@rubix0270/arboris 1.0.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 (451) hide show
  1. package/README.md +151 -0
  2. package/cli/manifest.json +323 -0
  3. package/dist/cli.mjs +376 -0
  4. package/package.json +81 -0
  5. package/prisma/skills/accessibility/SKILL.md +147 -0
  6. package/prisma/skills/agent-architecture-audit/SKILL.md +257 -0
  7. package/prisma/skills/agent-eval/SKILL.md +146 -0
  8. package/prisma/skills/agent-harness-construction/SKILL.md +74 -0
  9. package/prisma/skills/agent-introspection-debugging/SKILL.md +154 -0
  10. package/prisma/skills/agent-payment-x402/SKILL.md +225 -0
  11. package/prisma/skills/agent-self-evaluation/SKILL.md +182 -0
  12. package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +87 -0
  13. package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +86 -0
  14. package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -0
  15. package/prisma/skills/agent-self-evaluation/references/hook-integration.md +64 -0
  16. package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +408 -0
  17. package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +86 -0
  18. package/prisma/skills/agent-sort/SKILL.md +216 -0
  19. package/prisma/skills/agentic-engineering/SKILL.md +64 -0
  20. package/prisma/skills/agentic-os/SKILL.md +388 -0
  21. package/prisma/skills/ai-first-engineering/SKILL.md +52 -0
  22. package/prisma/skills/ai-regression-testing/SKILL.md +386 -0
  23. package/prisma/skills/android-clean-architecture/SKILL.md +340 -0
  24. package/prisma/skills/angular-developer/SKILL.md +155 -0
  25. package/prisma/skills/angular-developer/references/angular-animations.md +160 -0
  26. package/prisma/skills/angular-developer/references/angular-aria.md +410 -0
  27. package/prisma/skills/angular-developer/references/cli.md +86 -0
  28. package/prisma/skills/angular-developer/references/component-harnesses.md +59 -0
  29. package/prisma/skills/angular-developer/references/component-styling.md +91 -0
  30. package/prisma/skills/angular-developer/references/components.md +117 -0
  31. package/prisma/skills/angular-developer/references/creating-services.md +97 -0
  32. package/prisma/skills/angular-developer/references/data-resolvers.md +69 -0
  33. package/prisma/skills/angular-developer/references/define-routes.md +67 -0
  34. package/prisma/skills/angular-developer/references/defining-providers.md +72 -0
  35. package/prisma/skills/angular-developer/references/di-fundamentals.md +120 -0
  36. package/prisma/skills/angular-developer/references/e2e-testing.md +56 -0
  37. package/prisma/skills/angular-developer/references/effects.md +83 -0
  38. package/prisma/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  39. package/prisma/skills/angular-developer/references/host-elements.md +80 -0
  40. package/prisma/skills/angular-developer/references/injection-context.md +63 -0
  41. package/prisma/skills/angular-developer/references/inputs.md +101 -0
  42. package/prisma/skills/angular-developer/references/linked-signal.md +59 -0
  43. package/prisma/skills/angular-developer/references/loading-strategies.md +61 -0
  44. package/prisma/skills/angular-developer/references/mcp.md +108 -0
  45. package/prisma/skills/angular-developer/references/navigate-to-routes.md +69 -0
  46. package/prisma/skills/angular-developer/references/outputs.md +86 -0
  47. package/prisma/skills/angular-developer/references/reactive-forms.md +122 -0
  48. package/prisma/skills/angular-developer/references/rendering-strategies.md +44 -0
  49. package/prisma/skills/angular-developer/references/resource.md +77 -0
  50. package/prisma/skills/angular-developer/references/route-animations.md +56 -0
  51. package/prisma/skills/angular-developer/references/route-guards.md +52 -0
  52. package/prisma/skills/angular-developer/references/router-lifecycle.md +45 -0
  53. package/prisma/skills/angular-developer/references/router-testing.md +87 -0
  54. package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  55. package/prisma/skills/angular-developer/references/signal-forms.md +795 -0
  56. package/prisma/skills/angular-developer/references/signals-overview.md +94 -0
  57. package/prisma/skills/angular-developer/references/tailwind-css.md +69 -0
  58. package/prisma/skills/angular-developer/references/template-driven-forms.md +114 -0
  59. package/prisma/skills/angular-developer/references/testing-fundamentals.md +65 -0
  60. package/prisma/skills/api-connector-builder/SKILL.md +121 -0
  61. package/prisma/skills/api-design/SKILL.md +524 -0
  62. package/prisma/skills/architecture-decision-records/SKILL.md +180 -0
  63. package/prisma/skills/article-writing/SKILL.md +80 -0
  64. package/prisma/skills/automation-audit-ops/SKILL.md +143 -0
  65. package/prisma/skills/autonomous-agent-harness/SKILL.md +274 -0
  66. package/prisma/skills/autonomous-loops/SKILL.md +611 -0
  67. package/prisma/skills/backend-patterns/SKILL.md +562 -0
  68. package/prisma/skills/benchmark/SKILL.md +94 -0
  69. package/prisma/skills/benchmark-methodology/SKILL.md +190 -0
  70. package/prisma/skills/benchmark-optimization-loop/SKILL.md +70 -0
  71. package/prisma/skills/blender-motion-state-inspection/SKILL.md +165 -0
  72. package/prisma/skills/blueprint/SKILL.md +106 -0
  73. package/prisma/skills/brand-discovery/SKILL.md +145 -0
  74. package/prisma/skills/brand-discovery/references/10_purpose-why.md +40 -0
  75. package/prisma/skills/brand-discovery/references/20_positioning.md +44 -0
  76. package/prisma/skills/brand-discovery/references/30_audience-niche.md +52 -0
  77. package/prisma/skills/brand-discovery/references/40_personality-archetype.md +57 -0
  78. package/prisma/skills/brand-discovery/references/50_voice-tone.md +59 -0
  79. package/prisma/skills/brand-discovery/references/60_narrative-story.md +50 -0
  80. package/prisma/skills/brand-discovery/references/70_founder-tension.md +49 -0
  81. package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +133 -0
  82. package/prisma/skills/brand-voice/SKILL.md +98 -0
  83. package/prisma/skills/brand-voice/references/voice-profile-schema.md +55 -0
  84. package/prisma/skills/browser-qa/SKILL.md +105 -0
  85. package/prisma/skills/bun-runtime/SKILL.md +85 -0
  86. package/prisma/skills/canary-watch/SKILL.md +108 -0
  87. package/prisma/skills/carrier-relationship-management/SKILL.md +212 -0
  88. package/prisma/skills/cisco-ios-patterns/SKILL.md +164 -0
  89. package/prisma/skills/ck/SKILL.md +148 -0
  90. package/prisma/skills/ck/commands/forget.mjs +44 -0
  91. package/prisma/skills/ck/commands/info.mjs +24 -0
  92. package/prisma/skills/ck/commands/init.mjs +143 -0
  93. package/prisma/skills/ck/commands/list.mjs +40 -0
  94. package/prisma/skills/ck/commands/migrate.mjs +202 -0
  95. package/prisma/skills/ck/commands/resume.mjs +36 -0
  96. package/prisma/skills/ck/commands/save.mjs +210 -0
  97. package/prisma/skills/ck/commands/shared.mjs +387 -0
  98. package/prisma/skills/ck/hooks/session-start.mjs +224 -0
  99. package/prisma/skills/claude-devfleet/SKILL.md +112 -0
  100. package/prisma/skills/click-path-audit/SKILL.md +245 -0
  101. package/prisma/skills/clickhouse-io/SKILL.md +440 -0
  102. package/prisma/skills/code-tour/SKILL.md +254 -0
  103. package/prisma/skills/codebase-onboarding/SKILL.md +234 -0
  104. package/prisma/skills/codehealth-mcp/SKILL.md +167 -0
  105. package/prisma/skills/coding-standards/SKILL.md +551 -0
  106. package/prisma/skills/competitive-platform-analysis/SKILL.md +214 -0
  107. package/prisma/skills/competitive-report-structure/SKILL.md +162 -0
  108. package/prisma/skills/compose-multiplatform-patterns/SKILL.md +300 -0
  109. package/prisma/skills/config-gc/SKILL.md +120 -0
  110. package/prisma/skills/configure-ecc/SKILL.md +385 -0
  111. package/prisma/skills/connections-optimizer/SKILL.md +190 -0
  112. package/prisma/skills/content-engine/SKILL.md +132 -0
  113. package/prisma/skills/content-hash-cache-pattern/SKILL.md +162 -0
  114. package/prisma/skills/context-budget/SKILL.md +136 -0
  115. package/prisma/skills/continuous-agent-loop/SKILL.md +46 -0
  116. package/prisma/skills/continuous-learning/SKILL.md +132 -0
  117. package/prisma/skills/continuous-learning/config.json +18 -0
  118. package/prisma/skills/continuous-learning/evaluate-session.sh +69 -0
  119. package/prisma/skills/continuous-learning-v2/SKILL.md +361 -0
  120. package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +359 -0
  121. package/prisma/skills/continuous-learning-v2/agents/observer.md +189 -0
  122. package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  123. package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  124. package/prisma/skills/continuous-learning-v2/config.json +8 -0
  125. package/prisma/skills/continuous-learning-v2/hooks/observe.sh +585 -0
  126. package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +322 -0
  127. package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +1956 -0
  128. package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  129. package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +68 -0
  130. package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1421 -0
  131. package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
  132. package/prisma/skills/cost-tracking/SKILL.md +97 -0
  133. package/prisma/skills/council/SKILL.md +204 -0
  134. package/prisma/skills/cpp-coding-standards/SKILL.md +724 -0
  135. package/prisma/skills/cpp-testing/SKILL.md +325 -0
  136. package/prisma/skills/crosspost/SKILL.md +112 -0
  137. package/prisma/skills/csharp-testing/SKILL.md +322 -0
  138. package/prisma/skills/customer-billing-ops/SKILL.md +141 -0
  139. package/prisma/skills/customs-trade-compliance/SKILL.md +263 -0
  140. package/prisma/skills/dart-flutter-patterns/SKILL.md +564 -0
  141. package/prisma/skills/dashboard-builder/SKILL.md +109 -0
  142. package/prisma/skills/data-scraper-agent/SKILL.md +765 -0
  143. package/prisma/skills/data-throughput-accelerator/SKILL.md +73 -0
  144. package/prisma/skills/database-migrations/SKILL.md +430 -0
  145. package/prisma/skills/deep-research/SKILL.md +160 -0
  146. package/prisma/skills/defi-amm-security/SKILL.md +167 -0
  147. package/prisma/skills/delivery-gate/SKILL.md +126 -0
  148. package/prisma/skills/delivery-gate/hooks/quality-gate.py +220 -0
  149. package/prisma/skills/deployment-patterns/SKILL.md +428 -0
  150. package/prisma/skills/design-system/SKILL.md +83 -0
  151. package/prisma/skills/django-celery/SKILL.md +458 -0
  152. package/prisma/skills/django-patterns/SKILL.md +735 -0
  153. package/prisma/skills/django-security/SKILL.md +644 -0
  154. package/prisma/skills/django-tdd/SKILL.md +730 -0
  155. package/prisma/skills/django-verification/SKILL.md +470 -0
  156. package/prisma/skills/dmux-workflows/SKILL.md +192 -0
  157. package/prisma/skills/docker-patterns/SKILL.md +365 -0
  158. package/prisma/skills/documentation-lookup/SKILL.md +91 -0
  159. package/prisma/skills/dotnet-patterns/SKILL.md +322 -0
  160. package/prisma/skills/dynamic-workflow-mode/SKILL.md +124 -0
  161. package/prisma/skills/e2e-testing/SKILL.md +327 -0
  162. package/prisma/skills/ecc-guide/SKILL.md +190 -0
  163. package/prisma/skills/ecc-recipes/SKILL.md +149 -0
  164. package/prisma/skills/ecc-tools-cost-audit/SKILL.md +161 -0
  165. package/prisma/skills/email-ops/SKILL.md +122 -0
  166. package/prisma/skills/energy-procurement/SKILL.md +228 -0
  167. package/prisma/skills/enterprise-agent-ops/SKILL.md +51 -0
  168. package/prisma/skills/error-handling/SKILL.md +377 -0
  169. package/prisma/skills/eval-harness/SKILL.md +271 -0
  170. package/prisma/skills/evm-token-decimals/SKILL.md +131 -0
  171. package/prisma/skills/exa-search/SKILL.md +108 -0
  172. package/prisma/skills/fal-ai-media/SKILL.md +289 -0
  173. package/prisma/skills/fastapi-patterns/SKILL.md +514 -0
  174. package/prisma/skills/finance-billing-ops/SKILL.md +128 -0
  175. package/prisma/skills/flox-environments/SKILL.md +497 -0
  176. package/prisma/skills/flutter-dart-code-review/SKILL.md +436 -0
  177. package/prisma/skills/foundation-models-on-device/SKILL.md +243 -0
  178. package/prisma/skills/frontend-a11y/SKILL.md +446 -0
  179. package/prisma/skills/frontend-design-direction/SKILL.md +93 -0
  180. package/prisma/skills/frontend-patterns/SKILL.md +657 -0
  181. package/prisma/skills/frontend-slides/SKILL.md +185 -0
  182. package/prisma/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  183. package/prisma/skills/frontend-slides/animation-patterns.md +122 -0
  184. package/prisma/skills/frontend-slides/html-template.md +419 -0
  185. package/prisma/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  186. package/prisma/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  187. package/prisma/skills/frontend-slides/viewport-base.css +153 -0
  188. package/prisma/skills/fsharp-testing/SKILL.md +281 -0
  189. package/prisma/skills/gan-style-harness/SKILL.md +279 -0
  190. package/prisma/skills/gateguard/SKILL.md +133 -0
  191. package/prisma/skills/generating-python-installer/SKILL.md +820 -0
  192. package/prisma/skills/git-workflow/SKILL.md +716 -0
  193. package/prisma/skills/github-ops/SKILL.md +145 -0
  194. package/prisma/skills/golang-patterns/SKILL.md +675 -0
  195. package/prisma/skills/golang-testing/SKILL.md +721 -0
  196. package/prisma/skills/google-workspace-ops/SKILL.md +96 -0
  197. package/prisma/skills/growth-log/SKILL.md +128 -0
  198. package/prisma/skills/healthcare-cdss-patterns/SKILL.md +246 -0
  199. package/prisma/skills/healthcare-emr-patterns/SKILL.md +160 -0
  200. package/prisma/skills/healthcare-eval-harness/SKILL.md +208 -0
  201. package/prisma/skills/healthcare-phi-compliance/SKILL.md +146 -0
  202. package/prisma/skills/hermes-imports/SKILL.md +89 -0
  203. package/prisma/skills/hexagonal-architecture/SKILL.md +277 -0
  204. package/prisma/skills/hipaa-compliance/SKILL.md +79 -0
  205. package/prisma/skills/homelab-network-readiness/SKILL.md +170 -0
  206. package/prisma/skills/homelab-network-setup/SKILL.md +130 -0
  207. package/prisma/skills/homelab-pihole-dns/SKILL.md +275 -0
  208. package/prisma/skills/homelab-vlan-segmentation/SKILL.md +312 -0
  209. package/prisma/skills/homelab-wireguard-vpn/SKILL.md +306 -0
  210. package/prisma/skills/hookify-rules/SKILL.md +128 -0
  211. package/prisma/skills/inherit-legacy-style/SKILL.md +157 -0
  212. package/prisma/skills/intent-driven-development/SKILL.md +360 -0
  213. package/prisma/skills/inventory-demand-planning/SKILL.md +247 -0
  214. package/prisma/skills/investor-materials/SKILL.md +97 -0
  215. package/prisma/skills/investor-outreach/SKILL.md +92 -0
  216. package/prisma/skills/ios-icon-gen/SKILL.md +158 -0
  217. package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  218. package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  219. package/prisma/skills/iterative-retrieval/SKILL.md +212 -0
  220. package/prisma/skills/ito-basket-compare/SKILL.md +64 -0
  221. package/prisma/skills/ito-data-atlas-agent/SKILL.md +64 -0
  222. package/prisma/skills/ito-market-intelligence/SKILL.md +61 -0
  223. package/prisma/skills/ito-trade-planner/SKILL.md +68 -0
  224. package/prisma/skills/java-coding-standards/SKILL.md +384 -0
  225. package/prisma/skills/jira-integration/SKILL.md +303 -0
  226. package/prisma/skills/jpa-patterns/SKILL.md +152 -0
  227. package/prisma/skills/knowledge-ops/SKILL.md +155 -0
  228. package/prisma/skills/kotlin-coroutines-flows/SKILL.md +285 -0
  229. package/prisma/skills/kotlin-exposed-patterns/SKILL.md +720 -0
  230. package/prisma/skills/kotlin-ktor-patterns/SKILL.md +690 -0
  231. package/prisma/skills/kotlin-patterns/SKILL.md +712 -0
  232. package/prisma/skills/kotlin-testing/SKILL.md +825 -0
  233. package/prisma/skills/kubernetes-patterns/SKILL.md +756 -0
  234. package/prisma/skills/laravel-patterns/SKILL.md +416 -0
  235. package/prisma/skills/laravel-plugin-discovery/SKILL.md +230 -0
  236. package/prisma/skills/laravel-security/SKILL.md +948 -0
  237. package/prisma/skills/laravel-tdd/SKILL.md +675 -0
  238. package/prisma/skills/laravel-verification/SKILL.md +180 -0
  239. package/prisma/skills/latency-critical-systems/SKILL.md +74 -0
  240. package/prisma/skills/lead-intelligence/SKILL.md +322 -0
  241. package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  242. package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  243. package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  244. package/prisma/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  245. package/prisma/skills/liquid-glass-design/SKILL.md +279 -0
  246. package/prisma/skills/llm-trading-agent-security/SKILL.md +147 -0
  247. package/prisma/skills/logistics-exception-management/SKILL.md +222 -0
  248. package/prisma/skills/loop-design-check/SKILL.md +143 -0
  249. package/prisma/skills/mailtrap-email-integration/SKILL.md +77 -0
  250. package/prisma/skills/make-interfaces-feel-better/SKILL.md +152 -0
  251. package/prisma/skills/manim-video/SKILL.md +90 -0
  252. package/prisma/skills/manim-video/assets/network_graph_scene.py +52 -0
  253. package/prisma/skills/market-research/SKILL.md +76 -0
  254. package/prisma/skills/marketing-campaign/SKILL.md +114 -0
  255. package/prisma/skills/mcp-server-patterns/SKILL.md +70 -0
  256. package/prisma/skills/messages-ops/SKILL.md +105 -0
  257. package/prisma/skills/ml-adoption-playbook/SKILL.md +57 -0
  258. package/prisma/skills/mle-workflow/SKILL.md +347 -0
  259. package/prisma/skills/motion-advanced/SKILL.md +596 -0
  260. package/prisma/skills/motion-foundations/SKILL.md +299 -0
  261. package/prisma/skills/motion-patterns/SKILL.md +434 -0
  262. package/prisma/skills/motion-ui/SKILL.md +576 -0
  263. package/prisma/skills/mysql-patterns/SKILL.md +413 -0
  264. package/prisma/skills/nanoclaw-repl/SKILL.md +34 -0
  265. package/prisma/skills/nestjs-patterns/SKILL.md +231 -0
  266. package/prisma/skills/netmiko-ssh-automation/SKILL.md +174 -0
  267. package/prisma/skills/network-bgp-diagnostics/SKILL.md +168 -0
  268. package/prisma/skills/network-config-validation/SKILL.md +211 -0
  269. package/prisma/skills/network-interface-health/SKILL.md +153 -0
  270. package/prisma/skills/nextjs-turbopack/SKILL.md +58 -0
  271. package/prisma/skills/nodejs-keccak256/SKILL.md +103 -0
  272. package/prisma/skills/nutrient-document-processing/SKILL.md +168 -0
  273. package/prisma/skills/nuxt4-patterns/SKILL.md +101 -0
  274. package/prisma/skills/openclaw-persona-forge/SKILL.md +289 -0
  275. package/prisma/skills/openclaw-persona-forge/gacha.py +224 -0
  276. package/prisma/skills/openclaw-persona-forge/gacha.sh +5 -0
  277. package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  278. package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  279. package/prisma/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  280. package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  281. package/prisma/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  282. package/prisma/skills/openclaw-persona-forge/references/output-template.md +166 -0
  283. package/prisma/skills/opensource-pipeline/SKILL.md +256 -0
  284. package/prisma/skills/orch-add-feature/SKILL.md +45 -0
  285. package/prisma/skills/orch-build-mvp/SKILL.md +49 -0
  286. package/prisma/skills/orch-change-feature/SKILL.md +43 -0
  287. package/prisma/skills/orch-fix-defect/SKILL.md +43 -0
  288. package/prisma/skills/orch-pipeline/SKILL.md +121 -0
  289. package/prisma/skills/orch-refine-code/SKILL.md +44 -0
  290. package/prisma/skills/parallel-execution-optimizer/SKILL.md +73 -0
  291. package/prisma/skills/perl-patterns/SKILL.md +505 -0
  292. package/prisma/skills/perl-security/SKILL.md +504 -0
  293. package/prisma/skills/perl-testing/SKILL.md +476 -0
  294. package/prisma/skills/plan-orchestrate/SKILL.md +263 -0
  295. package/prisma/skills/plankton-code-quality/SKILL.md +237 -0
  296. package/prisma/skills/postgres-patterns/SKILL.md +148 -0
  297. package/prisma/skills/prediction-market-oracle-research/SKILL.md +64 -0
  298. package/prisma/skills/prediction-market-risk-review/SKILL.md +61 -0
  299. package/prisma/skills/prisma-patterns/SKILL.md +401 -0
  300. package/prisma/skills/product-capability/SKILL.md +142 -0
  301. package/prisma/skills/product-lens/SKILL.md +93 -0
  302. package/prisma/skills/production-audit/SKILL.md +207 -0
  303. package/prisma/skills/production-scheduling/SKILL.md +238 -0
  304. package/prisma/skills/project-flow-ops/SKILL.md +112 -0
  305. package/prisma/skills/prompt-optimizer/SKILL.md +398 -0
  306. package/prisma/skills/python-patterns/SKILL.md +751 -0
  307. package/prisma/skills/python-testing/SKILL.md +817 -0
  308. package/prisma/skills/pytorch-patterns/SKILL.md +397 -0
  309. package/prisma/skills/quality-nonconformance/SKILL.md +260 -0
  310. package/prisma/skills/quarkus-patterns/SKILL.md +723 -0
  311. package/prisma/skills/quarkus-security/SKILL.md +468 -0
  312. package/prisma/skills/quarkus-tdd/SKILL.md +812 -0
  313. package/prisma/skills/quarkus-verification/SKILL.md +480 -0
  314. package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
  315. package/prisma/skills/react-native-patterns/SKILL.md +326 -0
  316. package/prisma/skills/react-patterns/SKILL.md +342 -0
  317. package/prisma/skills/react-performance/SKILL.md +575 -0
  318. package/prisma/skills/react-testing/SKILL.md +424 -0
  319. package/prisma/skills/recsys-pipeline-architect/SKILL.md +115 -0
  320. package/prisma/skills/recursive-decision-ledger/SKILL.md +80 -0
  321. package/prisma/skills/redis-patterns/SKILL.md +404 -0
  322. package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
  323. package/prisma/skills/remotion-video-creation/SKILL.md +43 -0
  324. package/prisma/skills/remotion-video-creation/rules/3d.md +86 -0
  325. package/prisma/skills/remotion-video-creation/rules/animations.md +29 -0
  326. package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  327. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  328. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  329. package/prisma/skills/remotion-video-creation/rules/assets.md +78 -0
  330. package/prisma/skills/remotion-video-creation/rules/audio.md +172 -0
  331. package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  332. package/prisma/skills/remotion-video-creation/rules/can-decode.md +75 -0
  333. package/prisma/skills/remotion-video-creation/rules/charts.md +58 -0
  334. package/prisma/skills/remotion-video-creation/rules/compositions.md +146 -0
  335. package/prisma/skills/remotion-video-creation/rules/display-captions.md +126 -0
  336. package/prisma/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  337. package/prisma/skills/remotion-video-creation/rules/fonts.md +152 -0
  338. package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  339. package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  340. package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  341. package/prisma/skills/remotion-video-creation/rules/gifs.md +138 -0
  342. package/prisma/skills/remotion-video-creation/rules/images.md +130 -0
  343. package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  344. package/prisma/skills/remotion-video-creation/rules/lottie.md +67 -0
  345. package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  346. package/prisma/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  347. package/prisma/skills/remotion-video-creation/rules/sequencing.md +106 -0
  348. package/prisma/skills/remotion-video-creation/rules/tailwind.md +11 -0
  349. package/prisma/skills/remotion-video-creation/rules/text-animations.md +20 -0
  350. package/prisma/skills/remotion-video-creation/rules/timing.md +179 -0
  351. package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  352. package/prisma/skills/remotion-video-creation/rules/transitions.md +122 -0
  353. package/prisma/skills/remotion-video-creation/rules/trimming.md +52 -0
  354. package/prisma/skills/remotion-video-creation/rules/videos.md +171 -0
  355. package/prisma/skills/repo-scan/SKILL.md +79 -0
  356. package/prisma/skills/research-ops/SKILL.md +113 -0
  357. package/prisma/skills/returns-reverse-logistics/SKILL.md +240 -0
  358. package/prisma/skills/rules-distill/SKILL.md +265 -0
  359. package/prisma/skills/rules-distill/scripts/scan-rules.sh +58 -0
  360. package/prisma/skills/rules-distill/scripts/scan-skills.sh +129 -0
  361. package/prisma/skills/rust-patterns/SKILL.md +500 -0
  362. package/prisma/skills/rust-testing/SKILL.md +501 -0
  363. package/prisma/skills/safety-guard/SKILL.md +76 -0
  364. package/prisma/skills/santa-method/SKILL.md +307 -0
  365. package/prisma/skills/scientific-db-pubmed-database/SKILL.md +176 -0
  366. package/prisma/skills/scientific-db-uspto-database/SKILL.md +178 -0
  367. package/prisma/skills/scientific-pkg-gget/SKILL.md +167 -0
  368. package/prisma/skills/scientific-thinking-literature-review/SKILL.md +193 -0
  369. package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
  370. package/prisma/skills/search-first/SKILL.md +183 -0
  371. package/prisma/skills/security-bounty-hunter/SKILL.md +100 -0
  372. package/prisma/skills/security-review/SKILL.md +504 -0
  373. package/prisma/skills/security-review/cloud-infrastructure-security.md +361 -0
  374. package/prisma/skills/security-scan/SKILL.md +166 -0
  375. package/prisma/skills/seo/SKILL.md +155 -0
  376. package/prisma/skills/skill-comply/SKILL.md +59 -0
  377. package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  378. package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  379. package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  380. package/prisma/skills/skill-comply/prompts/classifier.md +24 -0
  381. package/prisma/skills/skill-comply/prompts/scenario_generator.md +62 -0
  382. package/prisma/skills/skill-comply/prompts/spec_generator.md +42 -0
  383. package/prisma/skills/skill-comply/pyproject.toml +15 -0
  384. package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
  385. package/prisma/skills/skill-comply/scripts/classifier.py +85 -0
  386. package/prisma/skills/skill-comply/scripts/grader.py +124 -0
  387. package/prisma/skills/skill-comply/scripts/parser.py +107 -0
  388. package/prisma/skills/skill-comply/scripts/report.py +170 -0
  389. package/prisma/skills/skill-comply/scripts/run.py +127 -0
  390. package/prisma/skills/skill-comply/scripts/runner.py +194 -0
  391. package/prisma/skills/skill-comply/scripts/scenario_generator.py +70 -0
  392. package/prisma/skills/skill-comply/scripts/spec_generator.py +72 -0
  393. package/prisma/skills/skill-comply/scripts/utils.py +13 -0
  394. package/prisma/skills/skill-comply/tests/test_grader.py +197 -0
  395. package/prisma/skills/skill-comply/tests/test_parser.py +90 -0
  396. package/prisma/skills/skill-comply/tests/test_runner.py +172 -0
  397. package/prisma/skills/skill-scout/SKILL.md +141 -0
  398. package/prisma/skills/skill-stocktake/SKILL.md +195 -0
  399. package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  400. package/prisma/skills/skill-stocktake/scripts/save-results.sh +56 -0
  401. package/prisma/skills/skill-stocktake/scripts/scan.sh +170 -0
  402. package/prisma/skills/social-graph-ranker/SKILL.md +155 -0
  403. package/prisma/skills/social-publisher/SKILL.md +130 -0
  404. package/prisma/skills/springboot-patterns/SKILL.md +315 -0
  405. package/prisma/skills/springboot-security/SKILL.md +273 -0
  406. package/prisma/skills/springboot-tdd/SKILL.md +159 -0
  407. package/prisma/skills/springboot-verification/SKILL.md +232 -0
  408. package/prisma/skills/strategic-compact/SKILL.md +136 -0
  409. package/prisma/skills/swift-actor-persistence/SKILL.md +144 -0
  410. package/prisma/skills/swift-concurrency-6-2/SKILL.md +216 -0
  411. package/prisma/skills/swift-protocol-di-testing/SKILL.md +191 -0
  412. package/prisma/skills/swiftui-patterns/SKILL.md +259 -0
  413. package/prisma/skills/taste/SKILL.md +264 -0
  414. package/prisma/skills/taste/references/genre-taxonomy.md +87 -0
  415. package/prisma/skills/tdd-workflow/SKILL.md +583 -0
  416. package/prisma/skills/team-agent-orchestration/SKILL.md +111 -0
  417. package/prisma/skills/team-builder/SKILL.md +169 -0
  418. package/prisma/skills/terminal-ops/SKILL.md +110 -0
  419. package/prisma/skills/tinystruct-patterns/SKILL.md +279 -0
  420. package/prisma/skills/tinystruct-patterns/references/architecture.md +90 -0
  421. package/prisma/skills/tinystruct-patterns/references/data-handling.md +60 -0
  422. package/prisma/skills/tinystruct-patterns/references/database.md +99 -0
  423. package/prisma/skills/tinystruct-patterns/references/routing.md +64 -0
  424. package/prisma/skills/tinystruct-patterns/references/system-usage.md +97 -0
  425. package/prisma/skills/tinystruct-patterns/references/testing.md +72 -0
  426. package/prisma/skills/token-budget-advisor/SKILL.md +134 -0
  427. package/prisma/skills/ui-demo/SKILL.md +466 -0
  428. package/prisma/skills/ui-to-vue/SKILL.md +135 -0
  429. package/prisma/skills/uncloud/SKILL.md +344 -0
  430. package/prisma/skills/unified-notifications-ops/SKILL.md +188 -0
  431. package/prisma/skills/verification-loop/SKILL.md +127 -0
  432. package/prisma/skills/video-editing/SKILL.md +311 -0
  433. package/prisma/skills/videodb/SKILL.md +375 -0
  434. package/prisma/skills/videodb/reference/api-reference.md +550 -0
  435. package/prisma/skills/videodb/reference/capture-reference.md +407 -0
  436. package/prisma/skills/videodb/reference/capture.md +101 -0
  437. package/prisma/skills/videodb/reference/editor.md +443 -0
  438. package/prisma/skills/videodb/reference/generative.md +331 -0
  439. package/prisma/skills/videodb/reference/rtstream-reference.md +564 -0
  440. package/prisma/skills/videodb/reference/rtstream.md +65 -0
  441. package/prisma/skills/videodb/reference/search.md +230 -0
  442. package/prisma/skills/videodb/reference/streaming.md +406 -0
  443. package/prisma/skills/videodb/reference/use-cases.md +118 -0
  444. package/prisma/skills/videodb/scripts/ws_listener.py +282 -0
  445. package/prisma/skills/visa-doc-translate/README.md +86 -0
  446. package/prisma/skills/visa-doc-translate/SKILL.md +117 -0
  447. package/prisma/skills/vite-patterns/SKILL.md +450 -0
  448. package/prisma/skills/vue-patterns/SKILL.md +471 -0
  449. package/prisma/skills/windows-desktop-e2e/SKILL.md +888 -0
  450. package/prisma/skills/workspace-surface-audit/SKILL.md +126 -0
  451. package/prisma/skills/x-api/SKILL.md +235 -0
