otinstaller 0.0.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 (91) hide show
  1. otinstaller-0.0.1/.gitattributes +1 -0
  2. otinstaller-0.0.1/.github/workflows/ci.yml +71 -0
  3. otinstaller-0.0.1/.gitignore +35 -0
  4. otinstaller-0.0.1/AGENTS.md +70 -0
  5. otinstaller-0.0.1/CHANGELOG.md +52 -0
  6. otinstaller-0.0.1/LICENSE +21 -0
  7. otinstaller-0.0.1/PKG-INFO +193 -0
  8. otinstaller-0.0.1/README.md +164 -0
  9. otinstaller-0.0.1/cleanup.sh +3 -0
  10. otinstaller-0.0.1/docs/DECISIONS.md +12 -0
  11. otinstaller-0.0.1/docs/LAYOUT.md +74 -0
  12. otinstaller-0.0.1/docs/REGISTRY.md +160 -0
  13. otinstaller-0.0.1/docs/RESULTS.md +101 -0
  14. otinstaller-0.0.1/docs/TAGGING.md +279 -0
  15. otinstaller-0.0.1/docs/status.html +324 -0
  16. otinstaller-0.0.1/llms.txt +165 -0
  17. otinstaller-0.0.1/pipeline/README.md +81 -0
  18. otinstaller-0.0.1/pipeline/__init__.py +1 -0
  19. otinstaller-0.0.1/pipeline/candidates.yaml +1164 -0
  20. otinstaller-0.0.1/pipeline/discover.py +371 -0
  21. otinstaller-0.0.1/pipeline/verify.py +671 -0
  22. otinstaller-0.0.1/playbooks/domain-recon.yaml +7 -0
  23. otinstaller-0.0.1/playbooks/username-investigation.yaml +7 -0
  24. otinstaller-0.0.1/pyproject.toml +60 -0
  25. otinstaller-0.0.1/registry/denylist.yaml +11 -0
  26. otinstaller-0.0.1/registry/generated_registry_tagged.yaml +1452 -0
  27. otinstaller-0.0.1/registry/registry.yaml +1 -0
  28. otinstaller-0.0.1/scripts/generate_status_page.py +121 -0
  29. otinstaller-0.0.1/src/otinstaller/__init__.py +1 -0
  30. otinstaller-0.0.1/src/otinstaller/__main__.py +4 -0
  31. otinstaller-0.0.1/src/otinstaller/cli.py +2554 -0
  32. otinstaller-0.0.1/src/otinstaller/config.py +96 -0
  33. otinstaller-0.0.1/src/otinstaller/data/examples/aliens-eye.txt +40 -0
  34. otinstaller-0.0.1/src/otinstaller/data/examples/auto-archiver.txt +3 -0
  35. otinstaller-0.0.1/src/otinstaller/data/examples/blackbird.txt +3 -0
  36. otinstaller-0.0.1/src/otinstaller/data/examples/dnstwist.txt +20 -0
  37. otinstaller-0.0.1/src/otinstaller/data/examples/edgar-tool.txt +4 -0
  38. otinstaller-0.0.1/src/otinstaller/data/examples/ghunt.txt +64 -0
  39. otinstaller-0.0.1/src/otinstaller/data/examples/h8mail.txt +20 -0
  40. otinstaller-0.0.1/src/otinstaller/data/examples/holehe.txt +52 -0
  41. otinstaller-0.0.1/src/otinstaller/data/examples/instagram-location-search.txt +3 -0
  42. otinstaller-0.0.1/src/otinstaller/data/examples/maigret.txt +74 -0
  43. otinstaller-0.0.1/src/otinstaller/data/examples/neutrosint.txt +17 -0
  44. otinstaller-0.0.1/src/otinstaller/data/examples/sherlock.txt +60 -0
  45. otinstaller-0.0.1/src/otinstaller/data/examples/spiderfoot.txt +63 -0
  46. otinstaller-0.0.1/src/otinstaller/data/examples/telegram-phone-number-checker.txt +4 -0
  47. otinstaller-0.0.1/src/otinstaller/data/examples/telepathy.txt +4 -0
  48. otinstaller-0.0.1/src/otinstaller/data/examples/thebigbrother.txt +17 -0
  49. otinstaller-0.0.1/src/otinstaller/data/examples/theharvester.txt +62 -0
  50. otinstaller-0.0.1/src/otinstaller/data/examples/torbot.txt +13 -0
  51. otinstaller-0.0.1/src/otinstaller/data/examples/user-scanner.txt +113 -0
  52. otinstaller-0.0.1/src/otinstaller/data/examples/zen.txt +11 -0
  53. otinstaller-0.0.1/src/otinstaller/data/registry.yaml +1806 -0
  54. otinstaller-0.0.1/src/otinstaller/denylist.py +80 -0
  55. otinstaller-0.0.1/src/otinstaller/detect.py +83 -0
  56. otinstaller-0.0.1/src/otinstaller/diff.py +76 -0
  57. otinstaller-0.0.1/src/otinstaller/examples.py +1 -0
  58. otinstaller-0.0.1/src/otinstaller/extract.py +122 -0
  59. otinstaller-0.0.1/src/otinstaller/installer/__init__.py +17 -0
  60. otinstaller-0.0.1/src/otinstaller/installer/core.py +243 -0
  61. otinstaller-0.0.1/src/otinstaller/installer/git_install.py +100 -0
  62. otinstaller-0.0.1/src/otinstaller/installer/pip_install.py +47 -0
  63. otinstaller-0.0.1/src/otinstaller/installer/process.py +127 -0
  64. otinstaller-0.0.1/src/otinstaller/installer/venv.py +27 -0
  65. otinstaller-0.0.1/src/otinstaller/keys.py +58 -0
  66. otinstaller-0.0.1/src/otinstaller/notice.py +54 -0
  67. otinstaller-0.0.1/src/otinstaller/registry.py +473 -0
  68. otinstaller-0.0.1/src/otinstaller/results.py +98 -0
  69. otinstaller-0.0.1/src/otinstaller/runner.py +275 -0
  70. otinstaller-0.0.1/src/otinstaller/state.py +263 -0
  71. otinstaller-0.0.1/src/otinstaller/updater.py +1 -0
  72. otinstaller-0.0.1/tests/conftest.py +8 -0
  73. otinstaller-0.0.1/tests/test_cli.py +3269 -0
  74. otinstaller-0.0.1/tests/test_config.py +186 -0
  75. otinstaller-0.0.1/tests/test_denylist.py +121 -0
  76. otinstaller-0.0.1/tests/test_detect.py +60 -0
  77. otinstaller-0.0.1/tests/test_diff.py +121 -0
  78. otinstaller-0.0.1/tests/test_discover.py +323 -0
  79. otinstaller-0.0.1/tests/test_extract.py +96 -0
  80. otinstaller-0.0.1/tests/test_init.py +59 -0
  81. otinstaller-0.0.1/tests/test_installer_core.py +389 -0
  82. otinstaller-0.0.1/tests/test_keys.py +127 -0
  83. otinstaller-0.0.1/tests/test_network.py +195 -0
  84. otinstaller-0.0.1/tests/test_notice.py +39 -0
  85. otinstaller-0.0.1/tests/test_process.py +61 -0
  86. otinstaller-0.0.1/tests/test_registry.py +574 -0
  87. otinstaller-0.0.1/tests/test_runner.py +630 -0
  88. otinstaller-0.0.1/tests/test_safe_rmtree.py +53 -0
  89. otinstaller-0.0.1/tests/test_state.py +1298 -0
  90. otinstaller-0.0.1/tests/test_venv.py +31 -0
  91. otinstaller-0.0.1/tests/test_verify.py +561 -0
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,71 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ${{ matrix.os }}
10
+ strategy:
11
+ matrix:
12
+ os: [ubuntu-22.04, ubuntu-24.04]
13
+ python-version: ["3.10", "3.11", "3.12"]
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - name: Set up Python ${{ matrix.python-version }}
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: ${{ matrix.python-version }}
20
+ - name: Install dependencies
21
+ run: pip install -e ".[dev,pipeline]"
22
+ - name: Ruff check
23
+ run: ruff check .
24
+ - name: Ruff format check
25
+ run: ruff format --check .
26
+ - name: Run tests
27
+ run: pytest
28
+
29
+ test-debian:
30
+ # Debian 12 (bookworm) - Kali is Debian-based and covered by this
31
+ runs-on: ubuntu-24.04
32
+ container: debian:12
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ - name: Install system dependencies
36
+ run: |
37
+ apt-get update && apt-get install -y python3 python3-venv python3-pip git
38
+ - name: Create virtualenv
39
+ run: python3 -m venv .venv
40
+ - name: Install project
41
+ run: .venv/bin/pip install -e ".[dev,pipeline]"
42
+ - name: Ruff check
43
+ run: .venv/bin/ruff check .
44
+ - name: Ruff format check
45
+ run: .venv/bin/ruff format --check .
46
+ - name: Run tests
47
+ run: .venv/bin/pytest
48
+ env:
49
+ RUN_NETWORK_TESTS: "0"
50
+
51
+ test-arch:
52
+ # Arch Linux
53
+ runs-on: ubuntu-24.04
54
+ container: archlinux:latest
55
+ steps:
56
+ - uses: actions/checkout@v4
57
+ - name: Install system dependencies
58
+ run: |
59
+ pacman -Sy --noconfirm python python-pip git
60
+ - name: Create virtualenv
61
+ run: python -m venv .venv
62
+ - name: Install project
63
+ run: .venv/bin/pip install -e ".[dev,pipeline]"
64
+ - name: Ruff check
65
+ run: .venv/bin/ruff check .
66
+ - name: Ruff format check
67
+ run: .venv/bin/ruff format --check .
68
+ - name: Run tests
69
+ run: .venv/bin/pytest
70
+ env:
71
+ RUN_NETWORK_TESTS: "0"
@@ -0,0 +1,35 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ .mypy_cache/
9
+ .coverage
10
+ htmlcov/
11
+
12
+ # Virtual environment
13
+ .venv/
14
+ .venv-wsl/
15
+
16
+ # Results
17
+ results/
18
+
19
+ # Environment
20
+ .env
21
+
22
+ # Build
23
+ dist/
24
+ build/
25
+ *.egg-info/
26
+
27
+ # Pipeline verification outputs
28
+ pipeline/verification_log.jsonl
29
+ registry/generated_registry.yaml
30
+
31
+ # IDE
32
+ .vscode/
33
+ .idea/
34
+ *.swp
35
+ *.swocommit_msg.txt
@@ -0,0 +1,70 @@
1
+ # otinstaller: project rules
2
+
3
+ ## What this is
4
+ otinstaller is a Python CLI, distributed on PyPI, that installs, runs, updates and
5
+ removes open-source command line tools by name, using one standard command interface.
6
+ It is a neutral tool manager, similar in spirit to pdtm, pipx or Kali's tool packages.
7
+ Tool descriptions, docs and messages stay neutral.
8
+
9
+ ## Fixed decisions (do not change without asking)
10
+ - Package and command name: otinstaller.
11
+ - The word "OSINT" must not appear in the package name, command name or CLI help text.
12
+ It may appear in the README and the PyPI description only.
13
+ - Python 3.10+. Linux only. Tested on Ubuntu 22.04 and 24.04 with Python 3.10, 3.11, 3.12.
14
+ - Managed tools are installed with pip or git only. No Go, Rust, Node or Docker.
15
+ - Every managed tool gets its own virtualenv. Never install tools into system Python.
16
+ - Run command shape: `otinstaller run <tool> -- <args>`. Arguments pass straight through.
17
+ - Results are saved automatically to ./results/<tool>/<target>/ using the filename
18
+ pattern <YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext> plus a .meta.json sidecar.
19
+ The results directory can be overridden with --output or OTINSTALLER_RESULTS_DIR.
20
+ - One env file holds all API keys: ~/.otinstaller/.env, permissions 600. Each tool only
21
+ receives the keys it declares in its registry entry.
22
+ - Home directory is ~/.otinstaller/ (override with OTINSTALLER_HOME).
23
+ - The registry is generated by a pipeline. A tool is listed only if it passes an
24
+ automated install test and a smoke test (--help or --version exits cleanly).
25
+ - Resume: job state lives in SQLite. Finished jobs are skipped on resume and partial
26
+ output is always kept.
27
+ - No telemetry. Network access only to GitHub, PyPI and the registry host.
28
+
29
+ ## Inclusion policy
30
+ - A tool is listed if it passes install and smoke tests and is not in the denylist.
31
+ - The denylist excludes attack or harassment tooling by capability (phishing kits, IP
32
+ grabbers, message or call bombers, credential brute-forcers, private-account bypass,
33
+ dox-dump hosting) and non-OSINT active scanners. It lives in registry/denylist.yaml
34
+ and can be edited without code changes.
35
+ - Registry entries carry a `capabilities` list. Tools tagged `dual-use` require the
36
+ responsible-use notice to be accepted before install.
37
+ - The generated list gets a human review before each release.
38
+
39
+ ## Code rules
40
+ - Stack: Typer and Rich for the CLI, PyYAML, and the standard library (sqlite3,
41
+ subprocess, asyncio, pathlib). Keep dependencies minimal. Ask before adding any.
42
+ - Layout: src/otinstaller/, tests/, docs/, registry/, pipeline/.
43
+ - The CLI layer stays thin. Real logic lives in importable modules so a TUI could
44
+ reuse it later.
45
+ - Type hints on all function signatures. Lint and format with ruff. Test with pytest.
46
+ - Write the test first, then the code. Every feature needs tests, including failure cases.
47
+ - Never use shell=True. Pass argument lists to subprocess. Validate tool names and
48
+ targets: no path traversal, no shell metacharacters in filenames.
49
+ - Never log or write API key values anywhere (logs, meta.json, error messages).
50
+ - Metadata is neutral: author "otinstaller contributors". No personal names, emails or
51
+ local paths anywhere in the repo.
52
+
53
+ ## Style rules (the code should read like an experienced developer wrote it)
54
+ - Comments explain why, not what. Skip comments on obvious code. Most functions need
55
+ no docstring; add a one-line docstring only where the purpose is not clear from
56
+ the name.
57
+ - No emojis anywhere: code, comments, README, commit messages, CLI output.
58
+ - No decorative banners, ASCII art, section divider comments, or "generated by" notes.
59
+ - Do not mention AI, assistants or prompts in any file.
60
+ - Keep functions short and names plain. Prefer simple code over clever code.
61
+ - README and docs are written in plain, direct English. No marketing filler, no
62
+ bullet-point overload, no exclamation marks.
63
+ - Commit messages are short and lowercase, imperative mood, for example
64
+ "add config module" or "fix path handling in results".
65
+
66
+ ## Workflow
67
+ - After every task run: ruff check ., ruff format --check ., pytest. Report the real output.
68
+ - If a check fails, fix it. If it still fails after 3 attempts, stop and report the
69
+ problem instead of continuing to change things.
70
+ - Make small commits after each working step. Never leave the repo broken.
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - Typed input prefixes: u: (username), e: (email), p: (phone), d: (domain), url: (URL), q: (query), geo: (coordinates), g: (Telegram channel)
12
+ - --all mode for
13
+ un command: run every installed tool supporting the given input types (-a short form)
14
+ - --include-credentialed flag for --all mode to include tools requiring API credentials
15
+ - check-updates command: read-only check for available updates
16
+ - --tools option for update and check-updates commands (comma-separated tool names)
17
+ - --json output support for all commands
18
+ - --yes / -y flag to skip confirmation prompts on all commands
19
+ - Stable exit codes: 0=success, 1=error, 2=invalid input, 130=interrupted
20
+ - Non-interactive mode detection (CI-friendly)
21
+ - ot command alias alongside otinstaller
22
+ - otinstaller <toolname> bare command shows tool info (same as info)
23
+ - New tools: Blackbird, Telegram Phone Number Checker, Auto Archiver, edgar-tool, instagram-location-search, Telepathy
24
+ -
25
+ eeds_config field in registry for tools requiring configuration
26
+ -
27
+ equires_credentials concept for tools with mandatory API keys
28
+
29
+ ### Changed
30
+ - All commands now support --json output
31
+ - All commands respect --yes / -y and non-interactive stdin
32
+ - update command refactored to use shared check logic
33
+ - Registry schema extended with input_types,
34
+ eeds_config
35
+
36
+ ### Fixed
37
+ - Tool name collision handling (bare tool name vs subcommand)
38
+ - Input type validation for --all mode
39
+
40
+ ## [0.0.1] - 2026-09-29
41
+
42
+ ### Added
43
+ - Initial release
44
+ - Basic tool management: install, remove, run, update, list, search, info
45
+ - Parallel tool execution with configurable concurrency
46
+ - Result storage with metadata and SHA256
47
+ - API key management via ~/.otinstaller/.env
48
+ - Responsible use notice on first run
49
+ - Auto-detect target type with uto command
50
+ - Example output viewer
51
+ - Resume interrupted jobs
52
+ - Doctor diagnostics
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 otinstaller 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.
@@ -0,0 +1,193 @@
1
+ Metadata-Version: 2.5
2
+ Name: otinstaller
3
+ Version: 0.0.1
4
+ Summary: Install, run and update command line tools by name
5
+ Author: otinstaller contributors
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: cli,installer,package-manager,tools
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: POSIX :: Linux
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: click>=8.0.0
19
+ Requires-Dist: pyyaml
20
+ Requires-Dist: rich>=13.8.0
21
+ Requires-Dist: typer==0.27.2
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest; extra == 'dev'
24
+ Requires-Dist: pytest-asyncio; extra == 'dev'
25
+ Requires-Dist: ruff; extra == 'dev'
26
+ Provides-Extra: pipeline
27
+ Requires-Dist: requests; extra == 'pipeline'
28
+ Description-Content-Type: text/markdown
29
+
30
+ # OTinstaller
31
+
32
+ Install, run, update, and remove open-source command line tools by name.
33
+
34
+ You pick a tool from a list. OTinstaller downloads it into its own folder, runs it, and saves the output. You do not learn a different install method for each tool.
35
+
36
+ Status: early development. Not published to PyPI yet.
37
+
38
+ ## What you need
39
+
40
+ A Linux machine. Tested on Ubuntu 22.04 and 24.04, Debian 12, and Arch Linux. Kali Linux is checked by hand before a release.
41
+
42
+ Python 3.10 or newer, git, and the `venv` module. On Debian, Ubuntu and Kali, install that module with:
43
+
44
+ ```bash
45
+ sudo apt install python3-venv git
46
+ ```
47
+
48
+ Note: Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. If you encounter install failures on newer Python versions, try running otinstaller in a Python 3.12 virtualenv.
49
+
50
+ ## Install otinstaller
51
+
52
+ These commands install otinstaller itself. Run them in this repository's folder. A virtualenv is a private Python folder, so this install does not change the Python that came with the system.
53
+
54
+ ```bash
55
+ python3 -m venv .venv
56
+ source .venv/bin/activate
57
+ pip install -e .
58
+ ```
59
+
60
+ `otinstaller` should now be on your path. A new terminal does not keep that. Run `source .venv/bin/activate` again from this folder if the next command says `otinstaller: command not found`.
61
+
62
+ For system-wide installation, use `pipx install otinstaller` (or `pipx install .` from this directory). This provides the `otinstaller` and `ot` commands on your PATH without a virtualenv.
63
+
64
+ Check the machine with:
65
+
66
+ ```bash
67
+ otinstaller doctor
68
+ ```
69
+
70
+ `doctor` prints `[ok]` or `[problem]` for Linux, Python, git, and venv. Fix any `[problem]` line before you continue. It often tells you the package to install.
71
+
72
+ ## Run your first tool
73
+
74
+ `init` creates `~/.otinstaller/` and shows a responsible-use notice. It asks `Do you accept? [y/N]`. Type `y` and press Enter. Nothing can be installed until you do.
75
+
76
+ ```bash
77
+ otinstaller init
78
+ ```
79
+
80
+ Sherlock searches for a username. This install asks `Install? [y/N]`. The capital N means Enter alone means no. Type `y` to continue.
81
+
82
+ ```bash
83
+ otinstaller install sherlock
84
+ otinstaller run sherlock -- someexampleuser123
85
+ ```
86
+
87
+ The `--` marks where otinstaller's own options end. Everything after it is passed to Sherlock. When the run finishes, otinstaller prints a path under `results/` in the folder where you ran the command. That file is the tool's output.
88
+
89
+ To try a different tool, use its name from the guide in place of `sherlock`.
90
+
91
+ ## Typed inputs
92
+
93
+ Instead of remembering each tool's flags, you can use typed input prefixes:
94
+
95
+ - `u:` username (e.g., `u:johndoe`)
96
+ - `e:` email (e.g., `e:john@example.com`)
97
+ - `p:` phone (e.g., `p:+15551234567`)
98
+ - `d:` domain (e.g., `d:example.com`)
99
+ - `url:` URL (e.g., `url:https://example.com`)
100
+ - `q:` text query (e.g., `q:search terms`)
101
+ - `geo:` coordinates (e.g., `geo:32.22,-110.97`)
102
+ - `tg:` Telegram channel (e.g., `tg:channelname`)
103
+ - `lat:` latitude (e.g., `lat:37.7749`)
104
+ - `lng:` longitude (e.g., `lng:-122.4194`)
105
+
106
+ Example:
107
+
108
+ ```bash
109
+ otinstaller run sherlock -- u:johndoe
110
+ otinstaller run ghunt -- u:johndoe e:john@example.com
111
+ ```
112
+
113
+ Each tool declares which input types it supports. Use `otinstaller info <tool>` to see the mapping.
114
+
115
+ ## All mode
116
+
117
+ Run every installed tool that supports a given input type:
118
+
119
+ ```bash
120
+ otinstaller run --all u:johndoe
121
+ otinstaller run -a u:johndoe e:john@example.com
122
+ ```
123
+
124
+ Only `u`, `e`, `p`, `d`, and `url` work with `--all`. Tools requiring API credentials are skipped unless `--include-credentialed` is passed.
125
+
126
+ ## Agent-friendly usage
127
+
128
+ Every command supports `--json` for machine-readable output. Commands never prompt when `--yes` or `-y` is given, or when stdin is not a terminal (CI mode). Exit codes are stable: 0 = success, 1 = error, 2 = invalid input, 130 = interrupted.
129
+
130
+ Command reference:
131
+
132
+ - `otinstaller init` — Initialize config and directories
133
+ - `otinstaller install <tool>...` — Install tools
134
+ - `otinstaller remove <tool>...` / `--all` — Remove tools
135
+ - `otinstaller run <tool>... -- <args>` — Run tools
136
+ - `otinstaller run --all u:...` — Run all matching tools
137
+ - `otinstaller info <tool>` — Show tool details
138
+ - `otinstaller list` / `--installed` — List tools
139
+ - `otinstaller search <query>` — Search tools
140
+ - `otinstaller update` / `--all` / `--check-only` — Update tools
141
+ - `otinstaller check-updates` — Check for updates (read-only)
142
+ - `otinstaller auto <target>` — Auto-detect type and run tools
143
+ - `otinstaller example <tool>` — Show example output
144
+ - `otinstaller keys check` — Check API keys
145
+ - `otinstaller resume` — Resume interrupted jobs
146
+ - `otinstaller doctor` — Run diagnostics
147
+
148
+ For AI agents: see `llms.txt` at the repository root.
149
+
150
+ ## Results
151
+
152
+ Results are saved automatically to `./results/<tool>/<target>/` using the filename pattern `<YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext>` plus a `.meta.json` sidecar. The results directory can be overridden with `--output` or `OTINSTALLER_RESULTS_DIR`.
153
+
154
+ Example:
155
+
156
+ ```
157
+ results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.txt
158
+ results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.meta.json
159
+ ```
160
+
161
+ ## API keys
162
+
163
+ One env file holds all API keys: `~/.otinstaller/.env`, permissions 600. Each tool only receives the keys it declares in its registry entry. Use `otinstaller keys check` to verify.
164
+
165
+ ## Resume
166
+
167
+ If a run or install is interrupted (crash, Ctrl+C, kill), otinstaller keeps a job marker in `~/.otinstaller/jobs/`. Run `otinstaller resume` to detect and handle interrupted jobs:
168
+
169
+ - For installs: cleans up partial state and retries the install.
170
+ - For runs: reports the interrupted run and prints the command to rerun manually.
171
+
172
+ Use `otinstaller resume --dry-run` to see what would happen without making changes. Use `--json` for machine-readable output.
173
+
174
+ Finished jobs are skipped on resume (their marker is removed on completion). Partial output from interrupted runs is always kept in the results directory.
175
+
176
+ ## Dual-use tools and responsible use
177
+
178
+ Some tools are tagged `dual-use` in the registry. They can be used for legitimate research but also for misuse. Installing a dual-use tool prints a notice and requires confirmation unless `--yes` is given.
179
+
180
+ The global responsible-use notice is accepted on first `otinstaller init`. You can re-read it with `otinstaller init` any time.
181
+
182
+ ## Python version caveats
183
+
184
+ Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. Known affected tools:
185
+
186
+ - `auto-archiver`: requires Python <3.13 (dependency `pdqhash` needs a C++ compiler, no wheel for 3.13+)
187
+ - `telepathy`: requires Python <3.13 (dependency `googletrans`/`httpx` uses removed `cgi` module)
188
+
189
+ If you encounter install failures on Python 3.13+, run otinstaller in a Python 3.12 virtualenv.
190
+
191
+ ## License
192
+
193
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,164 @@
1
+ # OTinstaller
2
+
3
+ Install, run, update, and remove open-source command line tools by name.
4
+
5
+ You pick a tool from a list. OTinstaller downloads it into its own folder, runs it, and saves the output. You do not learn a different install method for each tool.
6
+
7
+ Status: early development. Not published to PyPI yet.
8
+
9
+ ## What you need
10
+
11
+ A Linux machine. Tested on Ubuntu 22.04 and 24.04, Debian 12, and Arch Linux. Kali Linux is checked by hand before a release.
12
+
13
+ Python 3.10 or newer, git, and the `venv` module. On Debian, Ubuntu and Kali, install that module with:
14
+
15
+ ```bash
16
+ sudo apt install python3-venv git
17
+ ```
18
+
19
+ Note: Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. If you encounter install failures on newer Python versions, try running otinstaller in a Python 3.12 virtualenv.
20
+
21
+ ## Install otinstaller
22
+
23
+ These commands install otinstaller itself. Run them in this repository's folder. A virtualenv is a private Python folder, so this install does not change the Python that came with the system.
24
+
25
+ ```bash
26
+ python3 -m venv .venv
27
+ source .venv/bin/activate
28
+ pip install -e .
29
+ ```
30
+
31
+ `otinstaller` should now be on your path. A new terminal does not keep that. Run `source .venv/bin/activate` again from this folder if the next command says `otinstaller: command not found`.
32
+
33
+ For system-wide installation, use `pipx install otinstaller` (or `pipx install .` from this directory). This provides the `otinstaller` and `ot` commands on your PATH without a virtualenv.
34
+
35
+ Check the machine with:
36
+
37
+ ```bash
38
+ otinstaller doctor
39
+ ```
40
+
41
+ `doctor` prints `[ok]` or `[problem]` for Linux, Python, git, and venv. Fix any `[problem]` line before you continue. It often tells you the package to install.
42
+
43
+ ## Run your first tool
44
+
45
+ `init` creates `~/.otinstaller/` and shows a responsible-use notice. It asks `Do you accept? [y/N]`. Type `y` and press Enter. Nothing can be installed until you do.
46
+
47
+ ```bash
48
+ otinstaller init
49
+ ```
50
+
51
+ Sherlock searches for a username. This install asks `Install? [y/N]`. The capital N means Enter alone means no. Type `y` to continue.
52
+
53
+ ```bash
54
+ otinstaller install sherlock
55
+ otinstaller run sherlock -- someexampleuser123
56
+ ```
57
+
58
+ The `--` marks where otinstaller's own options end. Everything after it is passed to Sherlock. When the run finishes, otinstaller prints a path under `results/` in the folder where you ran the command. That file is the tool's output.
59
+
60
+ To try a different tool, use its name from the guide in place of `sherlock`.
61
+
62
+ ## Typed inputs
63
+
64
+ Instead of remembering each tool's flags, you can use typed input prefixes:
65
+
66
+ - `u:` username (e.g., `u:johndoe`)
67
+ - `e:` email (e.g., `e:john@example.com`)
68
+ - `p:` phone (e.g., `p:+15551234567`)
69
+ - `d:` domain (e.g., `d:example.com`)
70
+ - `url:` URL (e.g., `url:https://example.com`)
71
+ - `q:` text query (e.g., `q:search terms`)
72
+ - `geo:` coordinates (e.g., `geo:32.22,-110.97`)
73
+ - `tg:` Telegram channel (e.g., `tg:channelname`)
74
+ - `lat:` latitude (e.g., `lat:37.7749`)
75
+ - `lng:` longitude (e.g., `lng:-122.4194`)
76
+
77
+ Example:
78
+
79
+ ```bash
80
+ otinstaller run sherlock -- u:johndoe
81
+ otinstaller run ghunt -- u:johndoe e:john@example.com
82
+ ```
83
+
84
+ Each tool declares which input types it supports. Use `otinstaller info <tool>` to see the mapping.
85
+
86
+ ## All mode
87
+
88
+ Run every installed tool that supports a given input type:
89
+
90
+ ```bash
91
+ otinstaller run --all u:johndoe
92
+ otinstaller run -a u:johndoe e:john@example.com
93
+ ```
94
+
95
+ Only `u`, `e`, `p`, `d`, and `url` work with `--all`. Tools requiring API credentials are skipped unless `--include-credentialed` is passed.
96
+
97
+ ## Agent-friendly usage
98
+
99
+ Every command supports `--json` for machine-readable output. Commands never prompt when `--yes` or `-y` is given, or when stdin is not a terminal (CI mode). Exit codes are stable: 0 = success, 1 = error, 2 = invalid input, 130 = interrupted.
100
+
101
+ Command reference:
102
+
103
+ - `otinstaller init` — Initialize config and directories
104
+ - `otinstaller install <tool>...` — Install tools
105
+ - `otinstaller remove <tool>...` / `--all` — Remove tools
106
+ - `otinstaller run <tool>... -- <args>` — Run tools
107
+ - `otinstaller run --all u:...` — Run all matching tools
108
+ - `otinstaller info <tool>` — Show tool details
109
+ - `otinstaller list` / `--installed` — List tools
110
+ - `otinstaller search <query>` — Search tools
111
+ - `otinstaller update` / `--all` / `--check-only` — Update tools
112
+ - `otinstaller check-updates` — Check for updates (read-only)
113
+ - `otinstaller auto <target>` — Auto-detect type and run tools
114
+ - `otinstaller example <tool>` — Show example output
115
+ - `otinstaller keys check` — Check API keys
116
+ - `otinstaller resume` — Resume interrupted jobs
117
+ - `otinstaller doctor` — Run diagnostics
118
+
119
+ For AI agents: see `llms.txt` at the repository root.
120
+
121
+ ## Results
122
+
123
+ Results are saved automatically to `./results/<tool>/<target>/` using the filename pattern `<YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext>` plus a `.meta.json` sidecar. The results directory can be overridden with `--output` or `OTINSTALLER_RESULTS_DIR`.
124
+
125
+ Example:
126
+
127
+ ```
128
+ results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.txt
129
+ results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.meta.json
130
+ ```
131
+
132
+ ## API keys
133
+
134
+ One env file holds all API keys: `~/.otinstaller/.env`, permissions 600. Each tool only receives the keys it declares in its registry entry. Use `otinstaller keys check` to verify.
135
+
136
+ ## Resume
137
+
138
+ If a run or install is interrupted (crash, Ctrl+C, kill), otinstaller keeps a job marker in `~/.otinstaller/jobs/`. Run `otinstaller resume` to detect and handle interrupted jobs:
139
+
140
+ - For installs: cleans up partial state and retries the install.
141
+ - For runs: reports the interrupted run and prints the command to rerun manually.
142
+
143
+ Use `otinstaller resume --dry-run` to see what would happen without making changes. Use `--json` for machine-readable output.
144
+
145
+ Finished jobs are skipped on resume (their marker is removed on completion). Partial output from interrupted runs is always kept in the results directory.
146
+
147
+ ## Dual-use tools and responsible use
148
+
149
+ Some tools are tagged `dual-use` in the registry. They can be used for legitimate research but also for misuse. Installing a dual-use tool prints a notice and requires confirmation unless `--yes` is given.
150
+
151
+ The global responsible-use notice is accepted on first `otinstaller init`. You can re-read it with `otinstaller init` any time.
152
+
153
+ ## Python version caveats
154
+
155
+ Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. Known affected tools:
156
+
157
+ - `auto-archiver`: requires Python <3.13 (dependency `pdqhash` needs a C++ compiler, no wheel for 3.13+)
158
+ - `telepathy`: requires Python <3.13 (dependency `googletrans`/`httpx` uses removed `cgi` module)
159
+
160
+ If you encounter install failures on Python 3.13+, run otinstaller in a Python 3.12 virtualenv.
161
+
162
+ ## License
163
+
164
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ cd /home/otinstaller
3
+ git ls-files | grep -E "testtool|test_debug"
@@ -0,0 +1,12 @@
1
+ # Decisions
2
+
3
+ - The CLI does not apply the denylist at runtime; the registry pipeline applies it before publishing.
4
+ - Virtual environments are created in their final location (tools/<name>/venv/) because venv scripts embed absolute paths.
5
+ - The "commit" column in the state database was renamed to "commit_hash" to avoid SQLite reserved word conflicts.
6
+ - The notice acceptance file (accepted.json) stores the version and timestamp; changing the notice version requires re-acceptance.
7
+ - The .env file permissions are fixed to 600 on init if they are looser.
8
+ - The count line in list and search uses singular "tool" for 1, plural "tools" otherwise.
9
+ - Each tool gets its own virtualenv; no shared environments.
10
+ - Tools run on the same Python that runs otinstaller.
11
+ - otinstaller supports Linux only; install, remove, and run commands check sys.platform and exit with an error on other platforms.
12
+ - airecon passed verification but was deferred from launch because it requires Docker and Ollama, which otinstaller cannot check for yet; revisit once a `requires` field / dependency-check exists in the registry schema.