renance-dt 3.0.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.
@@ -0,0 +1,100 @@
1
+ Metadata-Version: 2.4
2
+ Name: renance-dt
3
+ Version: 3.0.0
4
+ Summary: Renance DevTools - One command to rule them all
5
+ Author-email: Renance <hello@renance.dev>
6
+ License: MIT
7
+ Requires-Python: >=3.8
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: click>=8.1.0
10
+ Requires-Dist: colorama>=0.4.6
11
+ Requires-Dist: requests>=2.31.0
12
+ Requires-Dist: qrcode[pil]>=7.4.0
13
+ Requires-Dist: pillow>=10.0.0
14
+ Requires-Dist: psutil>=5.9.0
15
+ Requires-Dist: speedtest-cli>=2.1.3
16
+ Requires-Dist: mss>=9.0.1
17
+ Requires-Dist: pyjokes>=0.6.0
18
+
19
+ # 🚀 Renance DevTools (renance-dt) v3.0
20
+
21
+ <div align="center">
22
+ <h3><a href="https://renance-devtools.vercel.app">🌐 Official Website & Interactive Tutorial</a></h3>
23
+ <p><b>Everything you need in one command.</b></p>
24
+
25
+ [![PyPI version](https://img.shields.io/pypi/v/renance-dt.svg)](https://pypi.org/project/renance-dt/)
26
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
27
+ [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux%20%7C%20Termux-lightgrey)](https://pypi.org/project/renance-dt/)
28
+ [![Built By](https://img.shields.io/badge/Built%20By-Resolutefemi-blue.svg)](mailto:hello@renance.dev)
29
+ </div>
30
+
31
+ ---
32
+
33
+ ## ⚡ Quick Start
34
+
35
+ ### 1. Global Installation (Recommended)
36
+ Install globally via pip to use the `dt` command from anywhere:
37
+ ```bash
38
+ pip install renance-dt
39
+ ```
40
+
41
+ ### 2. Automatic Setup
42
+ Configure your system PATH automatically:
43
+ ```bash
44
+ dt setup
45
+ ```
46
+ > **Note:** Please restart your terminal after running setup.
47
+
48
+ ---
49
+
50
+ ## 📥 Local Installation (Source Code)
51
+
52
+ If you have downloaded the source code, follow these steps:
53
+
54
+ ### 🪟 Windows
55
+ 1. Open the **`dt-cli`** directory.
56
+ 2. Double-click **`install.bat`** or run: `.\install.bat`
57
+
58
+ ### 🍎 macOS / 🐧 Linux / 📱 Termux
59
+ 1. Navigate to the **`dt-cli`** directory.
60
+ 2. Run: `chmod +x install.sh && ./install.sh`
61
+
62
+ ---
63
+
64
+ ## 🛠️ 14 Power Categories (200+ Commands)
65
+
66
+ Renance DevTools is a massive ecosystem. Run `dt help` to see the full dashboard.
67
+
68
+ ### 📁 1. High-Speed Files (`dt fcp`, `dt search`, `dt organize`)
69
+ * **`dt fcp`**: Multi-threaded copy engine for moving massive folders up to 5x faster.
70
+ * **`dt search`**: Recursive "super-search" inside file contents.
71
+ * **`dt clean`**: Deep-clean build artifacts and temp files.
72
+
73
+ ### 🎬 2. Media Processing (`dt join`, `dt shrink`, `dt music`)
74
+ * **`dt shrink`**: Compress videos for WhatsApp or Web.
75
+ * **`dt music`**: Extract high-quality MP3s from any video file.
76
+ * **`dt gif`**: Convert video clips into optimized GIFs.
77
+
78
+ ### 🐙 3. Smart Git Workflow (`dt gac`, `dt repo`, `dt pr`)
79
+ * **`dt gac`**: The ultimate Add-Commit-Push flow in one command.
80
+ * **`dt repo`**: Create a GitHub repository directly from your terminal.
81
+ * **`dt pr`**: Create Pull Requests without leaving the CLI.
82
+
83
+ ### 🕶️ 4. Hacker Mode (`dt matrix`, `dt vault`, `dt sniff`)
84
+ * **`dt matrix`**: Iconic falling green code effect.
85
+ * **`dt vault`**: Encrypt/Decrypt sensitive files with password protection.
86
+ * **`dt port-scan`**: Elite network diagnostic and port scanner.
87
+
88
+ ### 📱 5. Phone Remote (`dt serve-phone`, `dt torch`, `dt sms`)
89
+ * **`dt serve-phone`**: Instantly serve local files to your phone via QR code.
90
+ * **`dt torch`**: Control your Android device's flashlight (via Termux).
91
+ * **`dt sms`**: Send messages directly from your terminal.
92
+
93
+ ---
94
+
95
+ ## 📖 Official Tutorial
96
+ For the full interactive command dashboard and detailed usage guides, visit the official site:
97
+ 👉 **[renance-devtools.vercel.app](https://renance-devtools.vercel.app)**
98
+
99
+ ---
100
+ Built with ❤️ by **Resolutefemi**
@@ -0,0 +1,82 @@
1
+ # 🚀 Renance DevTools (renance-dt) v3.0
2
+
3
+ <div align="center">
4
+ <h3><a href="https://renance-devtools.vercel.app">🌐 Official Website & Interactive Tutorial</a></h3>
5
+ <p><b>Everything you need in one command.</b></p>
6
+
7
+ [![PyPI version](https://img.shields.io/pypi/v/renance-dt.svg)](https://pypi.org/project/renance-dt/)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+ [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux%20%7C%20Termux-lightgrey)](https://pypi.org/project/renance-dt/)
10
+ [![Built By](https://img.shields.io/badge/Built%20By-Resolutefemi-blue.svg)](mailto:hello@renance.dev)
11
+ </div>
12
+
13
+ ---
14
+
15
+ ## ⚡ Quick Start
16
+
17
+ ### 1. Global Installation (Recommended)
18
+ Install globally via pip to use the `dt` command from anywhere:
19
+ ```bash
20
+ pip install renance-dt
21
+ ```
22
+
23
+ ### 2. Automatic Setup
24
+ Configure your system PATH automatically:
25
+ ```bash
26
+ dt setup
27
+ ```
28
+ > **Note:** Please restart your terminal after running setup.
29
+
30
+ ---
31
+
32
+ ## 📥 Local Installation (Source Code)
33
+
34
+ If you have downloaded the source code, follow these steps:
35
+
36
+ ### 🪟 Windows
37
+ 1. Open the **`dt-cli`** directory.
38
+ 2. Double-click **`install.bat`** or run: `.\install.bat`
39
+
40
+ ### 🍎 macOS / 🐧 Linux / 📱 Termux
41
+ 1. Navigate to the **`dt-cli`** directory.
42
+ 2. Run: `chmod +x install.sh && ./install.sh`
43
+
44
+ ---
45
+
46
+ ## 🛠️ 14 Power Categories (200+ Commands)
47
+
48
+ Renance DevTools is a massive ecosystem. Run `dt help` to see the full dashboard.
49
+
50
+ ### 📁 1. High-Speed Files (`dt fcp`, `dt search`, `dt organize`)
51
+ * **`dt fcp`**: Multi-threaded copy engine for moving massive folders up to 5x faster.
52
+ * **`dt search`**: Recursive "super-search" inside file contents.
53
+ * **`dt clean`**: Deep-clean build artifacts and temp files.
54
+
55
+ ### 🎬 2. Media Processing (`dt join`, `dt shrink`, `dt music`)
56
+ * **`dt shrink`**: Compress videos for WhatsApp or Web.
57
+ * **`dt music`**: Extract high-quality MP3s from any video file.
58
+ * **`dt gif`**: Convert video clips into optimized GIFs.
59
+
60
+ ### 🐙 3. Smart Git Workflow (`dt gac`, `dt repo`, `dt pr`)
61
+ * **`dt gac`**: The ultimate Add-Commit-Push flow in one command.
62
+ * **`dt repo`**: Create a GitHub repository directly from your terminal.
63
+ * **`dt pr`**: Create Pull Requests without leaving the CLI.
64
+
65
+ ### 🕶️ 4. Hacker Mode (`dt matrix`, `dt vault`, `dt sniff`)
66
+ * **`dt matrix`**: Iconic falling green code effect.
67
+ * **`dt vault`**: Encrypt/Decrypt sensitive files with password protection.
68
+ * **`dt port-scan`**: Elite network diagnostic and port scanner.
69
+
70
+ ### 📱 5. Phone Remote (`dt serve-phone`, `dt torch`, `dt sms`)
71
+ * **`dt serve-phone`**: Instantly serve local files to your phone via QR code.
72
+ * **`dt torch`**: Control your Android device's flashlight (via Termux).
73
+ * **`dt sms`**: Send messages directly from your terminal.
74
+
75
+ ---
76
+
77
+ ## 📖 Official Tutorial
78
+ For the full interactive command dashboard and detailed usage guides, visit the official site:
79
+ 👉 **[renance-devtools.vercel.app](https://renance-devtools.vercel.app)**
80
+
81
+ ---
82
+ Built with ❤️ by **Resolutefemi**
@@ -0,0 +1 @@
1
+ __version__ = "3.0.0"
@@ -0,0 +1,149 @@
1
+ try:
2
+ import click
3
+ except ImportError:
4
+
5
+ import sys
6
+ if "setup" not in sys.argv:
7
+ print("❌ Error: Renance DevTools dependencies not found.")
8
+ print("To fix this, please run the installer in the project folder:")
9
+ print(" Windows: install.bat")
10
+ print(" Unix: bash install.sh")
11
+ sys.exit(1)
12
+
13
+ from colorama import Fore, Style
14
+ from pathlib import Path
15
+
16
+ from .commands.files import send, clean, organize, find, big, duplicate, tree, backup, where, fcp
17
+ from .commands.media import join, music, shrink, clip, gif, extract, compress
18
+ from .commands.check import check, doctor
19
+ from .commands.git import gac, repo, undo, pr, branch_clean, stash_all, changelog, sync, git_install, gh_login
20
+ from .commands.deploy import ship, login, logout, live, env_push, logs
21
+ from .commands.system import ports, kill_port, wifi, ip, battery, space, info, health, update_all, setup, update
22
+ from .commands.phone import serve_phone, torch, storage, sms, hotspot, wifi_scan, record_audio, backup_photos
23
+ from .commands.utils import up, qr, todo, note, timer, convert, weather, paste, pomo, shorten, status
24
+ from .commands.net import ping, myip, dns, scan_network, speed, whois, ip_info
25
+ from .commands.crypto import passgen, hash, b64encode, b64decode
26
+ from .commands.dev import ignore, license, readme
27
+ from .commands.hacker import matrix, port_scan, sniff, vault
28
+ from .commands.pro import screenshot, joke, json_fmt, kill_all, search, links, rename
29
+ from .commands.extra import extra_cmds
30
+
31
+ @click.group(invoke_without_command=True)
32
+ @click.pass_context
33
+ def cli(ctx):
34
+ if ctx.invoked_subcommand is None:
35
+ show_help()
36
+
37
+ def show_help():
38
+ from .config import IS_TERMUX
39
+ platform = "📱 Termux" if IS_TERMUX else "💻"
40
+ click.echo(f"\n{Fore.CYAN}{Style.BRIGHT}🚀 Renance DevTools v3.0 {platform}{Style.RESET_ALL}")
41
+ click.echo(f"{Fore.WHITE}Built with ❤️ by Resolutefemi\n{Style.RESET_ALL}")
42
+
43
+ all_commands = sorted(cli.list_commands(None))
44
+
45
+ categories = {
46
+ "📁 Files": ["fcp", "send", "clean", "organize", "find", "big", "duplicate", "tree", "backup", "where", "search", "rename", "touch2", "mkdir2", "rm2", "ls2", "pwd2", "size", "ext", "basename", "dirname", "exists", "isdir", "isfile", "count_files", "count_dirs", "md5_file", "sha1_file", "sha256_file"],
47
+ "🎬 Media": ["join", "music", "shrink", "clip", "gif", "extract", "compress", "screenshot", "links", "coffee"],
48
+ "🌐 Network": ["speed", "status", "ping", "dns", "whois", "scan-network", "myip", "ip2", "ip-info", "ip_loc", "http_get", "http_head", "http_options", "url_parse"],
49
+ "🕶️ Hacker": ["matrix", "vault", "port-scan", "sniff", "kill-all", "mac_addr", "ipv4_gen", "port_gen", "user_agent", "password", "pin", "port_check"],
50
+ "🚀 Deploy": ["deploy", "login", "logout", "live", "env-push", "logs"],
51
+ "🐙 Git": ["git-install", "gh", "gac", "repo", "pr", "undo", "sync", "changelog", "branch-clean", "stash-all"],
52
+ "💻 System": ["ports", "kill-port", "ip", "battery", "space", "info", "health", "update", "update-all", "setup", "cpu_count", "env_var", "path_list", "mem_total", "mem_avail", "disk_io", "net_io", "uptime", "whoami2", "clear2", "date2", "sleep2"],
53
+ "📱 Phone": ["serve-phone", "torch", "storage", "sms", "hotspot", "wifi-scan", "record-audio", "backup-photos", "wifi"],
54
+ "🛠️ Utils": ["shorten", "pomo", "weather", "qr", "todo", "note", "timer", "convert", "paste", "up", "json", "lorem", "hex_color", "rgb_color", "json_mock", "base64_img", "tz", "timestamp", "days_until", "week_num"],
55
+ "🔐 Crypto": ["passgen", "hash", "b64enc", "b64encode", "b64dec", "b64decode", "hexenc", "hexdec", "rot13", "morse", "uuid"],
56
+ "👨‍💻 Dev": ["ignore", "license", "readme", "check", "doctor", "github"],
57
+ "🧮 Math": ["add", "sub", "mul", "div", "mod", "pow", "sqrt", "sin", "cos", "tan", "log", "log10", "ceil", "floor", "round", "abs", "fact", "c2f", "f2c", "bmi", "mortgage", "tip", "tax", "bin2dec", "dec2bin", "hex2dec", "dec2hex", "oct2dec", "dec2oct", "kg2lb", "lb2kg", "m2ft", "ft2m"],
58
+ "🔤 Text": ["upper", "lower", "title", "reverse", "length", "wordcount", "slugify", "camelcase", "snakecase", "kebabcase", "urlenc", "urldec", "echo2"],
59
+ "🎲 Fun": ["random", "randint", "choice", "shuffle", "coin", "dice", "magic8", "rps", "catfact", "dogfact", "chuck", "yesno", "nationalize", "genderize", "bored", "bitcoin", "riddles", "advice", "quote", "trump", "kanye", "pokefact", "name_gen", "joke"]
60
+ }
61
+
62
+ import shutil
63
+ term_cols, _ = shutil.get_terminal_size()
64
+ col_width = 18
65
+ num_cols = max(1, term_cols // col_width)
66
+
67
+ displayed_cmds = set()
68
+
69
+ for cat_name, cmd_list in categories.items():
70
+ # Filter to only include commands that actually exist in cli
71
+ cmds = [c for c in cmd_list if c in all_commands]
72
+ if cmds:
73
+ click.echo(f"{Fore.MAGENTA}{Style.BRIGHT}{cat_name}{Style.RESET_ALL}")
74
+ for i in range(0, len(cmds), num_cols):
75
+ chunk = cmds[i:i + num_cols]
76
+ line = "".join(f"{Fore.GREEN}{cmd:<{col_width}}{Style.RESET_ALL}" for cmd in chunk)
77
+ click.echo(line)
78
+ click.echo("") # Empty line between categories
79
+ displayed_cmds.update(cmds)
80
+
81
+ # Catch any missing commands
82
+ remaining = sorted(list(set(all_commands) - displayed_cmds - {"help", "about"}))
83
+ if remaining:
84
+ click.echo(f"{Fore.MAGENTA}{Style.BRIGHT}📦 Uncategorized{Style.RESET_ALL}")
85
+ for i in range(0, len(remaining), num_cols):
86
+ chunk = remaining[i:i + num_cols]
87
+ line = "".join(f"{Fore.GREEN}{cmd:<{col_width}}{Style.RESET_ALL}" for cmd in chunk)
88
+ click.echo(line)
89
+ click.echo("")
90
+
91
+ click.echo(f"{Fore.YELLOW}Total Commands: {len(all_commands)}{Style.RESET_ALL}")
92
+ click.echo(f"{Fore.YELLOW}Usage: dt COMMAND [ARGS]...{Style.RESET_ALL}")
93
+ click.echo(f"{Fore.CYAN}Run 'dt about' for project information.\n{Style.RESET_ALL}")
94
+
95
+ @click.command()
96
+ def help_cmd():
97
+ """Show the interactive help dashboard"""
98
+ show_help()
99
+
100
+ @click.command()
101
+ def about():
102
+ """About Renance DevTools"""
103
+ click.echo(f"\n{Fore.CYAN}{Style.BRIGHT}🚀 Renance DevTools (renance-dt) v3.0{Style.RESET_ALL}")
104
+ click.echo(f"{Fore.GREEN}Built by: {Fore.WHITE}Resolutefemi")
105
+ click.echo(f"{Fore.GREEN}Email: {Fore.WHITE}hello@renance.dev")
106
+ click.echo(f"{Fore.GREEN}Status: {Fore.WHITE}Production Ready")
107
+ click.echo(f"\n{Fore.YELLOW}Renance DevTools is a unified CLI ecosystem designed to bridge the gap between")
108
+ click.echo(f"standard OS tools and developer needs. From multi-threaded copying to")
109
+ click.echo(f"one-click deployments and hacker-style diagnostics, it is the only")
110
+ click.echo(f"command you will ever need.{Style.RESET_ALL}\n")
111
+
112
+ # Register all commands
113
+ commands_list = [
114
+ send, clean, organize, find, big, duplicate, tree, backup, where, fcp,
115
+ join, music, shrink, clip, gif, extract, compress,
116
+ check, doctor,
117
+ gac, repo, undo, pr, branch_clean, stash_all, changelog, sync, git_install, gh_login,
118
+ ship, login, logout, live, env_push, logs,
119
+ ports, kill_port, wifi, ip, battery, space, info, health, update_all, setup, update,
120
+ serve_phone, torch, storage, sms, hotspot, wifi_scan, record_audio, backup_photos,
121
+ up, qr, todo, note, timer, convert, weather, paste, pomo, shorten, status,
122
+ ping, myip, dns, scan_network, speed, whois, ip_info,
123
+ passgen, hash, b64encode, b64decode,
124
+ ignore, license, readme, help_cmd, about,
125
+ matrix, port_scan, sniff, vault,
126
+ screenshot, joke, json_fmt, kill_all, search, links, rename
127
+ ]
128
+
129
+ commands_list.extend(extra_cmds)
130
+
131
+ for cmd in commands_list:
132
+ # Rename commands for better CLI naming
133
+ if cmd == help_cmd:
134
+ cli.add_command(cmd, name='help')
135
+ elif cmd == ship:
136
+ cli.add_command(cmd, name='deploy')
137
+ elif cmd == json_fmt:
138
+ cli.add_command(cmd, name='json')
139
+ elif cmd == kill_all:
140
+ cli.add_command(cmd, name='kill-all')
141
+ elif cmd == port_scan:
142
+ cli.add_command(cmd, name='port-scan')
143
+ elif cmd == scan_network:
144
+ cli.add_command(cmd, name='scan-network')
145
+ else:
146
+ cli.add_command(cmd)
147
+
148
+ if __name__ == "__main__":
149
+ cli()
@@ -0,0 +1 @@
1
+ # Commands module
@@ -0,0 +1,60 @@
1
+ import click, sys, subprocess, os
2
+ from pathlib import Path
3
+ from ..config import Colors
4
+
5
+ @click.command()
6
+ def check():
7
+ """Run basic project checks"""
8
+ click.echo(f"{Colors.CYAN}Running basic checks...{Colors.RESET}")
9
+
10
+ if Path('package.json').exists():
11
+ click.echo(f"{Colors.GREEN}✅ Node.js project detected{Colors.RESET}")
12
+ elif Path('requirements.txt').exists():
13
+ click.echo(f"{Colors.GREEN}✅ Python project detected{Colors.RESET}")
14
+ elif Path('Cargo.toml').exists():
15
+ click.echo(f"{Colors.GREEN}✅ Rust project detected{Colors.RESET}")
16
+ elif Path('go.mod').exists():
17
+ click.echo(f"{Colors.GREEN}✅ Go project detected{Colors.RESET}")
18
+ else:
19
+ click.echo(f"{Colors.YELLOW}⚠️ No specific project configuration found (Node/Python/Rust/Go){Colors.RESET}")
20
+
21
+ if Path('.git').exists():
22
+ click.echo(f"{Colors.GREEN}✅ Git initialized{Colors.RESET}")
23
+ else:
24
+ click.echo(f"{Colors.YELLOW}⚠️ Git not initialized{Colors.RESET}")
25
+
26
+ @click.command()
27
+ def doctor():
28
+ """Run comprehensive system diagnostic"""
29
+ click.echo(f"{Colors.CYAN}Running diagnostics...{Colors.RESET}")
30
+ tools = ['git', 'node', 'python', 'pip', 'ffmpeg']
31
+ all_good = True
32
+ for tool in tools:
33
+ try:
34
+ subprocess.run([tool, '-version' if tool == 'ffmpeg' else '--version'], capture_output=True, check=True)
35
+ click.echo(f"{Colors.GREEN}✅ {tool} is installed{Colors.RESET}")
36
+ except (FileNotFoundError, subprocess.CalledProcessError):
37
+ click.echo(f"{Colors.RED}❌ {tool} is missing or not working{Colors.RESET}")
38
+ if tool == 'ffmpeg':
39
+ click.echo(f"{Colors.YELLOW} 👉 Tip: Install ffmpeg from ffmpeg.org or via package manager (choco install ffmpeg on Windows).{Colors.RESET}")
40
+ all_good = False
41
+
42
+ click.echo(f"\n{Colors.CYAN}Checking Python Dependencies...{Colors.RESET}")
43
+ deps = ['click', 'colorama', 'requests', 'qrcode', 'PIL', 'psutil', 'speedtest', 'mss', 'pyjokes']
44
+ for dep in deps:
45
+ try:
46
+ if dep == 'PIL':
47
+ import PIL
48
+ elif dep == 'speedtest':
49
+ import speedtest
50
+ else:
51
+ __import__(dep)
52
+ click.echo(f"{Colors.GREEN}✅ {dep} is available{Colors.RESET}")
53
+ except ImportError:
54
+ click.echo(f"{Colors.RED}❌ {dep} is missing{Colors.RESET}")
55
+ all_good = False
56
+
57
+ if all_good:
58
+ click.echo(f"\n{Colors.CYAN}✅ Everything looks good!{Colors.RESET}")
59
+ else:
60
+ click.echo(f"\n{Colors.YELLOW}⚠️ Some tools or dependencies are missing. Run 'install.bat' to fix Python dependencies.{Colors.RESET}")
@@ -0,0 +1,36 @@
1
+ import click, random, string, hashlib, base64
2
+ from ..config import Colors
3
+
4
+ @click.command()
5
+ @click.option('--length', default=16, help='Length of password')
6
+ def passgen(length):
7
+ """Generate a strong password"""
8
+ chars = string.ascii_letters + string.digits + "!@#$%^&*"
9
+ pwd = ''.join(random.choice(chars) for _ in range(length))
10
+ click.echo(f"{Colors.GREEN}Generated Password: {pwd}{Colors.RESET}")
11
+
12
+ @click.command()
13
+ @click.argument('text')
14
+ def hash(text):
15
+ """Generate MD5 and SHA256 hashes"""
16
+ md5 = hashlib.md5(text.encode()).hexdigest()
17
+ sha256 = hashlib.sha256(text.encode()).hexdigest()
18
+ click.echo(f"{Colors.CYAN}MD5: {md5}{Colors.RESET}")
19
+ click.echo(f"{Colors.CYAN}SHA256: {sha256}{Colors.RESET}")
20
+
21
+ @click.command()
22
+ @click.argument('text')
23
+ def b64encode(text):
24
+ """Base64 encode text"""
25
+ encoded = base64.b64encode(text.encode()).decode()
26
+ click.echo(f"{Colors.GREEN}{encoded}{Colors.RESET}")
27
+
28
+ @click.command()
29
+ @click.argument('data')
30
+ def b64decode(data):
31
+ """Base64 decode text"""
32
+ try:
33
+ decoded = base64.b64decode(data).decode()
34
+ click.echo(f"{Colors.GREEN}{decoded}{Colors.RESET}")
35
+ except:
36
+ click.echo(f"{Colors.RED}Invalid Base64 data{Colors.RESET}")
@@ -0,0 +1,81 @@
1
+ import click, subprocess, os
2
+ from pathlib import Path
3
+ from ..config import Colors
4
+
5
+ @click.command()
6
+ def ship():
7
+ """Deploy application (Vercel/Netlify/Render)"""
8
+ click.echo(f"{Colors.CYAN}🚀 Renance Deployment Engine{Colors.RESET}")
9
+ provider = click.prompt(f"{Colors.BLUE}Choose provider (1: Vercel, 2: Netlify, 3: Render){Colors.RESET}", type=click.Choice(['1','2','3']))
10
+
11
+ use_shell = os.name == 'nt'
12
+
13
+ if provider == '1': # Vercel
14
+ # Check login
15
+ click.echo(f"{Colors.CYAN}Checking Vercel authentication... (this may take a moment on first run){Colors.RESET}")
16
+ # Using --yes to bypass "Need to install..." prompt which causes hangs
17
+ check = subprocess.run(['npx', '--yes', 'vercel', 'whoami'], shell=use_shell, capture_output=True)
18
+
19
+ if check.returncode != 0:
20
+ click.echo(f"{Colors.YELLOW}You are not logged in or Vercel is not initialized.{Colors.RESET}")
21
+ subprocess.run(['npx', '--yes', 'vercel', 'login'], shell=use_shell)
22
+
23
+ name = click.prompt(f"{Colors.BLUE}Project Name (leave blank for auto){Colors.RESET}", default="")
24
+ click.echo(f"{Colors.CYAN}Deploying to Vercel...{Colors.RESET}")
25
+ cmd = ['npx', '--yes', 'vercel', '--prod']
26
+ if name: cmd.extend(['--name', name])
27
+ subprocess.run(cmd, shell=use_shell)
28
+
29
+ elif provider == '2': # Netlify
30
+ # Check login
31
+ click.echo(f"{Colors.CYAN}Checking Netlify authentication...{Colors.RESET}")
32
+ check = subprocess.run(['npx', '--yes', 'netlify-cli', 'status'], shell=use_shell, capture_output=True)
33
+ if b"Not logged in" in check.stdout or check.returncode != 0:
34
+ click.echo(f"{Colors.YELLOW}You are not logged in to Netlify.{Colors.RESET}")
35
+ subprocess.run(['npx', '--yes', 'netlify-cli', 'login'], shell=use_shell)
36
+
37
+ name = click.prompt(f"{Colors.BLUE}Site Name (leave blank for auto){Colors.RESET}", default="")
38
+ click.echo(f"{Colors.CYAN}Deploying to Netlify...{Colors.RESET}")
39
+ cmd = ['npx', '--yes', 'netlify-cli', 'deploy', '--prod']
40
+ if name: cmd.extend(['--site', name])
41
+ subprocess.run(cmd, shell=use_shell)
42
+
43
+ elif provider == '3': # Render
44
+ hook = click.prompt(f"{Colors.BLUE}Enter Render Deploy Hook URL{Colors.RESET}", default="")
45
+ if hook:
46
+ subprocess.run(['curl', '-X', 'POST', hook], shell=use_shell)
47
+ click.echo(f"\n{Colors.GREEN}✅ Deployment triggered on Render!{Colors.RESET}")
48
+ else:
49
+ click.echo(f"{Colors.YELLOW}Render requires a Deploy Hook.{Colors.RESET}")
50
+
51
+ @click.command()
52
+ def login():
53
+ """Login to provider"""
54
+ click.echo(f"{Colors.CYAN}Logging in to Vercel...{Colors.RESET}")
55
+ subprocess.run(['npx', 'vercel', 'login'], shell=os.name == 'nt')
56
+
57
+ @click.command()
58
+ def logout():
59
+ """Logout from provider"""
60
+ click.echo(f"{Colors.CYAN}Logging out of Vercel...{Colors.RESET}")
61
+ subprocess.run(['npx', 'vercel', 'logout'], shell=os.name == 'nt')
62
+ click.echo(f"{Colors.GREEN}✅ Logged out{Colors.RESET}")
63
+
64
+ @click.command()
65
+ def live():
66
+ """Check live status"""
67
+ click.echo(f"{Colors.CYAN}Checking deployment status...{Colors.RESET}")
68
+ subprocess.run(['npx', 'vercel', 'ls'], shell=os.name == 'nt')
69
+
70
+ @click.command()
71
+ def env_push():
72
+ """Push environment variables"""
73
+ click.echo(f"{Colors.CYAN}Pushing .env to Vercel...{Colors.RESET}")
74
+ subprocess.run(['npx', 'vercel', 'env', 'pull'], shell=os.name == 'nt')
75
+ click.echo(f"{Colors.GREEN}✅ Done{Colors.RESET}")
76
+
77
+ @click.command()
78
+ def logs():
79
+ """View application logs"""
80
+ click.echo(f"{Colors.CYAN}Tailing Vercel logs...{Colors.RESET}")
81
+ subprocess.run(['npx', 'vercel', 'logs'], shell=os.name == 'nt')
@@ -0,0 +1,36 @@
1
+ import click, os
2
+ from pathlib import Path
3
+ from ..config import Colors
4
+
5
+ @click.command()
6
+ @click.argument('lang', type=click.Choice(['node', 'python', 'go', 'rust', 'flutter']))
7
+ def ignore(lang):
8
+ """Generate .gitignore for a language"""
9
+ import requests
10
+ url = f"https://raw.githubusercontent.com/github/gitignore/master/{lang.capitalize()}.gitignore"
11
+ try:
12
+ res = requests.get(url)
13
+ Path('.gitignore').write_text(res.text)
14
+ click.echo(f"{Colors.GREEN}✅ .gitignore for {lang} created{Colors.RESET}")
15
+ except:
16
+ click.echo(f"{Colors.RED}Could not fetch gitignore{Colors.RESET}")
17
+
18
+ @click.command()
19
+ def license():
20
+ """Add MIT License to project"""
21
+ name = click.prompt("Your Name")
22
+ year = os.datetime.now().year if hasattr(os, 'datetime') else 2026
23
+ mit = f"""MIT License
24
+
25
+ Copyright (c) {year} {name}
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining a copy..."""
28
+ Path('LICENSE').write_text(mit)
29
+ click.echo(f"{Colors.GREEN}✅ LICENSE (MIT) created{Colors.RESET}")
30
+
31
+ @click.command()
32
+ def readme():
33
+ """Generate a beautiful README template"""
34
+ content = "# Project Name\n\n## Description\n...\n\n## Installation\n```bash\n...\n```"
35
+ Path('README.md').write_text(content)
36
+ click.echo(f"{Colors.GREEN}✅ README.md created{Colors.RESET}")