nulltap 0.1.0__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.
- nulltap-0.1.0/LICENSE +21 -0
- nulltap-0.1.0/PKG-INFO +98 -0
- nulltap-0.1.0/README.md +76 -0
- nulltap-0.1.0/pyproject.toml +34 -0
- nulltap-0.1.0/setup.cfg +4 -0
- nulltap-0.1.0/src/nulltap/__init__.py +3 -0
- nulltap-0.1.0/src/nulltap/__main__.py +5 -0
- nulltap-0.1.0/src/nulltap/cli.py +784 -0
- nulltap-0.1.0/src/nulltap.egg-info/PKG-INFO +98 -0
- nulltap-0.1.0/src/nulltap.egg-info/SOURCES.txt +12 -0
- nulltap-0.1.0/src/nulltap.egg-info/dependency_links.txt +1 -0
- nulltap-0.1.0/src/nulltap.egg-info/entry_points.txt +2 -0
- nulltap-0.1.0/src/nulltap.egg-info/top_level.txt +1 -0
- nulltap-0.1.0/tests/test_cli.py +256 -0
nulltap-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Justin Howe
|
|
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.
|
nulltap-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nulltap
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Read the nulltap.sh cybersecurity feed from a terminal.
|
|
5
|
+
Author: Justin Howe
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://nulltap.sh
|
|
8
|
+
Project-URL: Repository, https://github.com/JustinHowe/nulltap
|
|
9
|
+
Keywords: cybersecurity,news,cli,nulltap
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Security
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
Dynamic: license-file
|
|
22
|
+
|
|
23
|
+
# nulltap
|
|
24
|
+
|
|
25
|
+
Nulltap in your terminal. This client reads the public [nulltap.sh](https://nulltap.sh) JSON feed and prints cybersecurity and AI coverage without requiring an account.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
Python 3.10 or newer is required. After the first PyPI release, install it with [pipx](https://pipx.pypa.io/):
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
pipx install nulltap
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Until then, install the current version from GitHub with `pipx install git+https://github.com/JustinHowe/nulltap.git`.
|
|
36
|
+
|
|
37
|
+
Run `nulltap --help` after installation.
|
|
38
|
+
|
|
39
|
+
## Commands
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
nulltap # paginated recent articles; type a number to read
|
|
43
|
+
nulltap browse # explicit form of the default command
|
|
44
|
+
nulltap latest -n 20 # browse the newest 20 articles
|
|
45
|
+
nulltap latest --topic identity
|
|
46
|
+
nulltap topics # choose a topic, then choose an article
|
|
47
|
+
nulltap topic ai # paginated articles tagged AI
|
|
48
|
+
nulltap topic # choose a topic interactively
|
|
49
|
+
nulltap search # enter search words interactively
|
|
50
|
+
nulltap search "token theft"
|
|
51
|
+
nulltap search gateway --topic appsec
|
|
52
|
+
nulltap read 1 # directly read the newest article
|
|
53
|
+
nulltap read # browse first when no number is supplied
|
|
54
|
+
nulltap --plain # print once; no prompts or pager
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Interactive lists show five articles per page so a page fits a normal terminal window. Enter the displayed number to read an article, `n` for the next page, `p` for the previous page, or `q` to leave. Use `--page-size N` to change the page size.
|
|
58
|
+
|
|
59
|
+
Articles open in the terminal pager. Headings, lists, quotations, code blocks, images, inline links, and primary sources are formatted for terminal reading. Press `q` to leave the pager and return to the article list. No browser is required.
|
|
60
|
+
|
|
61
|
+
When output is redirected, nulltap automatically disables menus and the pager. `--plain` does the same thing explicitly. Article IDs, slugs, and URLs remain accepted as direct targets for scripts, but ordinary readers should not need them.
|
|
62
|
+
|
|
63
|
+
## Search
|
|
64
|
+
|
|
65
|
+
Search belongs in the CLI because it is useful when the browser is not. It runs locally over article titles, summaries, and topic tags. Search terms are never sent to nulltap or another service.
|
|
66
|
+
|
|
67
|
+
Every word in the query must match. Title matches rank above tag and summary matches, with publication date breaking ties.
|
|
68
|
+
|
|
69
|
+
## Scripts
|
|
70
|
+
|
|
71
|
+
Add `--json` to `browse`, `latest`, `topics`, `topic`, `search`, `read`, or `show`:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
nulltap search ransomware --json
|
|
75
|
+
nulltap topics --json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Use a different compatible feed during development:
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
nulltap --feed http://127.0.0.1:4321/feed.json
|
|
82
|
+
# or
|
|
83
|
+
NULLTAP_FEED_URL=http://127.0.0.1:4321/feed.json nulltap
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Listing and search commands make one read-only feed request. Reading an article makes a second request for that article's text. The client has no analytics, login, local database, or background process. Feed and article text are stripped of terminal control sequences before display.
|
|
87
|
+
|
|
88
|
+
## Development
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
python -m venv .venv
|
|
92
|
+
# Windows: .venv\Scripts\activate
|
|
93
|
+
# macOS/Linux: source .venv/bin/activate
|
|
94
|
+
python -m pip install -e .
|
|
95
|
+
python -m unittest discover -s tests -v
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Licensed under the MIT License.
|
nulltap-0.1.0/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# nulltap
|
|
2
|
+
|
|
3
|
+
Nulltap in your terminal. This client reads the public [nulltap.sh](https://nulltap.sh) JSON feed and prints cybersecurity and AI coverage without requiring an account.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Python 3.10 or newer is required. After the first PyPI release, install it with [pipx](https://pipx.pypa.io/):
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
pipx install nulltap
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Until then, install the current version from GitHub with `pipx install git+https://github.com/JustinHowe/nulltap.git`.
|
|
14
|
+
|
|
15
|
+
Run `nulltap --help` after installation.
|
|
16
|
+
|
|
17
|
+
## Commands
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
nulltap # paginated recent articles; type a number to read
|
|
21
|
+
nulltap browse # explicit form of the default command
|
|
22
|
+
nulltap latest -n 20 # browse the newest 20 articles
|
|
23
|
+
nulltap latest --topic identity
|
|
24
|
+
nulltap topics # choose a topic, then choose an article
|
|
25
|
+
nulltap topic ai # paginated articles tagged AI
|
|
26
|
+
nulltap topic # choose a topic interactively
|
|
27
|
+
nulltap search # enter search words interactively
|
|
28
|
+
nulltap search "token theft"
|
|
29
|
+
nulltap search gateway --topic appsec
|
|
30
|
+
nulltap read 1 # directly read the newest article
|
|
31
|
+
nulltap read # browse first when no number is supplied
|
|
32
|
+
nulltap --plain # print once; no prompts or pager
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Interactive lists show five articles per page so a page fits a normal terminal window. Enter the displayed number to read an article, `n` for the next page, `p` for the previous page, or `q` to leave. Use `--page-size N` to change the page size.
|
|
36
|
+
|
|
37
|
+
Articles open in the terminal pager. Headings, lists, quotations, code blocks, images, inline links, and primary sources are formatted for terminal reading. Press `q` to leave the pager and return to the article list. No browser is required.
|
|
38
|
+
|
|
39
|
+
When output is redirected, nulltap automatically disables menus and the pager. `--plain` does the same thing explicitly. Article IDs, slugs, and URLs remain accepted as direct targets for scripts, but ordinary readers should not need them.
|
|
40
|
+
|
|
41
|
+
## Search
|
|
42
|
+
|
|
43
|
+
Search belongs in the CLI because it is useful when the browser is not. It runs locally over article titles, summaries, and topic tags. Search terms are never sent to nulltap or another service.
|
|
44
|
+
|
|
45
|
+
Every word in the query must match. Title matches rank above tag and summary matches, with publication date breaking ties.
|
|
46
|
+
|
|
47
|
+
## Scripts
|
|
48
|
+
|
|
49
|
+
Add `--json` to `browse`, `latest`, `topics`, `topic`, `search`, `read`, or `show`:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
nulltap search ransomware --json
|
|
53
|
+
nulltap topics --json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Use a different compatible feed during development:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
nulltap --feed http://127.0.0.1:4321/feed.json
|
|
60
|
+
# or
|
|
61
|
+
NULLTAP_FEED_URL=http://127.0.0.1:4321/feed.json nulltap
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Listing and search commands make one read-only feed request. Reading an article makes a second request for that article's text. The client has no analytics, login, local database, or background process. Feed and article text are stripped of terminal control sequences before display.
|
|
65
|
+
|
|
66
|
+
## Development
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
python -m venv .venv
|
|
70
|
+
# Windows: .venv\Scripts\activate
|
|
71
|
+
# macOS/Linux: source .venv/bin/activate
|
|
72
|
+
python -m pip install -e .
|
|
73
|
+
python -m unittest discover -s tests -v
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Licensed under the MIT License.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "nulltap"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Read the nulltap.sh cybersecurity feed from a terminal."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
authors = [{ name = "Justin Howe" }]
|
|
13
|
+
keywords = ["cybersecurity", "news", "cli", "nulltap"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Environment :: Console",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.10",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Topic :: Security"
|
|
23
|
+
]
|
|
24
|
+
dependencies = []
|
|
25
|
+
|
|
26
|
+
[project.scripts]
|
|
27
|
+
nulltap = "nulltap.cli:main"
|
|
28
|
+
|
|
29
|
+
[project.urls]
|
|
30
|
+
Homepage = "https://nulltap.sh"
|
|
31
|
+
Repository = "https://github.com/JustinHowe/nulltap"
|
|
32
|
+
|
|
33
|
+
[tool.setuptools.packages.find]
|
|
34
|
+
where = ["src"]
|
nulltap-0.1.0/setup.cfg
ADDED