reconkit 0.2.0__tar.gz → 0.2.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 (40) hide show
  1. reconkit-0.2.1/.github/workflows/publish.yml +50 -0
  2. {reconkit-0.2.0 → reconkit-0.2.1}/.gitignore +30 -30
  3. {reconkit-0.2.0 → reconkit-0.2.1}/CHANGELOG.md +37 -32
  4. reconkit-0.2.1/LICENSE +38 -0
  5. {reconkit-0.2.0 → reconkit-0.2.1}/PKG-INFO +12 -3
  6. {reconkit-0.2.0 → reconkit-0.2.1}/README.md +10 -1
  7. {reconkit-0.2.0 → reconkit-0.2.1}/pyproject.toml +57 -57
  8. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/__init__.py +22 -22
  9. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/cli.py +247 -247
  10. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/core/rate_limit.py +24 -24
  11. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/exif.py +16 -16
  12. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/hashing.py +22 -22
  13. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/identify.py +12 -12
  14. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/strings.py +47 -47
  15. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/__init__.py +54 -54
  16. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/errors.py +29 -29
  17. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/primitives.py +154 -154
  18. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/noir/public_api.py +225 -225
  19. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/dns.py +18 -18
  20. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/ip.py +25 -25
  21. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/whois.py +14 -14
  22. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/extract.py +36 -36
  23. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/fetch.py +112 -112
  24. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/robots.py +59 -59
  25. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_extract_links.py +13 -13
  26. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_hashing.py +9 -9
  27. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_noir_output_contract.py +23 -23
  28. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_noir_primitives.py +12 -12
  29. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_strings.py +11 -11
  30. reconkit-0.2.0/LICENSE +0 -21
  31. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/core/__init__.py +0 -0
  32. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/__init__.py +0 -0
  33. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/archives.py +0 -0
  34. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/custody.py +0 -0
  35. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/iris.py +0 -0
  36. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/evidence/manifest.py +0 -0
  37. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/forensics/__init__.py +0 -0
  38. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/osint/__init__.py +0 -0
  39. {reconkit-0.2.0 → reconkit-0.2.1}/src/reconkit/scraping/__init__.py +0 -0
  40. {reconkit-0.2.0 → reconkit-0.2.1}/tests/test_evidence_exports.py +0 -0
