@heytherevibin/skillforge 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CODE_OF_CONDUCT.md +34 -0
  3. package/CONTRIBUTING.md +38 -0
  4. package/LICENSE +21 -0
  5. package/README.md +337 -0
  6. package/RELEASING.md +93 -0
  7. package/SECURITY.md +31 -0
  8. package/STRATEGY.md +26 -0
  9. package/bin/cli.js +547 -0
  10. package/lib/packs.js +184 -0
  11. package/package.json +38 -0
  12. package/python/app/__init__.py +0 -0
  13. package/python/app/__pycache__/__init__.cpython-312.pyc +0 -0
  14. package/python/app/__pycache__/auth.cpython-312.pyc +0 -0
  15. package/python/app/__pycache__/main.cpython-312.pyc +0 -0
  16. package/python/app/auth.py +63 -0
  17. package/python/app/cli.py +78 -0
  18. package/python/app/db_paths.py +26 -0
  19. package/python/app/events_cli.py +175 -0
  20. package/python/app/main.py +647 -0
  21. package/python/app/materialize.py +138 -0
  22. package/python/app/mcp_server.py +610 -0
  23. package/python/app/route_cli.py +117 -0
  24. package/python/requirements-dev.txt +1 -0
  25. package/python/requirements.txt +7 -0
  26. package/python/tests/test_db_paths.py +41 -0
  27. package/skills/accessibility/SKILL.md +145 -0
  28. package/skills/agent-architecture-audit/SKILL.md +256 -0
  29. package/skills/agent-eval/SKILL.md +144 -0
  30. package/skills/agent-harness-construction/SKILL.md +72 -0
  31. package/skills/agent-introspection-debugging/SKILL.md +152 -0
  32. package/skills/agent-payment-x402/SKILL.md +224 -0
  33. package/skills/agent-sort/SKILL.md +214 -0
  34. package/skills/agentic-engineering/SKILL.md +62 -0
  35. package/skills/agentic-os/SKILL.md +386 -0
  36. package/skills/ai-first-engineering/SKILL.md +50 -0
  37. package/skills/ai-regression-testing/SKILL.md +384 -0
  38. package/skills/android-clean-architecture/SKILL.md +338 -0
  39. package/skills/angular-developer/SKILL.md +153 -0
  40. package/skills/angular-developer/references/angular-animations.md +160 -0
  41. package/skills/angular-developer/references/angular-aria.md +410 -0
  42. package/skills/angular-developer/references/cli.md +86 -0
  43. package/skills/angular-developer/references/component-harnesses.md +59 -0
  44. package/skills/angular-developer/references/component-styling.md +91 -0
  45. package/skills/angular-developer/references/components.md +117 -0
  46. package/skills/angular-developer/references/creating-services.md +97 -0
  47. package/skills/angular-developer/references/data-resolvers.md +69 -0
  48. package/skills/angular-developer/references/define-routes.md +67 -0
  49. package/skills/angular-developer/references/defining-providers.md +72 -0
  50. package/skills/angular-developer/references/di-fundamentals.md +120 -0
  51. package/skills/angular-developer/references/e2e-testing.md +56 -0
  52. package/skills/angular-developer/references/effects.md +83 -0
  53. package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  54. package/skills/angular-developer/references/host-elements.md +80 -0
  55. package/skills/angular-developer/references/injection-context.md +63 -0
  56. package/skills/angular-developer/references/inputs.md +101 -0
  57. package/skills/angular-developer/references/linked-signal.md +59 -0
  58. package/skills/angular-developer/references/loading-strategies.md +61 -0
  59. package/skills/angular-developer/references/mcp.md +108 -0
  60. package/skills/angular-developer/references/navigate-to-routes.md +69 -0
  61. package/skills/angular-developer/references/outputs.md +86 -0
  62. package/skills/angular-developer/references/reactive-forms.md +122 -0
  63. package/skills/angular-developer/references/rendering-strategies.md +44 -0
  64. package/skills/angular-developer/references/resource.md +77 -0
  65. package/skills/angular-developer/references/route-animations.md +56 -0
  66. package/skills/angular-developer/references/route-guards.md +52 -0
  67. package/skills/angular-developer/references/router-lifecycle.md +45 -0
  68. package/skills/angular-developer/references/router-testing.md +87 -0
  69. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  70. package/skills/angular-developer/references/signal-forms.md +795 -0
  71. package/skills/angular-developer/references/signals-overview.md +94 -0
  72. package/skills/angular-developer/references/tailwind-css.md +69 -0
  73. package/skills/angular-developer/references/template-driven-forms.md +114 -0
  74. package/skills/angular-developer/references/testing-fundamentals.md +65 -0
  75. package/skills/api-connector-builder/SKILL.md +120 -0
  76. package/skills/api-design/SKILL.md +522 -0
  77. package/skills/architecture-decision-records/SKILL.md +178 -0
  78. package/skills/article-writing/SKILL.md +78 -0
  79. package/skills/automation-audit-ops/SKILL.md +141 -0
  80. package/skills/autonomous-agent-harness/SKILL.md +272 -0
  81. package/skills/autonomous-loops/SKILL.md +609 -0
  82. package/skills/backend-patterns/SKILL.md +560 -0
  83. package/skills/benchmark/SKILL.md +92 -0
  84. package/skills/blueprint/SKILL.md +104 -0
  85. package/skills/browser-qa/SKILL.md +86 -0
  86. package/skills/bun-runtime/SKILL.md +83 -0
  87. package/skills/canary-watch/SKILL.md +98 -0
  88. package/skills/carrier-relationship-management/SKILL.md +211 -0
  89. package/skills/cisco-ios-patterns/SKILL.md +163 -0
  90. package/skills/ck/SKILL.md +147 -0
  91. package/skills/ck/commands/forget.mjs +44 -0
  92. package/skills/ck/commands/info.mjs +24 -0
  93. package/skills/ck/commands/init.mjs +143 -0
  94. package/skills/ck/commands/list.mjs +40 -0
  95. package/skills/ck/commands/migrate.mjs +202 -0
  96. package/skills/ck/commands/resume.mjs +36 -0
  97. package/skills/ck/commands/save.mjs +210 -0
  98. package/skills/ck/commands/shared.mjs +387 -0
  99. package/skills/ck/hooks/session-start.mjs +224 -0
  100. package/skills/claude-devfleet/SKILL.md +103 -0
  101. package/skills/click-path-audit/SKILL.md +244 -0
  102. package/skills/clickhouse-io/SKILL.md +438 -0
  103. package/skills/code-tour/SKILL.md +235 -0
  104. package/skills/codebase-onboarding/SKILL.md +232 -0
  105. package/skills/coding-standards/SKILL.md +548 -0
  106. package/skills/compose-multiplatform-patterns/SKILL.md +298 -0
  107. package/skills/connections-optimizer/SKILL.md +188 -0
  108. package/skills/content-engine/SKILL.md +126 -0
  109. package/skills/content-hash-cache-pattern/SKILL.md +160 -0
  110. package/skills/context-budget/SKILL.md +134 -0
  111. package/skills/continuous-agent-loop/SKILL.md +44 -0
  112. package/skills/continuous-learning/SKILL.md +129 -0
  113. package/skills/continuous-learning/config.json +18 -0
  114. package/skills/continuous-learning/evaluate-session.sh +69 -0
  115. package/skills/continuous-learning-v2/SKILL.md +358 -0
  116. package/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
  117. package/skills/continuous-learning-v2/agents/observer.md +198 -0
  118. package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  119. package/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  120. package/skills/continuous-learning-v2/config.json +8 -0
  121. package/skills/continuous-learning-v2/hooks/observe.sh +476 -0
  122. package/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
  123. package/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
  124. package/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  125. package/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  126. package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
  127. package/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
  128. package/skills/cost-tracking/SKILL.md +147 -0
  129. package/skills/council/SKILL.md +202 -0
  130. package/skills/cpp-coding-standards/SKILL.md +722 -0
  131. package/skills/cpp-testing/SKILL.md +323 -0
  132. package/skills/crosspost/SKILL.md +110 -0
  133. package/skills/csharp-testing/SKILL.md +320 -0
  134. package/skills/customer-billing-ops/SKILL.md +139 -0
  135. package/skills/customs-trade-compliance/SKILL.md +262 -0
  136. package/skills/dart-flutter-patterns/SKILL.md +562 -0
  137. package/skills/dashboard-builder/SKILL.md +108 -0
  138. package/skills/data-scraper-agent/SKILL.md +764 -0
  139. package/skills/database-migrations/SKILL.md +428 -0
  140. package/skills/deep-research/SKILL.md +158 -0
  141. package/skills/defi-amm-security/SKILL.md +166 -0
  142. package/skills/deployment-patterns/SKILL.md +426 -0
  143. package/skills/design-system/SKILL.md +81 -0
  144. package/skills/django-celery/SKILL.md +456 -0
  145. package/skills/django-patterns/SKILL.md +733 -0
  146. package/skills/django-security/SKILL.md +592 -0
  147. package/skills/django-tdd/SKILL.md +728 -0
  148. package/skills/django-verification/SKILL.md +468 -0
  149. package/skills/dmux-workflows/SKILL.md +190 -0
  150. package/skills/docker-patterns/SKILL.md +363 -0
  151. package/skills/documentation-lookup/SKILL.md +89 -0
  152. package/skills/dotnet-patterns/SKILL.md +320 -0
  153. package/skills/e2e-testing/SKILL.md +325 -0
  154. package/skills/email-ops/SKILL.md +120 -0
  155. package/skills/energy-procurement/SKILL.md +227 -0
  156. package/skills/enterprise-agent-ops/SKILL.md +49 -0
  157. package/skills/error-handling/SKILL.md +375 -0
  158. package/skills/eval-harness/SKILL.md +269 -0
  159. package/skills/evm-token-decimals/SKILL.md +130 -0
  160. package/skills/exa-search/SKILL.md +106 -0
  161. package/skills/fal-ai-media/SKILL.md +287 -0
  162. package/skills/fastapi-patterns/SKILL.md +327 -0
  163. package/skills/finance-billing-ops/SKILL.md +126 -0
  164. package/skills/flox-environments/SKILL.md +496 -0
  165. package/skills/flutter-dart-code-review/SKILL.md +434 -0
  166. package/skills/foundation-models-on-device/SKILL.md +243 -0
  167. package/skills/frontend-design-direction/SKILL.md +92 -0
  168. package/skills/frontend-patterns/SKILL.md +641 -0
  169. package/skills/frontend-slides/SKILL.md +183 -0
  170. package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  171. package/skills/frontend-slides/animation-patterns.md +122 -0
  172. package/skills/frontend-slides/html-template.md +419 -0
  173. package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  174. package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  175. package/skills/frontend-slides/viewport-base.css +153 -0
  176. package/skills/fsharp-testing/SKILL.md +279 -0
  177. package/skills/gan-style-harness/SKILL.md +278 -0
  178. package/skills/gateguard/SKILL.md +125 -0
  179. package/skills/git-workflow/SKILL.md +714 -0
  180. package/skills/github-ops/SKILL.md +143 -0
  181. package/skills/golang-patterns/SKILL.md +673 -0
  182. package/skills/golang-testing/SKILL.md +719 -0
  183. package/skills/google-workspace-ops/SKILL.md +94 -0
  184. package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  185. package/skills/healthcare-emr-patterns/SKILL.md +159 -0
  186. package/skills/healthcare-eval-harness/SKILL.md +207 -0
  187. package/skills/healthcare-phi-compliance/SKILL.md +145 -0
  188. package/skills/hermes-imports/SKILL.md +87 -0
  189. package/skills/hexagonal-architecture/SKILL.md +275 -0
  190. package/skills/hipaa-compliance/SKILL.md +78 -0
  191. package/skills/homelab-network-readiness/SKILL.md +169 -0
  192. package/skills/homelab-network-setup/SKILL.md +129 -0
  193. package/skills/homelab-pihole-dns/SKILL.md +274 -0
  194. package/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  195. package/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  196. package/skills/hookify-rules/SKILL.md +128 -0
  197. package/skills/inventory-demand-planning/SKILL.md +246 -0
  198. package/skills/investor-materials/SKILL.md +95 -0
  199. package/skills/investor-outreach/SKILL.md +90 -0
  200. package/skills/ios-icon-gen/SKILL.md +157 -0
  201. package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  202. package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  203. package/skills/iterative-retrieval/SKILL.md +209 -0
  204. package/skills/java-coding-standards/SKILL.md +382 -0
  205. package/skills/jira-integration/SKILL.md +292 -0
  206. package/skills/jpa-patterns/SKILL.md +150 -0
  207. package/skills/knowledge-ops/SKILL.md +153 -0
  208. package/skills/kotlin-coroutines-flows/SKILL.md +283 -0
  209. package/skills/kotlin-exposed-patterns/SKILL.md +718 -0
  210. package/skills/kotlin-ktor-patterns/SKILL.md +688 -0
  211. package/skills/kotlin-patterns/SKILL.md +710 -0
  212. package/skills/kotlin-testing/SKILL.md +823 -0
  213. package/skills/laravel-patterns/SKILL.md +414 -0
  214. package/skills/laravel-plugin-discovery/SKILL.md +228 -0
  215. package/skills/laravel-security/SKILL.md +284 -0
  216. package/skills/laravel-tdd/SKILL.md +282 -0
  217. package/skills/laravel-verification/SKILL.md +178 -0
  218. package/skills/lead-intelligence/SKILL.md +320 -0
  219. package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  220. package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  221. package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  222. package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  223. package/skills/liquid-glass-design/SKILL.md +279 -0
  224. package/skills/llm-trading-agent-security/SKILL.md +146 -0
  225. package/skills/logistics-exception-management/SKILL.md +221 -0
  226. package/skills/make-interfaces-feel-better/SKILL.md +151 -0
  227. package/skills/manim-video/SKILL.md +88 -0
  228. package/skills/manim-video/assets/network_graph_scene.py +52 -0
  229. package/skills/market-research/SKILL.md +74 -0
  230. package/skills/mcp-server-patterns/SKILL.md +68 -0
  231. package/skills/messages-ops/SKILL.md +103 -0
  232. package/skills/mle-workflow/SKILL.md +345 -0
  233. package/skills/motion-advanced/SKILL.md +596 -0
  234. package/skills/motion-foundations/SKILL.md +299 -0
  235. package/skills/motion-patterns/SKILL.md +435 -0
  236. package/skills/motion-ui/SKILL.md +574 -0
  237. package/skills/mysql-patterns/SKILL.md +411 -0
  238. package/skills/nanoclaw-repl/SKILL.md +32 -0
  239. package/skills/nestjs-patterns/SKILL.md +229 -0
  240. package/skills/netmiko-ssh-automation/SKILL.md +173 -0
  241. package/skills/network-bgp-diagnostics/SKILL.md +167 -0
  242. package/skills/network-config-validation/SKILL.md +210 -0
  243. package/skills/network-interface-health/SKILL.md +152 -0
  244. package/skills/nextjs-turbopack/SKILL.md +43 -0
  245. package/skills/nodejs-keccak256/SKILL.md +102 -0
  246. package/skills/nutrient-document-processing/SKILL.md +166 -0
  247. package/skills/nuxt4-patterns/SKILL.md +99 -0
  248. package/skills/openclaw-persona-forge/SKILL.md +288 -0
  249. package/skills/openclaw-persona-forge/gacha.py +224 -0
  250. package/skills/openclaw-persona-forge/gacha.sh +5 -0
  251. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  252. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  253. package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  254. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  255. package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  256. package/skills/openclaw-persona-forge/references/output-template.md +166 -0
  257. package/skills/opensource-pipeline/SKILL.md +254 -0
  258. package/skills/perl-patterns/SKILL.md +503 -0
  259. package/skills/perl-security/SKILL.md +502 -0
  260. package/skills/perl-testing/SKILL.md +474 -0
  261. package/skills/plan-orchestrate/SKILL.md +253 -0
  262. package/skills/plankton-code-quality/SKILL.md +236 -0
  263. package/skills/postgres-patterns/SKILL.md +146 -0
  264. package/skills/product-capability/SKILL.md +140 -0
  265. package/skills/product-lens/SKILL.md +91 -0
  266. package/skills/production-audit/SKILL.md +206 -0
  267. package/skills/production-scheduling/SKILL.md +237 -0
  268. package/skills/project-flow-ops/SKILL.md +110 -0
  269. package/skills/prompt-optimizer/SKILL.md +398 -0
  270. package/skills/python-patterns/SKILL.md +749 -0
  271. package/skills/python-testing/SKILL.md +815 -0
  272. package/skills/pytorch-patterns/SKILL.md +395 -0
  273. package/skills/quality-nonconformance/SKILL.md +259 -0
  274. package/skills/quarkus-patterns/SKILL.md +721 -0
  275. package/skills/quarkus-security/SKILL.md +466 -0
  276. package/skills/quarkus-tdd/SKILL.md +810 -0
  277. package/skills/quarkus-verification/SKILL.md +478 -0
  278. package/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
  279. package/skills/redis-patterns/SKILL.md +402 -0
  280. package/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
  281. package/skills/remotion-video-creation/SKILL.md +43 -0
  282. package/skills/remotion-video-creation/rules/3d.md +86 -0
  283. package/skills/remotion-video-creation/rules/animations.md +29 -0
  284. package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  285. package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  286. package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  287. package/skills/remotion-video-creation/rules/assets.md +78 -0
  288. package/skills/remotion-video-creation/rules/audio.md +172 -0
  289. package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  290. package/skills/remotion-video-creation/rules/can-decode.md +75 -0
  291. package/skills/remotion-video-creation/rules/charts.md +58 -0
  292. package/skills/remotion-video-creation/rules/compositions.md +146 -0
  293. package/skills/remotion-video-creation/rules/display-captions.md +126 -0
  294. package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  295. package/skills/remotion-video-creation/rules/fonts.md +152 -0
  296. package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  297. package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  298. package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  299. package/skills/remotion-video-creation/rules/gifs.md +138 -0
  300. package/skills/remotion-video-creation/rules/images.md +130 -0
  301. package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  302. package/skills/remotion-video-creation/rules/lottie.md +67 -0
  303. package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  304. package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  305. package/skills/remotion-video-creation/rules/sequencing.md +106 -0
  306. package/skills/remotion-video-creation/rules/tailwind.md +11 -0
  307. package/skills/remotion-video-creation/rules/text-animations.md +20 -0
  308. package/skills/remotion-video-creation/rules/timing.md +179 -0
  309. package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  310. package/skills/remotion-video-creation/rules/transitions.md +122 -0
  311. package/skills/remotion-video-creation/rules/trimming.md +52 -0
  312. package/skills/remotion-video-creation/rules/videos.md +171 -0
  313. package/skills/repo-scan/SKILL.md +78 -0
  314. package/skills/research-ops/SKILL.md +111 -0
  315. package/skills/returns-reverse-logistics/SKILL.md +239 -0
  316. package/skills/rules-distill/SKILL.md +263 -0
  317. package/skills/rules-distill/scripts/scan-rules.sh +58 -0
  318. package/skills/rules-distill/scripts/scan-skills.sh +129 -0
  319. package/skills/rust-patterns/SKILL.md +498 -0
  320. package/skills/rust-testing/SKILL.md +499 -0
  321. package/skills/safety-guard/SKILL.md +74 -0
  322. package/skills/santa-method/SKILL.md +306 -0
  323. package/skills/scientific-db-pubmed-database/SKILL.md +175 -0
  324. package/skills/scientific-db-uspto-database/SKILL.md +177 -0
  325. package/skills/scientific-pkg-gget/SKILL.md +166 -0
  326. package/skills/scientific-thinking-literature-review/SKILL.md +192 -0
  327. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  328. package/skills/search-first/SKILL.md +181 -0
  329. package/skills/security-bounty-hunter/SKILL.md +99 -0
  330. package/skills/security-review/SKILL.md +502 -0
  331. package/skills/security-review/cloud-infrastructure-security.md +361 -0
  332. package/skills/seo/SKILL.md +153 -0
  333. package/skills/skill-comply/SKILL.md +57 -0
  334. package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  335. package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  336. package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  337. package/skills/skill-comply/prompts/classifier.md +24 -0
  338. package/skills/skill-comply/prompts/scenario_generator.md +62 -0
  339. package/skills/skill-comply/prompts/spec_generator.md +42 -0
  340. package/skills/skill-comply/pyproject.toml +15 -0
  341. package/skills/skill-comply/scripts/__init__.py +0 -0
  342. package/skills/skill-comply/scripts/classifier.py +85 -0
  343. package/skills/skill-comply/scripts/grader.py +124 -0
  344. package/skills/skill-comply/scripts/parser.py +107 -0
  345. package/skills/skill-comply/scripts/report.py +170 -0
  346. package/skills/skill-comply/scripts/run.py +127 -0
  347. package/skills/skill-comply/scripts/runner.py +186 -0
  348. package/skills/skill-comply/scripts/scenario_generator.py +70 -0
  349. package/skills/skill-comply/scripts/spec_generator.py +72 -0
  350. package/skills/skill-comply/scripts/utils.py +13 -0
  351. package/skills/skill-comply/tests/test_grader.py +197 -0
  352. package/skills/skill-comply/tests/test_parser.py +90 -0
  353. package/skills/skill-comply/tests/test_runner.py +172 -0
  354. package/skills/skill-scout/SKILL.md +139 -0
  355. package/skills/skill-stocktake/SKILL.md +193 -0
  356. package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  357. package/skills/skill-stocktake/scripts/save-results.sh +56 -0
  358. package/skills/skill-stocktake/scripts/scan.sh +170 -0
  359. package/skills/social-graph-ranker/SKILL.md +153 -0
  360. package/skills/springboot-patterns/SKILL.md +313 -0
  361. package/skills/springboot-security/SKILL.md +271 -0
  362. package/skills/springboot-tdd/SKILL.md +157 -0
  363. package/skills/springboot-verification/SKILL.md +230 -0
  364. package/skills/strategic-compact/SKILL.md +129 -0
  365. package/skills/strategic-compact/suggest-compact.sh +54 -0
  366. package/skills/swift-actor-persistence/SKILL.md +142 -0
  367. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  368. package/skills/swift-protocol-di-testing/SKILL.md +189 -0
  369. package/skills/swiftui-patterns/SKILL.md +259 -0
  370. package/skills/tdd-workflow/SKILL.md +462 -0
  371. package/skills/team-builder/SKILL.md +166 -0
  372. package/skills/terminal-ops/SKILL.md +108 -0
  373. package/skills/tinystruct-patterns/SKILL.md +130 -0
  374. package/skills/tinystruct-patterns/references/architecture.md +77 -0
  375. package/skills/tinystruct-patterns/references/data-handling.md +35 -0
  376. package/skills/tinystruct-patterns/references/routing.md +57 -0
  377. package/skills/tinystruct-patterns/references/system-usage.md +74 -0
  378. package/skills/tinystruct-patterns/references/testing.md +59 -0
  379. package/skills/token-budget-advisor/SKILL.md +133 -0
  380. package/skills/ui-demo/SKILL.md +464 -0
  381. package/skills/ui-to-vue/SKILL.md +134 -0
  382. package/skills/unified-notifications-ops/SKILL.md +186 -0
  383. package/skills/verification-loop/SKILL.md +125 -0
  384. package/skills/video-editing/SKILL.md +309 -0
  385. package/skills/videodb/SKILL.md +373 -0
  386. package/skills/videodb/reference/api-reference.md +550 -0
  387. package/skills/videodb/reference/capture-reference.md +407 -0
  388. package/skills/videodb/reference/capture.md +101 -0
  389. package/skills/videodb/reference/editor.md +443 -0
  390. package/skills/videodb/reference/generative.md +331 -0
  391. package/skills/videodb/reference/rtstream-reference.md +564 -0
  392. package/skills/videodb/reference/rtstream.md +65 -0
  393. package/skills/videodb/reference/search.md +230 -0
  394. package/skills/videodb/reference/streaming.md +406 -0
  395. package/skills/videodb/reference/use-cases.md +118 -0
  396. package/skills/videodb/scripts/ws_listener.py +282 -0
  397. package/skills/visa-doc-translate/README.md +86 -0
  398. package/skills/visa-doc-translate/SKILL.md +117 -0
  399. package/skills/vite-patterns/SKILL.md +448 -0
  400. package/skills/windows-desktop-e2e/SKILL.md +787 -0
  401. package/skills/workspace-surface-audit/SKILL.md +124 -0
  402. package/skills/x-api/SKILL.md +233 -0
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: security-bounty-hunter
3
+ description: Hunt for exploitable, bounty-worthy security issues in repositories. Focuses on remotely reachable vulnerabilities that qualify for real reports instead of noisy local-only findings.
4
+ origin: the toolset direct-port adaptation
5
+ version: "1.0.0"
6
+ ---
7
+
8
+ # Security Bounty Hunter
9
+
10
+ Use this when the goal is practical vulnerability discovery for responsible disclosure or bounty submission, not a broad best-practices review.
11
+
12
+ ## When to Use
13
+
14
+ - Scanning a repository for exploitable vulnerabilities
15
+ - Preparing a Huntr, HackerOne, or similar bounty submission
16
+ - Triage where the question is "does this actually pay?" rather than "is this theoretically unsafe?"
17
+
18
+ ## How It Works
19
+
20
+ Bias toward remotely reachable, user-controlled attack paths and throw away patterns that platforms routinely reject as informative or out of scope.
21
+
22
+ ## In-Scope Patterns
23
+
24
+ These are the kinds of issues that consistently matter:
25
+
26
+ | Pattern | CWE | Typical impact |
27
+ | --- | --- | --- |
28
+ | SSRF through user-controlled URLs | CWE-918 | internal network access, cloud metadata theft |
29
+ | Auth bypass in middleware or API guards | CWE-287 | unauthorized account or data access |
30
+ | Remote deserialization or upload-to-RCE paths | CWE-502 | code execution |
31
+ | SQL injection in reachable endpoints | CWE-89 | data exfiltration, auth bypass, data destruction |
32
+ | Command injection in request handlers | CWE-78 | code execution |
33
+ | Path traversal in file-serving paths | CWE-22 | arbitrary file read or write |
34
+ | Auto-triggered XSS | CWE-79 | session theft, admin compromise |
35
+
36
+ ## Skip These
37
+
38
+ These are usually low-signal or out of bounty scope unless the program says otherwise:
39
+
40
+ - Local-only `pickle.loads`, `torch.load`, or equivalent with no remote path
41
+ - `eval()` or `exec()` in CLI-only tooling
42
+ - `shell=True` on fully hardcoded commands
43
+ - Missing security headers by themselves
44
+ - Generic rate-limiting complaints without exploit impact
45
+ - Self-XSS requiring the victim to paste code manually
46
+ - CI/CD injection that is not part of the target program scope
47
+ - Demo, example, or test-only code
48
+
49
+ ## Workflow
50
+
51
+ 1. Check scope first: program rules, SECURITY.md, disclosure channel, and exclusions.
52
+ 2. Find real entrypoints: HTTP handlers, uploads, background jobs, webhooks, parsers, and integration endpoints.
53
+ 3. Run static tooling where it helps, but treat it as triage input only.
54
+ 4. Read the real code path end to end.
55
+ 5. Prove user control reaches a meaningful sink.
56
+ 6. Confirm exploitability and impact with the smallest safe PoC possible.
57
+ 7. Check for duplicates before drafting a report.
58
+
59
+ ## Example Triage Loop
60
+
61
+ ```bash
62
+ semgrep --config=auto --severity=ERROR --severity=WARNING --json
63
+ ```
64
+
65
+ Then manually filter:
66
+
67
+ - drop tests, demos, fixtures, vendored code
68
+ - drop local-only or non-reachable paths
69
+ - keep only findings with a clear network or user-controlled route
70
+
71
+ ## Report Structure
72
+
73
+ ```markdown
74
+ ## Description
75
+ [What the vulnerability is and why it matters]
76
+
77
+ ## Vulnerable Code
78
+ [File path, line range, and a small snippet]
79
+
80
+ ## Proof of Concept
81
+ [Minimal working request or script]
82
+
83
+ ## Impact
84
+ [What the attacker can achieve]
85
+
86
+ ## Affected Version
87
+ [Version, commit, or deployment target tested]
88
+ ```
89
+
90
+ ## Quality Gate
91
+
92
+ Before submitting:
93
+
94
+ - The code path is reachable from a real user or network boundary
95
+ - The input is genuinely user-controlled
96
+ - The sink is meaningful and exploitable
97
+ - The PoC works
98
+ - The issue is not already covered by an advisory, CVE, or open ticket
99
+ - The target is actually in scope for the bounty program
@@ -0,0 +1,502 @@
1
+ ---
2
+ name: security-review
3
+ description: Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment/sensitive features. Provides comprehensive security checklist and patterns.
4
+ ---
5
+
6
+ # Security Review Skill
7
+
8
+ This skill ensures all code follows security best practices and identifies potential vulnerabilities.
9
+
10
+ ## When to Activate
11
+
12
+ - Implementing authentication or authorization
13
+ - Handling user input or file uploads
14
+ - Creating new API endpoints
15
+ - Working with secrets or credentials
16
+ - Implementing payment features
17
+ - Storing or transmitting sensitive data
18
+ - Integrating third-party APIs
19
+
20
+ ## Security Checklist
21
+
22
+ ### 1. Secrets Management
23
+
24
+ #### FAIL: NEVER Do This
25
+ ```typescript
26
+ const apiKey = "sk-proj-xxxxx" // Hardcoded secret
27
+ const dbPassword = "password123" // In source code
28
+ ```
29
+
30
+ #### PASS: ALWAYS Do This
31
+ ```typescript
32
+ const apiKey = process.env.OPENAI_API_KEY
33
+ const dbUrl = process.env.DATABASE_URL
34
+
35
+ // Verify secrets exist
36
+ if (!apiKey) {
37
+ throw new Error('OPENAI_API_KEY not configured')
38
+ }
39
+ ```
40
+
41
+ #### Verification Steps
42
+ - [ ] No hardcoded API keys, tokens, or passwords
43
+ - [ ] All secrets in environment variables
44
+ - [ ] `.env.local` in .gitignore
45
+ - [ ] No secrets in git history
46
+ - [ ] Production secrets in hosting platform (Vercel, Railway)
47
+
48
+ ### 2. Input Validation
49
+
50
+ #### Always Validate User Input
51
+ ```typescript
52
+ import { z } from 'zod'
53
+
54
+ // Define validation schema
55
+ const CreateUserSchema = z.object({
56
+ email: z.string().email(),
57
+ name: z.string().min(1).max(100),
58
+ age: z.number().int().min(0).max(150)
59
+ })
60
+
61
+ // Validate before processing
62
+ export async function createUser(input: unknown) {
63
+ try {
64
+ const validated = CreateUserSchema.parse(input)
65
+ return await db.users.create(validated)
66
+ } catch (error) {
67
+ if (error instanceof z.ZodError) {
68
+ return { success: false, errors: error.errors }
69
+ }
70
+ throw error
71
+ }
72
+ }
73
+ ```
74
+
75
+ #### File Upload Validation
76
+ ```typescript
77
+ function validateFileUpload(file: File) {
78
+ // Size check (5MB max)
79
+ const maxSize = 5 * 1024 * 1024
80
+ if (file.size > maxSize) {
81
+ throw new Error('File too large (max 5MB)')
82
+ }
83
+
84
+ // Type check
85
+ const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
86
+ if (!allowedTypes.includes(file.type)) {
87
+ throw new Error('Invalid file type')
88
+ }
89
+
90
+ // Extension check
91
+ const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
92
+ const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
93
+ if (!extension || !allowedExtensions.includes(extension)) {
94
+ throw new Error('Invalid file extension')
95
+ }
96
+
97
+ return true
98
+ }
99
+ ```
100
+
101
+ #### Verification Steps
102
+ - [ ] All user inputs validated with schemas
103
+ - [ ] File uploads restricted (size, type, extension)
104
+ - [ ] No direct use of user input in queries
105
+ - [ ] Whitelist validation (not blacklist)
106
+ - [ ] Error messages don't leak sensitive info
107
+
108
+ ### 3. SQL Injection Prevention
109
+
110
+ #### FAIL: NEVER Concatenate SQL
111
+ ```typescript
112
+ // DANGEROUS - SQL Injection vulnerability
113
+ const query = `SELECT * FROM users WHERE email = '${userEmail}'`
114
+ await db.query(query)
115
+ ```
116
+
117
+ #### PASS: ALWAYS Use Parameterized Queries
118
+ ```typescript
119
+ // Safe - parameterized query
120
+ const { data } = await supabase
121
+ .from('users')
122
+ .select('*')
123
+ .eq('email', userEmail)
124
+
125
+ // Or with raw SQL
126
+ await db.query(
127
+ 'SELECT * FROM users WHERE email = $1',
128
+ [userEmail]
129
+ )
130
+ ```
131
+
132
+ #### Verification Steps
133
+ - [ ] All database queries use parameterized queries
134
+ - [ ] No string concatenation in SQL
135
+ - [ ] ORM/query builder used correctly
136
+ - [ ] Supabase queries properly sanitized
137
+
138
+ ### 4. Authentication & Authorization
139
+
140
+ #### JWT Token Handling
141
+ ```typescript
142
+ // FAIL: WRONG: localStorage (vulnerable to XSS)
143
+ localStorage.setItem('token', token)
144
+
145
+ // PASS: CORRECT: httpOnly cookies
146
+ res.setHeader('Set-Cookie',
147
+ `token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
148
+ ```
149
+
150
+ #### Authorization Checks
151
+ ```typescript
152
+ export async function deleteUser(userId: string, requesterId: string) {
153
+ // ALWAYS verify authorization first
154
+ const requester = await db.users.findUnique({
155
+ where: { id: requesterId }
156
+ })
157
+
158
+ if (requester.role !== 'admin') {
159
+ return NextResponse.json(
160
+ { error: 'Unauthorized' },
161
+ { status: 403 }
162
+ )
163
+ }
164
+
165
+ // Proceed with deletion
166
+ await db.users.delete({ where: { id: userId } })
167
+ }
168
+ ```
169
+
170
+ #### Row Level Security (Supabase)
171
+ ```sql
172
+ -- Enable RLS on all tables
173
+ ALTER TABLE users ENABLE ROW LEVEL SECURITY;
174
+
175
+ -- Users can only view their own data
176
+ CREATE POLICY "Users view own data"
177
+ ON users FOR SELECT
178
+ USING (auth.uid() = id);
179
+
180
+ -- Users can only update their own data
181
+ CREATE POLICY "Users update own data"
182
+ ON users FOR UPDATE
183
+ USING (auth.uid() = id);
184
+ ```
185
+
186
+ #### Verification Steps
187
+ - [ ] Tokens stored in httpOnly cookies (not localStorage)
188
+ - [ ] Authorization checks before sensitive operations
189
+ - [ ] Row Level Security enabled in Supabase
190
+ - [ ] Role-based access control implemented
191
+ - [ ] Session management secure
192
+
193
+ ### 5. XSS Prevention
194
+
195
+ #### Sanitize HTML
196
+ ```typescript
197
+ import DOMPurify from 'isomorphic-dompurify'
198
+
199
+ // ALWAYS sanitize user-provided HTML
200
+ function renderUserContent(html: string) {
201
+ const clean = DOMPurify.sanitize(html, {
202
+ ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
203
+ ALLOWED_ATTR: []
204
+ })
205
+ return <div dangerouslySetInnerHTML={{ __html: clean }} />
206
+ }
207
+ ```
208
+
209
+ #### Content Security Policy
210
+
211
+ Start strict and loosen only with a documented removal plan. Do not default to
212
+ `'unsafe-inline'` or `'unsafe-eval'`; they neutralize much of CSP's protection
213
+ and should be treated as temporary compatibility debt.
214
+
215
+ ```typescript
216
+ // next.config.js
217
+ const securityHeaders = [
218
+ {
219
+ key: 'Content-Security-Policy',
220
+ value: `
221
+ default-src 'self';
222
+ base-uri 'self';
223
+ object-src 'none';
224
+ frame-ancestors 'none';
225
+ script-src 'self';
226
+ style-src 'self';
227
+ img-src 'self' data: https:;
228
+ font-src 'self';
229
+ connect-src 'self' https://api.example.com;
230
+ `.replace(/\s{2,}/g, ' ').trim()
231
+ }
232
+ ]
233
+ ```
234
+
235
+ #### Verification Steps
236
+ - [ ] User-provided HTML sanitized
237
+ - [ ] CSP headers configured
238
+ - [ ] No unvalidated dynamic content rendering
239
+ - [ ] React's built-in XSS protection used
240
+
241
+ ### 6. CSRF Protection
242
+
243
+ #### CSRF Tokens
244
+ ```typescript
245
+ import { csrf } from '@/lib/csrf'
246
+
247
+ export async function POST(request: Request) {
248
+ const token = request.headers.get('X-CSRF-Token')
249
+
250
+ if (!csrf.verify(token)) {
251
+ return NextResponse.json(
252
+ { error: 'Invalid CSRF token' },
253
+ { status: 403 }
254
+ )
255
+ }
256
+
257
+ // Process request
258
+ }
259
+ ```
260
+
261
+ #### SameSite Cookies
262
+ ```typescript
263
+ res.setHeader('Set-Cookie',
264
+ `session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)
265
+ ```
266
+
267
+ #### Verification Steps
268
+ - [ ] CSRF tokens on state-changing operations
269
+ - [ ] SameSite=Strict on all cookies
270
+ - [ ] Double-submit cookie pattern implemented
271
+
272
+ ### 7. Rate Limiting
273
+
274
+ #### API Rate Limiting
275
+ ```typescript
276
+ import rateLimit from 'express-rate-limit'
277
+
278
+ const limiter = rateLimit({
279
+ windowMs: 15 * 60 * 1000, // 15 minutes
280
+ max: 100, // 100 requests per window
281
+ message: 'Too many requests'
282
+ })
283
+
284
+ // Apply to routes
285
+ app.use('/api/', limiter)
286
+ ```
287
+
288
+ #### Expensive Operations
289
+ ```typescript
290
+ // Aggressive rate limiting for searches
291
+ const searchLimiter = rateLimit({
292
+ windowMs: 60 * 1000, // 1 minute
293
+ max: 10, // 10 requests per minute
294
+ message: 'Too many search requests'
295
+ })
296
+
297
+ app.use('/api/search', searchLimiter)
298
+ ```
299
+
300
+ #### Verification Steps
301
+ - [ ] Rate limiting on all API endpoints
302
+ - [ ] Stricter limits on expensive operations
303
+ - [ ] IP-based rate limiting
304
+ - [ ] User-based rate limiting (authenticated)
305
+
306
+ ### 8. Sensitive Data Exposure
307
+
308
+ #### Logging
309
+ ```typescript
310
+ // FAIL: WRONG: Logging sensitive data
311
+ console.log('User login:', { email, password })
312
+ console.log('Payment:', { cardNumber, cvv })
313
+
314
+ // PASS: CORRECT: Redact sensitive data
315
+ console.log('User login:', { email, userId })
316
+ console.log('Payment:', { last4: card.last4, userId })
317
+ ```
318
+
319
+ #### Error Messages
320
+ ```typescript
321
+ // FAIL: WRONG: Exposing internal details
322
+ catch (error) {
323
+ return NextResponse.json(
324
+ { error: error.message, stack: error.stack },
325
+ { status: 500 }
326
+ )
327
+ }
328
+
329
+ // PASS: CORRECT: Generic error messages
330
+ catch (error) {
331
+ console.error('Internal error:', error)
332
+ return NextResponse.json(
333
+ { error: 'An error occurred. Please try again.' },
334
+ { status: 500 }
335
+ )
336
+ }
337
+ ```
338
+
339
+ #### Verification Steps
340
+ - [ ] No passwords, tokens, or secrets in logs
341
+ - [ ] Error messages generic for users
342
+ - [ ] Detailed errors only in server logs
343
+ - [ ] No stack traces exposed to users
344
+
345
+ ### 9. Blockchain Security (Solana)
346
+
347
+ #### Wallet Verification
348
+ ```typescript
349
+ import { verify } from '@solana/web3.js'
350
+
351
+ async function verifyWalletOwnership(
352
+ publicKey: string,
353
+ signature: string,
354
+ message: string
355
+ ) {
356
+ try {
357
+ const isValid = verify(
358
+ Buffer.from(message),
359
+ Buffer.from(signature, 'base64'),
360
+ Buffer.from(publicKey, 'base64')
361
+ )
362
+ return isValid
363
+ } catch (error) {
364
+ return false
365
+ }
366
+ }
367
+ ```
368
+
369
+ #### Transaction Verification
370
+ ```typescript
371
+ async function verifyTransaction(transaction: Transaction) {
372
+ // Verify recipient
373
+ if (transaction.to !== expectedRecipient) {
374
+ throw new Error('Invalid recipient')
375
+ }
376
+
377
+ // Verify amount
378
+ if (transaction.amount > maxAmount) {
379
+ throw new Error('Amount exceeds limit')
380
+ }
381
+
382
+ // Verify user has sufficient balance
383
+ const balance = await getBalance(transaction.from)
384
+ if (balance < transaction.amount) {
385
+ throw new Error('Insufficient balance')
386
+ }
387
+
388
+ return true
389
+ }
390
+ ```
391
+
392
+ #### Verification Steps
393
+ - [ ] Wallet signatures verified
394
+ - [ ] Transaction details validated
395
+ - [ ] Balance checks before transactions
396
+ - [ ] No blind transaction signing
397
+
398
+ ### 10. Dependency Security
399
+
400
+ #### Regular Updates
401
+ ```bash
402
+ # Check for vulnerabilities
403
+ npm audit
404
+
405
+ # Fix automatically fixable issues
406
+ npm audit fix
407
+
408
+ # Update dependencies
409
+ npm update
410
+
411
+ # Check for outdated packages
412
+ npm outdated
413
+ ```
414
+
415
+ #### Lock Files
416
+ ```bash
417
+ # ALWAYS commit lock files
418
+ git add package-lock.json
419
+
420
+ # Use in CI/CD for reproducible builds
421
+ npm ci # Instead of npm install
422
+ ```
423
+
424
+ #### Verification Steps
425
+ - [ ] Dependencies up to date
426
+ - [ ] No known vulnerabilities (npm audit clean)
427
+ - [ ] Lock files committed
428
+ - [ ] Dependabot enabled on GitHub
429
+ - [ ] Regular security updates
430
+
431
+ ## Security Testing
432
+
433
+ ### Automated Security Tests
434
+ ```typescript
435
+ // Test authentication
436
+ test('requires authentication', async () => {
437
+ const response = await fetch('/api/protected')
438
+ expect(response.status).toBe(401)
439
+ })
440
+
441
+ // Test authorization
442
+ test('requires admin role', async () => {
443
+ const response = await fetch('/api/admin', {
444
+ headers: { Authorization: `Bearer ${userToken}` }
445
+ })
446
+ expect(response.status).toBe(403)
447
+ })
448
+
449
+ // Test input validation
450
+ test('rejects invalid input', async () => {
451
+ const response = await fetch('/api/users', {
452
+ method: 'POST',
453
+ body: JSON.stringify({ email: 'not-an-email' })
454
+ })
455
+ expect(response.status).toBe(400)
456
+ })
457
+
458
+ // Test rate limiting
459
+ test('enforces rate limits', async () => {
460
+ const requests = Array(101).fill(null).map(() =>
461
+ fetch('/api/endpoint')
462
+ )
463
+
464
+ const responses = await Promise.all(requests)
465
+ const tooManyRequests = responses.filter(r => r.status === 429)
466
+
467
+ expect(tooManyRequests.length).toBeGreaterThan(0)
468
+ })
469
+ ```
470
+
471
+ ## Pre-Deployment Security Checklist
472
+
473
+ Before ANY production deployment:
474
+
475
+ - [ ] **Secrets**: No hardcoded secrets, all in env vars
476
+ - [ ] **Input Validation**: All user inputs validated
477
+ - [ ] **SQL Injection**: All queries parameterized
478
+ - [ ] **XSS**: User content sanitized
479
+ - [ ] **CSRF**: Protection enabled
480
+ - [ ] **Authentication**: Proper token handling
481
+ - [ ] **Authorization**: Role checks in place
482
+ - [ ] **Rate Limiting**: Enabled on all endpoints
483
+ - [ ] **HTTPS**: Enforced in production
484
+ - [ ] **Security Headers**: CSP, X-Frame-Options configured
485
+ - [ ] **Error Handling**: No sensitive data in errors
486
+ - [ ] **Logging**: No sensitive data logged
487
+ - [ ] **Dependencies**: Up to date, no vulnerabilities
488
+ - [ ] **Row Level Security**: Enabled in Supabase
489
+ - [ ] **CORS**: Properly configured
490
+ - [ ] **File Uploads**: Validated (size, type)
491
+ - [ ] **Wallet Signatures**: Verified (if blockchain)
492
+
493
+ ## Resources
494
+
495
+ - [OWASP Top 10](https://owasp.org/www-project-top-ten/)
496
+ - [Next.js Security](https://nextjs.org/docs/security)
497
+ - [Supabase Security](https://supabase.com/docs/guides/auth)
498
+ - [Web Security Academy](https://portswigger.net/web-security)
499
+
500
+ ---
501
+
502
+ **Remember**: Security is not optional. One vulnerability can compromise the entire platform. When in doubt, err on the side of caution.