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.
- osintkit-0.1.1/.editorconfig +15 -0
- osintkit-0.1.1/.github/CODEOWNERS +3 -0
- osintkit-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +57 -0
- osintkit-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- osintkit-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- osintkit-0.1.1/.github/dependabot.yml +13 -0
- osintkit-0.1.1/.github/pull_request_template.md +16 -0
- osintkit-0.1.1/.github/workflows/ci.yml +31 -0
- osintkit-0.1.1/.github/workflows/codeql.yml +25 -0
- osintkit-0.1.1/.github/workflows/publish.yml +29 -0
- osintkit-0.1.1/.github/workflows/release.yml +36 -0
- osintkit-0.1.1/.github/workflows/smoke.yml +38 -0
- osintkit-0.1.1/.gitignore +12 -0
- osintkit-0.1.1/.mailmap +1 -0
- osintkit-0.1.1/.pre-commit-config.yaml +7 -0
- osintkit-0.1.1/CHANGELOG.md +52 -0
- osintkit-0.1.1/CODE_OF_CONDUCT.md +34 -0
- osintkit-0.1.1/CONTRIBUTING.md +69 -0
- osintkit-0.1.1/LICENSE +21 -0
- osintkit-0.1.1/PKG-INFO +176 -0
- osintkit-0.1.1/README.md +144 -0
- osintkit-0.1.1/SECURITY.md +41 -0
- osintkit-0.1.1/docs/REFERENCE.md +112 -0
- osintkit-0.1.1/docs/architecture.md +59 -0
- osintkit-0.1.1/docs/demo.svg +238 -0
- osintkit-0.1.1/docs/sample-output.md +45 -0
- osintkit-0.1.1/docs/social-preview.png +0 -0
- osintkit-0.1.1/examples/README.md +38 -0
- osintkit-0.1.1/examples/targets.csv +5 -0
- osintkit-0.1.1/pyproject.toml +58 -0
- osintkit-0.1.1/src/osintkit/__init__.py +3 -0
- osintkit-0.1.1/src/osintkit/cli.py +673 -0
- osintkit-0.1.1/src/osintkit/collectors/__init__.py +24 -0
- osintkit-0.1.1/src/osintkit/collectors/accounts.py +83 -0
- osintkit-0.1.1/src/osintkit/collectors/base.py +138 -0
- osintkit-0.1.1/src/osintkit/collectors/breaches.py +163 -0
- osintkit-0.1.1/src/osintkit/collectors/ct.py +165 -0
- osintkit-0.1.1/src/osintkit/collectors/dns.py +130 -0
- osintkit-0.1.1/src/osintkit/collectors/github.py +190 -0
- osintkit-0.1.1/src/osintkit/collectors/pastes.py +237 -0
- osintkit-0.1.1/src/osintkit/collectors/ports.py +91 -0
- osintkit-0.1.1/src/osintkit/collectors/subdomains.py +102 -0
- osintkit-0.1.1/src/osintkit/collectors/whois_lookup.py +72 -0
- osintkit-0.1.1/src/osintkit/config.py +151 -0
- osintkit-0.1.1/src/osintkit/diff.py +96 -0
- osintkit-0.1.1/src/osintkit/doctor.py +119 -0
- osintkit-0.1.1/src/osintkit/errors.py +51 -0
- osintkit-0.1.1/src/osintkit/http.py +272 -0
- osintkit-0.1.1/src/osintkit/llm.py +91 -0
- osintkit-0.1.1/src/osintkit/logging_store.py +206 -0
- osintkit-0.1.1/src/osintkit/models.py +228 -0
- osintkit-0.1.1/src/osintkit/normalise.py +131 -0
- osintkit-0.1.1/src/osintkit/pipeline.py +237 -0
- osintkit-0.1.1/src/osintkit/py.typed +0 -0
- osintkit-0.1.1/src/osintkit/render.py +235 -0
- osintkit-0.1.1/src/osintkit/retention.py +81 -0
- osintkit-0.1.1/src/osintkit/synthesis.py +176 -0
- osintkit-0.1.1/src/osintkit/targets.py +65 -0
- osintkit-0.1.1/tests/conftest.py +78 -0
- osintkit-0.1.1/tests/fixtures/model_reply.json +13 -0
- osintkit-0.1.1/tests/test_accounts.py +39 -0
- osintkit-0.1.1/tests/test_breaches.py +91 -0
- osintkit-0.1.1/tests/test_cli.py +449 -0
- osintkit-0.1.1/tests/test_collectors.py +479 -0
- osintkit-0.1.1/tests/test_config.py +47 -0
- osintkit-0.1.1/tests/test_ct.py +96 -0
- osintkit-0.1.1/tests/test_diff.py +49 -0
- osintkit-0.1.1/tests/test_doctor.py +83 -0
- osintkit-0.1.1/tests/test_e2e.py +87 -0
- osintkit-0.1.1/tests/test_http.py +142 -0
- osintkit-0.1.1/tests/test_llm.py +98 -0
- osintkit-0.1.1/tests/test_normalise.py +118 -0
- osintkit-0.1.1/tests/test_pastes.py +71 -0
- osintkit-0.1.1/tests/test_pipeline.py +187 -0
- osintkit-0.1.1/tests/test_render.py +106 -0
- osintkit-0.1.1/tests/test_retention.py +43 -0
- osintkit-0.1.1/tests/test_synthesis.py +173 -0
- osintkit-0.1.1/tests/test_targets.py +48 -0
- osintkit-0.1.1/tests/test_whois.py +58 -0
- osintkit-0.1.1/uv.lock +578 -0
|
@@ -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,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,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
|
osintkit-0.1.1/.mailmap
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sjdsjadjajdjsa <sjdsjadjajdjsa@users.noreply.github.com> <dev@osintkit.local>
|
|
@@ -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.
|