mindforge-cc 11.8.2 → 11.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/.agent/mindforge/wf-orchestrate-review.md +35 -0
  2. package/.agent/mindforge/wf-verification-loop.md +45 -0
  3. package/.agent/mindforge/wf-workflow-optimizer.md +51 -0
  4. package/.agent/skills/article-illustrator/SKILL.md +7 -7
  5. package/.agent/skills/arxiv/SKILL.md +6 -6
  6. package/.agent/skills/code-wiki/SKILL.md +11 -11
  7. package/.agent/skills/concept-diagrams/SKILL.md +6 -6
  8. package/.agent/skills/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
  9. package/.agent/skills/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
  10. package/.agent/skills/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
  11. package/.agent/skills/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
  12. package/.agent/skills/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
  13. package/.agent/skills/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
  14. package/.agent/skills/concept-diagrams/examples/electricity-grid-flow.md +182 -0
  15. package/.agent/skills/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
  16. package/.agent/skills/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
  17. package/.agent/skills/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
  18. package/.agent/skills/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
  19. package/.agent/skills/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
  20. package/.agent/skills/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
  21. package/.agent/skills/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
  22. package/.agent/skills/concept-diagrams/examples/wind-turbine-structure.md +338 -0
  23. package/.agent/skills/concept-diagrams/templates/template.html +174 -0
  24. package/.agent/skills/domain-intel/SKILL.md +7 -7
  25. package/.agent/skills/duckduckgo-search/SKILL.md +17 -17
  26. package/.agent/skills/github-auth/scripts/gh-env.sh +66 -0
  27. package/.agent/skills/github-code-review/SKILL.md +9 -9
  28. package/.agent/skills/github-pr-workflow/SKILL.md +3 -3
  29. package/.agent/skills/godmode/SKILL.md +8 -8
  30. package/.agent/skills/jupyter-live-kernel/SKILL.md +3 -3
  31. package/.agent/skills/kanban-orchestrator/SKILL.md +10 -10
  32. package/.agent/skills/kanban-worker/SKILL.md +6 -6
  33. package/.agent/skills/llm-wiki/SKILL.md +7 -7
  34. package/.agent/skills/mindforge-autonomous/SKILL.md +1 -1
  35. package/.agent/skills/mindforge-complete-milestone/SKILL.md +1 -1
  36. package/.agent/skills/mindforge-discuss-phase/SKILL.md +1 -1
  37. package/.agent/skills/mindforge-do/SKILL.md +1 -1
  38. package/.agent/skills/mindforge-execute-phase/SKILL.md +1 -1
  39. package/.agent/skills/mindforge-list-workspaces/SKILL.md +1 -1
  40. package/.agent/skills/mindforge-manager/SKILL.md +1 -1
  41. package/.agent/skills/mindforge-neural-orchestrator/SKILL.md +1 -1
  42. package/.agent/skills/mindforge-new-milestone/SKILL.md +4 -4
  43. package/.agent/skills/mindforge-new-project/SKILL.md +4 -4
  44. package/.agent/skills/mindforge-new-workspace/SKILL.md +1 -1
  45. package/.agent/skills/mindforge-note/SKILL.md +1 -1
  46. package/.agent/skills/mindforge-plan-phase/SKILL.md +1 -1
  47. package/.agent/skills/mindforge-profile-user/SKILL.md +1 -1
  48. package/.agent/skills/mindforge-remove-workspace/SKILL.md +1 -1
  49. package/.agent/skills/mindforge-research-phase/SKILL.md +1 -1
  50. package/.agent/skills/mindforge-ui-phase/SKILL.md +1 -1
  51. package/.agent/skills/mindforge-ui-review/SKILL.md +1 -1
  52. package/.agent/skills/mindforge-verify-work/SKILL.md +1 -1
  53. package/.agent/skills/mindforge-workspace-isolated/SKILL.md +1 -1
  54. package/.agent/skills/node-inspect-debugger/SKILL.md +1 -1
  55. package/.agent/skills/obsidian/SKILL.md +15 -15
  56. package/.agent/skills/osint-investigation/SKILL.md +3 -2
  57. package/.agent/skills/osint-investigation/references/sources/courtlistener.md +98 -0
  58. package/.agent/skills/osint-investigation/references/sources/gdelt.md +104 -0
  59. package/.agent/skills/osint-investigation/references/sources/icij-offshore.md +104 -0
  60. package/.agent/skills/osint-investigation/references/sources/nyc-acris.md +90 -0
  61. package/.agent/skills/osint-investigation/references/sources/ofac-sdn.md +92 -0
  62. package/.agent/skills/osint-investigation/references/sources/opencorporates.md +103 -0
  63. package/.agent/skills/osint-investigation/references/sources/sec-edgar.md +83 -0
  64. package/.agent/skills/osint-investigation/references/sources/senate-ld.md +89 -0
  65. package/.agent/skills/osint-investigation/references/sources/usaspending.md +97 -0
  66. package/.agent/skills/osint-investigation/references/sources/wayback.md +93 -0
  67. package/.agent/skills/osint-investigation/references/sources/wikipedia.md +107 -0
  68. package/.agent/skills/osint-investigation/scripts/_http.py +82 -0
  69. package/.agent/skills/osint-investigation/scripts/_normalize.py +67 -0
  70. package/.agent/skills/osint-investigation/scripts/build_findings.py +221 -0
  71. package/.agent/skills/osint-investigation/scripts/entity_resolution.py +228 -0
  72. package/.agent/skills/osint-investigation/scripts/fetch_courtlistener.py +149 -0
  73. package/.agent/skills/osint-investigation/scripts/fetch_gdelt.py +161 -0
  74. package/.agent/skills/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
  75. package/.agent/skills/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
  76. package/.agent/skills/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
  77. package/.agent/skills/osint-investigation/scripts/fetch_opencorporates.py +191 -0
  78. package/.agent/skills/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
  79. package/.agent/skills/osint-investigation/scripts/fetch_senate_ld.py +146 -0
  80. package/.agent/skills/osint-investigation/scripts/fetch_usaspending.py +170 -0
  81. package/.agent/skills/osint-investigation/scripts/fetch_wayback.py +142 -0
  82. package/.agent/skills/osint-investigation/scripts/fetch_wikipedia.py +266 -0
  83. package/.agent/skills/osint-investigation/scripts/timing_analysis.py +252 -0
  84. package/.agent/skills/oss-forensics/SKILL.md +10 -9
  85. package/.agent/skills/oss-forensics/scripts/evidence-store.py +313 -0
  86. package/.agent/skills/parallel-cli/SKILL.md +2 -2
  87. package/.agent/skills/pinggy-tunnel/SKILL.md +3 -3
  88. package/.agent/skills/pixel-art/SKILL.md +2 -2
  89. package/.agent/skills/plan/SKILL.md +10 -10
  90. package/.agent/skills/requesting-code-review/SKILL.md +4 -6
  91. package/.agent/skills/research-paper-writing/SKILL.md +32 -32
  92. package/.agent/skills/rest-graphql-debug/SKILL.md +31 -32
  93. package/.agent/skills/s6-container-supervision/SKILL.md +1 -1
  94. package/.agent/skills/scrapling/SKILL.md +1 -1
  95. package/.agent/skills/sherlock/SKILL.md +1 -1
  96. package/.agent/skills/simplify-code/SKILL.md +5 -7
  97. package/.agent/skills/skill-authoring/SKILL.md +4 -4
  98. package/.agent/skills/spike/SKILL.md +11 -13
  99. package/.agent/skills/subagent-driven-development/SKILL.md +7 -11
  100. package/.agent/skills/systematic-debugging/SKILL.md +13 -14
  101. package/.agent/skills/test-driven-development/SKILL.md +6 -7
  102. package/.agent/skills/video-orchestrator/SKILL.md +1 -1
  103. package/.agent/skills/web-pentest/SKILL.md +7 -7
  104. package/.mindforge/config.json +3 -2
  105. package/.mindforge/dynamic-workflows/REGISTRY.md +4 -1
  106. package/.mindforge/dynamic-workflows/index.json +910 -840
  107. package/.mindforge/dynamic-workflows/scripts/accessibility-audit.js +88 -90
  108. package/.mindforge/dynamic-workflows/scripts/ai-model-eval.js +59 -61
  109. package/.mindforge/dynamic-workflows/scripts/api-contract-test.js +87 -85
  110. package/.mindforge/dynamic-workflows/scripts/api-migration.js +120 -122
  111. package/.mindforge/dynamic-workflows/scripts/architecture-modernization.js +84 -86
  112. package/.mindforge/dynamic-workflows/scripts/code-audit.js +75 -77
  113. package/.mindforge/dynamic-workflows/scripts/code-explainer.js +99 -101
  114. package/.mindforge/dynamic-workflows/scripts/competitive-analysis.js +62 -64
  115. package/.mindforge/dynamic-workflows/scripts/competitive-teardown.js +106 -108
  116. package/.mindforge/dynamic-workflows/scripts/cost-analysis.js +78 -80
  117. package/.mindforge/dynamic-workflows/scripts/data-pipeline-validate.js +47 -49
  118. package/.mindforge/dynamic-workflows/scripts/database-migration.js +85 -87
  119. package/.mindforge/dynamic-workflows/scripts/debug-detective.js +97 -99
  120. package/.mindforge/dynamic-workflows/scripts/dependency-health.js +81 -83
  121. package/.mindforge/dynamic-workflows/scripts/design-system-audit.js +84 -86
  122. package/.mindforge/dynamic-workflows/scripts/documentation-gen.js +65 -67
  123. package/.mindforge/dynamic-workflows/scripts/feature-planner.js +78 -80
  124. package/.mindforge/dynamic-workflows/scripts/incident-response.js +81 -83
  125. package/.mindforge/dynamic-workflows/scripts/multi-repo-sync.js +49 -51
  126. package/.mindforge/dynamic-workflows/scripts/mutation-testing.js +113 -115
  127. package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +79 -81
  128. package/.mindforge/dynamic-workflows/scripts/orchestrate-review.js +115 -0
  129. package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +97 -99
  130. package/.mindforge/dynamic-workflows/scripts/pr-review.js +61 -63
  131. package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +88 -90
  132. package/.mindforge/dynamic-workflows/scripts/release-prep.js +79 -81
  133. package/.mindforge/dynamic-workflows/scripts/security-hardening.js +117 -119
  134. package/.mindforge/dynamic-workflows/scripts/security-threat-model.js +119 -121
  135. package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +80 -82
  136. package/.mindforge/dynamic-workflows/scripts/tech-evaluation.js +50 -52
  137. package/.mindforge/dynamic-workflows/scripts/test-coverage-gap.js +68 -70
  138. package/.mindforge/dynamic-workflows/scripts/ux-heuristic-audit.js +89 -91
  139. package/.mindforge/dynamic-workflows/scripts/verification-loop.js +138 -0
  140. package/.mindforge/dynamic-workflows/scripts/workflow-optimizer.js +136 -0
  141. package/.mindforge/dynamic-workflows/scripts/writer-reviewer.js +63 -65
  142. package/.mindforge/memory/sync-manifest.json +1 -1
  143. package/.mindforge/personas/advisor-researcher.md +2 -2
  144. package/.mindforge/personas/api-load-tester.md +1 -1
  145. package/.mindforge/personas/authentication-architect.md +1 -1
  146. package/.mindforge/personas/backup-recovery-specialist.md +1 -1
  147. package/.mindforge/personas/build-optimizer.md +1 -1
  148. package/.mindforge/personas/caching-strategist.md +1 -1
  149. package/.mindforge/personas/chaos-engineer.md +1 -1
  150. package/.mindforge/personas/compliance-auditor.md +1 -1
  151. package/.mindforge/personas/config-management-expert.md +1 -1
  152. package/.mindforge/personas/coverage-specialist.md +1 -1
  153. package/.mindforge/personas/debug-specialist.md +2 -2
  154. package/.mindforge/personas/debugger.md +2 -2
  155. package/.mindforge/personas/dependency-auditor.md +1 -1
  156. package/.mindforge/personas/developer.md +1 -1
  157. package/.mindforge/personas/devops-engineer.md +1 -1
  158. package/.mindforge/personas/executor.md +1 -1
  159. package/.mindforge/personas/go-specialist.md +1 -1
  160. package/.mindforge/personas/incident-commander.md +1 -1
  161. package/.mindforge/personas/java-specialist.md +1 -1
  162. package/.mindforge/personas/kubernetes-debugger.md +1 -1
  163. package/.mindforge/personas/logging-architect.md +1 -1
  164. package/.mindforge/personas/mf-planner.md +1 -1
  165. package/.mindforge/personas/mf-researcher.md +1 -1
  166. package/.mindforge/personas/mf-reviewer.md +1 -1
  167. package/.mindforge/personas/nyquist-auditor.md +1 -1
  168. package/.mindforge/personas/observability-engineer.md +1 -1
  169. package/.mindforge/personas/performance-optimizer.md +1 -1
  170. package/.mindforge/personas/phase-researcher.md +5 -5
  171. package/.mindforge/personas/planner.md +1 -1
  172. package/.mindforge/personas/project-researcher.md +2 -2
  173. package/.mindforge/personas/python-specialist.md +1 -1
  174. package/.mindforge/personas/qa-engineer.md +1 -1
  175. package/.mindforge/personas/release-manager.md +1 -1
  176. package/.mindforge/personas/research-agent.md +4 -4
  177. package/.mindforge/personas/roadmapper-extend.md +1 -1
  178. package/.mindforge/personas/rust-specialist.md +1 -1
  179. package/.mindforge/personas/security-reviewer.md +1 -1
  180. package/.mindforge/personas/tech-writer.md +1 -1
  181. package/.mindforge/personas/typescript-wizard.md +1 -1
  182. package/.mindforge/personas/ui-researcher.md +1 -1
  183. package/.mindforge/skills/accessibility/SKILL.md +3 -3
  184. package/.mindforge/skills/agent-architecture-audit/SKILL.md +11 -0
  185. package/.mindforge/skills/agent-loops/SKILL.md +1 -1
  186. package/.mindforge/skills/arxiv/SKILL.md +6 -6
  187. package/.mindforge/skills/arxiv/scripts/search_arxiv.py +114 -0
  188. package/.mindforge/skills/code-tour/SKILL.md +2 -2
  189. package/.mindforge/skills/code-wiki/SKILL.md +11 -11
  190. package/.mindforge/skills/code-wiki/templates/README.md +31 -0
  191. package/.mindforge/skills/code-wiki/templates/architecture.md +30 -0
  192. package/.mindforge/skills/code-wiki/templates/getting-started.md +47 -0
  193. package/.mindforge/skills/code-wiki/templates/module.md +38 -0
  194. package/.mindforge/skills/concept-diagrams/SKILL.md +6 -6
  195. package/.mindforge/skills/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
  196. package/.mindforge/skills/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
  197. package/.mindforge/skills/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
  198. package/.mindforge/skills/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
  199. package/.mindforge/skills/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
  200. package/.mindforge/skills/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
  201. package/.mindforge/skills/concept-diagrams/examples/electricity-grid-flow.md +182 -0
  202. package/.mindforge/skills/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
  203. package/.mindforge/skills/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
  204. package/.mindforge/skills/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
  205. package/.mindforge/skills/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
  206. package/.mindforge/skills/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
  207. package/.mindforge/skills/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
  208. package/.mindforge/skills/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
  209. package/.mindforge/skills/concept-diagrams/examples/wind-turbine-structure.md +338 -0
  210. package/.mindforge/skills/concept-diagrams/references/dashboard-patterns.md +43 -0
  211. package/.mindforge/skills/concept-diagrams/references/infrastructure-patterns.md +144 -0
  212. package/.mindforge/skills/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  213. package/.mindforge/skills/concept-diagrams/templates/template.html +174 -0
  214. package/.mindforge/skills/creative-ideation/references/full-prompt-library.md +110 -0
  215. package/.mindforge/skills/documentation/SKILL.md +1 -1
  216. package/.mindforge/skills/domain-intel/SKILL.md +7 -7
  217. package/.mindforge/skills/domain-intel/scripts/domain_intel.py +397 -0
  218. package/.mindforge/skills/duckduckgo-search/SKILL.md +17 -17
  219. package/.mindforge/skills/duckduckgo-search/scripts/duckduckgo.sh +28 -0
  220. package/.mindforge/skills/environment-management/SKILL.md +1 -1
  221. package/.mindforge/skills/github-code-review/SKILL.md +9 -9
  222. package/.mindforge/skills/github-code-review/references/review-output-template.md +74 -0
  223. package/.mindforge/skills/github-issues/templates/bug-report.md +35 -0
  224. package/.mindforge/skills/github-issues/templates/feature-request.md +31 -0
  225. package/.mindforge/skills/github-pr-workflow/SKILL.md +3 -3
  226. package/.mindforge/skills/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  227. package/.mindforge/skills/github-pr-workflow/references/conventional-commits.md +71 -0
  228. package/.mindforge/skills/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  229. package/.mindforge/skills/github-pr-workflow/templates/pr-body-feature.md +33 -0
  230. package/.mindforge/skills/incident-response/SKILL.md +1 -1
  231. package/.mindforge/skills/jupyter-live-kernel/SKILL.md +3 -3
  232. package/.mindforge/skills/kanban-orchestrator/SKILL.md +10 -10
  233. package/.mindforge/skills/kanban-worker/SKILL.md +6 -6
  234. package/.mindforge/skills/meme-generation/SKILL.md +1 -1
  235. package/.mindforge/skills/meme-generation/scripts/generate_meme.py +470 -0
  236. package/.mindforge/skills/meme-generation/scripts/templates.json +97 -0
  237. package/.mindforge/skills/obsidian/SKILL.md +15 -15
  238. package/.mindforge/skills/orch-pipeline/SKILL.md +2 -2
  239. package/.mindforge/skills/osint-investigation/SKILL.md +3 -2
  240. package/.mindforge/skills/osint-investigation/references/sources/courtlistener.md +98 -0
  241. package/.mindforge/skills/osint-investigation/references/sources/gdelt.md +104 -0
  242. package/.mindforge/skills/osint-investigation/references/sources/icij-offshore.md +104 -0
  243. package/.mindforge/skills/osint-investigation/references/sources/nyc-acris.md +90 -0
  244. package/.mindforge/skills/osint-investigation/references/sources/ofac-sdn.md +92 -0
  245. package/.mindforge/skills/osint-investigation/references/sources/opencorporates.md +103 -0
  246. package/.mindforge/skills/osint-investigation/references/sources/sec-edgar.md +83 -0
  247. package/.mindforge/skills/osint-investigation/references/sources/senate-ld.md +89 -0
  248. package/.mindforge/skills/osint-investigation/references/sources/usaspending.md +97 -0
  249. package/.mindforge/skills/osint-investigation/references/sources/wayback.md +93 -0
  250. package/.mindforge/skills/osint-investigation/references/sources/wikipedia.md +107 -0
  251. package/.mindforge/skills/osint-investigation/scripts/_http.py +82 -0
  252. package/.mindforge/skills/osint-investigation/scripts/_normalize.py +67 -0
  253. package/.mindforge/skills/osint-investigation/scripts/build_findings.py +221 -0
  254. package/.mindforge/skills/osint-investigation/scripts/entity_resolution.py +228 -0
  255. package/.mindforge/skills/osint-investigation/scripts/fetch_courtlistener.py +149 -0
  256. package/.mindforge/skills/osint-investigation/scripts/fetch_gdelt.py +161 -0
  257. package/.mindforge/skills/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
  258. package/.mindforge/skills/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
  259. package/.mindforge/skills/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
  260. package/.mindforge/skills/osint-investigation/scripts/fetch_opencorporates.py +191 -0
  261. package/.mindforge/skills/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
  262. package/.mindforge/skills/osint-investigation/scripts/fetch_senate_ld.py +146 -0
  263. package/.mindforge/skills/osint-investigation/scripts/fetch_usaspending.py +170 -0
  264. package/.mindforge/skills/osint-investigation/scripts/fetch_wayback.py +142 -0
  265. package/.mindforge/skills/osint-investigation/scripts/fetch_wikipedia.py +266 -0
  266. package/.mindforge/skills/osint-investigation/scripts/timing_analysis.py +252 -0
  267. package/.mindforge/skills/osint-investigation/templates/source-template.md +59 -0
  268. package/.mindforge/skills/oss-forensics/SKILL.md +6 -6
  269. package/.mindforge/skills/oss-forensics/references/evidence-types.md +89 -0
  270. package/.mindforge/skills/oss-forensics/references/github-archive-guide.md +184 -0
  271. package/.mindforge/skills/oss-forensics/references/investigation-templates.md +131 -0
  272. package/.mindforge/skills/oss-forensics/references/recovery-techniques.md +164 -0
  273. package/.mindforge/skills/oss-forensics/scripts/evidence-store.py +313 -0
  274. package/.mindforge/skills/oss-forensics/templates/forensic-report.md +151 -0
  275. package/.mindforge/skills/oss-forensics/templates/malicious-package-report.md +43 -0
  276. package/.mindforge/skills/pixel-art/SKILL.md +2 -2
  277. package/.mindforge/skills/pixel-art/references/palettes.md +49 -0
  278. package/.mindforge/skills/plan/SKILL.md +10 -10
  279. package/.mindforge/skills/requesting-code-review/SKILL.md +4 -6
  280. package/.mindforge/skills/research-paper-writing/SKILL.md +32 -32
  281. package/.mindforge/skills/research-paper-writing/references/autoreason-methodology.md +394 -0
  282. package/.mindforge/skills/research-paper-writing/references/checklists.md +434 -0
  283. package/.mindforge/skills/research-paper-writing/references/citation-workflow.md +563 -0
  284. package/.mindforge/skills/research-paper-writing/references/experiment-patterns.md +728 -0
  285. package/.mindforge/skills/research-paper-writing/references/human-evaluation.md +476 -0
  286. package/.mindforge/skills/research-paper-writing/references/paper-types.md +481 -0
  287. package/.mindforge/skills/research-paper-writing/references/reviewer-guidelines.md +433 -0
  288. package/.mindforge/skills/research-paper-writing/references/sources.md +191 -0
  289. package/.mindforge/skills/research-paper-writing/references/writing-guide.md +474 -0
  290. package/.mindforge/skills/research-paper-writing/templates/README.md +251 -0
  291. package/.mindforge/skills/scrapling/SKILL.md +1 -1
  292. package/.mindforge/skills/security-review/SKILL.md +1 -1
  293. package/.mindforge/skills/sherlock/SKILL.md +1 -1
  294. package/.mindforge/skills/simplify-code/SKILL.md +5 -7
  295. package/.mindforge/skills/spike/SKILL.md +11 -13
  296. package/.mindforge/skills/subagent-driven-development/SKILL.md +7 -11
  297. package/.mindforge/skills/subagent-driven-development/references/context-budget-discipline.md +53 -0
  298. package/.mindforge/skills/subagent-driven-development/references/gates-taxonomy.md +93 -0
  299. package/.mindforge/skills/systematic-debugging/SKILL.md +13 -14
  300. package/.mindforge/skills/test-driven-development/SKILL.md +7 -8
  301. package/.mindforge/skills/testing-standards/SKILL.md +1 -1
  302. package/.mindforge/skills/web-pentest/SKILL.md +2 -2
  303. package/.mindforge/skills/web-pentest/references/bypass-techniques.md +133 -0
  304. package/.mindforge/skills/web-pentest/references/exploitation-techniques.md +204 -0
  305. package/.mindforge/skills/web-pentest/references/scope-enforcement.md +110 -0
  306. package/.mindforge/skills/web-pentest/references/vuln-taxonomy.md +81 -0
  307. package/.mindforge/skills/web-pentest/templates/authorization.md +69 -0
  308. package/.mindforge/skills/web-pentest/templates/pentest-report.md +178 -0
  309. package/.mindforge/skills/writing-skills/SKILL.md +4 -3
  310. package/CHANGELOG.md +35 -0
  311. package/MINDFORGE.md +3 -3
  312. package/README.md +9 -7
  313. package/RELEASENOTES.md +65 -2
  314. package/SECURITY.md +5 -3
  315. package/bin/autonomous/auto-runner.js +5 -2
  316. package/bin/engine/skill-loader.js +4 -0
  317. package/bin/governance/rbac.js +4 -0
  318. package/bin/memory/eis-client.js +1 -0
  319. package/bin/mindforge-cli.js +5 -0
  320. package/bin/models/bedrock-provider.js +192 -0
  321. package/bin/models/model-client.js +19 -0
  322. package/bin/spawn-agent.js +9 -2
  323. package/docs/commands-reference.md +68 -6
  324. package/docs/faq.md +38 -1
  325. package/docs/getting-started.md +27 -12
  326. package/docs/sdk-reference.md +36 -3
  327. package/docs/troubleshooting.md +59 -1
  328. package/docs/user-guide.md +7 -4
  329. package/package.json +3 -3
  330. package/.claude/commands/mindforge/skill-tdd.md +0 -53
  331. package/.claude/commands/mindforge/skills-index.md +0 -118
  332. package/.claude/commands/mindforge/systematic-debug.md +0 -60
  333. package/.claude/commands/mindforge/wf-accessibility-audit.md +0 -31
  334. package/.claude/commands/mindforge/wf-ai-model-eval.md +0 -31
  335. package/.claude/commands/mindforge/wf-api-migration.md +0 -31
  336. package/.claude/commands/mindforge/wf-architecture-modernization.md +0 -32
  337. package/.claude/commands/mindforge/wf-catalog.md +0 -59
  338. package/.claude/commands/mindforge/wf-code-audit.md +0 -31
  339. package/.claude/commands/mindforge/wf-code-explainer.md +0 -31
  340. package/.claude/commands/mindforge/wf-competitive-analysis.md +0 -31
  341. package/.claude/commands/mindforge/wf-competitive-teardown.md +0 -31
  342. package/.claude/commands/mindforge/wf-cost-analysis.md +0 -31
  343. package/.claude/commands/mindforge/wf-data-pipeline-validate.md +0 -31
  344. package/.claude/commands/mindforge/wf-database-migration.md +0 -31
  345. package/.claude/commands/mindforge/wf-debug-detective.md +0 -32
  346. package/.claude/commands/mindforge/wf-design-system-audit.md +0 -31
  347. package/.claude/commands/mindforge/wf-documentation-gen.md +0 -31
  348. package/.claude/commands/mindforge/wf-feature-planner.md +0 -31
  349. package/.claude/commands/mindforge/wf-incident-response.md +0 -31
  350. package/.claude/commands/mindforge/wf-multi-repo-sync.md +0 -31
  351. package/.claude/commands/mindforge/wf-mutation-testing.md +0 -31
  352. package/.claude/commands/mindforge/wf-onboard-codebase.md +0 -31
  353. package/.claude/commands/mindforge/wf-perf-optimize.md +0 -31
  354. package/.claude/commands/mindforge/wf-pr-review.md +0 -31
  355. package/.claude/commands/mindforge/wf-refactor-plan.md +0 -31
  356. package/.claude/commands/mindforge/wf-release-prep.md +0 -31
  357. package/.claude/commands/mindforge/wf-security-threat-model.md +0 -31
  358. package/.claude/commands/mindforge/wf-tdd-sprint.md +0 -31
  359. package/.claude/commands/mindforge/wf-tech-evaluation.md +0 -31
  360. package/.claude/commands/mindforge/wf-ux-heuristic-audit.md +0 -31
  361. package/.claude/commands/mindforge/wf-writer-reviewer.md +0 -30
