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,996 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ License Checker - Dependency license compliance and conflict analysis tool.
4
+
5
+ This script analyzes dependency licenses from package metadata, classifies them
6
+ into risk categories, detects license conflicts, and generates compliance
7
+ reports with actionable recommendations for legal risk management.
8
+
9
+ Author: Claude Skills Engineering Team
10
+ License: MIT
11
+ """
12
+
13
+ import json
14
+ import os
15
+ import sys
16
+ import argparse
17
+ from typing import Dict, List, Set, Any, Optional, Tuple
18
+ from pathlib import Path
19
+ from dataclasses import dataclass, asdict
20
+ from datetime import datetime
21
+ import re
22
+ from enum import Enum
23
+
24
+ class LicenseType(Enum):
25
+ """License classification types."""
26
+ PERMISSIVE = "permissive"
27
+ COPYLEFT_STRONG = "copyleft_strong"
28
+ COPYLEFT_WEAK = "copyleft_weak"
29
+ PROPRIETARY = "proprietary"
30
+ DUAL = "dual"
31
+ UNKNOWN = "unknown"
32
+
33
+ class RiskLevel(Enum):
34
+ """Risk assessment levels."""
35
+ LOW = "low"
36
+ MEDIUM = "medium"
37
+ HIGH = "high"
38
+ CRITICAL = "critical"
39
+
40
+ @dataclass
41
+ class LicenseInfo:
42
+ """Represents license information for a dependency."""
43
+ name: str
44
+ spdx_id: Optional[str]
45
+ license_type: LicenseType
46
+ risk_level: RiskLevel
47
+ description: str
48
+ restrictions: List[str]
49
+ obligations: List[str]
50
+ compatibility: Dict[str, bool]
51
+
52
+ @dataclass
53
+ class DependencyLicense:
54
+ """Represents a dependency with its license information."""
55
+ name: str
56
+ version: str
57
+ ecosystem: str
58
+ direct: bool
59
+ license_declared: Optional[str]
60
+ license_detected: Optional[LicenseInfo]
61
+ license_files: List[str]
62
+ confidence: float
63
+
64
+ @dataclass
65
+ class LicenseConflict:
66
+ """Represents a license compatibility conflict."""
67
+ dependency1: str
68
+ license1: str
69
+ dependency2: str
70
+ license2: str
71
+ conflict_type: str
72
+ severity: RiskLevel
73
+ description: str
74
+ resolution_options: List[str]
75
+
76
+ class LicenseChecker:
77
+ """Main license checking and compliance analysis class."""
78
+
79
+ def __init__(self):
80
+ self.license_database = self._build_license_database()
81
+ self.compatibility_matrix = self._build_compatibility_matrix()
82
+ self.license_patterns = self._build_license_patterns()
83
+
84
+ def _build_license_database(self) -> Dict[str, LicenseInfo]:
85
+ """Build comprehensive license database with risk classifications."""
86
+ return {
87
+ # Permissive Licenses (Low Risk)
88
+ 'MIT': LicenseInfo(
89
+ name='MIT License',
90
+ spdx_id='MIT',
91
+ license_type=LicenseType.PERMISSIVE,
92
+ risk_level=RiskLevel.LOW,
93
+ description='Very permissive license with minimal restrictions',
94
+ restrictions=['Include copyright notice', 'Include license text'],
95
+ obligations=['Attribution'],
96
+ compatibility={
97
+ 'commercial': True, 'modification': True, 'distribution': True,
98
+ 'private_use': True, 'patent_grant': False
99
+ }
100
+ ),
101
+
102
+ 'Apache-2.0': LicenseInfo(
103
+ name='Apache License 2.0',
104
+ spdx_id='Apache-2.0',
105
+ license_type=LicenseType.PERMISSIVE,
106
+ risk_level=RiskLevel.LOW,
107
+ description='Permissive license with patent protection',
108
+ restrictions=['Include copyright notice', 'Include license text',
109
+ 'State changes', 'Include NOTICE file'],
110
+ obligations=['Attribution', 'Patent grant'],
111
+ compatibility={
112
+ 'commercial': True, 'modification': True, 'distribution': True,
113
+ 'private_use': True, 'patent_grant': True
114
+ }
115
+ ),
116
+
117
+ 'BSD-3-Clause': LicenseInfo(
118
+ name='BSD 3-Clause License',
119
+ spdx_id='BSD-3-Clause',
120
+ license_type=LicenseType.PERMISSIVE,
121
+ risk_level=RiskLevel.LOW,
122
+ description='Permissive license with non-endorsement clause',
123
+ restrictions=['Include copyright notice', 'Include license text',
124
+ 'No endorsement using author names'],
125
+ obligations=['Attribution'],
126
+ compatibility={
127
+ 'commercial': True, 'modification': True, 'distribution': True,
128
+ 'private_use': True, 'patent_grant': False
129
+ }
130
+ ),
131
+
132
+ 'BSD-2-Clause': LicenseInfo(
133
+ name='BSD 2-Clause License',
134
+ spdx_id='BSD-2-Clause',
135
+ license_type=LicenseType.PERMISSIVE,
136
+ risk_level=RiskLevel.LOW,
137
+ description='Very permissive license similar to MIT',
138
+ restrictions=['Include copyright notice', 'Include license text'],
139
+ obligations=['Attribution'],
140
+ compatibility={
141
+ 'commercial': True, 'modification': True, 'distribution': True,
142
+ 'private_use': True, 'patent_grant': False
143
+ }
144
+ ),
145
+
146
+ 'ISC': LicenseInfo(
147
+ name='ISC License',
148
+ spdx_id='ISC',
149
+ license_type=LicenseType.PERMISSIVE,
150
+ risk_level=RiskLevel.LOW,
151
+ description='Functionally equivalent to MIT license',
152
+ restrictions=['Include copyright notice'],
153
+ obligations=['Attribution'],
154
+ compatibility={
155
+ 'commercial': True, 'modification': True, 'distribution': True,
156
+ 'private_use': True, 'patent_grant': False
157
+ }
158
+ ),
159
+
160
+ # Weak Copyleft Licenses (Medium Risk)
161
+ 'MPL-2.0': LicenseInfo(
162
+ name='Mozilla Public License 2.0',
163
+ spdx_id='MPL-2.0',
164
+ license_type=LicenseType.COPYLEFT_WEAK,
165
+ risk_level=RiskLevel.MEDIUM,
166
+ description='File-level copyleft license',
167
+ restrictions=['Disclose source of modified files', 'Include copyright notice',
168
+ 'Include license text', 'State changes'],
169
+ obligations=['Source disclosure (modified files only)'],
170
+ compatibility={
171
+ 'commercial': True, 'modification': True, 'distribution': True,
172
+ 'private_use': True, 'patent_grant': True
173
+ }
174
+ ),
175
+
176
+ 'LGPL-2.1': LicenseInfo(
177
+ name='GNU Lesser General Public License 2.1',
178
+ spdx_id='LGPL-2.1',
179
+ license_type=LicenseType.COPYLEFT_WEAK,
180
+ risk_level=RiskLevel.MEDIUM,
181
+ description='Library-level copyleft license',
182
+ restrictions=['Disclose source of library modifications', 'Include copyright notice',
183
+ 'Include license text', 'Allow relinking'],
184
+ obligations=['Source disclosure (library modifications)', 'Dynamic linking preferred'],
185
+ compatibility={
186
+ 'commercial': True, 'modification': True, 'distribution': True,
187
+ 'private_use': True, 'patent_grant': False
188
+ }
189
+ ),
190
+
191
+ 'LGPL-3.0': LicenseInfo(
192
+ name='GNU Lesser General Public License 3.0',
193
+ spdx_id='LGPL-3.0',
194
+ license_type=LicenseType.COPYLEFT_WEAK,
195
+ risk_level=RiskLevel.MEDIUM,
196
+ description='Library-level copyleft with patent provisions',
197
+ restrictions=['Disclose source of library modifications', 'Include copyright notice',
198
+ 'Include license text', 'Allow relinking', 'Anti-tivoization'],
199
+ obligations=['Source disclosure (library modifications)', 'Patent grant'],
200
+ compatibility={
201
+ 'commercial': True, 'modification': True, 'distribution': True,
202
+ 'private_use': True, 'patent_grant': True
203
+ }
204
+ ),
205
+
206
+ # Strong Copyleft Licenses (High Risk)
207
+ 'GPL-2.0': LicenseInfo(
208
+ name='GNU General Public License 2.0',
209
+ spdx_id='GPL-2.0',
210
+ license_type=LicenseType.COPYLEFT_STRONG,
211
+ risk_level=RiskLevel.HIGH,
212
+ description='Strong copyleft requiring full source disclosure',
213
+ restrictions=['Disclose entire source code', 'Include copyright notice',
214
+ 'Include license text', 'Use same license'],
215
+ obligations=['Full source disclosure', 'License compatibility'],
216
+ compatibility={
217
+ 'commercial': False, 'modification': True, 'distribution': True,
218
+ 'private_use': True, 'patent_grant': False
219
+ }
220
+ ),
221
+
222
+ 'GPL-3.0': LicenseInfo(
223
+ name='GNU General Public License 3.0',
224
+ spdx_id='GPL-3.0',
225
+ license_type=LicenseType.COPYLEFT_STRONG,
226
+ risk_level=RiskLevel.HIGH,
227
+ description='Strong copyleft with patent and hardware provisions',
228
+ restrictions=['Disclose entire source code', 'Include copyright notice',
229
+ 'Include license text', 'Use same license', 'Anti-tivoization'],
230
+ obligations=['Full source disclosure', 'Patent grant', 'License compatibility'],
231
+ compatibility={
232
+ 'commercial': False, 'modification': True, 'distribution': True,
233
+ 'private_use': True, 'patent_grant': True
234
+ }
235
+ ),
236
+
237
+ 'AGPL-3.0': LicenseInfo(
238
+ name='GNU Affero General Public License 3.0',
239
+ spdx_id='AGPL-3.0',
240
+ license_type=LicenseType.COPYLEFT_STRONG,
241
+ risk_level=RiskLevel.CRITICAL,
242
+ description='Network copyleft extending GPL to SaaS',
243
+ restrictions=['Disclose entire source code', 'Include copyright notice',
244
+ 'Include license text', 'Use same license', 'Network use triggers copyleft'],
245
+ obligations=['Full source disclosure', 'Network service source disclosure'],
246
+ compatibility={
247
+ 'commercial': False, 'modification': True, 'distribution': True,
248
+ 'private_use': True, 'patent_grant': True
249
+ }
250
+ ),
251
+
252
+ # Proprietary/Commercial Licenses (High Risk)
253
+ 'PROPRIETARY': LicenseInfo(
254
+ name='Proprietary License',
255
+ spdx_id=None,
256
+ license_type=LicenseType.PROPRIETARY,
257
+ risk_level=RiskLevel.HIGH,
258
+ description='Commercial or custom proprietary license',
259
+ restrictions=['Varies by license', 'Often no redistribution',
260
+ 'May require commercial license'],
261
+ obligations=['License agreement compliance', 'Payment obligations'],
262
+ compatibility={
263
+ 'commercial': False, 'modification': False, 'distribution': False,
264
+ 'private_use': True, 'patent_grant': False
265
+ }
266
+ ),
267
+
268
+ # Unknown/Unlicensed (Critical Risk)
269
+ 'UNKNOWN': LicenseInfo(
270
+ name='Unknown License',
271
+ spdx_id=None,
272
+ license_type=LicenseType.UNKNOWN,
273
+ risk_level=RiskLevel.CRITICAL,
274
+ description='No license detected or ambiguous licensing',
275
+ restrictions=['Unknown', 'Assume no rights granted'],
276
+ obligations=['Investigate and clarify licensing'],
277
+ compatibility={
278
+ 'commercial': False, 'modification': False, 'distribution': False,
279
+ 'private_use': False, 'patent_grant': False
280
+ }
281
+ )
282
+ }
283
+
284
+ def _build_compatibility_matrix(self) -> Dict[str, Dict[str, bool]]:
285
+ """Build license compatibility matrix."""
286
+ return {
287
+ 'MIT': {
288
+ 'MIT': True, 'Apache-2.0': True, 'BSD-3-Clause': True, 'BSD-2-Clause': True,
289
+ 'ISC': True, 'MPL-2.0': True, 'LGPL-2.1': True, 'LGPL-3.0': True,
290
+ 'GPL-2.0': False, 'GPL-3.0': False, 'AGPL-3.0': False, 'PROPRIETARY': False
291
+ },
292
+ 'Apache-2.0': {
293
+ 'MIT': True, 'Apache-2.0': True, 'BSD-3-Clause': True, 'BSD-2-Clause': True,
294
+ 'ISC': True, 'MPL-2.0': True, 'LGPL-2.1': False, 'LGPL-3.0': True,
295
+ 'GPL-2.0': False, 'GPL-3.0': True, 'AGPL-3.0': True, 'PROPRIETARY': False
296
+ },
297
+ 'GPL-2.0': {
298
+ 'MIT': True, 'Apache-2.0': False, 'BSD-3-Clause': True, 'BSD-2-Clause': True,
299
+ 'ISC': True, 'MPL-2.0': False, 'LGPL-2.1': True, 'LGPL-3.0': False,
300
+ 'GPL-2.0': True, 'GPL-3.0': False, 'AGPL-3.0': False, 'PROPRIETARY': False
301
+ },
302
+ 'GPL-3.0': {
303
+ 'MIT': True, 'Apache-2.0': True, 'BSD-3-Clause': True, 'BSD-2-Clause': True,
304
+ 'ISC': True, 'MPL-2.0': True, 'LGPL-2.1': False, 'LGPL-3.0': True,
305
+ 'GPL-2.0': False, 'GPL-3.0': True, 'AGPL-3.0': True, 'PROPRIETARY': False
306
+ },
307
+ 'AGPL-3.0': {
308
+ 'MIT': True, 'Apache-2.0': True, 'BSD-3-Clause': True, 'BSD-2-Clause': True,
309
+ 'ISC': True, 'MPL-2.0': True, 'LGPL-2.1': False, 'LGPL-3.0': True,
310
+ 'GPL-2.0': False, 'GPL-3.0': True, 'AGPL-3.0': True, 'PROPRIETARY': False
311
+ }
312
+ }
313
+
314
+ def _build_license_patterns(self) -> Dict[str, List[str]]:
315
+ """Build license detection patterns for text analysis."""
316
+ return {
317
+ 'MIT': [
318
+ r'MIT License',
319
+ r'Permission is hereby granted, free of charge',
320
+ r'THE SOFTWARE IS PROVIDED "AS IS"'
321
+ ],
322
+ 'Apache-2.0': [
323
+ r'Apache License, Version 2\.0',
324
+ r'Licensed under the Apache License',
325
+ r'http://www\.apache\.org/licenses/LICENSE-2\.0'
326
+ ],
327
+ 'GPL-2.0': [
328
+ r'GNU GENERAL PUBLIC LICENSE\s+Version 2',
329
+ r'This program is free software.*GPL.*version 2',
330
+ r'http://www\.gnu\.org/licenses/gpl-2\.0'
331
+ ],
332
+ 'GPL-3.0': [
333
+ r'GNU GENERAL PUBLIC LICENSE\s+Version 3',
334
+ r'This program is free software.*GPL.*version 3',
335
+ r'http://www\.gnu\.org/licenses/gpl-3\.0'
336
+ ],
337
+ 'BSD-3-Clause': [
338
+ r'BSD 3-Clause License',
339
+ r'Redistributions of source code must retain',
340
+ r'Neither the name.*may be used to endorse'
341
+ ],
342
+ 'BSD-2-Clause': [
343
+ r'BSD 2-Clause License',
344
+ r'Redistributions of source code must retain.*Redistributions in binary form'
345
+ ]
346
+ }
347
+
348
+ def analyze_project(self, project_path: str, dependency_inventory: Optional[str] = None) -> Dict[str, Any]:
349
+ """Analyze license compliance for a project."""
350
+ project_path = Path(project_path)
351
+
352
+ analysis_results = {
353
+ 'timestamp': datetime.now().isoformat(),
354
+ 'project_path': str(project_path),
355
+ 'project_license': self._detect_project_license(project_path),
356
+ 'dependencies': [],
357
+ 'license_summary': {},
358
+ 'conflicts': [],
359
+ 'compliance_score': 0.0,
360
+ 'risk_assessment': {},
361
+ 'recommendations': []
362
+ }
363
+
364
+ # Load dependencies from inventory or scan project
365
+ if dependency_inventory:
366
+ dependencies = self._load_dependency_inventory(dependency_inventory)
367
+ else:
368
+ dependencies = self._scan_project_dependencies(project_path)
369
+
370
+ # Analyze each dependency's license
371
+ for dep in dependencies:
372
+ license_info = self._analyze_dependency_license(dep, project_path)
373
+ analysis_results['dependencies'].append(license_info)
374
+
375
+ # Generate license summary
376
+ analysis_results['license_summary'] = self._generate_license_summary(
377
+ analysis_results['dependencies']
378
+ )
379
+
380
+ # Detect conflicts
381
+ analysis_results['conflicts'] = self._detect_license_conflicts(
382
+ analysis_results['project_license'],
383
+ analysis_results['dependencies']
384
+ )
385
+
386
+ # Calculate compliance score
387
+ analysis_results['compliance_score'] = self._calculate_compliance_score(
388
+ analysis_results['dependencies'],
389
+ analysis_results['conflicts']
390
+ )
391
+
392
+ # Generate risk assessment
393
+ analysis_results['risk_assessment'] = self._generate_risk_assessment(
394
+ analysis_results['dependencies'],
395
+ analysis_results['conflicts']
396
+ )
397
+
398
+ # Generate recommendations
399
+ analysis_results['recommendations'] = self._generate_compliance_recommendations(
400
+ analysis_results
401
+ )
402
+
403
+ return analysis_results
404
+
405
+ def _detect_project_license(self, project_path: Path) -> Optional[str]:
406
+ """Detect the main project license."""
407
+ license_files = ['LICENSE', 'LICENSE.txt', 'LICENSE.md', 'COPYING', 'COPYING.txt']
408
+
409
+ for license_file in license_files:
410
+ license_path = project_path / license_file
411
+ if license_path.exists():
412
+ try:
413
+ with open(license_path, 'r', encoding='utf-8') as f:
414
+ content = f.read()
415
+
416
+ # Analyze license content
417
+ detected_license = self._detect_license_from_text(content)
418
+ if detected_license:
419
+ return detected_license
420
+ except Exception as e:
421
+ print(f"Error reading license file {license_path}: {e}")
422
+
423
+ return None
424
+
425
+ def _detect_license_from_text(self, text: str) -> Optional[str]:
426
+ """Detect license type from text content."""
427
+ text_upper = text.upper()
428
+
429
+ for license_id, patterns in self.license_patterns.items():
430
+ for pattern in patterns:
431
+ if re.search(pattern, text, re.IGNORECASE):
432
+ return license_id
433
+
434
+ # Common license text patterns
435
+ if 'MIT' in text_upper and 'PERMISSION IS HEREBY GRANTED' in text_upper:
436
+ return 'MIT'
437
+ elif 'APACHE LICENSE' in text_upper and 'VERSION 2.0' in text_upper:
438
+ return 'Apache-2.0'
439
+ elif 'GPL' in text_upper and 'VERSION 2' in text_upper:
440
+ return 'GPL-2.0'
441
+ elif 'GPL' in text_upper and 'VERSION 3' in text_upper:
442
+ return 'GPL-3.0'
443
+
444
+ return None
445
+
446
+ def _load_dependency_inventory(self, inventory_path: str) -> List[Dict[str, Any]]:
447
+ """Load dependencies from JSON inventory file."""
448
+ try:
449
+ with open(inventory_path, 'r') as f:
450
+ data = json.load(f)
451
+
452
+ if 'dependencies' in data:
453
+ return data['dependencies']
454
+ else:
455
+ return data if isinstance(data, list) else []
456
+ except Exception as e:
457
+ print(f"Error loading dependency inventory: {e}")
458
+ return []
459
+
460
+ def _scan_project_dependencies(self, project_path: Path) -> List[Dict[str, Any]]:
461
+ """Basic dependency scanning - in practice, would integrate with dep_scanner.py."""
462
+ dependencies = []
463
+
464
+ # Simple package.json parsing as example
465
+ package_json = project_path / 'package.json'
466
+ if package_json.exists():
467
+ try:
468
+ with open(package_json, 'r') as f:
469
+ data = json.load(f)
470
+
471
+ for dep_type in ['dependencies', 'devDependencies']:
472
+ if dep_type in data:
473
+ for name, version in data[dep_type].items():
474
+ dependencies.append({
475
+ 'name': name,
476
+ 'version': version,
477
+ 'ecosystem': 'npm',
478
+ 'direct': True
479
+ })
480
+ except Exception as e:
481
+ print(f"Error parsing package.json: {e}")
482
+
483
+ return dependencies
484
+
485
+ def _analyze_dependency_license(self, dependency: Dict[str, Any], project_path: Path) -> DependencyLicense:
486
+ """Analyze license information for a single dependency."""
487
+ dep_license = DependencyLicense(
488
+ name=dependency['name'],
489
+ version=dependency.get('version', ''),
490
+ ecosystem=dependency.get('ecosystem', ''),
491
+ direct=dependency.get('direct', False),
492
+ license_declared=dependency.get('license'),
493
+ license_detected=None,
494
+ license_files=[],
495
+ confidence=0.0
496
+ )
497
+
498
+ # Try to detect license from various sources
499
+ declared_license = dependency.get('license')
500
+ if declared_license:
501
+ license_info = self._resolve_license_info(declared_license)
502
+ if license_info:
503
+ dep_license.license_detected = license_info
504
+ dep_license.confidence = 0.9
505
+
506
+ # For unknown licenses, try to find license files in node_modules (example)
507
+ if not dep_license.license_detected and dep_license.ecosystem == 'npm':
508
+ node_modules_path = project_path / 'node_modules' / dep_license.name
509
+ if node_modules_path.exists():
510
+ license_info = self._scan_package_directory(node_modules_path)
511
+ if license_info:
512
+ dep_license.license_detected = license_info
513
+ dep_license.confidence = 0.7
514
+
515
+ # Default to unknown if no license detected
516
+ if not dep_license.license_detected:
517
+ dep_license.license_detected = self.license_database['UNKNOWN']
518
+ dep_license.confidence = 0.0
519
+
520
+ return dep_license
521
+
522
+ def _resolve_license_info(self, license_string: str) -> Optional[LicenseInfo]:
523
+ """Resolve license string to LicenseInfo object."""
524
+ if not license_string:
525
+ return None
526
+
527
+ license_string = license_string.strip()
528
+
529
+ # Direct SPDX ID match
530
+ if license_string in self.license_database:
531
+ return self.license_database[license_string]
532
+
533
+ # Common variations and mappings
534
+ license_mappings = {
535
+ 'mit': 'MIT',
536
+ 'apache': 'Apache-2.0',
537
+ 'apache-2.0': 'Apache-2.0',
538
+ 'apache 2.0': 'Apache-2.0',
539
+ 'bsd': 'BSD-3-Clause',
540
+ 'bsd-3-clause': 'BSD-3-Clause',
541
+ 'bsd-2-clause': 'BSD-2-Clause',
542
+ 'gpl-2.0': 'GPL-2.0',
543
+ 'gpl-3.0': 'GPL-3.0',
544
+ 'lgpl-2.1': 'LGPL-2.1',
545
+ 'lgpl-3.0': 'LGPL-3.0',
546
+ 'mpl-2.0': 'MPL-2.0',
547
+ 'isc': 'ISC',
548
+ 'unlicense': 'MIT', # Treat as permissive
549
+ 'public domain': 'MIT', # Treat as permissive
550
+ 'proprietary': 'PROPRIETARY',
551
+ 'commercial': 'PROPRIETARY'
552
+ }
553
+
554
+ license_lower = license_string.lower()
555
+ for pattern, mapped_license in license_mappings.items():
556
+ if pattern in license_lower:
557
+ return self.license_database.get(mapped_license)
558
+
559
+ return None
560
+
561
+ def _scan_package_directory(self, package_path: Path) -> Optional[LicenseInfo]:
562
+ """Scan package directory for license information."""
563
+ license_files = ['LICENSE', 'LICENSE.txt', 'LICENSE.md', 'COPYING', 'README.md', 'package.json']
564
+
565
+ for license_file in license_files:
566
+ file_path = package_path / license_file
567
+ if file_path.exists():
568
+ try:
569
+ with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
570
+ content = f.read()
571
+
572
+ # Try to detect license from content
573
+ if license_file == 'package.json':
574
+ # Parse JSON for license field
575
+ try:
576
+ data = json.loads(content)
577
+ license_field = data.get('license')
578
+ if license_field:
579
+ return self._resolve_license_info(license_field)
580
+ except:
581
+ continue
582
+ else:
583
+ # Analyze text content
584
+ detected_license = self._detect_license_from_text(content)
585
+ if detected_license:
586
+ return self.license_database.get(detected_license)
587
+ except Exception:
588
+ continue
589
+
590
+ return None
591
+
592
+ def _generate_license_summary(self, dependencies: List[DependencyLicense]) -> Dict[str, Any]:
593
+ """Generate summary of license distribution."""
594
+ summary = {
595
+ 'total_dependencies': len(dependencies),
596
+ 'license_types': {},
597
+ 'risk_levels': {},
598
+ 'unknown_licenses': 0,
599
+ 'direct_dependencies': 0,
600
+ 'transitive_dependencies': 0
601
+ }
602
+
603
+ for dep in dependencies:
604
+ # Count by license type
605
+ license_type = dep.license_detected.license_type.value
606
+ summary['license_types'][license_type] = summary['license_types'].get(license_type, 0) + 1
607
+
608
+ # Count by risk level
609
+ risk_level = dep.license_detected.risk_level.value
610
+ summary['risk_levels'][risk_level] = summary['risk_levels'].get(risk_level, 0) + 1
611
+
612
+ # Count unknowns
613
+ if dep.license_detected.license_type == LicenseType.UNKNOWN:
614
+ summary['unknown_licenses'] += 1
615
+
616
+ # Count direct vs transitive
617
+ if dep.direct:
618
+ summary['direct_dependencies'] += 1
619
+ else:
620
+ summary['transitive_dependencies'] += 1
621
+
622
+ return summary
623
+
624
+ def _detect_license_conflicts(self, project_license: Optional[str],
625
+ dependencies: List[DependencyLicense]) -> List[LicenseConflict]:
626
+ """Detect license compatibility conflicts."""
627
+ conflicts = []
628
+
629
+ if not project_license:
630
+ # If no project license detected, flag as potential issue
631
+ for dep in dependencies:
632
+ if dep.license_detected.risk_level in [RiskLevel.HIGH, RiskLevel.CRITICAL]:
633
+ conflicts.append(LicenseConflict(
634
+ dependency1='Project',
635
+ license1='Unknown',
636
+ dependency2=dep.name,
637
+ license2=dep.license_detected.spdx_id or dep.license_detected.name,
638
+ conflict_type='Unknown project license',
639
+ severity=RiskLevel.HIGH,
640
+ description=f'Project license unknown, dependency {dep.name} has {dep.license_detected.risk_level.value} risk license',
641
+ resolution_options=['Define project license', 'Review dependency usage']
642
+ ))
643
+ return conflicts
644
+
645
+ project_license_info = self.license_database.get(project_license)
646
+ if not project_license_info:
647
+ return conflicts
648
+
649
+ # Check compatibility with project license
650
+ for dep in dependencies:
651
+ dep_license_id = dep.license_detected.spdx_id or 'UNKNOWN'
652
+
653
+ # Check compatibility matrix
654
+ if project_license in self.compatibility_matrix:
655
+ compatibility = self.compatibility_matrix[project_license].get(dep_license_id, False)
656
+
657
+ if not compatibility:
658
+ severity = self._determine_conflict_severity(project_license_info, dep.license_detected)
659
+
660
+ conflicts.append(LicenseConflict(
661
+ dependency1='Project',
662
+ license1=project_license,
663
+ dependency2=dep.name,
664
+ license2=dep_license_id,
665
+ conflict_type='License incompatibility',
666
+ severity=severity,
667
+ description=f'Project license {project_license} is incompatible with dependency license {dep_license_id}',
668
+ resolution_options=self._generate_conflict_resolutions(project_license, dep_license_id)
669
+ ))
670
+
671
+ # Check for GPL contamination in permissive projects
672
+ if project_license_info.license_type == LicenseType.PERMISSIVE:
673
+ for dep in dependencies:
674
+ if dep.license_detected.license_type == LicenseType.COPYLEFT_STRONG:
675
+ conflicts.append(LicenseConflict(
676
+ dependency1='Project',
677
+ license1=project_license,
678
+ dependency2=dep.name,
679
+ license2=dep.license_detected.spdx_id or dep.license_detected.name,
680
+ conflict_type='GPL contamination',
681
+ severity=RiskLevel.CRITICAL,
682
+ description=f'GPL dependency {dep.name} may contaminate permissive project',
683
+ resolution_options=['Remove GPL dependency', 'Change project license to GPL',
684
+ 'Use dynamic linking', 'Find alternative dependency']
685
+ ))
686
+
687
+ return conflicts
688
+
689
+ def _determine_conflict_severity(self, project_license: LicenseInfo, dep_license: LicenseInfo) -> RiskLevel:
690
+ """Determine severity of a license conflict."""
691
+ if dep_license.license_type == LicenseType.UNKNOWN:
692
+ return RiskLevel.CRITICAL
693
+ elif (project_license.license_type == LicenseType.PERMISSIVE and
694
+ dep_license.license_type == LicenseType.COPYLEFT_STRONG):
695
+ return RiskLevel.CRITICAL
696
+ elif dep_license.license_type == LicenseType.PROPRIETARY:
697
+ return RiskLevel.HIGH
698
+ else:
699
+ return RiskLevel.MEDIUM
700
+
701
+ def _generate_conflict_resolutions(self, project_license: str, dep_license: str) -> List[str]:
702
+ """Generate resolution options for license conflicts."""
703
+ resolutions = []
704
+
705
+ if 'GPL' in dep_license:
706
+ resolutions.extend([
707
+ 'Find alternative non-GPL dependency',
708
+ 'Use dynamic linking if possible',
709
+ 'Consider changing project license to GPL-compatible',
710
+ 'Remove the dependency if not essential'
711
+ ])
712
+ elif dep_license == 'PROPRIETARY':
713
+ resolutions.extend([
714
+ 'Obtain commercial license',
715
+ 'Find open-source alternative',
716
+ 'Remove dependency if not essential',
717
+ 'Negotiate license terms'
718
+ ])
719
+ else:
720
+ resolutions.extend([
721
+ 'Review license compatibility carefully',
722
+ 'Consult legal counsel',
723
+ 'Find alternative dependency',
724
+ 'Consider license exception'
725
+ ])
726
+
727
+ return resolutions
728
+
729
+ def _calculate_compliance_score(self, dependencies: List[DependencyLicense],
730
+ conflicts: List[LicenseConflict]) -> float:
731
+ """Calculate overall compliance score (0-100)."""
732
+ if not dependencies:
733
+ return 100.0
734
+
735
+ base_score = 100.0
736
+
737
+ # Deduct points for unknown licenses
738
+ unknown_count = sum(1 for dep in dependencies
739
+ if dep.license_detected.license_type == LicenseType.UNKNOWN)
740
+ base_score -= (unknown_count / len(dependencies)) * 30
741
+
742
+ # Deduct points for high-risk licenses
743
+ high_risk_count = sum(1 for dep in dependencies
744
+ if dep.license_detected.risk_level in [RiskLevel.HIGH, RiskLevel.CRITICAL])
745
+ base_score -= (high_risk_count / len(dependencies)) * 20
746
+
747
+ # Deduct points for conflicts
748
+ if conflicts:
749
+ critical_conflicts = sum(1 for c in conflicts if c.severity == RiskLevel.CRITICAL)
750
+ high_conflicts = sum(1 for c in conflicts if c.severity == RiskLevel.HIGH)
751
+
752
+ base_score -= critical_conflicts * 15
753
+ base_score -= high_conflicts * 10
754
+
755
+ return max(0.0, base_score)
756
+
757
+ def _generate_risk_assessment(self, dependencies: List[DependencyLicense],
758
+ conflicts: List[LicenseConflict]) -> Dict[str, Any]:
759
+ """Generate comprehensive risk assessment."""
760
+ return {
761
+ 'overall_risk': self._calculate_overall_risk(dependencies, conflicts),
762
+ 'license_risk_breakdown': self._calculate_license_risks(dependencies),
763
+ 'conflict_summary': {
764
+ 'total_conflicts': len(conflicts),
765
+ 'critical_conflicts': len([c for c in conflicts if c.severity == RiskLevel.CRITICAL]),
766
+ 'high_conflicts': len([c for c in conflicts if c.severity == RiskLevel.HIGH])
767
+ },
768
+ 'distribution_risks': self._assess_distribution_risks(dependencies),
769
+ 'commercial_risks': self._assess_commercial_risks(dependencies)
770
+ }
771
+
772
+ def _calculate_overall_risk(self, dependencies: List[DependencyLicense],
773
+ conflicts: List[LicenseConflict]) -> str:
774
+ """Calculate overall project risk level."""
775
+ if any(c.severity == RiskLevel.CRITICAL for c in conflicts):
776
+ return 'CRITICAL'
777
+ elif any(dep.license_detected.risk_level == RiskLevel.CRITICAL for dep in dependencies):
778
+ return 'CRITICAL'
779
+ elif any(c.severity == RiskLevel.HIGH for c in conflicts):
780
+ return 'HIGH'
781
+ elif any(dep.license_detected.risk_level == RiskLevel.HIGH for dep in dependencies):
782
+ return 'HIGH'
783
+ elif any(dep.license_detected.risk_level == RiskLevel.MEDIUM for dep in dependencies):
784
+ return 'MEDIUM'
785
+ else:
786
+ return 'LOW'
787
+
788
+ def _calculate_license_risks(self, dependencies: List[DependencyLicense]) -> Dict[str, int]:
789
+ """Calculate breakdown of license risks."""
790
+ risks = {'low': 0, 'medium': 0, 'high': 0, 'critical': 0}
791
+
792
+ for dep in dependencies:
793
+ risk_level = dep.license_detected.risk_level.value
794
+ risks[risk_level] += 1
795
+
796
+ return risks
797
+
798
+ def _assess_distribution_risks(self, dependencies: List[DependencyLicense]) -> List[str]:
799
+ """Assess risks related to software distribution."""
800
+ risks = []
801
+
802
+ gpl_deps = [dep for dep in dependencies
803
+ if dep.license_detected.license_type == LicenseType.COPYLEFT_STRONG]
804
+ if gpl_deps:
805
+ risks.append(f"GPL dependencies require source code disclosure: {[d.name for d in gpl_deps]}")
806
+
807
+ proprietary_deps = [dep for dep in dependencies
808
+ if dep.license_detected.license_type == LicenseType.PROPRIETARY]
809
+ if proprietary_deps:
810
+ risks.append(f"Proprietary dependencies may require commercial licenses: {[d.name for d in proprietary_deps]}")
811
+
812
+ unknown_deps = [dep for dep in dependencies
813
+ if dep.license_detected.license_type == LicenseType.UNKNOWN]
814
+ if unknown_deps:
815
+ risks.append(f"Unknown licenses pose legal uncertainty: {[d.name for d in unknown_deps]}")
816
+
817
+ return risks
818
+
819
+ def _assess_commercial_risks(self, dependencies: List[DependencyLicense]) -> List[str]:
820
+ """Assess risks for commercial usage."""
821
+ risks = []
822
+
823
+ agpl_deps = [dep for dep in dependencies
824
+ if dep.license_detected.spdx_id == 'AGPL-3.0']
825
+ if agpl_deps:
826
+ risks.append(f"AGPL dependencies trigger copyleft for network services: {[d.name for d in agpl_deps]}")
827
+
828
+ return risks
829
+
830
+ def _generate_compliance_recommendations(self, analysis_results: Dict[str, Any]) -> List[str]:
831
+ """Generate actionable compliance recommendations."""
832
+ recommendations = []
833
+
834
+ # Address critical issues first
835
+ critical_conflicts = [c for c in analysis_results['conflicts']
836
+ if c.severity == RiskLevel.CRITICAL]
837
+ if critical_conflicts:
838
+ recommendations.append("CRITICAL: Address license conflicts immediately before any distribution")
839
+ for conflict in critical_conflicts[:3]: # Top 3
840
+ recommendations.append(f" • {conflict.description}")
841
+
842
+ # Unknown licenses
843
+ unknown_count = analysis_results['license_summary']['unknown_licenses']
844
+ if unknown_count > 0:
845
+ recommendations.append(f"Investigate and clarify licenses for {unknown_count} dependencies with unknown licensing")
846
+
847
+ # GPL contamination
848
+ gpl_deps = [dep for dep in analysis_results['dependencies']
849
+ if dep.license_detected.license_type == LicenseType.COPYLEFT_STRONG]
850
+ if gpl_deps and analysis_results.get('project_license') in ['MIT', 'Apache-2.0', 'BSD-3-Clause']:
851
+ recommendations.append("Consider removing GPL dependencies or changing project license for permissive project")
852
+
853
+ # Compliance score
854
+ if analysis_results['compliance_score'] < 70:
855
+ recommendations.append("Overall compliance score is low - prioritize license cleanup")
856
+
857
+ return recommendations
858
+
859
+ def generate_report(self, analysis_results: Dict[str, Any], format: str = 'text') -> str:
860
+ """Generate compliance report in specified format."""
861
+ if format == 'json':
862
+ # Convert dataclass objects for JSON serialization
863
+ serializable_results = analysis_results.copy()
864
+ serializable_results['dependencies'] = [
865
+ {
866
+ 'name': dep.name,
867
+ 'version': dep.version,
868
+ 'ecosystem': dep.ecosystem,
869
+ 'direct': dep.direct,
870
+ 'license_declared': dep.license_declared,
871
+ 'license_detected': asdict(dep.license_detected) if dep.license_detected else None,
872
+ 'confidence': dep.confidence
873
+ }
874
+ for dep in analysis_results['dependencies']
875
+ ]
876
+ serializable_results['conflicts'] = [asdict(conflict) for conflict in analysis_results['conflicts']]
877
+ return json.dumps(serializable_results, indent=2, default=str)
878
+
879
+ # Text format report
880
+ report = []
881
+ report.append("=" * 60)
882
+ report.append("LICENSE COMPLIANCE REPORT")
883
+ report.append("=" * 60)
884
+ report.append(f"Analysis Date: {analysis_results['timestamp']}")
885
+ report.append(f"Project: {analysis_results['project_path']}")
886
+ report.append(f"Project License: {analysis_results['project_license'] or 'Unknown'}")
887
+ report.append("")
888
+
889
+ # Summary
890
+ summary = analysis_results['license_summary']
891
+ report.append("SUMMARY:")
892
+ report.append(f" Total Dependencies: {summary['total_dependencies']}")
893
+ report.append(f" Compliance Score: {analysis_results['compliance_score']:.1f}/100")
894
+ report.append(f" Overall Risk: {analysis_results['risk_assessment']['overall_risk']}")
895
+ report.append(f" License Conflicts: {len(analysis_results['conflicts'])}")
896
+ report.append("")
897
+
898
+ # License distribution
899
+ report.append("LICENSE DISTRIBUTION:")
900
+ for license_type, count in summary['license_types'].items():
901
+ report.append(f" {license_type.title()}: {count}")
902
+ report.append("")
903
+
904
+ # Risk breakdown
905
+ report.append("RISK BREAKDOWN:")
906
+ for risk_level, count in summary['risk_levels'].items():
907
+ report.append(f" {risk_level.title()}: {count}")
908
+ report.append("")
909
+
910
+ # Conflicts
911
+ if analysis_results['conflicts']:
912
+ report.append("LICENSE CONFLICTS:")
913
+ report.append("-" * 30)
914
+ for conflict in analysis_results['conflicts']:
915
+ report.append(f"Conflict: {conflict.dependency2} ({conflict.license2})")
916
+ report.append(f" Issue: {conflict.description}")
917
+ report.append(f" Severity: {conflict.severity.value.upper()}")
918
+ report.append(f" Resolutions: {', '.join(conflict.resolution_options[:2])}")
919
+ report.append("")
920
+
921
+ # High-risk dependencies
922
+ high_risk_deps = [dep for dep in analysis_results['dependencies']
923
+ if dep.license_detected.risk_level in [RiskLevel.HIGH, RiskLevel.CRITICAL]]
924
+ if high_risk_deps:
925
+ report.append("HIGH-RISK DEPENDENCIES:")
926
+ report.append("-" * 30)
927
+ for dep in high_risk_deps[:10]: # Top 10
928
+ license_name = dep.license_detected.spdx_id or dep.license_detected.name
929
+ report.append(f" {dep.name} v{dep.version}: {license_name} ({dep.license_detected.risk_level.value.upper()})")
930
+ report.append("")
931
+
932
+ # Recommendations
933
+ if analysis_results['recommendations']:
934
+ report.append("RECOMMENDATIONS:")
935
+ report.append("-" * 20)
936
+ for i, rec in enumerate(analysis_results['recommendations'], 1):
937
+ report.append(f"{i}. {rec}")
938
+ report.append("")
939
+
940
+ report.append("=" * 60)
941
+ return '\n'.join(report)
942
+
943
+ def main():
944
+ """Main entry point for the license checker."""
945
+ parser = argparse.ArgumentParser(
946
+ description='Analyze dependency licenses for compliance and conflicts',
947
+ formatter_class=argparse.RawDescriptionHelpFormatter,
948
+ epilog="""
949
+ Examples:
950
+ python license_checker.py /path/to/project
951
+ python license_checker.py . --format json --output compliance.json
952
+ python license_checker.py /app --inventory deps.json --policy strict
953
+ """
954
+ )
955
+
956
+ parser.add_argument('project_path',
957
+ help='Path to the project directory to analyze')
958
+ parser.add_argument('--inventory',
959
+ help='Path to dependency inventory JSON file')
960
+ parser.add_argument('--format', choices=['text', 'json'], default='text',
961
+ help='Output format (default: text)')
962
+ parser.add_argument('--output', '-o',
963
+ help='Output file path (default: stdout)')
964
+ parser.add_argument('--policy', choices=['permissive', 'strict'], default='permissive',
965
+ help='License policy strictness (default: permissive)')
966
+ parser.add_argument('--warn-conflicts', action='store_true',
967
+ help='Show warnings for potential conflicts')
968
+
969
+ args = parser.parse_args()
970
+
971
+ try:
972
+ checker = LicenseChecker()
973
+ results = checker.analyze_project(args.project_path, args.inventory)
974
+ report = checker.generate_report(results, args.format)
975
+
976
+ if args.output:
977
+ with open(args.output, 'w') as f:
978
+ f.write(report)
979
+ print(f"Compliance report saved to {args.output}")
980
+ else:
981
+ print(report)
982
+
983
+ # Exit with error code for policy violations
984
+ if args.policy == 'strict' and results['compliance_score'] < 80:
985
+ sys.exit(1)
986
+
987
+ if args.warn_conflicts and results['conflicts']:
988
+ print("\nWARNING: License conflicts detected!")
989
+ sys.exit(2)
990
+
991
+ except Exception as e:
992
+ print(f"Error: {e}", file=sys.stderr)
993
+ sys.exit(1)
994
+
995
+ if __name__ == '__main__':
996
+ main()