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.
- package/.agent/mindforge/wf-orchestrate-review.md +35 -0
- package/.agent/mindforge/wf-verification-loop.md +45 -0
- package/.agent/mindforge/wf-workflow-optimizer.md +51 -0
- package/.agent/skills/article-illustrator/SKILL.md +7 -7
- package/.agent/skills/arxiv/SKILL.md +6 -6
- package/.agent/skills/code-wiki/SKILL.md +11 -11
- package/.agent/skills/concept-diagrams/SKILL.md +6 -6
- package/.agent/skills/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
- package/.agent/skills/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
- package/.agent/skills/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
- package/.agent/skills/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
- package/.agent/skills/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
- package/.agent/skills/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
- package/.agent/skills/concept-diagrams/examples/electricity-grid-flow.md +182 -0
- package/.agent/skills/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
- package/.agent/skills/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
- package/.agent/skills/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
- package/.agent/skills/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
- package/.agent/skills/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
- package/.agent/skills/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
- package/.agent/skills/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
- package/.agent/skills/concept-diagrams/examples/wind-turbine-structure.md +338 -0
- package/.agent/skills/concept-diagrams/templates/template.html +174 -0
- package/.agent/skills/domain-intel/SKILL.md +7 -7
- package/.agent/skills/duckduckgo-search/SKILL.md +17 -17
- package/.agent/skills/github-auth/scripts/gh-env.sh +66 -0
- package/.agent/skills/github-code-review/SKILL.md +9 -9
- package/.agent/skills/github-pr-workflow/SKILL.md +3 -3
- package/.agent/skills/godmode/SKILL.md +8 -8
- package/.agent/skills/jupyter-live-kernel/SKILL.md +3 -3
- package/.agent/skills/kanban-orchestrator/SKILL.md +10 -10
- package/.agent/skills/kanban-worker/SKILL.md +6 -6
- package/.agent/skills/llm-wiki/SKILL.md +7 -7
- package/.agent/skills/mindforge-autonomous/SKILL.md +1 -1
- package/.agent/skills/mindforge-complete-milestone/SKILL.md +1 -1
- package/.agent/skills/mindforge-discuss-phase/SKILL.md +1 -1
- package/.agent/skills/mindforge-do/SKILL.md +1 -1
- package/.agent/skills/mindforge-execute-phase/SKILL.md +1 -1
- package/.agent/skills/mindforge-list-workspaces/SKILL.md +1 -1
- package/.agent/skills/mindforge-manager/SKILL.md +1 -1
- package/.agent/skills/mindforge-neural-orchestrator/SKILL.md +1 -1
- package/.agent/skills/mindforge-new-milestone/SKILL.md +4 -4
- package/.agent/skills/mindforge-new-project/SKILL.md +4 -4
- package/.agent/skills/mindforge-new-workspace/SKILL.md +1 -1
- package/.agent/skills/mindforge-note/SKILL.md +1 -1
- package/.agent/skills/mindforge-plan-phase/SKILL.md +1 -1
- package/.agent/skills/mindforge-profile-user/SKILL.md +1 -1
- package/.agent/skills/mindforge-remove-workspace/SKILL.md +1 -1
- package/.agent/skills/mindforge-research-phase/SKILL.md +1 -1
- package/.agent/skills/mindforge-ui-phase/SKILL.md +1 -1
- package/.agent/skills/mindforge-ui-review/SKILL.md +1 -1
- package/.agent/skills/mindforge-verify-work/SKILL.md +1 -1
- package/.agent/skills/mindforge-workspace-isolated/SKILL.md +1 -1
- package/.agent/skills/node-inspect-debugger/SKILL.md +1 -1
- package/.agent/skills/obsidian/SKILL.md +15 -15
- package/.agent/skills/osint-investigation/SKILL.md +3 -2
- package/.agent/skills/osint-investigation/references/sources/courtlistener.md +98 -0
- package/.agent/skills/osint-investigation/references/sources/gdelt.md +104 -0
- package/.agent/skills/osint-investigation/references/sources/icij-offshore.md +104 -0
- package/.agent/skills/osint-investigation/references/sources/nyc-acris.md +90 -0
- package/.agent/skills/osint-investigation/references/sources/ofac-sdn.md +92 -0
- package/.agent/skills/osint-investigation/references/sources/opencorporates.md +103 -0
- package/.agent/skills/osint-investigation/references/sources/sec-edgar.md +83 -0
- package/.agent/skills/osint-investigation/references/sources/senate-ld.md +89 -0
- package/.agent/skills/osint-investigation/references/sources/usaspending.md +97 -0
- package/.agent/skills/osint-investigation/references/sources/wayback.md +93 -0
- package/.agent/skills/osint-investigation/references/sources/wikipedia.md +107 -0
- package/.agent/skills/osint-investigation/scripts/_http.py +82 -0
- package/.agent/skills/osint-investigation/scripts/_normalize.py +67 -0
- package/.agent/skills/osint-investigation/scripts/build_findings.py +221 -0
- package/.agent/skills/osint-investigation/scripts/entity_resolution.py +228 -0
- package/.agent/skills/osint-investigation/scripts/fetch_courtlistener.py +149 -0
- package/.agent/skills/osint-investigation/scripts/fetch_gdelt.py +161 -0
- package/.agent/skills/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
- package/.agent/skills/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
- package/.agent/skills/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
- package/.agent/skills/osint-investigation/scripts/fetch_opencorporates.py +191 -0
- package/.agent/skills/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
- package/.agent/skills/osint-investigation/scripts/fetch_senate_ld.py +146 -0
- package/.agent/skills/osint-investigation/scripts/fetch_usaspending.py +170 -0
- package/.agent/skills/osint-investigation/scripts/fetch_wayback.py +142 -0
- package/.agent/skills/osint-investigation/scripts/fetch_wikipedia.py +266 -0
- package/.agent/skills/osint-investigation/scripts/timing_analysis.py +252 -0
- package/.agent/skills/oss-forensics/SKILL.md +10 -9
- package/.agent/skills/oss-forensics/scripts/evidence-store.py +313 -0
- package/.agent/skills/parallel-cli/SKILL.md +2 -2
- package/.agent/skills/pinggy-tunnel/SKILL.md +3 -3
- package/.agent/skills/pixel-art/SKILL.md +2 -2
- package/.agent/skills/plan/SKILL.md +10 -10
- package/.agent/skills/requesting-code-review/SKILL.md +4 -6
- package/.agent/skills/research-paper-writing/SKILL.md +32 -32
- package/.agent/skills/rest-graphql-debug/SKILL.md +31 -32
- package/.agent/skills/s6-container-supervision/SKILL.md +1 -1
- package/.agent/skills/scrapling/SKILL.md +1 -1
- package/.agent/skills/sherlock/SKILL.md +1 -1
- package/.agent/skills/simplify-code/SKILL.md +5 -7
- package/.agent/skills/skill-authoring/SKILL.md +4 -4
- package/.agent/skills/spike/SKILL.md +11 -13
- package/.agent/skills/subagent-driven-development/SKILL.md +7 -11
- package/.agent/skills/systematic-debugging/SKILL.md +13 -14
- package/.agent/skills/test-driven-development/SKILL.md +6 -7
- package/.agent/skills/video-orchestrator/SKILL.md +1 -1
- package/.agent/skills/web-pentest/SKILL.md +7 -7
- package/.mindforge/config.json +3 -2
- package/.mindforge/dynamic-workflows/REGISTRY.md +4 -1
- package/.mindforge/dynamic-workflows/index.json +910 -840
- package/.mindforge/dynamic-workflows/scripts/accessibility-audit.js +88 -90
- package/.mindforge/dynamic-workflows/scripts/ai-model-eval.js +59 -61
- package/.mindforge/dynamic-workflows/scripts/api-contract-test.js +87 -85
- package/.mindforge/dynamic-workflows/scripts/api-migration.js +120 -122
- package/.mindforge/dynamic-workflows/scripts/architecture-modernization.js +84 -86
- package/.mindforge/dynamic-workflows/scripts/code-audit.js +75 -77
- package/.mindforge/dynamic-workflows/scripts/code-explainer.js +99 -101
- package/.mindforge/dynamic-workflows/scripts/competitive-analysis.js +62 -64
- package/.mindforge/dynamic-workflows/scripts/competitive-teardown.js +106 -108
- package/.mindforge/dynamic-workflows/scripts/cost-analysis.js +78 -80
- package/.mindforge/dynamic-workflows/scripts/data-pipeline-validate.js +47 -49
- package/.mindforge/dynamic-workflows/scripts/database-migration.js +85 -87
- package/.mindforge/dynamic-workflows/scripts/debug-detective.js +97 -99
- package/.mindforge/dynamic-workflows/scripts/dependency-health.js +81 -83
- package/.mindforge/dynamic-workflows/scripts/design-system-audit.js +84 -86
- package/.mindforge/dynamic-workflows/scripts/documentation-gen.js +65 -67
- package/.mindforge/dynamic-workflows/scripts/feature-planner.js +78 -80
- package/.mindforge/dynamic-workflows/scripts/incident-response.js +81 -83
- package/.mindforge/dynamic-workflows/scripts/multi-repo-sync.js +49 -51
- package/.mindforge/dynamic-workflows/scripts/mutation-testing.js +113 -115
- package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +79 -81
- package/.mindforge/dynamic-workflows/scripts/orchestrate-review.js +115 -0
- package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +97 -99
- package/.mindforge/dynamic-workflows/scripts/pr-review.js +61 -63
- package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +88 -90
- package/.mindforge/dynamic-workflows/scripts/release-prep.js +79 -81
- package/.mindforge/dynamic-workflows/scripts/security-hardening.js +117 -119
- package/.mindforge/dynamic-workflows/scripts/security-threat-model.js +119 -121
- package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +80 -82
- package/.mindforge/dynamic-workflows/scripts/tech-evaluation.js +50 -52
- package/.mindforge/dynamic-workflows/scripts/test-coverage-gap.js +68 -70
- package/.mindforge/dynamic-workflows/scripts/ux-heuristic-audit.js +89 -91
- package/.mindforge/dynamic-workflows/scripts/verification-loop.js +138 -0
- package/.mindforge/dynamic-workflows/scripts/workflow-optimizer.js +136 -0
- package/.mindforge/dynamic-workflows/scripts/writer-reviewer.js +63 -65
- package/.mindforge/memory/sync-manifest.json +1 -1
- package/.mindforge/personas/advisor-researcher.md +2 -2
- package/.mindforge/personas/api-load-tester.md +1 -1
- package/.mindforge/personas/authentication-architect.md +1 -1
- package/.mindforge/personas/backup-recovery-specialist.md +1 -1
- package/.mindforge/personas/build-optimizer.md +1 -1
- package/.mindforge/personas/caching-strategist.md +1 -1
- package/.mindforge/personas/chaos-engineer.md +1 -1
- package/.mindforge/personas/compliance-auditor.md +1 -1
- package/.mindforge/personas/config-management-expert.md +1 -1
- package/.mindforge/personas/coverage-specialist.md +1 -1
- package/.mindforge/personas/debug-specialist.md +2 -2
- package/.mindforge/personas/debugger.md +2 -2
- package/.mindforge/personas/dependency-auditor.md +1 -1
- package/.mindforge/personas/developer.md +1 -1
- package/.mindforge/personas/devops-engineer.md +1 -1
- package/.mindforge/personas/executor.md +1 -1
- package/.mindforge/personas/go-specialist.md +1 -1
- package/.mindforge/personas/incident-commander.md +1 -1
- package/.mindforge/personas/java-specialist.md +1 -1
- package/.mindforge/personas/kubernetes-debugger.md +1 -1
- package/.mindforge/personas/logging-architect.md +1 -1
- package/.mindforge/personas/mf-planner.md +1 -1
- package/.mindforge/personas/mf-researcher.md +1 -1
- package/.mindforge/personas/mf-reviewer.md +1 -1
- package/.mindforge/personas/nyquist-auditor.md +1 -1
- package/.mindforge/personas/observability-engineer.md +1 -1
- package/.mindforge/personas/performance-optimizer.md +1 -1
- package/.mindforge/personas/phase-researcher.md +5 -5
- package/.mindforge/personas/planner.md +1 -1
- package/.mindforge/personas/project-researcher.md +2 -2
- package/.mindforge/personas/python-specialist.md +1 -1
- package/.mindforge/personas/qa-engineer.md +1 -1
- package/.mindforge/personas/release-manager.md +1 -1
- package/.mindforge/personas/research-agent.md +4 -4
- package/.mindforge/personas/roadmapper-extend.md +1 -1
- package/.mindforge/personas/rust-specialist.md +1 -1
- package/.mindforge/personas/security-reviewer.md +1 -1
- package/.mindforge/personas/tech-writer.md +1 -1
- package/.mindforge/personas/typescript-wizard.md +1 -1
- package/.mindforge/personas/ui-researcher.md +1 -1
- package/.mindforge/skills/accessibility/SKILL.md +3 -3
- package/.mindforge/skills/agent-architecture-audit/SKILL.md +11 -0
- package/.mindforge/skills/agent-loops/SKILL.md +1 -1
- package/.mindforge/skills/arxiv/SKILL.md +6 -6
- package/.mindforge/skills/arxiv/scripts/search_arxiv.py +114 -0
- package/.mindforge/skills/code-tour/SKILL.md +2 -2
- package/.mindforge/skills/code-wiki/SKILL.md +11 -11
- package/.mindforge/skills/code-wiki/templates/README.md +31 -0
- package/.mindforge/skills/code-wiki/templates/architecture.md +30 -0
- package/.mindforge/skills/code-wiki/templates/getting-started.md +47 -0
- package/.mindforge/skills/code-wiki/templates/module.md +38 -0
- package/.mindforge/skills/concept-diagrams/SKILL.md +6 -6
- package/.mindforge/skills/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
- package/.mindforge/skills/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
- package/.mindforge/skills/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
- package/.mindforge/skills/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
- package/.mindforge/skills/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
- package/.mindforge/skills/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
- package/.mindforge/skills/concept-diagrams/examples/electricity-grid-flow.md +182 -0
- package/.mindforge/skills/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
- package/.mindforge/skills/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
- package/.mindforge/skills/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
- package/.mindforge/skills/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
- package/.mindforge/skills/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
- package/.mindforge/skills/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
- package/.mindforge/skills/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
- package/.mindforge/skills/concept-diagrams/examples/wind-turbine-structure.md +338 -0
- package/.mindforge/skills/concept-diagrams/references/dashboard-patterns.md +43 -0
- package/.mindforge/skills/concept-diagrams/references/infrastructure-patterns.md +144 -0
- package/.mindforge/skills/concept-diagrams/references/physical-shape-cookbook.md +42 -0
- package/.mindforge/skills/concept-diagrams/templates/template.html +174 -0
- package/.mindforge/skills/creative-ideation/references/full-prompt-library.md +110 -0
- package/.mindforge/skills/documentation/SKILL.md +1 -1
- package/.mindforge/skills/domain-intel/SKILL.md +7 -7
- package/.mindforge/skills/domain-intel/scripts/domain_intel.py +397 -0
- package/.mindforge/skills/duckduckgo-search/SKILL.md +17 -17
- package/.mindforge/skills/duckduckgo-search/scripts/duckduckgo.sh +28 -0
- package/.mindforge/skills/environment-management/SKILL.md +1 -1
- package/.mindforge/skills/github-code-review/SKILL.md +9 -9
- package/.mindforge/skills/github-code-review/references/review-output-template.md +74 -0
- package/.mindforge/skills/github-issues/templates/bug-report.md +35 -0
- package/.mindforge/skills/github-issues/templates/feature-request.md +31 -0
- package/.mindforge/skills/github-pr-workflow/SKILL.md +3 -3
- package/.mindforge/skills/github-pr-workflow/references/ci-troubleshooting.md +183 -0
- package/.mindforge/skills/github-pr-workflow/references/conventional-commits.md +71 -0
- package/.mindforge/skills/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
- package/.mindforge/skills/github-pr-workflow/templates/pr-body-feature.md +33 -0
- package/.mindforge/skills/incident-response/SKILL.md +1 -1
- package/.mindforge/skills/jupyter-live-kernel/SKILL.md +3 -3
- package/.mindforge/skills/kanban-orchestrator/SKILL.md +10 -10
- package/.mindforge/skills/kanban-worker/SKILL.md +6 -6
- package/.mindforge/skills/meme-generation/SKILL.md +1 -1
- package/.mindforge/skills/meme-generation/scripts/generate_meme.py +470 -0
- package/.mindforge/skills/meme-generation/scripts/templates.json +97 -0
- package/.mindforge/skills/obsidian/SKILL.md +15 -15
- package/.mindforge/skills/orch-pipeline/SKILL.md +2 -2
- package/.mindforge/skills/osint-investigation/SKILL.md +3 -2
- package/.mindforge/skills/osint-investigation/references/sources/courtlistener.md +98 -0
- package/.mindforge/skills/osint-investigation/references/sources/gdelt.md +104 -0
- package/.mindforge/skills/osint-investigation/references/sources/icij-offshore.md +104 -0
- package/.mindforge/skills/osint-investigation/references/sources/nyc-acris.md +90 -0
- package/.mindforge/skills/osint-investigation/references/sources/ofac-sdn.md +92 -0
- package/.mindforge/skills/osint-investigation/references/sources/opencorporates.md +103 -0
- package/.mindforge/skills/osint-investigation/references/sources/sec-edgar.md +83 -0
- package/.mindforge/skills/osint-investigation/references/sources/senate-ld.md +89 -0
- package/.mindforge/skills/osint-investigation/references/sources/usaspending.md +97 -0
- package/.mindforge/skills/osint-investigation/references/sources/wayback.md +93 -0
- package/.mindforge/skills/osint-investigation/references/sources/wikipedia.md +107 -0
- package/.mindforge/skills/osint-investigation/scripts/_http.py +82 -0
- package/.mindforge/skills/osint-investigation/scripts/_normalize.py +67 -0
- package/.mindforge/skills/osint-investigation/scripts/build_findings.py +221 -0
- package/.mindforge/skills/osint-investigation/scripts/entity_resolution.py +228 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_courtlistener.py +149 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_gdelt.py +161 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_opencorporates.py +191 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_senate_ld.py +146 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_usaspending.py +170 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_wayback.py +142 -0
- package/.mindforge/skills/osint-investigation/scripts/fetch_wikipedia.py +266 -0
- package/.mindforge/skills/osint-investigation/scripts/timing_analysis.py +252 -0
- package/.mindforge/skills/osint-investigation/templates/source-template.md +59 -0
- package/.mindforge/skills/oss-forensics/SKILL.md +6 -6
- package/.mindforge/skills/oss-forensics/references/evidence-types.md +89 -0
- package/.mindforge/skills/oss-forensics/references/github-archive-guide.md +184 -0
- package/.mindforge/skills/oss-forensics/references/investigation-templates.md +131 -0
- package/.mindforge/skills/oss-forensics/references/recovery-techniques.md +164 -0
- package/.mindforge/skills/oss-forensics/scripts/evidence-store.py +313 -0
- package/.mindforge/skills/oss-forensics/templates/forensic-report.md +151 -0
- package/.mindforge/skills/oss-forensics/templates/malicious-package-report.md +43 -0
- package/.mindforge/skills/pixel-art/SKILL.md +2 -2
- package/.mindforge/skills/pixel-art/references/palettes.md +49 -0
- package/.mindforge/skills/plan/SKILL.md +10 -10
- package/.mindforge/skills/requesting-code-review/SKILL.md +4 -6
- package/.mindforge/skills/research-paper-writing/SKILL.md +32 -32
- package/.mindforge/skills/research-paper-writing/references/autoreason-methodology.md +394 -0
- package/.mindforge/skills/research-paper-writing/references/checklists.md +434 -0
- package/.mindforge/skills/research-paper-writing/references/citation-workflow.md +563 -0
- package/.mindforge/skills/research-paper-writing/references/experiment-patterns.md +728 -0
- package/.mindforge/skills/research-paper-writing/references/human-evaluation.md +476 -0
- package/.mindforge/skills/research-paper-writing/references/paper-types.md +481 -0
- package/.mindforge/skills/research-paper-writing/references/reviewer-guidelines.md +433 -0
- package/.mindforge/skills/research-paper-writing/references/sources.md +191 -0
- package/.mindforge/skills/research-paper-writing/references/writing-guide.md +474 -0
- package/.mindforge/skills/research-paper-writing/templates/README.md +251 -0
- package/.mindforge/skills/scrapling/SKILL.md +1 -1
- package/.mindforge/skills/security-review/SKILL.md +1 -1
- package/.mindforge/skills/sherlock/SKILL.md +1 -1
- package/.mindforge/skills/simplify-code/SKILL.md +5 -7
- package/.mindforge/skills/spike/SKILL.md +11 -13
- package/.mindforge/skills/subagent-driven-development/SKILL.md +7 -11
- package/.mindforge/skills/subagent-driven-development/references/context-budget-discipline.md +53 -0
- package/.mindforge/skills/subagent-driven-development/references/gates-taxonomy.md +93 -0
- package/.mindforge/skills/systematic-debugging/SKILL.md +13 -14
- package/.mindforge/skills/test-driven-development/SKILL.md +7 -8
- package/.mindforge/skills/testing-standards/SKILL.md +1 -1
- package/.mindforge/skills/web-pentest/SKILL.md +2 -2
- package/.mindforge/skills/web-pentest/references/bypass-techniques.md +133 -0
- package/.mindforge/skills/web-pentest/references/exploitation-techniques.md +204 -0
- package/.mindforge/skills/web-pentest/references/scope-enforcement.md +110 -0
- package/.mindforge/skills/web-pentest/references/vuln-taxonomy.md +81 -0
- package/.mindforge/skills/web-pentest/templates/authorization.md +69 -0
- package/.mindforge/skills/web-pentest/templates/pentest-report.md +178 -0
- package/.mindforge/skills/writing-skills/SKILL.md +4 -3
- package/CHANGELOG.md +35 -0
- package/MINDFORGE.md +3 -3
- package/README.md +9 -7
- package/RELEASENOTES.md +65 -2
- package/SECURITY.md +5 -3
- package/bin/autonomous/auto-runner.js +5 -2
- package/bin/engine/skill-loader.js +4 -0
- package/bin/governance/rbac.js +4 -0
- package/bin/memory/eis-client.js +1 -0
- package/bin/mindforge-cli.js +5 -0
- package/bin/models/bedrock-provider.js +192 -0
- package/bin/models/model-client.js +19 -0
- package/bin/spawn-agent.js +9 -2
- package/docs/commands-reference.md +68 -6
- package/docs/faq.md +38 -1
- package/docs/getting-started.md +27 -12
- package/docs/sdk-reference.md +36 -3
- package/docs/troubleshooting.md +59 -1
- package/docs/user-guide.md +7 -4
- package/package.json +3 -3
- package/.claude/commands/mindforge/skill-tdd.md +0 -53
- package/.claude/commands/mindforge/skills-index.md +0 -118
- package/.claude/commands/mindforge/systematic-debug.md +0 -60
- package/.claude/commands/mindforge/wf-accessibility-audit.md +0 -31
- package/.claude/commands/mindforge/wf-ai-model-eval.md +0 -31
- package/.claude/commands/mindforge/wf-api-migration.md +0 -31
- package/.claude/commands/mindforge/wf-architecture-modernization.md +0 -32
- package/.claude/commands/mindforge/wf-catalog.md +0 -59
- package/.claude/commands/mindforge/wf-code-audit.md +0 -31
- package/.claude/commands/mindforge/wf-code-explainer.md +0 -31
- package/.claude/commands/mindforge/wf-competitive-analysis.md +0 -31
- package/.claude/commands/mindforge/wf-competitive-teardown.md +0 -31
- package/.claude/commands/mindforge/wf-cost-analysis.md +0 -31
- package/.claude/commands/mindforge/wf-data-pipeline-validate.md +0 -31
- package/.claude/commands/mindforge/wf-database-migration.md +0 -31
- package/.claude/commands/mindforge/wf-debug-detective.md +0 -32
- package/.claude/commands/mindforge/wf-design-system-audit.md +0 -31
- package/.claude/commands/mindforge/wf-documentation-gen.md +0 -31
- package/.claude/commands/mindforge/wf-feature-planner.md +0 -31
- package/.claude/commands/mindforge/wf-incident-response.md +0 -31
- package/.claude/commands/mindforge/wf-multi-repo-sync.md +0 -31
- package/.claude/commands/mindforge/wf-mutation-testing.md +0 -31
- package/.claude/commands/mindforge/wf-onboard-codebase.md +0 -31
- package/.claude/commands/mindforge/wf-perf-optimize.md +0 -31
- package/.claude/commands/mindforge/wf-pr-review.md +0 -31
- package/.claude/commands/mindforge/wf-refactor-plan.md +0 -31
- package/.claude/commands/mindforge/wf-release-prep.md +0 -31
- package/.claude/commands/mindforge/wf-security-threat-model.md +0 -31
- package/.claude/commands/mindforge/wf-tdd-sprint.md +0 -31
- package/.claude/commands/mindforge/wf-tech-evaluation.md +0 -31
- package/.claude/commands/mindforge/wf-ux-heuristic-audit.md +0 -31
- 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)
|