Docs: fix version/count drift and label TUI vs --classic

- logo.svg version v2.0.0 -> v3.1.0; add test_logo_version.py guard so the
  static SVG label can't drift from constants.VERSION again.
- Reconcile counts across README/TOOLS/HOW-TO-USE to the app's real numbers:
  219 tools / 21 categories / 44 archived / 63 tags in use (was 215/21/59/63).
- Frame the default TUI vs the --classic REPL: mark /find, /goal, recommend,
  tags/search and background panes as --classic (Phase 2 brings them to the TUI).
This commit is contained in:
Hardik Zinzu committed 2026-10-15 19:01:16 +05:30
1 parent 266153e3fc
commit e3824c8a26
5 files changed
+36 -13

No files matched your search

+13 -7
View File
@@ -4,7 +4,7 @@
### AI-guided, all-in-one toolkit for authorized security testing
**215 curated tools across 21 categories** — recon, OSINT, web, wireless, phishing,
**219 curated tools across 21 categories** — recon, OSINT, web, wireless, phishing,
forensics, post-exploitation and more — with an **AI layer that turns plain English
into the right tool and the exact command**.
@@ -34,7 +34,7 @@ students — all working **legally, on systems they own or are authorised to tes
<br/>
![](https://img.shields.io/badge/21_Categories-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/215_Tools-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/63_Tags-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/AI--Guided-7B61FF?style=for-the-badge&labelColor=0D1117&logo=openai&logoColor=white) &nbsp;![](https://img.shields.io/badge/Linux_%7C_Kali_%7C_Parrot_%7C_macOS-7B61FF?style=for-the-badge&labelColor=0D1117&logo=linux&logoColor=white)
![](https://img.shields.io/badge/21_Categories-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/219_Tools-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/63_Tags-7B61FF?style=for-the-badge&labelColor=0D1117) &nbsp;![](https://img.shields.io/badge/AI--Guided-7B61FF?style=for-the-badge&labelColor=0D1117&logo=openai&logoColor=white) &nbsp;![](https://img.shields.io/badge/Linux_%7C_Kali_%7C_Parrot_%7C_macOS-7B61FF?style=for-the-badge&labelColor=0D1117&logo=linux&logoColor=white)
<br/>
@@ -77,7 +77,7 @@ students — all working **legally, on systems they own or are authorised to tes
plans an objective step by step, then summarizes findings and drafts an engagement
report. Bring your own key or run a local model — nothing auto-executes and nothing
is fabricated.
- **🗂 215 curated tools, one interactive console** — type to search every tool, then
- **🗂 219 curated tools, one interactive console** — type to search every tool, then
install and run across 21 categories without hunting down Git repos; a fixed tag
taxonomy (63 tags in use) makes every tool discoverable.
- **🔎 It knows what it doesn't have** — `/find` searches your catalog first, then the
@@ -98,7 +98,7 @@ students — all working **legally, on systems they own or are authorised to tes
## Tool Categories
**215 tools across 21 categories** — the full list, with links and tags, is in
**219 tools across 21 categories** — the full list, with links and tags, is in
**[docs/TOOLS.md](docs/TOOLS.md)**.
<div align="center">
@@ -119,9 +119,9 @@ students — all working **legally, on systems they own or are authorised to tes
</div>
<sub>59 further entries are archived (unmaintained or dead upstream) and hidden unless
<sub>44 further entries are archived (unmaintained or dead upstream) and hidden unless
you set `show_archived true` via `/config`. The in-app header counts 22 categories /
217 tools because it also counts the built-in Update / Uninstall menu.</sub>
219 tools because it also counts the built-in Update / Uninstall menu.</sub>
---
@@ -328,9 +328,15 @@ falls back to the classic numbered menu, where `/` or `s` searches, `t` filters
## Features
> **Where these live today.** `/find`, `/goal`, plain-English recommendations,
> `/tags`/`/search` and background panes currently run in the **`--classic`** REPL
> (`hackingtool --classic`). The default TUI browses and type-searches the whole
> catalog and runs tools; wiring these AI/search features into it is Phase 2. The
> screenshots below showing a `/` command prompt are the `--classic` REPL.
### 🔎 `/find` — a tool for a need you don't have yet
Searches the 215 curated tools first, then the GitHub search API, and ranks the
Searches the 219 curated tools first, then the GitHub search API, and ranks the
results explainably. **Suggest-only** — it never clones, installs or runs anything —
and it makes **zero model calls**.
+9 -3
View File
@@ -7,6 +7,12 @@ and something you get back — no prior knowledge of the codebase needed.
> written permission to test it. hackingtool never runs a step without asking you
> first, and never invents results.
> **TUI vs `--classic`.** The default `hackingtool` is an interactive TUI: browse
> categories, type to search every tool, `↑↓`/`Enter`/`Esc` to move, `/` for the
> command palette. The `/…`, `@…` and plain-English **grammar** taught below
> (sections 2, 4, 5, 8) is the **`--classic`** REPL — launch it with
> `hackingtool --classic`. Bringing these into the default TUI is Phase 2.
- [1. First run](#1-first-run)
- [2. Learn the grammar in 60 seconds](#2-learn-the-grammar-in-60-seconds)
- [3. Open and install a tool](#3-open-and-install-a-tool)
@@ -47,9 +53,9 @@ and something you get back — no prior knowledge of the codebase needed.
| `~/.hackingtool/history` | your `↑`/`↓` command history |
4. You land on the banner + prompt. The header line tells you what you have:
OS, IP, and `22 categories · 217 active · 59 archived` (that count includes
OS, IP, and `22 categories · 219 active · 44 archived` (that count includes
the built-in Update/Uninstall menu; the tool catalog itself is
[21 categories / 215 tools](TOOLS.md)).
[21 categories / 219 tools](TOOLS.md)).
5. Type `/help` for the command card, and `q` (or `/quit`, `Ctrl-D`) to leave.
@@ -109,7 +115,7 @@ metapackages), hackingtool reuses that binary instead of re-cloning it.
## 4. Find a tool that isn't in the catalog (`/find`)
`/find` answers "what should I use for X?" — first from the 215 curated tools,
`/find` answers "what should I use for X?" — first from the 219 curated tools,
then from the GitHub search API, ranked with a reason for each hit. It is
**suggest-only**: it never clones, installs or runs anything, and it makes **zero
model calls**.
+2 -2
View File
@@ -1,7 +1,7 @@
# Tool catalog
Every tool hackingtool can install, launch, or point you at — **215 active tools
across 21 categories**, plus 59 archived entries kept out of this list (they are
Every tool hackingtool can install, launch, or point you at — **219 active tools
across 21 categories**, plus 44 archived entries kept out of this list (they are
unmaintained or dead upstream and are hidden in the app unless you set
`show_archived true` via `/config`).
+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200" viewBox="0 0 600 200"><defs><linearGradient id="bgGrad" x1="0%" x2="100%" y1="0%" y2="100%"><stop offset="0%" style="stop-color:#0d1117;stop-opacity:1"/><stop offset="100%" style="stop-color:#161b22;stop-opacity:1"/></linearGradient><linearGradient id="accentGrad" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" style="stop-color:#7b61ff"/><stop offset="50%" style="stop-color:#ff61dc"/><stop offset="100%" style="stop-color:#7b61ff"/></linearGradient><linearGradient id="greenGrad" x1="0%" x2="0%" y1="0%" y2="100%"><stop offset="0%" style="stop-color:#0f8"/><stop offset="100%" style="stop-color:#0c6"/></linearGradient><filter id="glow"><feGaussianBlur result="blur" stdDeviation="2"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter><filter id="softGlow"><feGaussianBlur result="blur" stdDeviation="4"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><rect width="600" height="200" fill="url(#bgGrad)" rx="16"/><rect width="598" height="198" x="1" y="1" fill="none" stroke="url(#accentGrad)" stroke-width="1.5" opacity=".6" rx="15"/><circle cx="28" cy="22" r="5" fill="#FF5F56"/><circle cx="46" cy="22" r="5" fill="#FFBD2E"/><circle cx="64" cy="22" r="5" fill="#27C93F"/><text x="300" y="26" fill="#8b949e" font-family="'SF Mono','Fira Code','Cascadia Code',monospace" font-size="11" text-anchor="middle">hackingtool — v2.0.0</text><g filter="url(#glow)" transform="translate(42, 58)"><path fill="none" stroke="url(#greenGrad)" stroke-width="2.5" d="M40 0 L75 15 L75 55 Q75 85 40 100 Q5 85 5 55 L5 15 Z"/><path fill="#0F8" d="M40 6 L70 19 L70 53 Q70 80 40 93 Q10 80 10 53 L10 19 Z" opacity=".08"/><ellipse cx="40" cy="40" fill="none" stroke="#0F8" stroke-width="2" rx="18" ry="16"/><ellipse cx="33" cy="38" fill="#0F8" opacity=".9" rx="4" ry="5"/><ellipse cx="47" cy="38" fill="#0F8" opacity=".9" rx="4" ry="5"/><path fill="none" stroke="#0F8" stroke-width="1.5" d="M38 47 L40 50 L42 47"/><path fill="none" stroke="#0F8" stroke-width="1.5" d="M28 52 Q40 62 52 52"/><line x1="34" x2="34" y1="52" y2="57" stroke="#0F8" stroke-width="1.2"/><line x1="40" x2="40" y1="53" y2="58" stroke="#0F8" stroke-width="1.2"/><line x1="46" x2="46" y1="52" y2="57" stroke="#0F8" stroke-width="1.2"/><line x1="15" x2="65" y1="72" y2="88" stroke="#0F8" stroke-linecap="round" stroke-width="2"/><line x1="65" x2="15" y1="72" y2="88" stroke="#0F8" stroke-linecap="round" stroke-width="2"/><circle cx="15" cy="72" r="3" fill="#0F8" opacity=".7"/><circle cx="65" cy="72" r="3" fill="#0F8" opacity=".7"/><circle cx="15" cy="88" r="3" fill="#0F8" opacity=".7"/><circle cx="65" cy="88" r="3" fill="#0F8" opacity=".7"/></g><text x="160" y="105" fill="url(#accentGrad)" filter="url(#softGlow)" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="52" font-weight="bold" letter-spacing="3">HACKING</text><text x="160" y="148" fill="#0F8" filter="url(#glow)" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="40" font-weight="bold" letter-spacing="8">TOOL</text><text x="160" y="178" fill="#8b949e" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="12" letter-spacing="1">All-in-One Security Research Framework</text><rect width="12" height="20" x="530" y="135" fill="#0F8" opacity=".8"><animate attributeName="opacity" dur="1.2s" repeatCount="indefinite" values="0.8;0;0.8"/></rect><path fill="none" stroke="#7B61FF" stroke-width="1" d="M16 40 L16 16 L40 16" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M584 40 L584 16 L560 16" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M16 160 L16 184 L40 184" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M584 160 L584 184 L560 184" opacity=".3"/><text x="540" y="60" fill="#0F8" font-family="monospace" font-size="10" opacity=".15">01101</text><text x="545" y="75" fill="#0F8" font-family="monospace" font-size="10" opacity=".12">10010</text><text x="548" y="90" fill="#0F8" font-family="monospace" font-size="10" opacity=".09">11001</text><text x="542" y="105" fill="#0F8" font-family="monospace" font-size="10" opacity=".06">01110</text></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200" viewBox="0 0 600 200"><defs><linearGradient id="bgGrad" x1="0%" x2="100%" y1="0%" y2="100%"><stop offset="0%" style="stop-color:#0d1117;stop-opacity:1"/><stop offset="100%" style="stop-color:#161b22;stop-opacity:1"/></linearGradient><linearGradient id="accentGrad" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" style="stop-color:#7b61ff"/><stop offset="50%" style="stop-color:#ff61dc"/><stop offset="100%" style="stop-color:#7b61ff"/></linearGradient><linearGradient id="greenGrad" x1="0%" x2="0%" y1="0%" y2="100%"><stop offset="0%" style="stop-color:#0f8"/><stop offset="100%" style="stop-color:#0c6"/></linearGradient><filter id="glow"><feGaussianBlur result="blur" stdDeviation="2"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter><filter id="softGlow"><feGaussianBlur result="blur" stdDeviation="4"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><rect width="600" height="200" fill="url(#bgGrad)" rx="16"/><rect width="598" height="198" x="1" y="1" fill="none" stroke="url(#accentGrad)" stroke-width="1.5" opacity=".6" rx="15"/><circle cx="28" cy="22" r="5" fill="#FF5F56"/><circle cx="46" cy="22" r="5" fill="#FFBD2E"/><circle cx="64" cy="22" r="5" fill="#27C93F"/><text x="300" y="26" fill="#8b949e" font-family="'SF Mono','Fira Code','Cascadia Code',monospace" font-size="11" text-anchor="middle">hackingtool — v3.1.0</text><g filter="url(#glow)" transform="translate(42, 58)"><path fill="none" stroke="url(#greenGrad)" stroke-width="2.5" d="M40 0 L75 15 L75 55 Q75 85 40 100 Q5 85 5 55 L5 15 Z"/><path fill="#0F8" d="M40 6 L70 19 L70 53 Q70 80 40 93 Q10 80 10 53 L10 19 Z" opacity=".08"/><ellipse cx="40" cy="40" fill="none" stroke="#0F8" stroke-width="2" rx="18" ry="16"/><ellipse cx="33" cy="38" fill="#0F8" opacity=".9" rx="4" ry="5"/><ellipse cx="47" cy="38" fill="#0F8" opacity=".9" rx="4" ry="5"/><path fill="none" stroke="#0F8" stroke-width="1.5" d="M38 47 L40 50 L42 47"/><path fill="none" stroke="#0F8" stroke-width="1.5" d="M28 52 Q40 62 52 52"/><line x1="34" x2="34" y1="52" y2="57" stroke="#0F8" stroke-width="1.2"/><line x1="40" x2="40" y1="53" y2="58" stroke="#0F8" stroke-width="1.2"/><line x1="46" x2="46" y1="52" y2="57" stroke="#0F8" stroke-width="1.2"/><line x1="15" x2="65" y1="72" y2="88" stroke="#0F8" stroke-linecap="round" stroke-width="2"/><line x1="65" x2="15" y1="72" y2="88" stroke="#0F8" stroke-linecap="round" stroke-width="2"/><circle cx="15" cy="72" r="3" fill="#0F8" opacity=".7"/><circle cx="65" cy="72" r="3" fill="#0F8" opacity=".7"/><circle cx="15" cy="88" r="3" fill="#0F8" opacity=".7"/><circle cx="65" cy="88" r="3" fill="#0F8" opacity=".7"/></g><text x="160" y="105" fill="url(#accentGrad)" filter="url(#softGlow)" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="52" font-weight="bold" letter-spacing="3">HACKING</text><text x="160" y="148" fill="#0F8" filter="url(#glow)" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="40" font-weight="bold" letter-spacing="8">TOOL</text><text x="160" y="178" fill="#8b949e" font-family="'SF Mono','Fira Code','Cascadia Code','Courier New',monospace" font-size="12" letter-spacing="1">All-in-One Security Research Framework</text><rect width="12" height="20" x="530" y="135" fill="#0F8" opacity=".8"><animate attributeName="opacity" dur="1.2s" repeatCount="indefinite" values="0.8;0;0.8"/></rect><path fill="none" stroke="#7B61FF" stroke-width="1" d="M16 40 L16 16 L40 16" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M584 40 L584 16 L560 16" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M16 160 L16 184 L40 184" opacity=".3"/><path fill="none" stroke="#7B61FF" stroke-width="1" d="M584 160 L584 184 L560 184" opacity=".3"/><text x="540" y="60" fill="#0F8" font-family="monospace" font-size="10" opacity=".15">01101</text><text x="545" y="75" fill="#0F8" font-family="monospace" font-size="10" opacity=".12">10010</text><text x="548" y="90" fill="#0F8" font-family="monospace" font-size="10" opacity=".09">11001</text><text x="542" y="105" fill="#0F8" font-family="monospace" font-size="10" opacity=".06">01110</text></svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

+11
View File
@@ -0,0 +1,11 @@
"""Guard: the static logo.svg version label must match constants.VERSION (single source)."""
from pathlib import Path
from hackingtool.constants import VERSION
_LOGO = Path(__file__).resolve().parents[1] / "images" / "logo.svg"
def test_logo_svg_version_matches_constants():
assert f"hackingtool — v{VERSION}" in _LOGO.read_text(encoding="utf-8"), (
f"images/logo.svg version label is stale; bump it to v{VERSION}")