bps-kit 1.0.1 → 1.0.2

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 (368) hide show
  1. package/package.json +1 -1
  2. package/templates/.agents/agents/backend-specialist.md +263 -0
  3. package/templates/.agents/agents/code-archaeologist.md +106 -0
  4. package/templates/.agents/agents/database-architect.md +226 -0
  5. package/templates/.agents/agents/debugger.md +225 -0
  6. package/templates/.agents/agents/devops-engineer.md +242 -0
  7. package/templates/.agents/agents/documentation-writer.md +104 -0
  8. package/templates/.agents/agents/explorer-agent.md +73 -0
  9. package/templates/.agents/agents/frontend-specialist.md +593 -0
  10. package/templates/.agents/agents/game-developer.md +162 -0
  11. package/templates/.agents/agents/mobile-developer.md +377 -0
  12. package/templates/.agents/agents/orchestrator.md +416 -0
  13. package/templates/.agents/agents/penetration-tester.md +188 -0
  14. package/templates/.agents/agents/performance-optimizer.md +187 -0
  15. package/templates/.agents/agents/product-manager.md +112 -0
  16. package/templates/.agents/agents/product-owner.md +95 -0
  17. package/templates/.agents/agents/project-planner.md +406 -0
  18. package/templates/.agents/agents/qa-automation-engineer.md +103 -0
  19. package/templates/.agents/agents/security-auditor.md +170 -0
  20. package/templates/.agents/agents/seo-specialist.md +111 -0
  21. package/templates/.agents/agents/test-engineer.md +158 -0
  22. package/templates/.agents/rules/GEMINI.md +219 -0
  23. package/templates/.agents/scripts/auto_preview.py +148 -0
  24. package/templates/.agents/scripts/checklist.py +217 -0
  25. package/templates/.agents/scripts/session_manager.py +120 -0
  26. package/templates/.agents/scripts/verify_all.py +327 -0
  27. package/templates/.agents/workflows/brainstorm.md +113 -0
  28. package/templates/.agents/workflows/create.md +59 -0
  29. package/templates/.agents/workflows/debug.md +103 -0
  30. package/templates/.agents/workflows/deploy.md +176 -0
  31. package/templates/.agents/workflows/enhance.md +63 -0
  32. package/templates/.agents/workflows/orchestrate.md +237 -0
  33. package/templates/.agents/workflows/plan.md +89 -0
  34. package/templates/.agents/workflows/preview.md +81 -0
  35. package/templates/.agents/workflows/setup-brain.md +39 -0
  36. package/templates/.agents/workflows/status.md +86 -0
  37. package/templates/.agents/workflows/test.md +144 -0
  38. package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
  39. package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
  40. package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
  41. package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
  42. package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
  43. package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
  44. package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
  45. package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
  46. package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
  47. package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  48. package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  49. package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
  50. package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
  51. package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
  52. package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
  53. package/templates/vault/007/scripts/config.py +472 -0
  54. package/templates/vault/007/scripts/full_audit.py +1306 -0
  55. package/templates/vault/007/scripts/quick_scan.py +481 -0
  56. package/templates/vault/007/scripts/requirements.txt +26 -0
  57. package/templates/vault/007/scripts/scanners/__init__.py +0 -0
  58. package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
  59. package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
  60. package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
  61. package/templates/vault/007/scripts/score_calculator.py +693 -0
  62. package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
  63. package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
  64. package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
  65. package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
  66. package/templates/vault/ai-studio-image/scripts/config.py +613 -0
  67. package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
  68. package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
  69. package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
  70. package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
  71. package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
  72. package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
  73. package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
  74. package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
  75. package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
  76. package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
  77. package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
  78. package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
  79. package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
  80. package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
  81. package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
  82. package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
  83. package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
  84. package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
  85. package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
  86. package/templates/vault/claude-monitor/scripts/config.py +69 -0
  87. package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
  88. package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
  89. package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
  90. package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
  91. package/templates/vault/context-agent/scripts/active_context.py +227 -0
  92. package/templates/vault/context-agent/scripts/compressor.py +149 -0
  93. package/templates/vault/context-agent/scripts/config.py +69 -0
  94. package/templates/vault/context-agent/scripts/context_loader.py +155 -0
  95. package/templates/vault/context-agent/scripts/context_manager.py +302 -0
  96. package/templates/vault/context-agent/scripts/models.py +103 -0
  97. package/templates/vault/context-agent/scripts/project_registry.py +132 -0
  98. package/templates/vault/context-agent/scripts/requirements.txt +6 -0
  99. package/templates/vault/context-agent/scripts/search.py +115 -0
  100. package/templates/vault/context-agent/scripts/session_parser.py +206 -0
  101. package/templates/vault/context-agent/scripts/session_summary.py +319 -0
  102. package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
  103. package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
  104. package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
  105. package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
  106. package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
  107. package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
  108. package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
  109. package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
  110. package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
  111. package/templates/vault/docx/scripts/__init__.py +1 -0
  112. package/templates/vault/docx/scripts/document.py +1276 -0
  113. package/templates/vault/docx/scripts/templates/comments.xml +3 -0
  114. package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
  115. package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
  116. package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
  117. package/templates/vault/docx/scripts/templates/people.xml +3 -0
  118. package/templates/vault/docx/scripts/utilities.py +374 -0
  119. package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
  120. package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
  121. package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
  122. package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
  123. package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
  124. package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
  125. package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
  126. package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
  127. package/templates/vault/docx-official/scripts/__init__.py +1 -0
  128. package/templates/vault/docx-official/scripts/document.py +1276 -0
  129. package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
  130. package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
  131. package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
  132. package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
  133. package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
  134. package/templates/vault/docx-official/scripts/utilities.py +374 -0
  135. package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  137. package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/vault/instagram/scripts/account_setup.py +233 -0
  139. package/templates/vault/instagram/scripts/analyze.py +221 -0
  140. package/templates/vault/instagram/scripts/api_client.py +444 -0
  141. package/templates/vault/instagram/scripts/auth.py +411 -0
  142. package/templates/vault/instagram/scripts/comments.py +160 -0
  143. package/templates/vault/instagram/scripts/config.py +111 -0
  144. package/templates/vault/instagram/scripts/db.py +467 -0
  145. package/templates/vault/instagram/scripts/export.py +138 -0
  146. package/templates/vault/instagram/scripts/governance.py +233 -0
  147. package/templates/vault/instagram/scripts/hashtags.py +114 -0
  148. package/templates/vault/instagram/scripts/insights.py +170 -0
  149. package/templates/vault/instagram/scripts/media.py +65 -0
  150. package/templates/vault/instagram/scripts/messages.py +103 -0
  151. package/templates/vault/instagram/scripts/profile.py +58 -0
  152. package/templates/vault/instagram/scripts/publish.py +449 -0
  153. package/templates/vault/instagram/scripts/requirements.txt +5 -0
  154. package/templates/vault/instagram/scripts/run_all.py +189 -0
  155. package/templates/vault/instagram/scripts/schedule.py +189 -0
  156. package/templates/vault/instagram/scripts/serve_api.py +234 -0
  157. package/templates/vault/instagram/scripts/templates.py +155 -0
  158. package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
  159. package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
  160. package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
  161. package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
  162. package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
  163. package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
  164. package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
  165. package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
  166. package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
  167. package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
  168. package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
  169. package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
  170. package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
  171. package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
  172. package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
  173. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
  174. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
  175. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
  176. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
  177. package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
  178. package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
  179. package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
  180. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
  181. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
  182. package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
  183. package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
  184. package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
  185. package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
  186. package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
  187. package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
  188. package/templates/vault/last30days/scripts/last30days.py +521 -0
  189. package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
  190. package/templates/vault/last30days/scripts/lib/cache.py +152 -0
  191. package/templates/vault/last30days/scripts/lib/dates.py +124 -0
  192. package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
  193. package/templates/vault/last30days/scripts/lib/env.py +149 -0
  194. package/templates/vault/last30days/scripts/lib/http.py +152 -0
  195. package/templates/vault/last30days/scripts/lib/models.py +175 -0
  196. package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
  197. package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
  198. package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
  199. package/templates/vault/last30days/scripts/lib/render.py +383 -0
  200. package/templates/vault/last30days/scripts/lib/schema.py +336 -0
  201. package/templates/vault/last30days/scripts/lib/score.py +311 -0
  202. package/templates/vault/last30days/scripts/lib/ui.py +324 -0
  203. package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
  204. package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
  205. package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
  206. package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
  207. package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
  208. package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
  209. package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
  210. package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
  211. package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
  212. package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
  213. package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
  214. package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
  215. package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
  216. package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
  217. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
  218. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
  219. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
  220. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
  221. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
  222. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
  223. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
  224. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
  225. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
  226. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
  227. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
  228. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
  229. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
  230. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
  231. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
  232. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
  233. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
  234. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
  235. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
  236. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
  237. package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
  238. package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
  239. package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
  240. package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
  241. package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
  242. package/templates/vault/mcp-builder/scripts/connections.py +151 -0
  243. package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
  244. package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
  245. package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
  246. package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
  247. package/templates/vault/notebooklm/scripts/__init__.py +81 -0
  248. package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
  249. package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
  250. package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
  251. package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
  252. package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
  253. package/templates/vault/notebooklm/scripts/config.py +44 -0
  254. package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
  255. package/templates/vault/notebooklm/scripts/run.py +102 -0
  256. package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
  257. package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
  258. package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
  259. package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
  260. package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
  261. package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
  262. package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
  263. package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
  264. package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  265. package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
  266. package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
  267. package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
  268. package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
  269. package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
  270. package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
  271. package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
  272. package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
  273. package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
  274. package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
  275. package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
  276. package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
  277. package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
  278. package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
  279. package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
  280. package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
  281. package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
  282. package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
  283. package/templates/vault/pptx/scripts/html2pptx.js +979 -0
  284. package/templates/vault/pptx/scripts/inventory.py +1020 -0
  285. package/templates/vault/pptx/scripts/rearrange.py +231 -0
  286. package/templates/vault/pptx/scripts/replace.py +385 -0
  287. package/templates/vault/pptx/scripts/thumbnail.py +450 -0
  288. package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
  289. package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
  290. package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
  291. package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
  292. package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
  293. package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
  294. package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
  295. package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
  296. package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
  297. package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
  298. package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
  299. package/templates/vault/pptx-official/scripts/replace.py +385 -0
  300. package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
  301. package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
  302. package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
  303. package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  304. package/templates/vault/scripts/.skill_cache.json +7538 -0
  305. package/templates/vault/scripts/skill_search.py +228 -0
  306. package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
  307. package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
  308. package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
  309. package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
  310. package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
  311. package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
  312. package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
  313. package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
  314. package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
  315. package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
  316. package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
  317. package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
  318. package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
  319. package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
  320. package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
  321. package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
  322. package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
  323. package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
  324. package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
  325. package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
  326. package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
  327. package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
  328. package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
  329. package/templates/vault/skill-sentinel/scripts/config.py +158 -0
  330. package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
  331. package/templates/vault/skill-sentinel/scripts/db.py +354 -0
  332. package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
  333. package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
  334. package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
  335. package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
  336. package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
  337. package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
  338. package/templates/vault/stability-ai/scripts/config.py +266 -0
  339. package/templates/vault/stability-ai/scripts/generate.py +687 -0
  340. package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
  341. package/templates/vault/stability-ai/scripts/styles.py +174 -0
  342. package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
  343. package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
  344. package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
  345. package/templates/vault/telegram/scripts/send_message.py +143 -0
  346. package/templates/vault/telegram/scripts/setup_project.py +103 -0
  347. package/templates/vault/telegram/scripts/test_bot.py +144 -0
  348. package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
  349. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  350. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  351. package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
  352. package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
  353. package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
  354. package/templates/vault/videodb/scripts/ws_listener.py +204 -0
  355. package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  357. package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
  359. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
  360. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
  361. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
  362. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
  363. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
  364. package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
  365. package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
  366. package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
  367. package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
  368. package/templates/vault/youtube-summarizer/scripts/install-dependencies.sh +28 -0