@@ -0,0 +1,89 @@
1
+ # Senate LD — Lobbying Disclosure (LD-1 / LD-2)
2
+
3
+ ## 1. Summary
4
+
5
+ The Senate Office of Public Records publishes lobbying disclosures under the
6
+ Lobbying Disclosure Act of 1995 (LDA, as amended by HLOGA 2007). LD-1 is
7
+ registration of a new client-lobbyist relationship; LD-2 is the quarterly
8
+ activity report.
9
+
10
+ ## 2. Access Methods
11
+
12
+ - **API:** `https://lda.senate.gov/api/v1/` (no auth required for read-only)
13
+ - **Bulk download:** `https://lda.senate.gov/api/v1/filings/?format=csv` (paginated)
14
+ - **Auth:** Token required for >120 req/hour — register at https://lda.senate.gov/api/auth/register/
15
+ - **Rate limit:** 120 req/hour unauthenticated, 1,200 req/hour authenticated
16
+
17
+ ## 3. Data Schema
18
+
19
+ Key fields emitted by `fetch_senate_ld.py`:
20
+
21
+ | Column | Type | Description |
22
+ |--------|------|-------------|
23
+ | `filing_uuid` | str | Unique filing ID |
24
+ | `filing_type` | str | LD-1, LD-2, LD-203, etc. |
25
+ | `filing_year` | int | Year |
26
+ | `filing_period` | str | Q1/Q2/Q3/Q4 or annual |
27
+ | `registrant_name` | str | Lobbying firm or organization |
28
+ | `registrant_id` | str | Senate-assigned registrant ID |
29
+ | `client_name` | str | Client being represented |
30
+ | `client_id` | str | Senate-assigned client ID |
31
+ | `client_general_description` | str | Client industry / business |
32
+ | `income` | float | LD-2 income from client this quarter (USD) |
33
+ | `expenses` | float | LD-2 expenses (in-house lobbying) |
34
+ | `lobbyists` | str | Semicolon-separated lobbyist names |
35
+ | `issues` | str | Semicolon-separated issue areas |
36
+ | `government_entities` | str | Agencies/chambers contacted |
37
+ | `filing_date` | str | YYYY-MM-DD |
38
+
39
+ ## 4. Coverage
40
+
41
+ - US federal lobbying only (state lobbying handled by individual state ethics offices)
42
+ - 1999 → present (full electronic coverage from 2008)
43
+ - Quarterly reporting cycle (LD-2)
44
+ - ~1M+ filings cumulative
45
+
46
+ ## 5. Cross-Reference Potential
47
+
48
+ - **USAspending** ↔ `client_name` (clients lobbying for contracts)
49
+ - **SEC EDGAR** ↔ `client_name` (public companies as lobbying clients)
50
+ - **OFAC SDN** ↔ `client_name` (sanctions screening of lobbying clients)
51
+
52
+ Join key: normalized client_name. registrant_id and client_id are canonical
53
+ when joining Senate-internal records.
54
+
55
+ ## 6. Data Quality
56
+
57
+ - Many lobbyist names appear in multiple registrants over time (job changes)
58
+ - `issues` and `government_entities` are free-text — Inconsistent capitalization
59
+ - Foreign agents register under FARA (Department of Justice), NOT here
60
+ - Income/expenses are reported in $10,000 brackets in some older filings
61
+
62
+ ## 7. Acquisition Script
63
+
64
+ Path: `scripts/fetch_senate_ld.py`
65
+
66
+ ```bash
67
+ # By client
68
+ python3 SKILL_DIR/scripts/fetch_senate_ld.py --client "EXAMPLE CORP" \
69
+ --year 2024 --out data/lobbying.csv
70
+
71
+ # By registrant (lobbying firm)
72
+ python3 SKILL_DIR/scripts/fetch_senate_ld.py --registrant "BIG K STREET LLP" \
73
+ --year 2024 --out data/lobbying.csv
74
+ ```
75
+
76
+ Set `SENATE_LDA_TOKEN` env var if you have one (or pass `--token`).
77
+ Defaults to anonymous (120 req/hour).
78
+
79
+ ## 8. Legal & Licensing
80
+
81
+ - Public record under 2 U.S.C. § 1604 (LDA)
82
+ - No commercial use restrictions
83
+ - Reuse is unconditional — see Senate Public Records Office disclaimer
84
+
85
+ ## 9. References
86
+
87
+ - API docs: https://lda.senate.gov/api/redoc/v1/
88
+ - LDA guidance: https://lobbyingdisclosure.house.gov/ld_guidance.pdf
89
+ - Senate Public Records: https://lda.senate.gov/
@@ -0,0 +1,97 @@
1
+ # USAspending — Federal Government Contracts and Grants
2
+
3
+ ## 1. Summary
4
+
5
+ USAspending.gov is the official source of federal spending data. Coverage:
6
+ contracts, grants, loans, direct payments, sub-awards. Required by the DATA Act
7
+ of 2014 — all federal agencies must report to a single schema.
8
+
9
+ ## 2. Access Methods
10
+
11
+ - **API v2:** `https://api.usaspending.gov/api/v2/` (no auth, no key)
12
+ - **Bulk:** `https://files.usaspending.gov/` (CSV / Parquet by award type)
13
+ - **Auth:** None
14
+ - **Rate limit:** Not strictly enforced, but be polite — keep to <10 req/s
15
+
16
+ ## 3. Data Schema
17
+
18
+ Key fields emitted by `fetch_usaspending.py` (prime awards):
19
+
20
+ | Column | Type | Description |
21
+ |--------|------|-------------|
22
+ | `award_id` | str | Federal award ID (PIID for contracts, FAIN for grants) |
23
+ | `recipient_name` | str | Awardee legal name |
24
+ | `recipient_uei` | str | Unique Entity Identifier (replaced DUNS in 2022) |
25
+ | `recipient_duns` | str | Legacy DUNS number (historical only) |
26
+ | `recipient_parent_name` | str | Ultimate parent organization |
27
+ | `recipient_state` | str | Recipient state |
28
+ | `awarding_agency` | str | Department / agency name |
29
+ | `awarding_sub_agency` | str | Sub-tier (e.g. DoD → Army) |
30
+ | `award_type` | str | Contract / Grant / Loan / Direct Payment |
31
+ | `award_amount` | float | Current total obligation in USD |
32
+ | `award_date` | str | Action / signed date YYYY-MM-DD |
33
+ | `period_of_performance_start` | str | YYYY-MM-DD |
34
+ | `period_of_performance_end` | str | YYYY-MM-DD |
35
+ | `naics_code` | str | Industry classification |
36
+ | `psc_code` | str | Product / Service Code |
37
+ | `competition_extent` | str | Full / limited / sole-source |
38
+ | `description` | str | Award description (free-text) |
39
+
40
+ ## 4. Coverage
41
+
42
+ - US federal awards only (state/local not included)
43
+ - FY 2008 → present (full coverage from FY 2017)
44
+ - Updated bi-weekly from agency reporting
45
+ - ~100M+ transaction records cumulative
46
+
47
+ ## 5. Cross-Reference Potential
48
+
49
+ - **SEC EDGAR** ↔ `recipient_name` (public companies as contractors)
50
+ - **Senate LD** ↔ `recipient_name` (lobbying clients winning contracts)
51
+ - **OFAC SDN** ↔ `recipient_name` (sanctions screening of contractors — must be
52
+ filtered out by SAM.gov but verify)
53
+ - **ICIJ Offshore** ↔ `recipient_name` (offshore-linked contractors)
54
+
55
+ Join key: normalized recipient name. UEI is canonical when present.
56
+
57
+ ## 6. Data Quality
58
+
59
+ - DUNS → UEI transition (April 2022) — old records have DUNS, new records have UEI
60
+ - Some sub-awards aren't reported (FFATA threshold is $30k)
61
+ - Award amount changes over time (mod actions) — fetch script reports current total
62
+ - `competition_extent` field is free-text in older records — `fetch_usaspending.py`
63
+ normalizes to canonical values
64
+ - Recipient name variations are extensive — "ACME LLC", "Acme L.L.C.", "ACME, INC"
65
+ all appear. Use `entity_resolution.py`.
66
+
67
+ ## 7. Acquisition Script
68
+
69
+ Path: `scripts/fetch_usaspending.py`
70
+
71
+ ```bash
72
+ # By recipient name
73
+ python3 SKILL_DIR/scripts/fetch_usaspending.py --recipient "EXAMPLE CORP" \
74
+ --fy 2024 --out data/contracts.csv
75
+
76
+ # By awarding agency
77
+ python3 SKILL_DIR/scripts/fetch_usaspending.py --agency "Department of Defense" \
78
+ --fy 2024 --out data/contracts.csv
79
+
80
+ # Filter to sole-source only
81
+ python3 SKILL_DIR/scripts/fetch_usaspending.py --recipient "EXAMPLE CORP" \
82
+ --fy 2024 --sole-source-only --out data/contracts.csv
83
+ ```
84
+
85
+ ## 8. Legal & Licensing
86
+
87
+ - Public record under the Federal Funding Accountability and Transparency Act
88
+ (FFATA, 2006) and DATA Act (2014)
89
+ - No commercial use restrictions on the data
90
+ - Personal information of award recipients (e.g. small business owners' addresses
91
+ in some grants) should be handled per the source agency's privacy notice
92
+
93
+ ## 9. References
94
+
95
+ - API docs: https://api.usaspending.gov/
96
+ - Data dictionary: https://www.usaspending.gov/data-dictionary
97
+ - Award schema: https://files.usaspending.gov/docs/Data_Dictionary_Crosswalk.xlsx
@@ -0,0 +1,93 @@
1
+ # Wayback Machine — Internet Archive CDX
2
+
3
+ ## 1. Summary
4
+
5
+ The Internet Archive's Wayback Machine has captured ~900B+ web pages since
6
+ 1996. The CDX server API indexes those captures by URL, timestamp, and
7
+ content hash. Free, anonymous, no auth.
8
+
9
+ ## 2. Access Methods
10
+
11
+ - **CDX server:** `https://web.archive.org/cdx/search/cdx`
12
+ - **Wayback URL:** `https://web.archive.org/web/<timestamp>/<url>`
13
+ - **Save Page Now (write):** `https://web.archive.org/save/<url>` (different API)
14
+ - **Auth:** None
15
+ - **Rate limit:** Generous; be polite (~1 req/s)
16
+
17
+ ## 3. Data Schema
18
+
19
+ Key fields emitted by `fetch_wayback.py`:
20
+
21
+ | Column | Type | Description |
22
+ |--------|------|-------------|
23
+ | `url` | str | Original URL captured |
24
+ | `timestamp` | str | YYYYMMDDHHMMSS (CDX format) |
25
+ | `wayback_url` | str | Direct replay URL |
26
+ | `mimetype` | str | Content-type at capture |
27
+ | `status` | str | HTTP status (typically 200) |
28
+ | `digest` | str | SHA1 of capture content (collapse-friendly) |
29
+ | `length` | str | Byte length of capture |
30
+
31
+ ## 4. Coverage
32
+
33
+ - 1996 → present
34
+ - ~900B+ captures across ~700M domains
35
+ - Updated continuously by automated crawls + manual saves
36
+ - Some domains have aggressive coverage (news), others sparse (private)
37
+
38
+ ## 5. Cross-Reference Potential
39
+
40
+ - **Wikipedia** ↔ Reverse-lookup pages cited as references that have since
41
+ disappeared
42
+ - **News URLs** ↔ Original article content when present-day URLs 404
43
+ - **Corporate websites** ↔ Historical "About" pages, executive bios that
44
+ have been scrubbed
45
+
46
+ The Wayback CDX is most useful as a **content-recovery** layer when other
47
+ sources point to URLs that no longer exist.
48
+
49
+ ## 6. Data Quality
50
+
51
+ - robots.txt-blocked domains may have spotty or no coverage
52
+ - Captures vary in completeness (HTML may be saved without CSS/JS)
53
+ - Some content is excluded by domain owner request (DMCA, etc.)
54
+ - Coverage of "deep links" (URLs with query strings) is uneven
55
+ - Time resolution is per-capture, not continuous — gaps are common
56
+
57
+ ## 7. Acquisition Script
58
+
59
+ Path: `scripts/fetch_wayback.py`
60
+
61
+ ```bash
62
+ # All captures of a specific URL
63
+ python3 SKILL_DIR/scripts/fetch_wayback.py --url "https://example.com/page" \
64
+ --out data/wb.csv
65
+
66
+ # All captures of a host
67
+ python3 SKILL_DIR/scripts/fetch_wayback.py --url "example.com" \
68
+ --match host --out data/wb.csv
69
+
70
+ # All captures of a domain + subdomains
71
+ python3 SKILL_DIR/scripts/fetch_wayback.py --url "example.com" \
72
+ --match domain --out data/wb.csv
73
+
74
+ # Only unique-content captures within a date window
75
+ python3 SKILL_DIR/scripts/fetch_wayback.py --url "example.com" \
76
+ --match host --collapse digest \
77
+ --from-date 2020-01-01 --to-date 2023-12-31 \
78
+ --out data/wb.csv
79
+ ```
80
+
81
+ ## 8. Legal & Licensing
82
+
83
+ - Internet Archive captures are made under fair-use research provisions
84
+ - Replay URLs are stable references — citing them is encouraged
85
+ - Internet Archive non-profit terms of use govern content
86
+ - Some content is rights-restricted; replay may be blocked even if the
87
+ CDX entry shows it as captured
88
+
89
+ ## 9. References
90
+
91
+ - CDX server docs: https://github.com/internetarchive/wayback/blob/master/wayback-cdx-server/README.md
92
+ - Wayback API: https://archive.org/help/wayback_api.php
93
+ - Internet Archive: https://archive.org/
@@ -0,0 +1,107 @@
1
+ # Wikipedia + Wikidata
2
+
3
+ ## 1. Summary
4
+
5
+ Wikipedia is the canonical narrative-bio source for notable people, places,
6
+ and organizations. Wikidata is its structured-data counterpart: ~110M
7
+ items, each with claims, dates, identifiers, and cross-references to
8
+ external authorities (VIAF, ISNI, ORCID, GRID, etc.).
9
+
10
+ Together they're a high-precision entity-resolution layer — the bar for
11
+ inclusion is real, but anything past that bar is well-cross-referenced.
12
+
13
+ ## 2. Access Methods
14
+
15
+ - **Wikipedia OpenSearch:** `https://en.wikipedia.org/w/api.php?action=opensearch`
16
+ - **Wikipedia REST summary:** `https://en.wikipedia.org/api/rest_v1/page/summary/<title>`
17
+ - **Wikidata Action API:** `https://www.wikidata.org/w/api.php?action=wbgetentities`
18
+ - **Wikidata SPARQL:** `https://query.wikidata.org/sparql` (more powerful but aggressively rate-limited)
19
+ - **Auth:** None, but **a meaningful User-Agent is required**
20
+
21
+ Set `HERMES_OSINT_UA` to something identifying (e.g. `your-app/1.0 (you@example.com)`).
22
+ Wikimedia returns HTTP 429 to generic UAs.
23
+
24
+ ## 3. Data Schema
25
+
26
+ Key fields emitted by `fetch_wikipedia.py`:
27
+
28
+ | Column | Type | Description |
29
+ |--------|------|-------------|
30
+ | `source` | str | `wikipedia` or `wikipedia+wikidata` |
31
+ | `label` | str | Wikipedia article title |
32
+ | `description` | str | Short Wikidata description |
33
+ | `qid` | str | Wikidata QID (e.g. Q2283 for Microsoft) |
34
+ | `wikipedia_title`, `wikipedia_url` | str | Article identifier + URL |
35
+ | `wikidata_url` | str | Wikidata entity URL |
36
+ | `instance_of` | str | What kind of thing it is (P31) |
37
+ | `country` | str | Country (P17 for orgs/places, P27 for people) |
38
+ | `occupation` | str | P106 |
39
+ | `employer` | str | P108 |
40
+ | `date_of_birth` | str | P569, YYYY-MM-DD |
41
+ | `place_of_birth` | str | P19 |
42
+ | `summary` | str | Wikipedia REST extract (~1000 chars) |
43
+
44
+ The fetch script uses Wikidata's Action API (NOT SPARQL) for structured
45
+ facts — far more lenient on rate limits.
46
+
47
+ ## 4. Coverage
48
+
49
+ - Wikipedia EN: ~7M articles
50
+ - Wikidata: ~110M items, ~1.5B statements
51
+ - Updated continuously; abuse filters and bots run constantly
52
+ - High notability bar — most private individuals are not in Wikipedia
53
+
54
+ ## 5. Cross-Reference Potential
55
+
56
+ - **All sources** ↔ `label` (entity identity resolution)
57
+ - **SEC EDGAR** ↔ `label` (public companies)
58
+ - **CourtListener** ↔ `label` (parties to notable litigation)
59
+ - **Wikidata external identifiers** (not currently in this fetcher's output)
60
+ link to VIAF, ISNI, ORCID, GRID, GitHub, Twitter, IMDb, ...
61
+
62
+ Join key: Wikidata QID is canonical. Wikipedia titles are stable for
63
+ most articles but can be renamed.
64
+
65
+ ## 6. Data Quality
66
+
67
+ - Notability filter — only notable entities (criteria vary by topic)
68
+ - Recency lag — current events take days to weeks to be reflected
69
+ - POV / vandalism — moderated, but edits between sweeps can be bad
70
+ - Living-persons biographies have stricter sourcing requirements
71
+ - Wikidata claims have qualifiers and references — the fetch script
72
+ doesn't currently export them
73
+
74
+ ## 7. Acquisition Script
75
+
76
+ Path: `scripts/fetch_wikipedia.py`
77
+
78
+ ```bash
79
+ # Look up a notable entity
80
+ python3 SKILL_DIR/scripts/fetch_wikipedia.py --query "Microsoft" --out data/wp.csv
81
+
82
+ # A specific person
83
+ python3 SKILL_DIR/scripts/fetch_wikipedia.py --query "Bill Gates" --out data/wp_bg.csv
84
+
85
+ # Skip the Wikidata enrichment for speed
86
+ python3 SKILL_DIR/scripts/fetch_wikipedia.py --query "Microsoft" --no-wikidata \
87
+ --limit 5 --out data/wp.csv
88
+ ```
89
+
90
+ The OpenSearch is fuzzy — `--limit 5` returns the top 5 Wikipedia article
91
+ matches. Each is enriched with the QID + structured facts unless
92
+ `--no-wikidata` is passed.
93
+
94
+ ## 8. Legal & Licensing
95
+
96
+ - Wikipedia text: CC-BY-SA-3.0 / GFDL
97
+ - Wikidata claims: CC0 (public domain)
98
+ - API ToS: respect rate limits, identify your agent
99
+ - Commercial use allowed with attribution
100
+
101
+ ## 9. References
102
+
103
+ - Wikipedia OpenSearch: https://www.mediawiki.org/wiki/API:Opensearch
104
+ - Wikipedia REST: https://en.wikipedia.org/api/rest_v1/
105
+ - Wikidata Action API: https://www.wikidata.org/wiki/Wikidata:Data_access
106
+ - Wikidata SPARQL: https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service
107
+ - User-Agent policy: https://meta.wikimedia.org/wiki/User-Agent_policy
@@ -0,0 +1,82 @@
1
+ """Tiny stdlib HTTP helper used by fetch_*.py scripts.
2
+
3
+ Provides polite retry + JSON convenience + User-Agent enforcement.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import json
8
+ import os
9
+ import time
10
+ import urllib.error
11
+ import urllib.parse
12
+ import urllib.request
13
+
14
+ DEFAULT_UA = (
15
+ "hermes-osint-investigation/0.2 "
16
+ "(+https://github.com/NousResearch/hermes-agent; "
17
+ "set HERMES_OSINT_UA env var to identify yourself per "
18
+ "Wikimedia / SEC fair-use guidance)"
19
+ )
20
+
21
+
22
+ def get(
23
+ url: str,
24
+ *,
25
+ params: dict | None = None,
26
+ headers: dict | None = None,
27
+ user_agent: str | None = None,
28
+ max_retries: int = 3,
29
+ backoff: float = 1.5,
30
+ timeout: float = 30.0,
31
+ ) -> bytes:
32
+ """GET with retry on 5xx and Retry-After honoring.
33
+
34
+ 429 (rate-limit) is raised IMMEDIATELY with a clear message — retrying
35
+ when the upstream says "you're over quota" just wastes time. The caller
36
+ should slow down or supply real credentials.
37
+ """
38
+ if params:
39
+ sep = "&" if "?" in url else "?"
40
+ url = f"{url}{sep}{urllib.parse.urlencode(params)}"
41
+ h = {"User-Agent": user_agent or os.environ.get("HERMES_OSINT_UA", DEFAULT_UA)}
42
+ if headers:
43
+ h.update(headers)
44
+
45
+ last_err: Exception | None = None
46
+ for attempt in range(max_retries + 1):
47
+ req = urllib.request.Request(url, headers=h)
48
+ try:
49
+ with urllib.request.urlopen(req, timeout=timeout) as resp:
50
+ return resp.read()
51
+ except urllib.error.HTTPError as e:
52
+ if e.code == 429:
53
+ # Surface immediately. Read the body so the caller sees the
54
+ # provider's actual message ("OVER_RATE_LIMIT" etc.).
55
+ try:
56
+ body = e.read(2048).decode("utf-8", errors="replace")
57
+ except Exception: # noqa: BLE001
58
+ body = ""
59
+ raise RuntimeError(
60
+ f"HTTP 429 rate-limited by {urllib.parse.urlsplit(url).netloc}. "
61
+ f"Slow down or supply a real API key. Body: {body[:300]}"
62
+ ) from e
63
+ if e.code in {500, 502, 503, 504} and attempt < max_retries:
64
+ retry_after = e.headers.get("Retry-After") if e.headers else None
65
+ wait = float(retry_after) if (retry_after and retry_after.isdigit()) else backoff ** (attempt + 1)
66
+ time.sleep(wait)
67
+ last_err = e
68
+ continue
69
+ raise
70
+ except urllib.error.URLError as e:
71
+ if attempt < max_retries:
72
+ time.sleep(backoff ** (attempt + 1))
73
+ last_err = e
74
+ continue
75
+ raise
76
+ if last_err:
77
+ raise last_err
78
+ raise RuntimeError("unreachable")
79
+
80
+
81
+ def get_json(url: str, **kwargs) -> dict | list:
82
+ return json.loads(get(url, **kwargs).decode("utf-8"))
@@ -0,0 +1,67 @@
1
+ """Shared entity-name normalization helpers (stdlib-only).
2
+
3
+ Used by entity_resolution.py and timing_analysis.py.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import re
8
+
9
+ # Legal suffixes / corporate boilerplate to strip during normalization.
10
+ _SUFFIX_TOKENS = {
11
+ "INC", "INCORPORATED", "LLC", "LLP", "LP", "LTD", "LIMITED",
12
+ "CORP", "CORPORATION", "CO", "COMPANY",
13
+ "GROUP", "GRP", "HOLDINGS", "HOLDING",
14
+ "PARTNERS", "ASSOCIATES",
15
+ "INTERNATIONAL", "INTL",
16
+ "ENTERPRISES", "ENTERPRISE",
17
+ "SERVICES", "SERVICE", "SVCS",
18
+ "SOLUTIONS", "MANAGEMENT", "MGMT", "CONSULTING",
19
+ "TECHNOLOGY", "TECHNOLOGIES", "TECH",
20
+ "INDUSTRIES", "INDUSTRY",
21
+ "AMERICA", "AMERICAN",
22
+ "USA", "US",
23
+ "PLLC", "PC",
24
+ "TRUST", "FOUNDATION",
25
+ }
26
+
27
+ _PUNCT_RE = re.compile(r"[^\w\s]")
28
+ _WS_RE = re.compile(r"\s+")
29
+
30
+
31
+ def normalize_name(name: str | None) -> str:
32
+ """Standard normalization: uppercase, strip suffixes, drop punctuation."""
33
+ if not name:
34
+ return ""
35
+ s = _PUNCT_RE.sub(" ", name.upper())
36
+ s = _WS_RE.sub(" ", s).strip()
37
+ tokens = [t for t in s.split() if t and t not in _SUFFIX_TOKENS]
38
+ return " ".join(tokens)
39
+
40
+
41
+ def normalize_aggressive(name: str | None) -> str:
42
+ """Aggressive normalization: sorted unique tokens (word-bag)."""
43
+ base = normalize_name(name)
44
+ if not base:
45
+ return ""
46
+ return " ".join(sorted(set(base.split())))
47
+
48
+
49
+ def name_tokens(name: str | None, min_len: int = 4) -> set[str]:
50
+ """Token set used for overlap matching."""
51
+ base = normalize_name(name)
52
+ if not base:
53
+ return set()
54
+ return {t for t in base.split() if len(t) >= min_len}
55
+
56
+
57
+ def token_overlap_ratio(left: str | None, right: str | None) -> tuple[float, int]:
58
+ """Return (jaccard-like ratio, shared token count) over min-len tokens."""
59
+ a = name_tokens(left)
60
+ b = name_tokens(right)
61
+ if not a or not b:
62
+ return 0.0, 0
63
+ shared = a & b
64
+ if not shared:
65
+ return 0.0, 0
66
+ union = a | b
67
+ return len(shared) / len(union), len(shared)