osintkit 0.1.1__tar.gz

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 (80) hide show
  1. osintkit-0.1.1/.editorconfig +15 -0
  2. osintkit-0.1.1/.github/CODEOWNERS +3 -0
  3. osintkit-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +57 -0
  4. osintkit-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. osintkit-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
  6. osintkit-0.1.1/.github/dependabot.yml +13 -0
  7. osintkit-0.1.1/.github/pull_request_template.md +16 -0
  8. osintkit-0.1.1/.github/workflows/ci.yml +31 -0
  9. osintkit-0.1.1/.github/workflows/codeql.yml +25 -0
  10. osintkit-0.1.1/.github/workflows/publish.yml +29 -0
  11. osintkit-0.1.1/.github/workflows/release.yml +36 -0
  12. osintkit-0.1.1/.github/workflows/smoke.yml +38 -0
  13. osintkit-0.1.1/.gitignore +12 -0
  14. osintkit-0.1.1/.mailmap +1 -0
  15. osintkit-0.1.1/.pre-commit-config.yaml +7 -0
  16. osintkit-0.1.1/CHANGELOG.md +52 -0
  17. osintkit-0.1.1/CODE_OF_CONDUCT.md +34 -0
  18. osintkit-0.1.1/CONTRIBUTING.md +69 -0
  19. osintkit-0.1.1/LICENSE +21 -0
  20. osintkit-0.1.1/PKG-INFO +176 -0
  21. osintkit-0.1.1/README.md +144 -0
  22. osintkit-0.1.1/SECURITY.md +41 -0
  23. osintkit-0.1.1/docs/REFERENCE.md +112 -0
  24. osintkit-0.1.1/docs/architecture.md +59 -0
  25. osintkit-0.1.1/docs/demo.svg +238 -0
  26. osintkit-0.1.1/docs/sample-output.md +45 -0
  27. osintkit-0.1.1/docs/social-preview.png +0 -0
  28. osintkit-0.1.1/examples/README.md +38 -0
  29. osintkit-0.1.1/examples/targets.csv +5 -0
  30. osintkit-0.1.1/pyproject.toml +58 -0
  31. osintkit-0.1.1/src/osintkit/__init__.py +3 -0
  32. osintkit-0.1.1/src/osintkit/cli.py +673 -0
  33. osintkit-0.1.1/src/osintkit/collectors/__init__.py +24 -0
  34. osintkit-0.1.1/src/osintkit/collectors/accounts.py +83 -0
  35. osintkit-0.1.1/src/osintkit/collectors/base.py +138 -0
  36. osintkit-0.1.1/src/osintkit/collectors/breaches.py +163 -0
  37. osintkit-0.1.1/src/osintkit/collectors/ct.py +165 -0
  38. osintkit-0.1.1/src/osintkit/collectors/dns.py +130 -0
  39. osintkit-0.1.1/src/osintkit/collectors/github.py +190 -0
  40. osintkit-0.1.1/src/osintkit/collectors/pastes.py +237 -0
  41. osintkit-0.1.1/src/osintkit/collectors/ports.py +91 -0
  42. osintkit-0.1.1/src/osintkit/collectors/subdomains.py +102 -0
  43. osintkit-0.1.1/src/osintkit/collectors/whois_lookup.py +72 -0
  44. osintkit-0.1.1/src/osintkit/config.py +151 -0
  45. osintkit-0.1.1/src/osintkit/diff.py +96 -0
  46. osintkit-0.1.1/src/osintkit/doctor.py +119 -0
  47. osintkit-0.1.1/src/osintkit/errors.py +51 -0
  48. osintkit-0.1.1/src/osintkit/http.py +272 -0
  49. osintkit-0.1.1/src/osintkit/llm.py +91 -0
  50. osintkit-0.1.1/src/osintkit/logging_store.py +206 -0
  51. osintkit-0.1.1/src/osintkit/models.py +228 -0
  52. osintkit-0.1.1/src/osintkit/normalise.py +131 -0
  53. osintkit-0.1.1/src/osintkit/pipeline.py +237 -0
  54. osintkit-0.1.1/src/osintkit/py.typed +0 -0
  55. osintkit-0.1.1/src/osintkit/render.py +235 -0
  56. osintkit-0.1.1/src/osintkit/retention.py +81 -0
  57. osintkit-0.1.1/src/osintkit/synthesis.py +176 -0
  58. osintkit-0.1.1/src/osintkit/targets.py +65 -0
  59. osintkit-0.1.1/tests/conftest.py +78 -0
  60. osintkit-0.1.1/tests/fixtures/model_reply.json +13 -0
  61. osintkit-0.1.1/tests/test_accounts.py +39 -0
  62. osintkit-0.1.1/tests/test_breaches.py +91 -0
  63. osintkit-0.1.1/tests/test_cli.py +449 -0
  64. osintkit-0.1.1/tests/test_collectors.py +479 -0
  65. osintkit-0.1.1/tests/test_config.py +47 -0
  66. osintkit-0.1.1/tests/test_ct.py +96 -0
  67. osintkit-0.1.1/tests/test_diff.py +49 -0
  68. osintkit-0.1.1/tests/test_doctor.py +83 -0
  69. osintkit-0.1.1/tests/test_e2e.py +87 -0
  70. osintkit-0.1.1/tests/test_http.py +142 -0
  71. osintkit-0.1.1/tests/test_llm.py +98 -0
  72. osintkit-0.1.1/tests/test_normalise.py +118 -0
  73. osintkit-0.1.1/tests/test_pastes.py +71 -0
  74. osintkit-0.1.1/tests/test_pipeline.py +187 -0
  75. osintkit-0.1.1/tests/test_render.py +106 -0
  76. osintkit-0.1.1/tests/test_retention.py +43 -0
  77. osintkit-0.1.1/tests/test_synthesis.py +173 -0
  78. osintkit-0.1.1/tests/test_targets.py +48 -0
  79. osintkit-0.1.1/tests/test_whois.py +58 -0
  80. osintkit-0.1.1/uv.lock +578 -0