@@ -0,0 +1,256 @@
1
+ """
2
+ Scraper JUCER — Junta Comercial do Estado de Rondonia
3
+ URL: https://rondonia.ro.gov.br/jucer/lista-de-leiloeiros-oficiais/
4
+ Metodo: httpx + BeautifulSoup com parser DL/DT/DD
5
+ Estrutura descoberta em 2026-02-25:
6
+ WordPress CMS com estrutura DL/DT/DD aninada e malformada:
7
+ <dt><strong>NOME</strong></dt>
8
+ <dd><em>Matricula: <i>007/1995</i></em></dd>
9
+ <dd><em>Data da posse: <i>19/05/1995</i></em></dd>
10
+ <dd><em>Cidade: <i>Porto Velho</i></em></dd>
11
+ <dd><em>Endereco: <i>...</i></em></dd>
12
+ <dd><em>Telefone: <i>...</i></em></dd>
13
+ <dd><em>E-mail: <a href="mailto:...">...</a></em></dd>
14
+ <dd><em>Situacao:<strong>REGULAR</strong></em></dd>
15
+ <hr />
16
+ Total: ~47 leiloeiros separados por <hr>
17
+ Situacoes: Regular, Irregular, Afastado judicial
18
+ """
19
+ from __future__ import annotations
20
+
21
+ import logging
22
+ import re
23
+ from typing import List
24
+
25
+ from .base_scraper import AbstractJuntaScraper, Leiloeiro
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+ RE_MATRICULA_RO = re.compile(r"[Mm]atr[íi]cula:?\s*(.+)")
30
+ RE_POSSE_RO = re.compile(r"[Dd]ata\s+da\s+[Pp]osse:?\s*(.+)")
31
+ RE_CIDADE_RO = re.compile(r"[Cc]idade:?\s*(.+)")
32
+ RE_ENDERECO_RO = re.compile(r"[Ee]ndere[çc]o:?\s*(.+)")
33
+ RE_TELEFONE_RO = re.compile(r"[Tt]elefone:?\s*(.+)")
34
+ RE_EMAIL_RO = re.compile(r"[Ee]-?[Mm]ail:?\s*(.+)")
35
+ RE_SITUACAO_RO = re.compile(r"[Ss]itua[çc][aã]o:?\s*(.+)")
36
+
37
+
38
+ class JucerScraper(AbstractJuntaScraper):
39
+ estado = "RO"
40
+ junta = "JUCER"
41
+ url = "https://rondonia.ro.gov.br/jucer/lista-de-leiloeiros-oficiais/"
42
+
43
+ def _parse_dl_structure(self, soup) -> List[dict]:
44
+ """
45
+ Parseia estrutura DL/DT/DD do WordPress com anotacao malformada.
46
+ Estrategia: encontrar todos <dt><strong>NOME</strong></dt>
47
+ e coletar os <dd> subsequentes ate o proximo <dt> ou <hr>.
48
+ """
49
+ records = []
50
+
51
+ # Encontrar area de conteudo
52
+ content = soup.select_one(
53
+ ".entry-content, .post-content, article .content, .conteudo, "
54
+ "#conteudo, main article, .page-content"
55
+ )
56
+ if not content:
57
+ content = soup.body or soup
58
+
59
+ # Abordagem 1: dt/dd estruturado
60
+ dts = content.find_all("dt")
61
+ for dt in dts:
62
+ strong = dt.find("strong")
63
+ if not strong:
64
+ continue
65
+ nome = self.clean(strong.get_text())
66
+ if not nome or len(nome) < 3:
67
+ continue
68
+
69
+ record = {"nome": nome, "municipio": "Porto Velho"}
70
+
71
+ # Coletar dd's subsequentes
72
+ sibling = dt.next_sibling
73
+ for _ in range(15):
74
+ if sibling is None:
75
+ break
76
+ if hasattr(sibling, "name"):
77
+ if sibling.name == "dt":
78
+ break
79
+ if sibling.name == "hr":
80
+ break
81
+ if sibling.name == "dd":
82
+ text = self.clean(sibling.get_text())
83
+ if text:
84
+ self._extract_dd_field(text, record)
85
+ sibling = sibling.next_sibling
86
+
87
+ records.append(record)
88
+
89
+ if records:
90
+ return records
91
+
92
+ # Abordagem 2: Segmentar por <hr> e parsear cada bloco
93
+ # Obter HTML como string e dividir por <hr>
94
+ full_text = content.get_text("\n")
95
+ # Usa separadores de linha longa como delimitadores de entrada
96
+ segments = re.split(r"\n\s*[-_]{5,}\s*\n|\n(?=\d+\.\s+[A-Z])", full_text)
97
+
98
+ for seg in segments:
99
+ lines = [l.strip() for l in seg.strip().split("\n") if l.strip()]
100
+ if len(lines) < 2:
101
+ continue
102
+
103
+ # Primeira linha substancial e o nome
104
+ nome = None
105
+ remaining = []
106
+ for i, line in enumerate(lines):
107
+ if (len(line) > 3 and
108
+ re.search(r"[A-ZÁÉÍÓÚÀÃÕÇ]", line) and
109
+ not re.match(r"[Mm]atr|[Dd]ata|[Cc]idad|[Ee]ndere|[Tt]ele|[Ee]-?mail|[Ss]itua", line)):
110
+ nome = line
111
+ remaining = lines[i+1:]
112
+ break
113
+
114
+ if not nome:
115
+ continue
116
+
117
+ record = {"nome": nome, "municipio": "Porto Velho"}
118
+ for line in remaining:
119
+ self._extract_dd_field(line, record)
120
+ records.append(record)
121
+
122
+ return records
123
+
124
+ def _extract_dd_field(self, text: str, record: dict) -> None:
125
+ """Extrai campos de uma linha de texto e popula o record."""
126
+ m = RE_MATRICULA_RO.match(text)
127
+ if m:
128
+ record["matricula"] = self.clean(m.group(1))
129
+ return
130
+ m = RE_POSSE_RO.match(text)
131
+ if m:
132
+ record["data_registro"] = self.clean(m.group(1))
133
+ return
134
+ m = RE_CIDADE_RO.match(text)
135
+ if m:
136
+ record["municipio"] = self.clean(m.group(1))
137
+ return
138
+ m = RE_ENDERECO_RO.match(text)
139
+ if m:
140
+ record["endereco"] = self.clean(m.group(1))
141
+ return
142
+ m = RE_TELEFONE_RO.match(text)
143
+ if m:
144
+ record["telefone"] = self.clean(m.group(1))
145
+ return
146
+ m = RE_EMAIL_RO.match(text)
147
+ if m:
148
+ record["email"] = self.clean(m.group(1))
149
+ return
150
+ m = RE_SITUACAO_RO.match(text)
151
+ if m:
152
+ record["situacao"] = self.clean(m.group(1))
153
+ return
154
+
155
+ def _parse_hr_blocks(self, soup) -> List[dict]:
156
+ """
157
+ Estrategia alternativa: coleta conteudo entre tags <hr>.
158
+ Cada bloco entre <hr> e uma entrada de leiloeiro.
159
+ """
160
+ records = []
161
+ content = soup.select_one(".entry-content, .post-content, article .content, main, body")
162
+ if not content:
163
+ return []
164
+
165
+ # Coletar todos os elementos ate os <hr>
166
+ current_block = []
167
+ blocks = []
168
+
169
+ for el in content.descendants:
170
+ if not hasattr(el, "name"):
171
+ continue
172
+ if el.name == "hr":
173
+ if current_block:
174
+ blocks.append(current_block)
175
+ current_block = []
176
+ elif el.name in ("dt", "dd", "strong", "i", "em", "a", "p"):
177
+ text = self.clean(el.get_text())
178
+ if text:
179
+ current_block.append((el.name, text))
180
+
181
+ if current_block:
182
+ blocks.append(current_block)
183
+
184
+ for block in blocks:
185
+ if not block:
186
+ continue
187
+
188
+ record = {"municipio": "Porto Velho"}
189
+ nome_found = False
190
+
191
+ for tag, text in block:
192
+ if not nome_found and tag in ("dt", "strong"):
193
+ if len(text) > 3 and re.search(r"[A-ZÁÉÍÓÚÀÃÕÇ]", text):
194
+ # Verificar se nao e um campo de dado
195
+ if not re.match(r"[Mm]atr|[Dd]ata|[Cc]idad|[Ee]ndere|[Tt]ele|[Ee]-?mail|[Ss]itua", text):
196
+ record["nome"] = text
197
+ nome_found = True
198
+ continue
199
+ self._extract_dd_field(text, record)
200
+
201
+ if record.get("nome"):
202
+ records.append(record)
203
+
204
+ return records
205
+
206
+ async def parse_leiloeiros(self) -> List[Leiloeiro]:
207
+ soup = await self.fetch_page()
208
+ if not soup:
209
+ soup = await self.fetch_page_js(wait_ms=3000)
210
+ if not soup:
211
+ return []
212
+
213
+ # Estrategia 1: Parser DL/DT/DD estruturado
214
+ records = self._parse_dl_structure(soup)
215
+
216
+ if not records:
217
+ # Estrategia 2: Parser por blocos HR
218
+ records = self._parse_hr_blocks(soup)
219
+
220
+ if not records:
221
+ # Estrategia 3: Tabela generica (fallback)
222
+ for table in soup.find_all("table"):
223
+ rows = table.find_all("tr")
224
+ if len(rows) < 2:
225
+ continue
226
+ headers = [self.clean(th.get_text()) for th in rows[0].find_all(["th", "td"])]
227
+ col = {(h or "").lower(): i for i, h in enumerate(headers)}
228
+
229
+ def gcol(cells, frags):
230
+ for k, i in col.items():
231
+ if any(f in k for f in frags) and i < len(cells):
232
+ return self.clean(cells[i].get_text())
233
+ return None
234
+
235
+ for row in rows[1:]:
236
+ cells = row.find_all(["td", "th"])
237
+ if not cells:
238
+ continue
239
+ nome = gcol(cells, ["nome", "leiloeiro"]) or self.clean(cells[0].get_text())
240
+ if not nome or len(nome) < 3:
241
+ continue
242
+ records.append({
243
+ "nome": nome,
244
+ "matricula": gcol(cells, ["matr", "registro"]),
245
+ "situacao": gcol(cells, ["situ", "status"]),
246
+ "municipio": gcol(cells, ["munic", "cidade"]) or "Porto Velho",
247
+ "telefone": gcol(cells, ["tel", "fone"]),
248
+ "email": gcol(cells, ["email"]),
249
+ "endereco": gcol(cells, ["ender", "logr"]),
250
+ "data_registro": gcol(cells, ["data", "posse"]),
251
+ })
252
+ if records:
253
+ break
254
+
255
+ logger.info("[RO] Total: %d registros encontrados", len(records))
256
+ return [self.make_leiloeiro(**r) for r in records if r.get("nome")]
@@ -0,0 +1,170 @@
1
+ """
2
+ Scraper JUCERJA — Junta Comercial do Estado do Rio de Janeiro
3
+ URL: https://www.jucerja.rj.gov.br/AuxiliaresComercio/Leiloeiros
4
+ Metodo: httpx com paginacao AJAX
5
+ Endpoints reais descobertos em 2026-02-25:
6
+ - Lista paginada (5/pg): GET /AuxiliaresComercio/FiltrarLeiloeiros?pagina=N&ordenacao=matricula&SituacaoFuncionalId=
7
+ - SituacaoFuncionalId vazio = todos os status
8
+ Estrutura HTML: <ul class="ats-listaLnks ats-container--estrutura">
9
+ com <li class="ats-listaLnks-item"> contendo pares <h5>label</h5><h6>valor</h6>
10
+ Total: ~334 leiloeiros (108 Regular + 132 Cancelados + 94 outros)
11
+ 67 paginas x 5 registros/pagina com SituacaoFuncionalId em branco
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import logging
17
+ from typing import List
18
+
19
+ from .base_scraper import AbstractJuntaScraper, Leiloeiro
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class JucerjaScraper(AbstractJuntaScraper):
25
+ estado = "RJ"
26
+ junta = "JUCERJA"
27
+ url = "https://www.jucerja.rj.gov.br/AuxiliaresComercio/Leiloeiros"
28
+
29
+ # Endpoint AJAX real da paginacao (descoberto em 2026-02-25)
30
+ _PAGINAR_URL = "https://www.jucerja.rj.gov.br/AuxiliaresComercio/FiltrarLeiloeiros"
31
+
32
+ def _parse_lista(self, soup) -> List[dict]:
33
+ """
34
+ Extrai leiloeiros da lista HTML.
35
+ Estrutura: <ul class="ats-listaLnks"> com <li> contendo <h5> (label) e <h6> (valor).
36
+ """
37
+ records = []
38
+
39
+ # Seletor primario: li dentro da lista de leiloeiros
40
+ items = soup.select("ul.ats-listaLnks li, ul.ats-container--estrutura li, #listaLeiloeiros li, .listagemLeiloeiros li")
41
+ if not items:
42
+ # Fallback: qualquer li com h5 e h6
43
+ items = [li for li in soup.find_all("li") if li.find("h5") and li.find("h6")]
44
+
45
+ for li in items:
46
+ labels = [self.clean(h.get_text()) for h in li.find_all("h5")]
47
+ values = [self.clean(h.get_text()) for h in li.find_all("h6")]
48
+ if not labels or not values:
49
+ continue
50
+
51
+ # Mapa label.lower() -> valor
52
+ data = {}
53
+ for label, val in zip(labels, values):
54
+ if label:
55
+ data[label.lower().rstrip(":")] = val
56
+
57
+ def get_val(*frags):
58
+ for k, v in data.items():
59
+ if any(f in k for f in frags) and v:
60
+ return v
61
+ return None
62
+
63
+ # Nome: pode ser "leiloeiro", "nome" ou o primeiro valor
64
+ nome = get_val("leiloeiro", "nome") or (values[0] if values else None)
65
+ if not nome or len(nome) < 3:
66
+ continue
67
+
68
+ records.append({
69
+ "nome": nome,
70
+ "matricula": get_val("matr", "registro", "nº matr", "n° matr"),
71
+ "situacao": get_val("situ", "funcional", "status"),
72
+ "municipio": get_val("munic", "cidade"),
73
+ "telefone": get_val("tel", "fone"),
74
+ "email": get_val("email", "e-mail"),
75
+ "endereco": get_val("ender", "logr", "rua", "endere"),
76
+ "data_registro": get_val("data matrícula", "posse", "data"),
77
+ })
78
+
79
+ return records
80
+
81
+ async def parse_leiloeiros(self) -> List[Leiloeiro]:
82
+ """
83
+ Coleta todos os leiloeiros via endpoint AJAX de paginacao.
84
+ GET /AuxiliaresComercio/FiltrarLeiloeiros?pagina=N&ordenacao=matricula&SituacaoFuncionalId=
85
+ Pagina 5 registros por vez; SituacaoFuncionalId em branco = todos os status.
86
+ """
87
+ import httpx
88
+ results: List[Leiloeiro] = []
89
+ pagina = 1
90
+ seen_names: set = set()
91
+
92
+ headers = {
93
+ **self.HEADERS,
94
+ "X-Requested-With": "XMLHttpRequest",
95
+ "Referer": self.url,
96
+ }
97
+
98
+ try:
99
+ async with httpx.AsyncClient(
100
+ headers=headers,
101
+ verify=True,
102
+ follow_redirects=True,
103
+ timeout=60.0,
104
+ ) as client:
105
+ # Primeiro GET na pagina principal para obter cookies
106
+ await client.get(self.url)
107
+
108
+ while True:
109
+ url_pagina = (
110
+ f"{self._PAGINAR_URL}"
111
+ f"?pagina={pagina}&ordenacao=matricula&Nome=&SituacaoFuncionalId="
112
+ )
113
+ try:
114
+ resp = await client.get(url_pagina)
115
+ if resp.status_code >= 400:
116
+ logger.warning("[RJ] Pagina %d retornou HTTP %d", pagina, resp.status_code)
117
+ break
118
+ except Exception as exc:
119
+ logger.error("[RJ] Erro na pagina %d: %s", pagina, exc)
120
+ break
121
+
122
+ from bs4 import BeautifulSoup
123
+ soup = BeautifulSoup(resp.text, "lxml")
124
+ page_records = self._parse_lista(soup)
125
+
126
+ if not page_records:
127
+ logger.debug("[RJ] Pagina %d sem registros — fim da paginacao", pagina)
128
+ break
129
+
130
+ # Evita duplicatas (mesmo nome ja visto)
131
+ novos = 0
132
+ for r in page_records:
133
+ key = r["nome"].upper()
134
+ if key not in seen_names:
135
+ seen_names.add(key)
136
+ if not r.get("municipio"):
137
+ r["municipio"] = "Rio de Janeiro"
138
+ results.append(self.make_leiloeiro(**r))
139
+ novos += 1
140
+
141
+ logger.debug("[RJ] Pagina %d: %d novos (total=%d)", pagina, novos, len(results))
142
+
143
+ if novos == 0:
144
+ break # Pagina repetiu dados — parar
145
+
146
+ pagina += 1
147
+ if pagina > 100: # Limite de seguranca
148
+ logger.warning("[RJ] Limite de paginas atingido")
149
+ break
150
+
151
+ await asyncio.sleep(0.3) # Evita sobrecarga
152
+
153
+ except Exception as exc:
154
+ logger.error("[RJ] Erro geral na coleta: %s", exc)
155
+
156
+ if not results:
157
+ # Fallback: Playwright para pagina estatica com qualquer registro
158
+ logger.info("[RJ] Tentando Playwright como fallback")
159
+ soup = await self.fetch_page_js(
160
+ url=self.url,
161
+ wait_selector="li",
162
+ wait_ms=5000,
163
+ )
164
+ if soup:
165
+ for r in self._parse_lista(soup):
166
+ if not r.get("municipio"):
167
+ r["municipio"] = "Rio de Janeiro"
168
+ results.append(self.make_leiloeiro(**r))
169
+
170
+ return results
@@ -0,0 +1,71 @@
1
+ """
2
+ Scraper JUCERN — Junta Comercial do Estado do Rio Grande do Norte
3
+ URL: http://www.jucern.rn.gov.br/Conteudo.asp?TRAN=ITEM&TARG=8695&ACT=&PAGE=0&PARM=&LBL=Leiloeiros
4
+ Método: httpx (HTTP sem TLS — site usa HTTP apenas)
5
+ Nota: URL com parâmetros de query é a página correta de leiloeiros.
6
+ Usar HTTP (não HTTPS). Referenciado em FENAJU e InnLei como ativo.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from typing import List
11
+
12
+ from .base_scraper import AbstractJuntaScraper, Leiloeiro
13
+
14
+
15
+ class JucernScraper(AbstractJuntaScraper):
16
+ estado = "RN"
17
+ junta = "JUCERN"
18
+ url = "http://www.jucern.rn.gov.br/Conteudo.asp?TRAN=ITEM&TARG=8695&ACT=&PAGE=0&PARM=&LBL=Leiloeiros"
19
+
20
+ async def parse_leiloeiros(self) -> List[Leiloeiro]:
21
+ soup = await self.fetch_page()
22
+ if not soup:
23
+ # Tenta domínio sem www
24
+ soup = await self.fetch_page(url="http://jucern.rn.gov.br/Conteudo.asp?TRAN=ITEM&TARG=8695&ACT=&PAGE=0&PARM=&LBL=Leiloeiros")
25
+ if not soup:
26
+ soup = await self.fetch_page_js(wait_ms=3000)
27
+ if not soup:
28
+ return []
29
+
30
+ results: List[Leiloeiro] = []
31
+
32
+ for table in soup.find_all("table"):
33
+ rows = table.find_all("tr")
34
+ if len(rows) < 2:
35
+ continue
36
+ headers = [self.clean(th.get_text()) for th in rows[0].find_all(["th", "td"])]
37
+ col = {(h or "").lower(): i for i, h in enumerate(headers)}
38
+
39
+ def gcol(cells, frags):
40
+ for k, i in col.items():
41
+ if any(f in k for f in frags) and i < len(cells):
42
+ return self.clean(cells[i].get_text())
43
+ return None
44
+
45
+ for row in rows[1:]:
46
+ cells = row.find_all(["td", "th"])
47
+ if not cells:
48
+ continue
49
+ nome = gcol(cells, ["nome", "leiloeiro"]) or self.clean(cells[0].get_text())
50
+ if not nome or len(nome) < 3:
51
+ continue
52
+ results.append(self.make_leiloeiro(
53
+ nome=nome,
54
+ matricula=gcol(cells, ["matr", "registro", "nº"]),
55
+ situacao=gcol(cells, ["situ", "status"]),
56
+ municipio=gcol(cells, ["munic", "cidade"]) or "Natal",
57
+ telefone=gcol(cells, ["tel", "fone"]),
58
+ email=gcol(cells, ["email"]),
59
+ endereco=gcol(cells, ["ender", "logr"]),
60
+ data_registro=gcol(cells, ["data", "posse"]),
61
+ ))
62
+ if results:
63
+ break
64
+
65
+ if not results:
66
+ for el in soup.select("td, li, p"):
67
+ text = self.clean(el.get_text())
68
+ if text and len(text) > 10 and any(c.isupper() for c in text[:20]):
69
+ results.append(self.make_leiloeiro(nome=text, municipio="Natal"))
70
+
71
+ return results
@@ -0,0 +1,89 @@
1
+ """
2
+ Scraper JUCESC — Junta Comercial do Estado de Santa Catarina
3
+ URL: https://leiloeiros.jucesc.sc.gov.br/site/
4
+ https://leiloeiros.jucesc.sc.gov.br/site/porcidade.php (por cidade)
5
+ Método: httpx + BeautifulSoup (sistema dedicado com tabela HTML)
6
+ Nota: Sistema migrou para subdomínio dedicado leiloeiros.jucesc.sc.gov.br
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from typing import List
11
+
12
+ from .base_scraper import AbstractJuntaScraper, Leiloeiro
13
+
14
+
15
+ class JucescScraper(AbstractJuntaScraper):
16
+ estado = "SC"
17
+ junta = "JUCESC"
18
+ url = "https://leiloeiros.jucesc.sc.gov.br/site/"
19
+
20
+ async def parse_leiloeiros(self) -> List[Leiloeiro]:
21
+ soup = await self.fetch_page()
22
+ if not soup:
23
+ soup = await self.fetch_page_js(wait_ms=3000)
24
+ if not soup:
25
+ return []
26
+
27
+ results: List[Leiloeiro] = []
28
+
29
+ for table in soup.find_all("table"):
30
+ rows = table.find_all("tr")
31
+ if len(rows) < 2:
32
+ continue
33
+ headers = [self.clean(th.get_text()) for th in rows[0].find_all(["th", "td"])]
34
+ if not headers:
35
+ continue
36
+
37
+ col = {(h or "").lower(): i for i, h in enumerate(headers)}
38
+
39
+ def gcol(cells, frags):
40
+ for k, i in col.items():
41
+ if any(f in k for f in frags) and i < len(cells):
42
+ return self.clean(cells[i].get_text())
43
+ return None
44
+
45
+ for row in rows[1:]:
46
+ cells = row.find_all(["td", "th"])
47
+ if not cells:
48
+ continue
49
+ nome = gcol(cells, ["nome", "leiloeiro"]) or self.clean(cells[0].get_text())
50
+ if not nome or len(nome) < 3:
51
+ continue
52
+ results.append(self.make_leiloeiro(
53
+ nome=nome,
54
+ matricula=gcol(cells, ["matr", "registro", "nº", "numero", "antiguidade"]),
55
+ cpf_cnpj=gcol(cells, ["cpf", "cnpj"]),
56
+ situacao=gcol(cells, ["situ", "status"]),
57
+ municipio=gcol(cells, ["munic", "cidade"]) or "Florianópolis",
58
+ telefone=gcol(cells, ["tel", "fone"]),
59
+ email=gcol(cells, ["email"]),
60
+ endereco=gcol(cells, ["ender", "logr", "rua"]),
61
+ data_registro=gcol(cells, ["data", "posse", "registro"]),
62
+ ))
63
+ if results:
64
+ break
65
+
66
+ # Se não achou tabela, tenta página por cidade para pegar todos
67
+ if not results:
68
+ soup2 = await self.fetch_page(url="https://leiloeiros.jucesc.sc.gov.br/site/porcidade.php")
69
+ if soup2:
70
+ for table in soup2.find_all("table"):
71
+ rows = table.find_all("tr")
72
+ if len(rows) < 2:
73
+ continue
74
+ for row in rows[1:]:
75
+ cells = row.find_all(["td", "th"])
76
+ if not cells:
77
+ continue
78
+ nome = self.clean(cells[0].get_text())
79
+ if not nome or len(nome) < 3:
80
+ continue
81
+ results.append(self.make_leiloeiro(
82
+ nome=nome,
83
+ matricula=self.clean(cells[1].get_text()) if len(cells) > 1 else None,
84
+ municipio=self.clean(cells[2].get_text()) if len(cells) > 2 else "Florianópolis",
85
+ ))
86
+ if results:
87
+ break
88
+
89
+ return results