@@ -0,0 +1,50 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ publish:
13
+ name: Build and publish
14
+ runs-on: ubuntu-latest
15
+ environment: pypi
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - uses: actions/setup-python@v5
20
+ with:
21
+ python-version: "3.12"
22
+
23
+ - name: Install release tools
24
+ run: python -m pip install --upgrade build twine
25
+
26
+ - name: Confirm the tag matches the package version
27
+ env:
28
+ RELEASE_TAG: ${{ github.ref_name }}
29
+ run: |
30
+ python - <<'PY'
31
+ import os
32
+ import tomllib
33
+ from pathlib import Path
34
+
35
+ version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
36
+ expected = f"v{version}"
37
+ if os.environ["RELEASE_TAG"] != expected:
38
+ raise SystemExit(f"Tag {os.environ['RELEASE_TAG']} does not match {expected}.")
39
+ PY
40
+
41
+ - name: Build distributions
42
+ run: python -m build
43
+
44
+ - name: Validate distributions
45
+ run: twine check dist/*
46
+
47
+ - name: Publish to PyPI
48
+ uses: pypa/gh-action-pypi-publish@release/v1
49
+ with:
50
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -1,30 +1,30 @@
1
- # Byte-compiled / optimized / DLL files
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
-
6
- # C extensions
7
- *.so
8
-
9
- # Distribution / packaging
10
- build/
11
- dist/
12
- *.egg-info/
13
- .eggs/
14
-
15
- # Virtual environments
16
- .venv/
17
- venv/
18
- ENV/
19
-
20
- # Test / tooling caches
21
- .pytest_cache/
22
- .mypy_cache/
23
- .ruff_cache/
24
- .coverage
25
- htmlcov/
26
-
27
- # OS / editor
28
- .DS_Store
29
- Thumbs.db
30
- .vscode/
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ build/
11
+ dist/
12
+ *.egg-info/
13
+ .eggs/
14
+
15
+ # Virtual environments
16
+ .venv/
17
+ venv/
18
+ ENV/
19
+
20
+ # Test / tooling caches
21
+ .pytest_cache/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+ .coverage
25
+ htmlcov/
26
+
27
+ # OS / editor
28
+ .DS_Store
29
+ Thumbs.db
30
+ .vscode/
@@ -1,32 +1,37 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- Format: loosely based on *Keep a Changelog*. Versioning: SemVer where practical.
6
-
7
- ## [0.2.0] - 2026-11-04
8
-
9
- ### Added
10
- - WARC 1.1 and WACZ 1.2 exports with an index, page list, SHA-256 fixity, and data-package digest.
11
- - Hash-linked chain-of-custody ledgers and Ed25519-signed manifests.
12
- - DFIR-IRIS v2 evidence-registration adapter.
13
- - Redirect-chain recording and conservative public-destination checks for web capture.
14
-
15
- ### Changed
16
- - Robots rules are checked at every redirect destination and fail closed by default.
17
-
18
- ## [0.1.0] - 2026-02-09
19
-
20
- ### Added
21
- - Noir Stack public primitives: `EvidenceArtifact`, `EvidenceBundle`, `ProvenanceRecord`, `VerificationResult`.
22
- - Domain-specific errors that describe trust boundaries and provenance constraints.
23
- - Audit-grade CLI vocabulary: `evidence`, `boundary`, `verify`.
24
- - Structured JSON outputs include: `decision_basis`, `verification_status`, `provenance_confidence`.
25
- - `robots.txt` compliance (default) and rate limiting for web acquisition.
26
-
27
- ### Changed
28
- - Public-facing surface and CLI terminology refactored to evidence/verification framing.
29
-
30
- ### Notes
31
- - This release is intentionally conservative.
32
- - The system is capable of refusing to speculate. This is a feature.
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ Format: loosely based on *Keep a Changelog*. Versioning: SemVer where practical.
6
+
7
+ ## [0.2.1] - 2026-11-04
8
+
9
+ ### Changed
10
+ - Replaced the MIT license with Noir Stack LLC's Proprietary Software License — Free Use, No Modification.
11
+
12
+ ## [0.2.0] - 2026-11-04
13
+
14
+ ### Added
15
+ - WARC 1.1 and WACZ 1.2 exports with an index, page list, SHA-256 fixity, and data-package digest.
16
+ - Hash-linked chain-of-custody ledgers and Ed25519-signed manifests.
17
+ - DFIR-IRIS v2 evidence-registration adapter.
18
+ - Redirect-chain recording and conservative public-destination checks for web capture.
19
+
20
+ ### Changed
21
+ - Robots rules are checked at every redirect destination and fail closed by default.
22
+
23
+ ## [0.1.0] - 2026-02-09
24
+
25
+ ### Added
26
+ - Noir Stack public primitives: `EvidenceArtifact`, `EvidenceBundle`, `ProvenanceRecord`, `VerificationResult`.
27
+ - Domain-specific errors that describe trust boundaries and provenance constraints.
28
+ - Audit-grade CLI vocabulary: `evidence`, `boundary`, `verify`.
29
+ - Structured JSON outputs include: `decision_basis`, `verification_status`, `provenance_confidence`.
30
+ - `robots.txt` compliance (default) and rate limiting for web acquisition.
31
+
32
+ ### Changed
33
+ - Public-facing surface and CLI terminology refactored to evidence/verification framing.
34
+
35
+ ### Notes
36
+ - This release is intentionally conservative.
37
+ - The system is capable of refusing to speculate. This is a feature.
reconkit-0.2.1/LICENSE ADDED
@@ -0,0 +1,38 @@
1
+ Proprietary Software License — Free Use, No Modification
2
+
3
+ Copyright (c) 2026 Noir Stack LLC. All rights reserved.
4
+
5
+ ## 1. Grant of License
6
+
7
+ The copyright holder grants users a non-exclusive, worldwide, royalty-free license to download, install, and use this software for personal, educational, research, and commercial purposes, subject to the conditions below.
8
+
9
+ ## 2. Restrictions
10
+
11
+ Users may not, without prior written permission from the copyright holder:
12
+
13
+ - Modify, adapt, translate, or create derivative works based on the software.
14
+ - Redistribute, publish, sell, sublicense, or repackage the software.
15
+ - Remove or alter copyright, attribution, or license notices.
16
+ - Claim ownership or authorship of the software.
17
+
18
+ ## 3. Ownership
19
+
20
+ All rights, title, and interest in the software, including its source code and associated intellectual property, remain with the copyright holder.
21
+
22
+ No ownership rights are transferred under this license.
23
+
24
+ ## 4. No Warranty
25
+
26
+ The software is provided "AS IS", without warranty of any kind, express or implied, to the extent permitted by applicable law.
27
+
28
+ ## 5. Limitation of Liability
29
+
30
+ To the extent permitted by applicable law, the copyright holder shall not be liable for damages arising from the use or inability to use the software.
31
+
32
+ ## 6. Termination
33
+
34
+ Permission to use the software terminates upon a material violation of this license, subject to applicable law.
35
+
36
+ ## 7. Additional Permissions
37
+
38
+ Any permissions not expressly granted must be obtained in writing from the copyright holder.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: reconkit
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Evidence collection, provenance, and preservation utilities for authorized investigations.
5
5
  Author: reconkit
6
- License: MIT
6
+ License: Proprietary Software License — Free Use, No Modification
7
7
  License-File: LICENSE
8
8
  Keywords: forensics,osint,scraping,triage
9
9
  Requires-Python: >=3.10
@@ -122,6 +122,15 @@ python -m build
122
122
  twine check dist/*
123
123
  ```
124
124
 
125
+ ## Releases
126
+
127
+ PyPI publication is automated by GitHub Actions. After updating the version in
128
+ `pyproject.toml` and the changelog, push the matching annotated tag (for example,
129
+ `v0.3.0`). The workflow verifies that the tag and package version match, builds
130
+ the distributions, validates them with Twine, and publishes using the repository's
131
+ `PYPI_API_TOKEN` Actions secret. Ordinary branch pushes never publish a release.
132
+
125
133
  ## License
126
134
 
127
- MIT
135
+ Copyright © 2026 Noir Stack LLC. Licensed under the
136
+ [Proprietary Software License — Free Use, No Modification](LICENSE).
@@ -93,6 +93,15 @@ python -m build
93
93
  twine check dist/*
94
94
  ```
95
95
 
96
+ ## Releases
97
+
98
+ PyPI publication is automated by GitHub Actions. After updating the version in
99
+ `pyproject.toml` and the changelog, push the matching annotated tag (for example,
100
+ `v0.3.0`). The workflow verifies that the tag and package version match, builds
101
+ the distributions, validates them with Twine, and publishes using the repository's
102
+ `PYPI_API_TOKEN` Actions secret. Ordinary branch pushes never publish a release.
103
+
96
104
  ## License
97
105
 
98
- MIT
106
+ Copyright © 2026 Noir Stack LLC. Licensed under the
107
+ [Proprietary Software License — Free Use, No Modification](LICENSE).
@@ -1,57 +1,57 @@
1
- [build-system]
2
- requires = ["hatchling>=1.25"]
3
- build-backend = "hatchling.build"
4
-
5
- [project]
6
- name = "reconkit"
7
- version = "0.2.0"
8
- description = "Evidence collection, provenance, and preservation utilities for authorized investigations."
9
- readme = "README.md"
10
- requires-python = ">=3.10"
11
- license = { text = "MIT" }
12
- authors = [{ name = "reconkit" }]
13
- keywords = ["osint", "forensics", "scraping", "triage"]
14
- dependencies = [
15
- "httpx>=0.27",
16
- "typer>=0.12",
17
- "rich>=13.7",
18
- "beautifulsoup4>=4.12",
19
- "lxml>=5.1",
20
- "dnspython>=2.6",
21
- "python-whois>=0.9",
22
- "ipwhois>=1.2",
23
- "exifread>=3.0",
24
- "filetype>=1.2",
25
- "cryptography>=42",
26
- ]
27
-
28
- [project.optional-dependencies]
29
- dev = [
30
- "build>=1.2",
31
- "twine>=5.1",
32
- "pytest>=8.0",
33
- "pytest-asyncio>=0.23",
34
- "ruff>=0.4",
35
- "mypy>=1.10",
36
- ]
37
-
38
- [project.scripts]
39
- reconkit = "reconkit.cli:app"
40
-
41
- [tool.hatch.build.targets.wheel]
42
- packages = ["src/reconkit"]
43
-
44
- [tool.pytest.ini_options]
45
- addopts = "-q"
46
- testpaths = ["tests"]
47
-
48
- [tool.ruff]
49
- line-length = 100
50
-
51
- [tool.mypy]
52
- python_version = "3.10"
53
- warn_return_any = true
54
- warn_unused_ignores = true
55
- no_implicit_optional = true
56
- strict_optional = true
57
- ignore_missing_imports = true
1
+ [build-system]
2
+ requires = ["hatchling>=1.25"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "reconkit"
7
+ version = "0.2.1"
8
+ description = "Evidence collection, provenance, and preservation utilities for authorized investigations."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "Proprietary Software License — Free Use, No Modification" }
12
+ authors = [{ name = "reconkit" }]
13
+ keywords = ["osint", "forensics", "scraping", "triage"]
14
+ dependencies = [
15
+ "httpx>=0.27",
16
+ "typer>=0.12",
17
+ "rich>=13.7",
18
+ "beautifulsoup4>=4.12",
19
+ "lxml>=5.1",
20
+ "dnspython>=2.6",
21
+ "python-whois>=0.9",
22
+ "ipwhois>=1.2",
23
+ "exifread>=3.0",
24
+ "filetype>=1.2",
25
+ "cryptography>=42",
26
+ ]
27
+
28
+ [project.optional-dependencies]
29
+ dev = [
30
+ "build>=1.2",
31
+ "twine>=5.1",
32
+ "pytest>=8.0",
33
+ "pytest-asyncio>=0.23",
34
+ "ruff>=0.4",
35
+ "mypy>=1.10",
36
+ ]
37
+
38
+ [project.scripts]
39
+ reconkit = "reconkit.cli:app"
40
+
41
+ [tool.hatch.build.targets.wheel]
42
+ packages = ["src/reconkit"]
43
+
44
+ [tool.pytest.ini_options]
45
+ addopts = "-q"
46
+ testpaths = ["tests"]
47
+
48
+ [tool.ruff]
49
+ line-length = 100
50
+
51
+ [tool.mypy]
52
+ python_version = "3.10"
53
+ warn_return_any = true
54
+ warn_unused_ignores = true
55
+ no_implicit_optional = true
56
+ strict_optional = true
57
+ ignore_missing_imports = true
@@ -1,22 +1,22 @@
1
- """reconkit.
2
-
3
- Public API: Noir Stack / Hexarch / Judicium surface lives under `reconkit.noir`.
4
- Internal modules remain available but are not the supported public interface.
5
- """
6
-
7
- __version__ = "0.2.0"
8
-
9
- from reconkit.noir.primitives import ( # noqa: E402
10
- EvidenceArtifact,
11
- EvidenceBundle,
12
- ProvenanceRecord,
13
- VerificationResult,
14
- )
15
-
16
- __all__ = [
17
- "__version__",
18
- "EvidenceArtifact",
19
- "EvidenceBundle",
20
- "ProvenanceRecord",
21
- "VerificationResult",
22
- ]
1
+ """reconkit.
2
+
3
+ Public API: Noir Stack / Hexarch / Judicium surface lives under `reconkit.noir`.
4
+ Internal modules remain available but are not the supported public interface.
5
+ """
6
+
7
+ __version__ = "0.2.1"
8
+
9
+ from reconkit.noir.primitives import ( # noqa: E402
10
+ EvidenceArtifact,
11
+ EvidenceBundle,
12
+ ProvenanceRecord,
13
+ VerificationResult,
14
+ )
15
+
16
+ __all__ = [
17
+ "__version__",
18
+ "EvidenceArtifact",
19
+ "EvidenceBundle",
20
+ "ProvenanceRecord",
21
+ "VerificationResult",
22
+ ]