@@ -0,0 +1,15 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 4
10
+
11
+ [*.{yml,yaml,json,md}]
12
+ indent_size = 2
13
+
14
+ [Makefile]
15
+ indent_style = tab
@@ -0,0 +1,3 @@
1
+ * @sjdsjadjajdjsa
2
+
3
+ docs/ @sjdsjadjajdjsa
@@ -0,0 +1,57 @@
1
+ name: Bug report
2
+ description: Something broke or lied
3
+ labels: [bug]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Never paste a live API key. Trim personal data from reports where you can.
9
+ - type: input
10
+ id: version
11
+ attributes:
12
+ label: Version
13
+ description: Output of `osintkit --version`
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: command
18
+ attributes:
19
+ label: Command
20
+ description: Redact the target if it is sensitive
21
+ render: shell
22
+ validations:
23
+ required: true
24
+ - type: textarea
25
+ id: expected
26
+ attributes:
27
+ label: Expected
28
+ validations:
29
+ required: true
30
+ - type: textarea
31
+ id: actual
32
+ attributes:
33
+ label: Actual
34
+ description: Paste the error or the coverage panel
35
+ validations:
36
+ required: true
37
+ - type: dropdown
38
+ id: source
39
+ attributes:
40
+ label: Area
41
+ options:
42
+ - collector / source
43
+ - synthesis / model
44
+ - rendering / output
45
+ - cache / storage
46
+ - CLI / UX
47
+ - packaging / install
48
+ - other
49
+ validations:
50
+ required: true
51
+ - type: checkboxes
52
+ id: checks
53
+ attributes:
54
+ label: Checks
55
+ options:
56
+ - label: Reproduced on the latest main
57
+ - label: osintkit doctor output included (key length only)
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security report
4
+ url: https://github.com/sjdsjadjajdjsa/osintkit/security/advisories/new
5
+ about: Private disclosure for key leaks, cache poisoning, injection, and SSRF
@@ -0,0 +1,30 @@
1
+ name: Feature request
2
+ description: A source, output, or behaviour worth adding
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem
9
+ description: What is awkward today?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: proposal
14
+ attributes:
15
+ label: Proposal
16
+ validations:
17
+ required: true
18
+ - type: input
19
+ id: source
20
+ attributes:
21
+ label: Source
22
+ description: If this is a data source, link it and confirm it needs no login
23
+ - type: checkboxes
24
+ id: constraints
25
+ attributes:
26
+ label: Constraints
27
+ options:
28
+ - label: The source is public and login-free
29
+ - label: The output can be represented in the existing JSON schema
30
+ - label: I am willing to open a PR
@@ -0,0 +1,13 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: uv
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ groups:
8
+ dev:
9
+ patterns: ["*"]
10
+ - package-ecosystem: github-actions
11
+ directory: /
12
+ schedule:
13
+ interval: weekly
@@ -0,0 +1,16 @@
1
+ ## Problem
2
+
3
+ <!-- What is wrong or missing today? -->
4
+
5
+ ## Change
6
+
7
+ <!-- What does this do, and why this way? -->
8
+
9
+ ## Testing
10
+
11
+ <!-- Commands run, sources exercised, and the report or coverage panel for collector changes. -->
12
+
13
+ - [ ] `pytest` passes
14
+ - [ ] `uvx ruff check src tests` and `uvx ruff format --check src tests` pass
15
+ - [ ] no live credentials or captured personal data in the diff
16
+ - [ ] docs updated for new flags, collectors, or behaviour
@@ -0,0 +1,31 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ python-version: ["3.12", "3.13"]
15
+ steps:
16
+ - uses: actions/checkout@v7
17
+ - uses: astral-sh/setup-uv@v7
18
+ with:
19
+ enable-cache: true
20
+ - name: Set up Python
21
+ run: uv python install ${{ matrix.python-version }}
22
+ - name: Install
23
+ run: |
24
+ uv venv --python ${{ matrix.python-version }}
25
+ uv sync --frozen --extra dev
26
+ - name: Lint
27
+ run: |
28
+ uvx ruff check src tests
29
+ uvx ruff format --check src tests
30
+ - name: Test
31
+ run: .venv/bin/pytest -q --cov=osintkit --cov-fail-under=85
@@ -0,0 +1,25 @@
1
+ name: codeql
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ schedule:
8
+ - cron: "0 6 * * 1"
9
+
10
+ permissions:
11
+ security-events: write
12
+ actions: read
13
+ contents: read
14
+
15
+ jobs:
16
+ analyze:
17
+ if: github.event.repository.private == false
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+ - uses: github/codeql-action/init@v4
22
+ with:
23
+ languages: python
24
+ queries: security-extended
25
+ - uses: github/codeql-action/analyze@v4
@@ -0,0 +1,29 @@
1
+ name: publish
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+
12
+ jobs:
13
+ pypi:
14
+ if: vars.PUBLISH_TO_PYPI == 'true'
15
+ runs-on: ubuntu-latest
16
+ environment: pypi
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+ - uses: astral-sh/setup-uv@v7
20
+ - name: Build
21
+ run: |
22
+ uv python install 3.12
23
+ uv venv --python 3.12
24
+ uv sync --frozen --no-dev
25
+ uv pip install build
26
+ .venv/bin/python -m build --outdir dist
27
+ - uses: pypa/gh-action-pypi-publish@release/v1
28
+ with:
29
+ packages-dir: dist
@@ -0,0 +1,36 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v7
15
+ - uses: astral-sh/setup-uv@v7
16
+ - name: Build
17
+ run: |
18
+ uv python install 3.12
19
+ uv venv --python 3.12
20
+ uv sync --frozen
21
+ uv pip install build
22
+ .venv/bin/python -m build --outdir dist
23
+ - name: Verify the tag matches the package version
24
+ run: |
25
+ tag="${GITHUB_REF_NAME#v}"
26
+ version="$(.venv/bin/python -c 'import osintkit; print(osintkit.__version__)')"
27
+ test "$tag" = "$version" || { echo "tag $tag != version $version"; exit 1; }
28
+ - name: Checksums
29
+ run: |
30
+ cd dist
31
+ sha256sum osintkit-*.whl osintkit-*.tar.gz > SHA256SUMS.txt
32
+ - uses: softprops/action-gh-release@v3
33
+ with:
34
+ files: |
35
+ dist/*
36
+ generate_release_notes: true
@@ -0,0 +1,38 @@
1
+ name: smoke
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 5 * * 1"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ collectors:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ - uses: astral-sh/setup-uv@v7
17
+ - name: Install
18
+ run: |
19
+ uv venv --python 3.12
20
+ uv sync --frozen --no-dev
21
+ - name: Collect against stable targets
22
+ run: |
23
+ set -eu
24
+ for target in example.com cloudflare.com; do
25
+ .venv/bin/osintkit --no-cache lookup --domain "$target" --raw \
26
+ --only dns_records,dns_mail_posture,crt_sh_subdomains > "smoke-$target.json"
27
+ .venv/bin/python - "smoke-$target.json" <<'PY'
28
+ import json, sys
29
+
30
+ payload = json.load(open(sys.argv[1]))
31
+ results = payload["results"]
32
+ ok = [r for r in results if r["ok"] and r["data"]]
33
+ if not ok:
34
+ print("every collector failed", file=sys.stderr)
35
+ raise SystemExit(1)
36
+ print(f"{len(ok)}/{len(results)} collectors returned data")
37
+ PY
38
+ done
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ dist/
5
+ build/
6
+ *.egg-info/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ .coverage
10
+ htmlcov/
11
+ .crush/
12
+ DS_Store
@@ -0,0 +1 @@
1
+ sjdsjadjajdjsa <sjdsjadjajdjsa@users.noreply.github.com> <dev@osintkit.local>
@@ -0,0 +1,7 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.14.0
4
+ hooks:
5
+ - id: ruff-check
6
+ args: [--fix]
7
+ - id: ruff-format
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ All notable changes are recorded here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## Unreleased
8
+
9
+ ## 0.1.1 — 2026-11-02
10
+
11
+ ### Added
12
+
13
+ - `--provider` presets (`venice`, `openrouter`, `openai`) chosen from a key prefix
14
+ - `collectors --json` metadata for scripting
15
+ - weekly smoke workflow and a social preview card
16
+ - opt-in PyPI publishing through Trusted Publishing
17
+
18
+ ### Changed
19
+
20
+ - default Venice model is the plain `deepseek-v4-1-flash` alias
21
+ - the README demo image no longer names the model
22
+ - CI enforces formatting and 85% coverage
23
+
24
+ ### Added
25
+
26
+ - `diff` command comparing two archived runs: risk direction, breach and subdomain deltas,
27
+ collector health
28
+ - `--ports` to scope the TCP probe list
29
+ - provider detection from a `sk-or-` key prefix
30
+ - `doctor --deep` verifying the key with a one-token completion
31
+ - retention window and `prune` for cache, logs, and reports
32
+ - `schema` command publishing the model contract
33
+ - `batch --only`, `--skip`, `--raw`, and `--concurrency`
34
+
35
+ ### Changed
36
+
37
+ - breach records merge across sources; risk gets a deterministic floor
38
+ - report schema carries `schema_version`
39
+ - unknown collector names fail with a suggestion
40
+
41
+ ### Fixed
42
+
43
+ - repeat runs missed the model cache because of a prompt timestamp
44
+ - cached replays double-decoded compressed bodies
45
+ - crt.sh organisation search falls back to certificate identity
46
+ - batch progress no longer pollutes piped JSON
47
+ - rate-limit and empty-completion handling
48
+
49
+ ## 0.1.0 — 2026-11-02
50
+
51
+ Initial release: lookup, batch, and history commands; twenty public-source collectors;
52
+ LLM synthesis with schema validation; Rich, JSON, and Markdown output; local cache and logs.
@@ -0,0 +1,34 @@
1
+ # Code of conduct
2
+
3
+ Adapted from the Contributor Covenant, version 2.1.
4
+
5
+ ## Our pledge
6
+
7
+ We make participation in this project harassment-free for everyone, regardless of experience,
8
+ identity, or background.
9
+
10
+ ## Expected behaviour
11
+
12
+ - Be direct and kind. Critique the change, not the person.
13
+ - Assume good faith; ask before rewriting someone else's work.
14
+ - Accept that "no, and here is why" is a complete answer.
15
+ - Credit prior art and other people's findings.
16
+
17
+ ## Unacceptable behaviour
18
+
19
+ - Harassment, insults, or dismissive gatekeeping.
20
+ - Publishing others' private data without consent (fits this project especially).
21
+ - Sustained off-topic noise in issues or pull requests.
22
+ - Plagiarism or uncredited vendoring.
23
+
24
+ ## Scope
25
+
26
+ Issues, pull requests, discussions, and anywhere the project is represented.
27
+
28
+ ## Enforcement
29
+
30
+ Report by opening an issue or tagging the maintainer in the thread. Consequences scale with the
31
+ offence: a nudge, a comment cleanup, or removal from the project. Decisions are explained, and
32
+ appeals are heard once.
33
+
34
+ Maintainers may edit or delete contributions that break these rules.
@@ -0,0 +1,69 @@
1
+ # Contributing
2
+
3
+ Bug reports and pull requests are welcome. By participating you agree to the
4
+ [Code of Conduct](CODE_OF_CONDUCT.md).
5
+
6
+ ## Setup
7
+
8
+ ```bash
9
+ git clone https://github.com/sjdsjadjajdjsa/osintkit
10
+ cd osintkit
11
+ uv sync --extra dev
12
+ pre-commit install
13
+ pytest
14
+ ```
15
+
16
+ Tests must not touch the network. HTTP is mocked with `respx`; DNS, WHOIS, and model calls are
17
+ monkeypatched. `tests/fixtures/model_reply.json` covers the full-stack path.
18
+
19
+ ## What fits
20
+
21
+ - new login-free, publicly documented sources
22
+ - parser fixes when a source changes shape
23
+ - better failure messages, caching, or rate-limit handling
24
+ - accessibility and output quality in the Rich renderer
25
+ - documentation, examples, and tests
26
+
27
+ Out of scope: sources that need scraping behind a login, paid brokers, and broad rewrites of the
28
+ CLI surface.
29
+
30
+ ## Adding a collector
31
+
32
+ Collectors are small async functions in `src/osintkit/collectors/`.
33
+
34
+ 1. Register with `@collector(name, target_types, description, order=..., ttl=..., timeout=...)`.
35
+ 2. Accept `Context`; read only `ctx.target`, `ctx.target_type`, `ctx.http`, and settings.
36
+ 3. Return plain JSON-able data. Raise nothing for a normal empty result.
37
+ 4. Pass a `namespace` to every `ctx.http` call so caching is isolated. Use `empty_on` for
38
+ "not found" statuses.
39
+ 5. Add a `ttl` for volatile data and a `timeout` for slow sources.
40
+ 6. Test the happy path, the empty path, and one failure path with `respx`.
41
+ 7. Add the row to `docs/REFERENCE.md#collectors`.
42
+
43
+ `run_collector` catches exceptions, times the call, and records the outcome, so a collector must
44
+ only raise for genuinely broken upstream state.
45
+
46
+ Never invent data: if a source returns nothing, return an empty value. The synthesis prompt
47
+ distinguishes "no findings" from "not collected", and both are visible in the report.
48
+
49
+ ## Style
50
+
51
+ - `ruff format` and `ruff check` must pass; line length 112.
52
+ - Type hints on public functions; `from __future__ import annotations` at the top.
53
+ - Comments explain *why*, not *what*. Docstrings for modules and non-obvious functions.
54
+ - No new runtime dependency without a reason in the PR.
55
+ - Keep the security posture: public data only, no credentials in logs, no shelling out.
56
+
57
+ ## Commits
58
+
59
+ Present tense, imperative, under 72 characters on the first line. Say what the change enables,
60
+ not which files moved. Body only when the reason is not obvious.
61
+
62
+ ## Pull requests
63
+
64
+ - One logical change per PR; split unrelated cleanups out.
65
+ - Describe the problem before the fix, and say how it was tested.
66
+ - Include the report or coverage panel for collector changes.
67
+ - CI must be green; `--no-verify` is fine locally but not for merging.
68
+
69
+ Maintainers may squash. A reviewer will ask for a test if a change is behavioural and untested.
osintkit-0.1.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 osintkit contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.