@baselane/packs 0.1.5 → 0.1.7

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