@@ -0,0 +1,765 @@
1
+ ---
2
+ name: data-scraper-agent
3
+ description: Build a fully automated AI-powered data collection agent for any public source — job boards, prices, news, GitHub, sports, anything. Scrapes on a schedule, enriches data with a free LLM (Gemini Flash), stores results in Notion/Sheets/Supabase, and learns from user feedback. Runs 100% free on GitHub Actions. Use when the user wants to monitor, collect, or track any public data automatically.
4
+ metadata:
5
+ origin: community
6
+ ---
7
+
8
+ # Data Scraper Agent
9
+
10
+ Build a production-ready, AI-powered data collection agent for any public data source.
11
+ Runs on a schedule, enriches results with a free LLM, stores to a database, and improves over time.
12
+
13
+ **Stack: Python · Gemini Flash (free) · GitHub Actions (free) · Notion / Sheets / Supabase**
14
+
15
+ ## When to Activate
16
+
17
+ - User wants to scrape or monitor any public website or API
18
+ - User says "build a bot that checks...", "monitor X for me", "collect data from..."
19
+ - User wants to track jobs, prices, news, repos, sports scores, events, listings
20
+ - User asks how to automate data collection without paying for hosting
21
+ - User wants an agent that gets smarter over time based on their decisions
22
+
23
+ ## Core Concepts
24
+
25
+ ### The Three Layers
26
+
27
+ Every data scraper agent has three layers:
28
+
29
+ ```
30
+ COLLECT → ENRICH → STORE
31
+ │ │ │
32
+ Scraper AI (LLM) Database
33
+ runs on scores/ Notion /
34
+ schedule summarises Sheets /
35
+ & classifies Supabase
36
+ ```
37
+
38
+ ### Free Stack
39
+
40
+ | Layer | Tool | Why |
41
+ |---|---|---|
42
+ | **Scraping** | `requests` + `BeautifulSoup` | No cost, covers 80% of public sites |
43
+ | **JS-rendered sites** | `playwright` (free) | When HTML scraping fails |
44
+ | **AI enrichment** | Gemini Flash via REST API | 500 req/day, 1M tokens/day — free |
45
+ | **Storage** | Notion API | Free tier, great UI for review |
46
+ | **Schedule** | GitHub Actions cron | Free for public repos |
47
+ | **Learning** | JSON feedback file in repo | Zero infra, persists in git |
48
+
49
+ ### AI Model Fallback Chain
50
+
51
+ Build agents to auto-fallback across Gemini models on quota exhaustion:
52
+
53
+ ```
54
+ gemini-2.0-flash-lite (30 RPM) →
55
+ gemini-2.0-flash (15 RPM) →
56
+ gemini-2.5-flash (10 RPM) →
57
+ gemini-flash-lite-latest (fallback)
58
+ ```
59
+
60
+ ### Batch API Calls for Efficiency
61
+
62
+ Never call the LLM once per item. Always batch:
63
+
64
+ ```python
65
+ # BAD: 33 API calls for 33 items
66
+ for item in items:
67
+ result = call_ai(item) # 33 calls → hits rate limit
68
+
69
+ # GOOD: 7 API calls for 33 items (batch size 5)
70
+ for batch in chunks(items, size=5):
71
+ results = call_ai(batch) # 7 calls → stays within free tier
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Workflow
77
+
78
+ ### Step 1: Understand the Goal
79
+
80
+ Ask the user:
81
+
82
+ 1. **What to collect:** "What data source? URL / API / RSS / public endpoint?"
83
+ 2. **What to extract:** "What fields matter? Title, price, URL, date, score?"
84
+ 3. **How to store:** "Where should results go? Notion, Google Sheets, Supabase, or local file?"
85
+ 4. **How to enrich:** "Do you want AI to score, summarise, classify, or match each item?"
86
+ 5. **Frequency:** "How often should it run? Every hour, daily, weekly?"
87
+
88
+ Common examples to prompt:
89
+ - Job boards → score relevance to resume
90
+ - Product prices → alert on drops
91
+ - GitHub repos → summarise new releases
92
+ - News feeds → classify by topic + sentiment
93
+ - Sports results → extract stats to tracker
94
+ - Events calendar → filter by interest
95
+
96
+ ---
97
+
98
+ ### Step 2: Design the Agent Architecture
99
+
100
+ Generate this directory structure for the user:
101
+
102
+ ```
103
+ my-agent/
104
+ ├── config.yaml # User customises this (keywords, filters, preferences)
105
+ ├── profile/
106
+ │ └── context.md # User context the AI uses (resume, interests, criteria)
107
+ ├── scraper/
108
+ │ ├── __init__.py
109
+ │ ├── main.py # Orchestrator: scrape → enrich → store
110
+ │ ├── filters.py # Rule-based pre-filter (fast, before AI)
111
+ │ └── sources/
112
+ │ ├── __init__.py
113
+ │ └── source_name.py # One file per data source
114
+ ├── ai/
115
+ │ ├── __init__.py
116
+ │ ├── client.py # Gemini REST client with model fallback
117
+ │ ├── pipeline.py # Batch AI analysis
118
+ │ ├── jd_fetcher.py # Fetch full content from URLs (optional)
119
+ │ └── memory.py # Learn from user feedback
120
+ ├── storage/
121
+ │ ├── __init__.py
122
+ │ └── notion_sync.py # Or sheets_sync.py / supabase_sync.py
123
+ ├── data/
124
+ │ └── feedback.json # User decision history (auto-updated)
125
+ ├── .env.example
126
+ ├── setup.py # One-time DB/schema creation
127
+ ├── enrich_existing.py # Backfill AI scores on old rows
128
+ ├── requirements.txt
129
+ └── .github/
130
+ └── workflows/
131
+ └── scraper.yml # GitHub Actions schedule
132
+ ```
133
+
134
+ ---
135
+
136
+ ### Step 3: Build the Scraper Source
137
+
138
+ Template for any data source:
139
+
140
+ ```python
141
+ # scraper/sources/my_source.py
142
+ """
143
+ [Source Name] — scrapes [what] from [where].
144
+ Method: [REST API / HTML scraping / RSS feed]
145
+ """
146
+ import requests
147
+ from bs4 import BeautifulSoup
148
+ from datetime import datetime, timezone
149
+ from scraper.filters import is_relevant
150
+
151
+ HEADERS = {
152
+ "User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)",
153
+ }
154
+
155
+
156
+ def fetch() -> list[dict]:
157
+ """
158
+ Returns a list of items with consistent schema.
159
+ Each item must have at minimum: name, url, date_found.
160
+ """
161
+ results = []
162
+
163
+ # ---- REST API source ----
164
+ resp = requests.get("https://api.example.com/items", headers=HEADERS, timeout=15)
165
+ if resp.status_code == 200:
166
+ for item in resp.json().get("results", []):
167
+ if not is_relevant(item.get("title", "")):
168
+ continue
169
+ results.append(_normalise(item))
170
+
171
+ return results
172
+
173
+
174
+ def _normalise(raw: dict) -> dict:
175
+ """Convert raw API/HTML data to the standard schema."""
176
+ return {
177
+ "name": raw.get("title", ""),
178
+ "url": raw.get("link", ""),
179
+ "source": "MySource",
180
+ "date_found": datetime.now(timezone.utc).date().isoformat(),
181
+ # add domain-specific fields here
182
+ }
183
+ ```
184
+
185
+ **HTML scraping pattern:**
186
+ ```python
187
+ soup = BeautifulSoup(resp.text, "lxml")
188
+ for card in soup.select("[class*='listing']"):
189
+ title = card.select_one("h2, h3").get_text(strip=True)
190
+ link = card.select_one("a")["href"]
191
+ if not link.startswith("http"):
192
+ link = f"https://example.com{link}"
193
+ ```
194
+
195
+ **RSS feed pattern:**
196
+ ```python
197
+ import xml.etree.ElementTree as ET
198
+ root = ET.fromstring(resp.text)
199
+ for item in root.findall(".//item"):
200
+ title = item.findtext("title", "")
201
+ link = item.findtext("link", "")
202
+ ```
203
+
204
+ ---
205
+
206
+ ### Step 4: Build the Gemini AI Client
207
+
208
+ ```python
209
+ # ai/client.py
210
+ import os, json, time, requests
211
+
212
+ _last_call = 0.0
213
+
214
+ MODEL_FALLBACK = [
215
+ "gemini-2.0-flash-lite",
216
+ "gemini-2.0-flash",
217
+ "gemini-2.5-flash",
218
+ "gemini-flash-lite-latest",
219
+ ]
220
+
221
+
222
+ def generate(prompt: str, model: str = "", rate_limit: float = 7.0) -> dict:
223
+ """Call Gemini with auto-fallback on 429. Returns parsed JSON or {}."""
224
+ global _last_call
225
+
226
+ api_key = os.environ.get("GEMINI_API_KEY", "")
227
+ if not api_key:
228
+ return {}
229
+
230
+ elapsed = time.time() - _last_call
231
+ if elapsed < rate_limit:
232
+ time.sleep(rate_limit - elapsed)
233
+
234
+ models = [model] + [m for m in MODEL_FALLBACK if m != model] if model else MODEL_FALLBACK
235
+ _last_call = time.time()
236
+
237
+ for m in models:
238
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{m}:generateContent?key={api_key}"
239
+ payload = {
240
+ "contents": [{"parts": [{"text": prompt}]}],
241
+ "generationConfig": {
242
+ "responseMimeType": "application/json",
243
+ "temperature": 0.3,
244
+ "maxOutputTokens": 2048,
245
+ },
246
+ }
247
+ try:
248
+ resp = requests.post(url, json=payload, timeout=30)
249
+ if resp.status_code == 200:
250
+ return _parse(resp)
251
+ if resp.status_code in (429, 404):
252
+ time.sleep(1)
253
+ continue
254
+ return {}
255
+ except requests.RequestException:
256
+ return {}
257
+
258
+ return {}
259
+
260
+
261
+ def _parse(resp) -> dict:
262
+ try:
263
+ text = (
264
+ resp.json()
265
+ .get("candidates", [{}])[0]
266
+ .get("content", {})
267
+ .get("parts", [{}])[0]
268
+ .get("text", "")
269
+ .strip()
270
+ )
271
+ if text.startswith("```"):
272
+ text = text.split("\n", 1)[-1].rsplit("```", 1)[0]
273
+ return json.loads(text)
274
+ except (json.JSONDecodeError, KeyError):
275
+ return {}
276
+ ```
277
+
278
+ ---
279
+
280
+ ### Step 5: Build the AI Pipeline (Batch)
281
+
282
+ ```python
283
+ # ai/pipeline.py
284
+ import json
285
+ import yaml
286
+ from pathlib import Path
287
+ from ai.client import generate
288
+
289
+ def analyse_batch(items: list[dict], context: str = "", preference_prompt: str = "") -> list[dict]:
290
+ """Analyse items in batches. Returns items enriched with AI fields."""
291
+ config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
292
+ model = config.get("ai", {}).get("model", "gemini-2.5-flash")
293
+ rate_limit = config.get("ai", {}).get("rate_limit_seconds", 7.0)
294
+ min_score = config.get("ai", {}).get("min_score", 0)
295
+ batch_size = config.get("ai", {}).get("batch_size", 5)
296
+
297
+ batches = [items[i:i + batch_size] for i in range(0, len(items), batch_size)]
298
+ print(f" [AI] {len(items)} items → {len(batches)} API calls")
299
+
300
+ enriched = []
301
+ for i, batch in enumerate(batches):
302
+ print(f" [AI] Batch {i + 1}/{len(batches)}...")
303
+ prompt = _build_prompt(batch, context, preference_prompt, config)
304
+ result = generate(prompt, model=model, rate_limit=rate_limit)
305
+
306
+ analyses = result.get("analyses", [])
307
+ for j, item in enumerate(batch):
308
+ ai = analyses[j] if j < len(analyses) else {}
309
+ if ai:
310
+ score = max(0, min(100, int(ai.get("score", 0))))
311
+ if min_score and score < min_score:
312
+ continue
313
+ enriched.append({**item, "ai_score": score, "ai_summary": ai.get("summary", ""), "ai_notes": ai.get("notes", "")})
314
+ else:
315
+ enriched.append(item)
316
+
317
+ return enriched
318
+
319
+
320
+ def _build_prompt(batch, context, preference_prompt, config):
321
+ priorities = config.get("priorities", [])
322
+ items_text = "\n\n".join(
323
+ f"Item {i+1}: {json.dumps({k: v for k, v in item.items() if not k.startswith('_')})}"
324
+ for i, item in enumerate(batch)
325
+ )
326
+
327
+ return f"""Analyse these {len(batch)} items and return a JSON object.
328
+
329
+ # Items
330
+ {items_text}
331
+
332
+ # User Context
333
+ {context[:800] if context else "Not provided"}
334
+
335
+ # User Priorities
336
+ {chr(10).join(f"- {p}" for p in priorities)}
337
+
338
+ {preference_prompt}
339
+
340
+ # Instructions
341
+ Return: {{"analyses": [{{"score": <0-100>, "summary": "<2 sentences>", "notes": "<why this matches or doesn't>"}} for each item in order]}}
342
+ Be concise. Score 90+=excellent match, 70-89=good, 50-69=ok, <50=weak."""
343
+ ```
344
+
345
+ ---
346
+
347
+ ### Step 6: Build the Feedback Learning System
348
+
349
+ ```python
350
+ # ai/memory.py
351
+ """Learn from user decisions to improve future scoring."""
352
+ import json
353
+ from pathlib import Path
354
+
355
+ FEEDBACK_PATH = Path(__file__).parent.parent / "data" / "feedback.json"
356
+
357
+
358
+ def load_feedback() -> dict:
359
+ if FEEDBACK_PATH.exists():
360
+ try:
361
+ return json.loads(FEEDBACK_PATH.read_text())
362
+ except (json.JSONDecodeError, OSError):
363
+ pass
364
+ return {"positive": [], "negative": []}
365
+
366
+
367
+ def save_feedback(fb: dict):
368
+ FEEDBACK_PATH.parent.mkdir(parents=True, exist_ok=True)
369
+ FEEDBACK_PATH.write_text(json.dumps(fb, indent=2))
370
+
371
+
372
+ def build_preference_prompt(feedback: dict, max_examples: int = 15) -> str:
373
+ """Convert feedback history into a prompt bias section."""
374
+ lines = []
375
+ if feedback.get("positive"):
376
+ lines.append("# Items the user LIKED (positive signal):")
377
+ for e in feedback["positive"][-max_examples:]:
378
+ lines.append(f"- {e}")
379
+ if feedback.get("negative"):
380
+ lines.append("\n# Items the user SKIPPED/REJECTED (negative signal):")
381
+ for e in feedback["negative"][-max_examples:]:
382
+ lines.append(f"- {e}")
383
+ if lines:
384
+ lines.append("\nUse these patterns to bias scoring on new items.")
385
+ return "\n".join(lines)
386
+ ```
387
+
388
+ **Integration with your storage layer:** after each run, query your DB for items with positive/negative status and call `save_feedback()` with the extracted patterns.
389
+
390
+ ---
391
+
392
+ ### Step 7: Build Storage (Notion example)
393
+
394
+ ```python
395
+ # storage/notion_sync.py
396
+ import os
397
+ from notion_client import Client
398
+ from notion_client.errors import APIResponseError
399
+
400
+ _client = None
401
+
402
+ def get_client():
403
+ global _client
404
+ if _client is None:
405
+ _client = Client(auth=os.environ["NOTION_TOKEN"])
406
+ return _client
407
+
408
+ def get_existing_urls(db_id: str) -> set[str]:
409
+ """Fetch all URLs already stored — used for deduplication."""
410
+ client, seen, cursor = get_client(), set(), None
411
+ while True:
412
+ resp = client.databases.query(database_id=db_id, page_size=100, **{"start_cursor": cursor} if cursor else {})
413
+ for page in resp["results"]:
414
+ url = page["properties"].get("URL", {}).get("url", "")
415
+ if url: seen.add(url)
416
+ if not resp["has_more"]: break
417
+ cursor = resp["next_cursor"]
418
+ return seen
419
+
420
+ def push_item(db_id: str, item: dict) -> bool:
421
+ """Push one item to Notion. Returns True on success."""
422
+ props = {
423
+ "Name": {"title": [{"text": {"content": item.get("name", "")[:100]}}]},
424
+ "URL": {"url": item.get("url")},
425
+ "Source": {"select": {"name": item.get("source", "Unknown")}},
426
+ "Date Found": {"date": {"start": item.get("date_found")}},
427
+ "Status": {"select": {"name": "New"}},
428
+ }
429
+ # AI fields
430
+ if item.get("ai_score") is not None:
431
+ props["AI Score"] = {"number": item["ai_score"]}
432
+ if item.get("ai_summary"):
433
+ props["Summary"] = {"rich_text": [{"text": {"content": item["ai_summary"][:2000]}}]}
434
+ if item.get("ai_notes"):
435
+ props["Notes"] = {"rich_text": [{"text": {"content": item["ai_notes"][:2000]}}]}
436
+
437
+ try:
438
+ get_client().pages.create(parent={"database_id": db_id}, properties=props)
439
+ return True
440
+ except APIResponseError as e:
441
+ print(f"[notion] Push failed: {e}")
442
+ return False
443
+
444
+ def sync(db_id: str, items: list[dict]) -> tuple[int, int]:
445
+ existing = get_existing_urls(db_id)
446
+ added = skipped = 0
447
+ for item in items:
448
+ if item.get("url") in existing:
449
+ skipped += 1; continue
450
+ if push_item(db_id, item):
451
+ added += 1; existing.add(item["url"])
452
+ else:
453
+ skipped += 1
454
+ return added, skipped
455
+ ```
456
+
457
+ ---
458
+
459
+ ### Step 8: Orchestrate in main.py
460
+
461
+ ```python
462
+ # scraper/main.py
463
+ import os, sys, yaml
464
+ from pathlib import Path
465
+ from dotenv import load_dotenv
466
+
467
+ load_dotenv()
468
+
469
+ from scraper.sources import my_source # add your sources
470
+
471
+ # NOTE: This example uses Notion. If storage.provider is "sheets" or "supabase",
472
+ # replace this import with storage.sheets_sync or storage.supabase_sync and update
473
+ # the env var and sync() call accordingly.
474
+ from storage.notion_sync import sync
475
+
476
+ SOURCES = [
477
+ ("My Source", my_source.fetch),
478
+ ]
479
+
480
+ def ai_enabled():
481
+ return bool(os.environ.get("GEMINI_API_KEY"))
482
+
483
+ def main():
484
+ config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
485
+ provider = config.get("storage", {}).get("provider", "notion")
486
+
487
+ # Resolve the storage target identifier from env based on provider
488
+ if provider == "notion":
489
+ db_id = os.environ.get("NOTION_DATABASE_ID")
490
+ if not db_id:
491
+ print("ERROR: NOTION_DATABASE_ID not set"); sys.exit(1)
492
+ else:
493
+ # Extend here for sheets (SHEET_ID) or supabase (SUPABASE_TABLE) etc.
494
+ print(f"ERROR: provider '{provider}' not yet wired in main.py"); sys.exit(1)
495
+
496
+ config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
497
+ all_items = []
498
+
499
+ for name, fetch_fn in SOURCES:
500
+ try:
501
+ items = fetch_fn()
502
+ print(f"[{name}] {len(items)} items")
503
+ all_items.extend(items)
504
+ except Exception as e:
505
+ print(f"[{name}] FAILED: {e}")
506
+
507
+ # Deduplicate by URL
508
+ seen, deduped = set(), []
509
+ for item in all_items:
510
+ if (url := item.get("url", "")) and url not in seen:
511
+ seen.add(url); deduped.append(item)
512
+
513
+ print(f"Unique items: {len(deduped)}")
514
+
515
+ if ai_enabled() and deduped:
516
+ from ai.memory import load_feedback, build_preference_prompt
517
+ from ai.pipeline import analyse_batch
518
+
519
+ # load_feedback() reads data/feedback.json written by your feedback sync script.
520
+ # To keep it current, implement a separate feedback_sync.py that queries your
521
+ # storage provider for items with positive/negative statuses and calls save_feedback().
522
+ feedback = load_feedback()
523
+ preference = build_preference_prompt(feedback)
524
+ context_path = Path(__file__).parent.parent / "profile" / "context.md"
525
+ context = context_path.read_text() if context_path.exists() else ""
526
+ deduped = analyse_batch(deduped, context=context, preference_prompt=preference)
527
+ else:
528
+ print("[AI] Skipped — GEMINI_API_KEY not set")
529
+
530
+ added, skipped = sync(db_id, deduped)
531
+ print(f"Done — {added} new, {skipped} existing")
532
+
533
+ if __name__ == "__main__":
534
+ main()
535
+ ```
536
+
537
+ ---
538
+
539
+ ### Step 9: GitHub Actions Workflow
540
+
541
+ ```yaml
542
+ # .github/workflows/scraper.yml
543
+ name: Data Scraper Agent
544
+
545
+ on:
546
+ schedule:
547
+ - cron: "0 */3 * * *" # every 3 hours — adjust to your needs
548
+ workflow_dispatch: # allow manual trigger
549
+
550
+ permissions:
551
+ contents: write # required for the feedback-history commit step
552
+
553
+ jobs:
554
+ scrape:
555
+ runs-on: ubuntu-latest
556
+ timeout-minutes: 20
557
+
558
+ steps:
559
+ - uses: actions/checkout@v4
560
+
561
+ - uses: actions/setup-python@v5
562
+ with:
563
+ python-version: "3.11"
564
+ cache: "pip"
565
+
566
+ - run: pip install -r requirements.txt
567
+
568
+ # Uncomment if Playwright is enabled in requirements.txt
569
+ # - name: Install Playwright browsers
570
+ # run: python -m playwright install chromium --with-deps
571
+
572
+ - name: Run agent
573
+ env:
574
+ NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
575
+ NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
576
+ GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
577
+ run: python -m scraper.main
578
+
579
+ - name: Commit feedback history
580
+ run: |
581
+ git config user.name "github-actions[bot]"
582
+ git config user.email "github-actions[bot]@users.noreply.github.com"
583
+ git add data/feedback.json || true
584
+ git diff --cached --quiet || git commit -m "chore: update feedback history"
585
+ git push
586
+ ```
587
+
588
+ ---
589
+
590
+ ### Step 10: config.yaml Template
591
+
592
+ ```yaml
593
+ # Customise this file — no code changes needed
594
+
595
+ # What to collect (pre-filter before AI)
596
+ filters:
597
+ required_keywords: [] # item must contain at least one
598
+ blocked_keywords: [] # item must not contain any
599
+
600
+ # Your priorities — AI uses these for scoring
601
+ priorities:
602
+ - "example priority 1"
603
+ - "example priority 2"
604
+
605
+ # Storage
606
+ storage:
607
+ provider: "notion" # notion | sheets | supabase | sqlite
608
+
609
+ # Feedback learning
610
+ feedback:
611
+ positive_statuses: ["Saved", "Applied", "Interested"]
612
+ negative_statuses: ["Skip", "Rejected", "Not relevant"]
613
+
614
+ # AI settings
615
+ ai:
616
+ enabled: true
617
+ model: "gemini-2.5-flash"
618
+ min_score: 0 # filter out items below this score
619
+ rate_limit_seconds: 7 # seconds between API calls
620
+ batch_size: 5 # items per API call
621
+ ```
622
+
623
+ ---
624
+
625
+ ## Common Scraping Patterns
626
+
627
+ ### Pattern 1: REST API (easiest)
628
+ ```python
629
+ resp = requests.get(url, params={"q": query}, headers=HEADERS, timeout=15)
630
+ items = resp.json().get("results", [])
631
+ ```
632
+
633
+ ### Pattern 2: HTML Scraping
634
+ ```python
635
+ soup = BeautifulSoup(resp.text, "lxml")
636
+ for card in soup.select(".listing-card"):
637
+ title = card.select_one("h2").get_text(strip=True)
638
+ href = card.select_one("a")["href"]
639
+ ```
640
+
641
+ ### Pattern 3: RSS Feed
642
+ ```python
643
+ import xml.etree.ElementTree as ET
644
+ root = ET.fromstring(resp.text)
645
+ for item in root.findall(".//item"):
646
+ title = item.findtext("title", "")
647
+ link = item.findtext("link", "")
648
+ pub_date = item.findtext("pubDate", "")
649
+ ```
650
+
651
+ ### Pattern 4: Paginated API
652
+ ```python
653
+ page = 1
654
+ while True:
655
+ resp = requests.get(url, params={"page": page, "limit": 50}, timeout=15)
656
+ data = resp.json()
657
+ items = data.get("results", [])
658
+ if not items:
659
+ break
660
+ for item in items:
661
+ results.append(_normalise(item))
662
+ if not data.get("has_more"):
663
+ break
664
+ page += 1
665
+ ```
666
+
667
+ ### Pattern 5: JS-Rendered Pages (Playwright)
668
+ ```python
669
+ from playwright.sync_api import sync_playwright
670
+
671
+ with sync_playwright() as p:
672
+ browser = p.chromium.launch()
673
+ page = browser.new_page()
674
+ page.goto(url)
675
+ page.wait_for_selector(".listing")
676
+ html = page.content()
677
+ browser.close()
678
+
679
+ soup = BeautifulSoup(html, "lxml")
680
+ ```
681
+
682
+ ---
683
+
684
+ ## Anti-Patterns to Avoid
685
+
686
+ | Anti-pattern | Problem | Fix |
687
+ |---|---|---|
688
+ | One LLM call per item | Hits rate limits instantly | Batch 5 items per call |
689
+ | Hardcoded keywords in code | Not reusable | Move all config to `config.yaml` |
690
+ | Scraping without rate limit | IP ban | Add `time.sleep(1)` between requests |
691
+ | Storing secrets in code | Security risk | Always use `.env` + GitHub Secrets |
692
+ | No deduplication | Duplicate rows pile up | Always check URL before pushing |
693
+ | Ignoring `robots.txt` | Legal/ethical risk | Respect crawl rules; use public APIs when available |
694
+ | JS-rendered sites with `requests` | Empty response | Use Playwright or look for the underlying API |
695
+ | `maxOutputTokens` too low | Truncated JSON, parse error | Use 2048+ for batch responses |
696
+
697
+ ---
698
+
699
+ ## Free Tier Limits Reference
700
+
701
+ | Service | Free Limit | Typical Usage |
702
+ |---|---|---|
703
+ | Gemini Flash Lite | 30 RPM, 1500 RPD | ~56 req/day at 3-hr intervals |
704
+ | Gemini 2.0 Flash | 15 RPM, 1500 RPD | Good fallback |
705
+ | Gemini 2.5 Flash | 10 RPM, 500 RPD | Use sparingly |
706
+ | GitHub Actions | Unlimited (public repos) | ~20 min/day |
707
+ | Notion API | Unlimited | ~200 writes/day |
708
+ | Supabase | 500MB DB, 2GB transfer | Fine for most agents |
709
+ | Google Sheets API | 300 req/min | Works for small agents |
710
+
711
+ ---
712
+
713
+ ## Requirements Template
714
+
715
+ ```
716
+ requests==2.31.0
717
+ beautifulsoup4==4.12.3
718
+ lxml==5.1.0
719
+ python-dotenv==1.0.1
720
+ pyyaml==6.0.2
721
+ notion-client==2.2.1 # if using Notion
722
+ # playwright==1.40.0 # uncomment for JS-rendered sites
723
+ ```
724
+
725
+ ---
726
+
727
+ ## Quality Checklist
728
+
729
+ Before marking the agent complete:
730
+
731
+ - [ ] `config.yaml` controls all user-facing settings — no hardcoded values
732
+ - [ ] `profile/context.md` holds user-specific context for AI matching
733
+ - [ ] Deduplication by URL before every storage push
734
+ - [ ] Gemini client has model fallback chain (4 models)
735
+ - [ ] Batch size ≤ 5 items per API call
736
+ - [ ] `maxOutputTokens` ≥ 2048
737
+ - [ ] `.env` is in `.gitignore`
738
+ - [ ] `.env.example` provided for onboarding
739
+ - [ ] `setup.py` creates DB schema on first run
740
+ - [ ] `enrich_existing.py` backfills AI scores on old rows
741
+ - [ ] GitHub Actions workflow commits `feedback.json` after each run
742
+ - [ ] README covers: setup in < 5 minutes, required secrets, customisation
743
+
744
+ ---
745
+
746
+ ## Real-World Examples
747
+
748
+ ```
749
+ "Build me an agent that monitors Hacker News for AI startup funding news"
750
+ "Scrape product prices from 3 e-commerce sites and alert when they drop"
751
+ "Track new GitHub repos tagged with 'llm' or 'agents' — summarise each one"
752
+ "Collect Chief of Staff job listings from LinkedIn and Cutshort into Notion"
753
+ "Monitor a subreddit for posts mentioning my company — classify sentiment"
754
+ "Scrape new academic papers from arXiv on a topic I care about daily"
755
+ "Track sports fixture results and keep a running table in Google Sheets"
756
+ "Build a real estate listing watcher — alert on new properties under ₹1 Cr"
757
+ ```
758
+
759
+ ---
760
+
761
+ ## Reference Implementation
762
+
763
+ A complete working agent built with this exact architecture would scrape 4+ sources,
764
+ batch Gemini calls, learn from Applied/Rejected decisions stored in Notion, and run
765
+ 100% free on GitHub Actions. Follow Steps 1–9 above to build your own.