@rubix0270/arboris 1.0.2 → 1.0.4

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/package.json +25 -37
  2. package/run.mjs +10 -0
  3. package/dist/cli.mjs +0 -383
  4. package/manifest.json +0 -323
  5. package/prisma/skills/accessibility/SKILL.md +0 -147
  6. package/prisma/skills/agent-architecture-audit/SKILL.md +0 -257
  7. package/prisma/skills/agent-eval/SKILL.md +0 -146
  8. package/prisma/skills/agent-harness-construction/SKILL.md +0 -74
  9. package/prisma/skills/agent-introspection-debugging/SKILL.md +0 -154
  10. package/prisma/skills/agent-payment-x402/SKILL.md +0 -225
  11. package/prisma/skills/agent-self-evaluation/SKILL.md +0 -182
  12. package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +0 -87
  13. package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +0 -86
  14. package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +0 -71
  15. package/prisma/skills/agent-self-evaluation/references/hook-integration.md +0 -64
  16. package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +0 -408
  17. package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +0 -86
  18. package/prisma/skills/agent-sort/SKILL.md +0 -216
  19. package/prisma/skills/agentic-engineering/SKILL.md +0 -64
  20. package/prisma/skills/agentic-os/SKILL.md +0 -388
  21. package/prisma/skills/ai-first-engineering/SKILL.md +0 -52
  22. package/prisma/skills/ai-regression-testing/SKILL.md +0 -386
  23. package/prisma/skills/android-clean-architecture/SKILL.md +0 -340
  24. package/prisma/skills/angular-developer/SKILL.md +0 -155
  25. package/prisma/skills/angular-developer/references/angular-animations.md +0 -160
  26. package/prisma/skills/angular-developer/references/angular-aria.md +0 -410
  27. package/prisma/skills/angular-developer/references/cli.md +0 -86
  28. package/prisma/skills/angular-developer/references/component-harnesses.md +0 -59
  29. package/prisma/skills/angular-developer/references/component-styling.md +0 -91
  30. package/prisma/skills/angular-developer/references/components.md +0 -117
  31. package/prisma/skills/angular-developer/references/creating-services.md +0 -97
  32. package/prisma/skills/angular-developer/references/data-resolvers.md +0 -69
  33. package/prisma/skills/angular-developer/references/define-routes.md +0 -67
  34. package/prisma/skills/angular-developer/references/defining-providers.md +0 -72
  35. package/prisma/skills/angular-developer/references/di-fundamentals.md +0 -120
  36. package/prisma/skills/angular-developer/references/e2e-testing.md +0 -56
  37. package/prisma/skills/angular-developer/references/effects.md +0 -83
  38. package/prisma/skills/angular-developer/references/hierarchical-injectors.md +0 -43
  39. package/prisma/skills/angular-developer/references/host-elements.md +0 -80
  40. package/prisma/skills/angular-developer/references/injection-context.md +0 -63
  41. package/prisma/skills/angular-developer/references/inputs.md +0 -101
  42. package/prisma/skills/angular-developer/references/linked-signal.md +0 -59
  43. package/prisma/skills/angular-developer/references/loading-strategies.md +0 -61
  44. package/prisma/skills/angular-developer/references/mcp.md +0 -108
  45. package/prisma/skills/angular-developer/references/navigate-to-routes.md +0 -69
  46. package/prisma/skills/angular-developer/references/outputs.md +0 -86
  47. package/prisma/skills/angular-developer/references/reactive-forms.md +0 -122
  48. package/prisma/skills/angular-developer/references/rendering-strategies.md +0 -44
  49. package/prisma/skills/angular-developer/references/resource.md +0 -77
  50. package/prisma/skills/angular-developer/references/route-animations.md +0 -56
  51. package/prisma/skills/angular-developer/references/route-guards.md +0 -52
  52. package/prisma/skills/angular-developer/references/router-lifecycle.md +0 -45
  53. package/prisma/skills/angular-developer/references/router-testing.md +0 -87
  54. package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +0 -68
  55. package/prisma/skills/angular-developer/references/signal-forms.md +0 -795
  56. package/prisma/skills/angular-developer/references/signals-overview.md +0 -94
  57. package/prisma/skills/angular-developer/references/tailwind-css.md +0 -69
  58. package/prisma/skills/angular-developer/references/template-driven-forms.md +0 -114
  59. package/prisma/skills/angular-developer/references/testing-fundamentals.md +0 -65
  60. package/prisma/skills/api-connector-builder/SKILL.md +0 -121
  61. package/prisma/skills/api-design/SKILL.md +0 -524
  62. package/prisma/skills/architecture-decision-records/SKILL.md +0 -180
  63. package/prisma/skills/article-writing/SKILL.md +0 -80
  64. package/prisma/skills/automation-audit-ops/SKILL.md +0 -143
  65. package/prisma/skills/autonomous-agent-harness/SKILL.md +0 -274
  66. package/prisma/skills/autonomous-loops/SKILL.md +0 -611
  67. package/prisma/skills/backend-patterns/SKILL.md +0 -562
  68. package/prisma/skills/benchmark/SKILL.md +0 -94
  69. package/prisma/skills/benchmark-methodology/SKILL.md +0 -190
  70. package/prisma/skills/benchmark-optimization-loop/SKILL.md +0 -70
  71. package/prisma/skills/blender-motion-state-inspection/SKILL.md +0 -165
  72. package/prisma/skills/blueprint/SKILL.md +0 -106
  73. package/prisma/skills/brand-discovery/SKILL.md +0 -145
  74. package/prisma/skills/brand-discovery/references/10_purpose-why.md +0 -40
  75. package/prisma/skills/brand-discovery/references/20_positioning.md +0 -44
  76. package/prisma/skills/brand-discovery/references/30_audience-niche.md +0 -52
  77. package/prisma/skills/brand-discovery/references/40_personality-archetype.md +0 -57
  78. package/prisma/skills/brand-discovery/references/50_voice-tone.md +0 -59
  79. package/prisma/skills/brand-discovery/references/60_narrative-story.md +0 -50
  80. package/prisma/skills/brand-discovery/references/70_founder-tension.md +0 -49
  81. package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +0 -133
  82. package/prisma/skills/brand-voice/SKILL.md +0 -98
  83. package/prisma/skills/brand-voice/references/voice-profile-schema.md +0 -55
  84. package/prisma/skills/browser-qa/SKILL.md +0 -105
  85. package/prisma/skills/bun-runtime/SKILL.md +0 -85
  86. package/prisma/skills/canary-watch/SKILL.md +0 -108
  87. package/prisma/skills/carrier-relationship-management/SKILL.md +0 -212
  88. package/prisma/skills/cisco-ios-patterns/SKILL.md +0 -164
  89. package/prisma/skills/ck/SKILL.md +0 -148
  90. package/prisma/skills/ck/commands/forget.mjs +0 -44
  91. package/prisma/skills/ck/commands/info.mjs +0 -24
  92. package/prisma/skills/ck/commands/init.mjs +0 -143
  93. package/prisma/skills/ck/commands/list.mjs +0 -40
  94. package/prisma/skills/ck/commands/migrate.mjs +0 -202
  95. package/prisma/skills/ck/commands/resume.mjs +0 -36
  96. package/prisma/skills/ck/commands/save.mjs +0 -210
  97. package/prisma/skills/ck/commands/shared.mjs +0 -387
  98. package/prisma/skills/ck/hooks/session-start.mjs +0 -224
  99. package/prisma/skills/claude-devfleet/SKILL.md +0 -112
  100. package/prisma/skills/click-path-audit/SKILL.md +0 -245
  101. package/prisma/skills/clickhouse-io/SKILL.md +0 -440
  102. package/prisma/skills/code-tour/SKILL.md +0 -254
  103. package/prisma/skills/codebase-onboarding/SKILL.md +0 -234
  104. package/prisma/skills/codehealth-mcp/SKILL.md +0 -167
  105. package/prisma/skills/coding-standards/SKILL.md +0 -551
  106. package/prisma/skills/competitive-platform-analysis/SKILL.md +0 -214
  107. package/prisma/skills/competitive-report-structure/SKILL.md +0 -162
  108. package/prisma/skills/compose-multiplatform-patterns/SKILL.md +0 -300
  109. package/prisma/skills/config-gc/SKILL.md +0 -120
  110. package/prisma/skills/configure-ecc/SKILL.md +0 -385
  111. package/prisma/skills/connections-optimizer/SKILL.md +0 -190
  112. package/prisma/skills/content-engine/SKILL.md +0 -132
  113. package/prisma/skills/content-hash-cache-pattern/SKILL.md +0 -162
  114. package/prisma/skills/context-budget/SKILL.md +0 -136
  115. package/prisma/skills/continuous-agent-loop/SKILL.md +0 -46
  116. package/prisma/skills/continuous-learning/SKILL.md +0 -132
  117. package/prisma/skills/continuous-learning/config.json +0 -18
  118. package/prisma/skills/continuous-learning/evaluate-session.sh +0 -69
  119. package/prisma/skills/continuous-learning-v2/SKILL.md +0 -361
  120. package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +0 -359
  121. package/prisma/skills/continuous-learning-v2/agents/observer.md +0 -189
  122. package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +0 -150
  123. package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +0 -248
  124. package/prisma/skills/continuous-learning-v2/config.json +0 -8
  125. package/prisma/skills/continuous-learning-v2/hooks/observe.sh +0 -585
  126. package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +0 -322
  127. package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -1956
  128. package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +0 -31
  129. package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +0 -68
  130. package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -1421
  131. package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +0 -184
  132. package/prisma/skills/cost-tracking/SKILL.md +0 -97
  133. package/prisma/skills/council/SKILL.md +0 -204
  134. package/prisma/skills/cpp-coding-standards/SKILL.md +0 -724
  135. package/prisma/skills/cpp-testing/SKILL.md +0 -325
  136. package/prisma/skills/crosspost/SKILL.md +0 -112
  137. package/prisma/skills/csharp-testing/SKILL.md +0 -322
  138. package/prisma/skills/customer-billing-ops/SKILL.md +0 -141
  139. package/prisma/skills/customs-trade-compliance/SKILL.md +0 -263
  140. package/prisma/skills/dart-flutter-patterns/SKILL.md +0 -564
  141. package/prisma/skills/dashboard-builder/SKILL.md +0 -109
  142. package/prisma/skills/data-scraper-agent/SKILL.md +0 -765
  143. package/prisma/skills/data-throughput-accelerator/SKILL.md +0 -73
  144. package/prisma/skills/database-migrations/SKILL.md +0 -430
  145. package/prisma/skills/deep-research/SKILL.md +0 -160
  146. package/prisma/skills/defi-amm-security/SKILL.md +0 -167
  147. package/prisma/skills/delivery-gate/SKILL.md +0 -126
  148. package/prisma/skills/delivery-gate/hooks/quality-gate.py +0 -220
  149. package/prisma/skills/deployment-patterns/SKILL.md +0 -428
  150. package/prisma/skills/design-system/SKILL.md +0 -83
  151. package/prisma/skills/django-celery/SKILL.md +0 -458
  152. package/prisma/skills/django-patterns/SKILL.md +0 -735
  153. package/prisma/skills/django-security/SKILL.md +0 -644
  154. package/prisma/skills/django-tdd/SKILL.md +0 -730
  155. package/prisma/skills/django-verification/SKILL.md +0 -470
  156. package/prisma/skills/dmux-workflows/SKILL.md +0 -192
  157. package/prisma/skills/docker-patterns/SKILL.md +0 -365
  158. package/prisma/skills/documentation-lookup/SKILL.md +0 -91
  159. package/prisma/skills/dotnet-patterns/SKILL.md +0 -322
  160. package/prisma/skills/dynamic-workflow-mode/SKILL.md +0 -124
  161. package/prisma/skills/e2e-testing/SKILL.md +0 -327
  162. package/prisma/skills/ecc-guide/SKILL.md +0 -190
  163. package/prisma/skills/ecc-recipes/SKILL.md +0 -149
  164. package/prisma/skills/ecc-tools-cost-audit/SKILL.md +0 -161
  165. package/prisma/skills/email-ops/SKILL.md +0 -122
  166. package/prisma/skills/energy-procurement/SKILL.md +0 -228
  167. package/prisma/skills/enterprise-agent-ops/SKILL.md +0 -51
  168. package/prisma/skills/error-handling/SKILL.md +0 -377
  169. package/prisma/skills/eval-harness/SKILL.md +0 -271
  170. package/prisma/skills/evm-token-decimals/SKILL.md +0 -131
  171. package/prisma/skills/exa-search/SKILL.md +0 -108
  172. package/prisma/skills/fal-ai-media/SKILL.md +0 -289
  173. package/prisma/skills/fastapi-patterns/SKILL.md +0 -514
  174. package/prisma/skills/finance-billing-ops/SKILL.md +0 -128
  175. package/prisma/skills/flox-environments/SKILL.md +0 -497
  176. package/prisma/skills/flutter-dart-code-review/SKILL.md +0 -436
  177. package/prisma/skills/foundation-models-on-device/SKILL.md +0 -243
  178. package/prisma/skills/frontend-a11y/SKILL.md +0 -446
  179. package/prisma/skills/frontend-design-direction/SKILL.md +0 -93
  180. package/prisma/skills/frontend-patterns/SKILL.md +0 -657
  181. package/prisma/skills/frontend-slides/SKILL.md +0 -185
  182. package/prisma/skills/frontend-slides/STYLE_PRESETS.md +0 -330
  183. package/prisma/skills/frontend-slides/animation-patterns.md +0 -122
  184. package/prisma/skills/frontend-slides/html-template.md +0 -419
  185. package/prisma/skills/frontend-slides/scripts/export-pdf.sh +0 -418
  186. package/prisma/skills/frontend-slides/scripts/extract-pptx.py +0 -96
  187. package/prisma/skills/frontend-slides/viewport-base.css +0 -153
  188. package/prisma/skills/fsharp-testing/SKILL.md +0 -281
  189. package/prisma/skills/gan-style-harness/SKILL.md +0 -279
  190. package/prisma/skills/gateguard/SKILL.md +0 -133
  191. package/prisma/skills/generating-python-installer/SKILL.md +0 -820
  192. package/prisma/skills/git-workflow/SKILL.md +0 -716
  193. package/prisma/skills/github-ops/SKILL.md +0 -145
  194. package/prisma/skills/golang-patterns/SKILL.md +0 -675
  195. package/prisma/skills/golang-testing/SKILL.md +0 -721
  196. package/prisma/skills/google-workspace-ops/SKILL.md +0 -96
  197. package/prisma/skills/growth-log/SKILL.md +0 -128
  198. package/prisma/skills/healthcare-cdss-patterns/SKILL.md +0 -246
  199. package/prisma/skills/healthcare-emr-patterns/SKILL.md +0 -160
  200. package/prisma/skills/healthcare-eval-harness/SKILL.md +0 -208
  201. package/prisma/skills/healthcare-phi-compliance/SKILL.md +0 -146
  202. package/prisma/skills/hermes-imports/SKILL.md +0 -89
  203. package/prisma/skills/hexagonal-architecture/SKILL.md +0 -277
  204. package/prisma/skills/hipaa-compliance/SKILL.md +0 -79
  205. package/prisma/skills/homelab-network-readiness/SKILL.md +0 -170
  206. package/prisma/skills/homelab-network-setup/SKILL.md +0 -130
  207. package/prisma/skills/homelab-pihole-dns/SKILL.md +0 -275
  208. package/prisma/skills/homelab-vlan-segmentation/SKILL.md +0 -312
  209. package/prisma/skills/homelab-wireguard-vpn/SKILL.md +0 -306
  210. package/prisma/skills/hookify-rules/SKILL.md +0 -128
  211. package/prisma/skills/inherit-legacy-style/SKILL.md +0 -157
  212. package/prisma/skills/intent-driven-development/SKILL.md +0 -360
  213. package/prisma/skills/inventory-demand-planning/SKILL.md +0 -247
  214. package/prisma/skills/investor-materials/SKILL.md +0 -97
  215. package/prisma/skills/investor-outreach/SKILL.md +0 -92
  216. package/prisma/skills/ios-icon-gen/SKILL.md +0 -158
  217. package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +0 -258
  218. package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +0 -235
  219. package/prisma/skills/iterative-retrieval/SKILL.md +0 -212
  220. package/prisma/skills/ito-basket-compare/SKILL.md +0 -64
  221. package/prisma/skills/ito-data-atlas-agent/SKILL.md +0 -64
  222. package/prisma/skills/ito-market-intelligence/SKILL.md +0 -61
  223. package/prisma/skills/ito-trade-planner/SKILL.md +0 -68
  224. package/prisma/skills/java-coding-standards/SKILL.md +0 -384
  225. package/prisma/skills/jira-integration/SKILL.md +0 -303
  226. package/prisma/skills/jpa-patterns/SKILL.md +0 -152
  227. package/prisma/skills/knowledge-ops/SKILL.md +0 -155
  228. package/prisma/skills/kotlin-coroutines-flows/SKILL.md +0 -285
  229. package/prisma/skills/kotlin-exposed-patterns/SKILL.md +0 -720
  230. package/prisma/skills/kotlin-ktor-patterns/SKILL.md +0 -690
  231. package/prisma/skills/kotlin-patterns/SKILL.md +0 -712
  232. package/prisma/skills/kotlin-testing/SKILL.md +0 -825
  233. package/prisma/skills/kubernetes-patterns/SKILL.md +0 -756
  234. package/prisma/skills/laravel-patterns/SKILL.md +0 -416
  235. package/prisma/skills/laravel-plugin-discovery/SKILL.md +0 -230
  236. package/prisma/skills/laravel-security/SKILL.md +0 -948
  237. package/prisma/skills/laravel-tdd/SKILL.md +0 -675
  238. package/prisma/skills/laravel-verification/SKILL.md +0 -180
  239. package/prisma/skills/latency-critical-systems/SKILL.md +0 -74
  240. package/prisma/skills/lead-intelligence/SKILL.md +0 -322
  241. package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +0 -85
  242. package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +0 -75
  243. package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +0 -98
  244. package/prisma/skills/lead-intelligence/agents/signal-scorer.md +0 -60
  245. package/prisma/skills/liquid-glass-design/SKILL.md +0 -279
  246. package/prisma/skills/llm-trading-agent-security/SKILL.md +0 -147
  247. package/prisma/skills/logistics-exception-management/SKILL.md +0 -222
  248. package/prisma/skills/loop-design-check/SKILL.md +0 -143
  249. package/prisma/skills/mailtrap-email-integration/SKILL.md +0 -77
  250. package/prisma/skills/make-interfaces-feel-better/SKILL.md +0 -152
  251. package/prisma/skills/manim-video/SKILL.md +0 -90
  252. package/prisma/skills/manim-video/assets/network_graph_scene.py +0 -52
  253. package/prisma/skills/market-research/SKILL.md +0 -76
  254. package/prisma/skills/marketing-campaign/SKILL.md +0 -114
  255. package/prisma/skills/mcp-server-patterns/SKILL.md +0 -70
  256. package/prisma/skills/messages-ops/SKILL.md +0 -105
  257. package/prisma/skills/ml-adoption-playbook/SKILL.md +0 -57
  258. package/prisma/skills/mle-workflow/SKILL.md +0 -347
  259. package/prisma/skills/motion-advanced/SKILL.md +0 -596
  260. package/prisma/skills/motion-foundations/SKILL.md +0 -299
  261. package/prisma/skills/motion-patterns/SKILL.md +0 -434
  262. package/prisma/skills/motion-ui/SKILL.md +0 -576
  263. package/prisma/skills/mysql-patterns/SKILL.md +0 -413
  264. package/prisma/skills/nanoclaw-repl/SKILL.md +0 -34
  265. package/prisma/skills/nestjs-patterns/SKILL.md +0 -231
  266. package/prisma/skills/netmiko-ssh-automation/SKILL.md +0 -174
  267. package/prisma/skills/network-bgp-diagnostics/SKILL.md +0 -168
  268. package/prisma/skills/network-config-validation/SKILL.md +0 -211
  269. package/prisma/skills/network-interface-health/SKILL.md +0 -153
  270. package/prisma/skills/nextjs-turbopack/SKILL.md +0 -58
  271. package/prisma/skills/nodejs-keccak256/SKILL.md +0 -103
  272. package/prisma/skills/nutrient-document-processing/SKILL.md +0 -168
  273. package/prisma/skills/nuxt4-patterns/SKILL.md +0 -101
  274. package/prisma/skills/openclaw-persona-forge/SKILL.md +0 -289
  275. package/prisma/skills/openclaw-persona-forge/gacha.py +0 -224
  276. package/prisma/skills/openclaw-persona-forge/gacha.sh +0 -5
  277. package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +0 -124
  278. package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +0 -53
  279. package/prisma/skills/openclaw-persona-forge/references/error-handling.md +0 -53
  280. package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +0 -48
  281. package/prisma/skills/openclaw-persona-forge/references/naming-system.md +0 -39
  282. package/prisma/skills/openclaw-persona-forge/references/output-template.md +0 -166
  283. package/prisma/skills/opensource-pipeline/SKILL.md +0 -256
  284. package/prisma/skills/orch-add-feature/SKILL.md +0 -45
  285. package/prisma/skills/orch-build-mvp/SKILL.md +0 -49
  286. package/prisma/skills/orch-change-feature/SKILL.md +0 -43
  287. package/prisma/skills/orch-fix-defect/SKILL.md +0 -43
  288. package/prisma/skills/orch-pipeline/SKILL.md +0 -121
  289. package/prisma/skills/orch-refine-code/SKILL.md +0 -44
  290. package/prisma/skills/parallel-execution-optimizer/SKILL.md +0 -73
  291. package/prisma/skills/perl-patterns/SKILL.md +0 -505
  292. package/prisma/skills/perl-security/SKILL.md +0 -504
  293. package/prisma/skills/perl-testing/SKILL.md +0 -476
  294. package/prisma/skills/plan-orchestrate/SKILL.md +0 -263
  295. package/prisma/skills/plankton-code-quality/SKILL.md +0 -237
  296. package/prisma/skills/postgres-patterns/SKILL.md +0 -148
  297. package/prisma/skills/prediction-market-oracle-research/SKILL.md +0 -64
  298. package/prisma/skills/prediction-market-risk-review/SKILL.md +0 -61
  299. package/prisma/skills/prisma-patterns/SKILL.md +0 -401
  300. package/prisma/skills/product-capability/SKILL.md +0 -142
  301. package/prisma/skills/product-lens/SKILL.md +0 -93
  302. package/prisma/skills/production-audit/SKILL.md +0 -207
  303. package/prisma/skills/production-scheduling/SKILL.md +0 -238
  304. package/prisma/skills/project-flow-ops/SKILL.md +0 -112
  305. package/prisma/skills/prompt-optimizer/SKILL.md +0 -398
  306. package/prisma/skills/python-patterns/SKILL.md +0 -751
  307. package/prisma/skills/python-testing/SKILL.md +0 -817
  308. package/prisma/skills/pytorch-patterns/SKILL.md +0 -397
  309. package/prisma/skills/quality-nonconformance/SKILL.md +0 -260
  310. package/prisma/skills/quarkus-patterns/SKILL.md +0 -723
  311. package/prisma/skills/quarkus-security/SKILL.md +0 -468
  312. package/prisma/skills/quarkus-tdd/SKILL.md +0 -812
  313. package/prisma/skills/quarkus-verification/SKILL.md +0 -480
  314. package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +0 -68
  315. package/prisma/skills/react-native-patterns/SKILL.md +0 -326
  316. package/prisma/skills/react-patterns/SKILL.md +0 -342
  317. package/prisma/skills/react-performance/SKILL.md +0 -575
  318. package/prisma/skills/react-testing/SKILL.md +0 -424
  319. package/prisma/skills/recsys-pipeline-architect/SKILL.md +0 -115
  320. package/prisma/skills/recursive-decision-ledger/SKILL.md +0 -80
  321. package/prisma/skills/redis-patterns/SKILL.md +0 -404
  322. package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +0 -221
  323. package/prisma/skills/remotion-video-creation/SKILL.md +0 -43
  324. package/prisma/skills/remotion-video-creation/rules/3d.md +0 -86
  325. package/prisma/skills/remotion-video-creation/rules/animations.md +0 -29
  326. package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +0 -173
  327. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +0 -100
  328. package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +0 -108
  329. package/prisma/skills/remotion-video-creation/rules/assets.md +0 -78
  330. package/prisma/skills/remotion-video-creation/rules/audio.md +0 -172
  331. package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +0 -104
  332. package/prisma/skills/remotion-video-creation/rules/can-decode.md +0 -75
  333. package/prisma/skills/remotion-video-creation/rules/charts.md +0 -58
  334. package/prisma/skills/remotion-video-creation/rules/compositions.md +0 -146
  335. package/prisma/skills/remotion-video-creation/rules/display-captions.md +0 -126
  336. package/prisma/skills/remotion-video-creation/rules/extract-frames.md +0 -229
  337. package/prisma/skills/remotion-video-creation/rules/fonts.md +0 -152
  338. package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +0 -58
  339. package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +0 -68
  340. package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +0 -58
  341. package/prisma/skills/remotion-video-creation/rules/gifs.md +0 -138
  342. package/prisma/skills/remotion-video-creation/rules/images.md +0 -130
  343. package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +0 -67
  344. package/prisma/skills/remotion-video-creation/rules/lottie.md +0 -67
  345. package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +0 -34
  346. package/prisma/skills/remotion-video-creation/rules/measuring-text.md +0 -143
  347. package/prisma/skills/remotion-video-creation/rules/sequencing.md +0 -106
  348. package/prisma/skills/remotion-video-creation/rules/tailwind.md +0 -11
  349. package/prisma/skills/remotion-video-creation/rules/text-animations.md +0 -20
  350. package/prisma/skills/remotion-video-creation/rules/timing.md +0 -179
  351. package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +0 -19
  352. package/prisma/skills/remotion-video-creation/rules/transitions.md +0 -122
  353. package/prisma/skills/remotion-video-creation/rules/trimming.md +0 -52
  354. package/prisma/skills/remotion-video-creation/rules/videos.md +0 -171
  355. package/prisma/skills/repo-scan/SKILL.md +0 -79
  356. package/prisma/skills/research-ops/SKILL.md +0 -113
  357. package/prisma/skills/returns-reverse-logistics/SKILL.md +0 -240
  358. package/prisma/skills/rules-distill/SKILL.md +0 -265
  359. package/prisma/skills/rules-distill/scripts/scan-rules.sh +0 -58
  360. package/prisma/skills/rules-distill/scripts/scan-skills.sh +0 -129
  361. package/prisma/skills/rust-patterns/SKILL.md +0 -500
  362. package/prisma/skills/rust-testing/SKILL.md +0 -501
  363. package/prisma/skills/safety-guard/SKILL.md +0 -76
  364. package/prisma/skills/santa-method/SKILL.md +0 -307
  365. package/prisma/skills/scientific-db-pubmed-database/SKILL.md +0 -176
  366. package/prisma/skills/scientific-db-uspto-database/SKILL.md +0 -178
  367. package/prisma/skills/scientific-pkg-gget/SKILL.md +0 -167
  368. package/prisma/skills/scientific-thinking-literature-review/SKILL.md +0 -193
  369. package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +0 -161
  370. package/prisma/skills/search-first/SKILL.md +0 -183
  371. package/prisma/skills/security-bounty-hunter/SKILL.md +0 -100
  372. package/prisma/skills/security-review/SKILL.md +0 -504
  373. package/prisma/skills/security-review/cloud-infrastructure-security.md +0 -361
  374. package/prisma/skills/security-scan/SKILL.md +0 -166
  375. package/prisma/skills/seo/SKILL.md +0 -155
  376. package/prisma/skills/skill-comply/SKILL.md +0 -59
  377. package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +0 -5
  378. package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +0 -3
  379. package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +0 -44
  380. package/prisma/skills/skill-comply/prompts/classifier.md +0 -24
  381. package/prisma/skills/skill-comply/prompts/scenario_generator.md +0 -62
  382. package/prisma/skills/skill-comply/prompts/spec_generator.md +0 -42
  383. package/prisma/skills/skill-comply/pyproject.toml +0 -15
  384. package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
  385. package/prisma/skills/skill-comply/scripts/classifier.py +0 -85
  386. package/prisma/skills/skill-comply/scripts/grader.py +0 -124
  387. package/prisma/skills/skill-comply/scripts/parser.py +0 -107
  388. package/prisma/skills/skill-comply/scripts/report.py +0 -170
  389. package/prisma/skills/skill-comply/scripts/run.py +0 -127
  390. package/prisma/skills/skill-comply/scripts/runner.py +0 -194
  391. package/prisma/skills/skill-comply/scripts/scenario_generator.py +0 -70
  392. package/prisma/skills/skill-comply/scripts/spec_generator.py +0 -72
  393. package/prisma/skills/skill-comply/scripts/utils.py +0 -13
  394. package/prisma/skills/skill-comply/tests/test_grader.py +0 -197
  395. package/prisma/skills/skill-comply/tests/test_parser.py +0 -90
  396. package/prisma/skills/skill-comply/tests/test_runner.py +0 -172
  397. package/prisma/skills/skill-scout/SKILL.md +0 -141
  398. package/prisma/skills/skill-stocktake/SKILL.md +0 -195
  399. package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +0 -87
  400. package/prisma/skills/skill-stocktake/scripts/save-results.sh +0 -56
  401. package/prisma/skills/skill-stocktake/scripts/scan.sh +0 -170
  402. package/prisma/skills/social-graph-ranker/SKILL.md +0 -155
  403. package/prisma/skills/social-publisher/SKILL.md +0 -130
  404. package/prisma/skills/springboot-patterns/SKILL.md +0 -315
  405. package/prisma/skills/springboot-security/SKILL.md +0 -273
  406. package/prisma/skills/springboot-tdd/SKILL.md +0 -159
  407. package/prisma/skills/springboot-verification/SKILL.md +0 -232
  408. package/prisma/skills/strategic-compact/SKILL.md +0 -136
  409. package/prisma/skills/swift-actor-persistence/SKILL.md +0 -144
  410. package/prisma/skills/swift-concurrency-6-2/SKILL.md +0 -216
  411. package/prisma/skills/swift-protocol-di-testing/SKILL.md +0 -191
  412. package/prisma/skills/swiftui-patterns/SKILL.md +0 -259
  413. package/prisma/skills/taste/SKILL.md +0 -264
  414. package/prisma/skills/taste/references/genre-taxonomy.md +0 -87
  415. package/prisma/skills/tdd-workflow/SKILL.md +0 -583
  416. package/prisma/skills/team-agent-orchestration/SKILL.md +0 -111
  417. package/prisma/skills/team-builder/SKILL.md +0 -169
  418. package/prisma/skills/terminal-ops/SKILL.md +0 -110
  419. package/prisma/skills/tinystruct-patterns/SKILL.md +0 -279
  420. package/prisma/skills/tinystruct-patterns/references/architecture.md +0 -90
  421. package/prisma/skills/tinystruct-patterns/references/data-handling.md +0 -60
  422. package/prisma/skills/tinystruct-patterns/references/database.md +0 -99
  423. package/prisma/skills/tinystruct-patterns/references/routing.md +0 -64
  424. package/prisma/skills/tinystruct-patterns/references/system-usage.md +0 -97
  425. package/prisma/skills/tinystruct-patterns/references/testing.md +0 -72
  426. package/prisma/skills/token-budget-advisor/SKILL.md +0 -134
  427. package/prisma/skills/ui-demo/SKILL.md +0 -466
  428. package/prisma/skills/ui-to-vue/SKILL.md +0 -135
  429. package/prisma/skills/uncloud/SKILL.md +0 -344
  430. package/prisma/skills/unified-notifications-ops/SKILL.md +0 -188
  431. package/prisma/skills/verification-loop/SKILL.md +0 -127
  432. package/prisma/skills/video-editing/SKILL.md +0 -311
  433. package/prisma/skills/videodb/SKILL.md +0 -375
  434. package/prisma/skills/videodb/reference/api-reference.md +0 -550
  435. package/prisma/skills/videodb/reference/capture-reference.md +0 -407
  436. package/prisma/skills/videodb/reference/capture.md +0 -101
  437. package/prisma/skills/videodb/reference/editor.md +0 -443
  438. package/prisma/skills/videodb/reference/generative.md +0 -331
  439. package/prisma/skills/videodb/reference/rtstream-reference.md +0 -564
  440. package/prisma/skills/videodb/reference/rtstream.md +0 -65
  441. package/prisma/skills/videodb/reference/search.md +0 -230
  442. package/prisma/skills/videodb/reference/streaming.md +0 -406
  443. package/prisma/skills/videodb/reference/use-cases.md +0 -118
  444. package/prisma/skills/videodb/scripts/ws_listener.py +0 -282
  445. package/prisma/skills/visa-doc-translate/README.md +0 -86
  446. package/prisma/skills/visa-doc-translate/SKILL.md +0 -117
  447. package/prisma/skills/vite-patterns/SKILL.md +0 -450
  448. package/prisma/skills/vue-patterns/SKILL.md +0 -471
  449. package/prisma/skills/windows-desktop-e2e/SKILL.md +0 -888
  450. package/prisma/skills/workspace-surface-audit/SKILL.md +0 -126
  451. package/prisma/skills/x-api/SKILL.md +0 -235
@@ -1,765 +0,0 @@
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.