max-cli 0.2.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.
Files changed (46) hide show
  1. max_cli-0.2.0/LICENSE +21 -0
  2. max_cli-0.2.0/PKG-INFO +632 -0
  3. max_cli-0.2.0/README.md +603 -0
  4. max_cli-0.2.0/pyproject.toml +42 -0
  5. max_cli-0.2.0/setup.cfg +4 -0
  6. max_cli-0.2.0/src/max_cli/__init__.py +0 -0
  7. max_cli-0.2.0/src/max_cli/common/cache.py +145 -0
  8. max_cli-0.2.0/src/max_cli/common/concurrent.py +83 -0
  9. max_cli-0.2.0/src/max_cli/common/exceptions.py +40 -0
  10. max_cli-0.2.0/src/max_cli/common/logger.py +22 -0
  11. max_cli-0.2.0/src/max_cli/common/logging.py +24 -0
  12. max_cli-0.2.0/src/max_cli/common/retry.py +51 -0
  13. max_cli-0.2.0/src/max_cli/common/utils.py +40 -0
  14. max_cli-0.2.0/src/max_cli/config.py +43 -0
  15. max_cli-0.2.0/src/max_cli/core/ai_engine.py +541 -0
  16. max_cli-0.2.0/src/max_cli/core/file_organizer.py +254 -0
  17. max_cli-0.2.0/src/max_cli/core/image_processor.py +139 -0
  18. max_cli-0.2.0/src/max_cli/core/media_engine.py +681 -0
  19. max_cli-0.2.0/src/max_cli/core/network_engine.py +103 -0
  20. max_cli-0.2.0/src/max_cli/core/pdf_engine.py +520 -0
  21. max_cli-0.2.0/src/max_cli/core/system_engine.py +57 -0
  22. max_cli-0.2.0/src/max_cli/interface/cli_ai.py +376 -0
  23. max_cli-0.2.0/src/max_cli/interface/cli_config.py +363 -0
  24. max_cli-0.2.0/src/max_cli/interface/cli_files.py +388 -0
  25. max_cli-0.2.0/src/max_cli/interface/cli_images.py +176 -0
  26. max_cli-0.2.0/src/max_cli/interface/cli_media.py +558 -0
  27. max_cli-0.2.0/src/max_cli/interface/cli_network.py +174 -0
  28. max_cli-0.2.0/src/max_cli/interface/cli_pdf.py +651 -0
  29. max_cli-0.2.0/src/max_cli/interface/cli_tools.py +60 -0
  30. max_cli-0.2.0/src/max_cli/main.py +91 -0
  31. max_cli-0.2.0/src/max_cli/plugins/__init__.py +4 -0
  32. max_cli-0.2.0/src/max_cli/plugins/base.py +39 -0
  33. max_cli-0.2.0/src/max_cli/plugins/manager.py +81 -0
  34. max_cli-0.2.0/src/max_cli.egg-info/PKG-INFO +632 -0
  35. max_cli-0.2.0/src/max_cli.egg-info/SOURCES.txt +44 -0
  36. max_cli-0.2.0/src/max_cli.egg-info/dependency_links.txt +1 -0
  37. max_cli-0.2.0/src/max_cli.egg-info/entry_points.txt +2 -0
  38. max_cli-0.2.0/src/max_cli.egg-info/requires.txt +21 -0
  39. max_cli-0.2.0/src/max_cli.egg-info/top_level.txt +1 -0
  40. max_cli-0.2.0/tests/test_cli_images.py +68 -0
  41. max_cli-0.2.0/tests/test_core_ai.py +203 -0
  42. max_cli-0.2.0/tests/test_core_file_organizer.py +110 -0
  43. max_cli-0.2.0/tests/test_core_images.py +42 -0
  44. max_cli-0.2.0/tests/test_core_media.py +171 -0
  45. max_cli-0.2.0/tests/test_core_network.py +134 -0
  46. max_cli-0.2.0/tests/test_core_pdf.py +140 -0
max_cli-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Abubakr Alsheikh
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.
max_cli-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,632 @@
1
+ Metadata-Version: 2.4
2
+ Name: max-cli
3
+ Version: 0.2.0
4
+ Summary: The Local, Fast, & Lazy Terminal Assistant for high-performance tasks.
5
+ Author-email: Abubakr Alsheikh <abubakralsheikh@outlook.com>
6
+ Requires-Python: >=3.9
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: typer>=0.12.0
10
+ Requires-Dist: rich>=13.0.0
11
+ Requires-Dist: shellingham>=1.5.0
12
+ Requires-Dist: pillow>=10.0.0
13
+ Requires-Dist: pymupdf>=1.22.0
14
+ Requires-Dist: pydantic-settings>=2.0.0
15
+ Requires-Dist: openai>=1.0.0
16
+ Requires-Dist: requests>=2.31.0
17
+ Requires-Dist: yt-dlp>=2023.0.0
18
+ Requires-Dist: segno>=1.5.0
19
+ Requires-Dist: pyperclip>=1.8.0
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
22
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
23
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
24
+ Requires-Dist: mkdocs>=1.5.0; extra == "dev"
25
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "dev"
26
+ Provides-Extra: ocr
27
+ Requires-Dist: pytesseract>=0.3.10; extra == "ocr"
28
+ Dynamic: license-file
29
+
30
+ # Max CLI ⚑
31
+
32
+ [![PyPI Version](https://img.shields.io/pypi/v/max-cli.svg)](https://pypi.org/project/max-cli/)
33
+ [![Python Version](https://img.shields.io/pypi/pyversions/max-cli.svg)](https://pypi.org/project/max-cli/)
34
+ [![License](https://img.shields.io/pypi/l/max-cli.svg)](https://github.com/Abubakr-Alsheikh/max-cli/blob/main/LICENSE)
35
+ [![Build Status](https://github.com/Abubakr-Alsheikh/max-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/Abubakr-Alsheikh/max-cli/actions)
36
+ [![Documentation](https://img.shields.io/badge/docs-MkDocs-blue)](https://Abubakr-Alsheikh.github.io/max-cli/)
37
+
38
+ > **Your Lazy, Fast Terminal Assistant That Does the Work for You.**
39
+
40
+ Max transforms complex tasksβ€”like compressing videos, merging PDFs, or downloading from YouTubeβ€”into simple commands you can actually remember. Whether you're a casual user or a seasoned developer, Max speaks your language.
41
+
42
+ ---
43
+
44
+ ## πŸ“š Documentation
45
+
46
+ **Full docs:** https://Abubakr-Alsheikh.github.io/max-cli/
47
+
48
+ **Quick links:**
49
+ - [Installation](https://Abubakr-Alsheikh.github.io/max-cli/installation/)
50
+ - [Usage](https://Abubakr-Alsheikh.github.io/max-cli/usage/)
51
+ - [Commands](https://Abubakr-Alsheikh.github.io/max-cli/commands/)
52
+ - [API Reference](https://Abubakr-Alsheikh.github.io/max-cli/api/)
53
+ - [Contributing](https://Abubakr-Alsheikh.github.io/max-cli/contributing/)
54
+
55
+ ---
56
+
57
+ ## πŸ€” What Can Max Do?
58
+
59
+ | Task | Max Command | Example |
60
+ |------|-------------|---------|
61
+ | **Compress videos** | `max video compress` | `max video compress movie.mp4` |
62
+ | **Convert video to audio** | `max video to-audio` | `max video to-audio podcast.mp4` |
63
+ | **Download videos/music** | `max grab` | `max grab "youtube.com/..."` |
64
+ | **Merge PDFs** | `max pdf bundle` | `max pdf bundle contracts/` |
65
+ | **Compress images** | `max img compress` | `max img compress photos/` |
66
+ | **Resize images** | `max img resize` | `max img resize logo.png --width 800` |
67
+ | **Ask AI anything** | `max ai ask` | `max ai ask "Merge and Compress those pdf files"` |
68
+ | **Generate images** | `max ai create` | `max ai create "A cat on a bike"` |
69
+ | **Organize files** | `max files smart-sort` | `max files smart-sort downloads/` |
70
+
71
+ ---
72
+
73
+ ## πŸš€ Quick Start (5 Minutes)
74
+
75
+ ### Step 1: Install Python
76
+
77
+ Max runs on Python. If you don't have it:
78
+
79
+ - **Windows:** Download from [python.org](https://python.org) (check "Add to PATH")
80
+ - **Mac:** Open Terminal and run: `brew install python`
81
+ - **Linux:** `sudo apt install python3`
82
+
83
+ ### Step 2: Install FFmpeg (For Video/Audio)
84
+
85
+ Max needs FFmpeg to process videos. Don't worry, it's easy:
86
+
87
+ ```bash
88
+ # Mac
89
+ brew install ffmpeg
90
+
91
+ # Windows (run in PowerShell or Command Prompt)
92
+ winget install Gyan.FFmpeg
93
+
94
+ # Linux
95
+ sudo apt install ffmpeg
96
+ ```
97
+
98
+ ### Step 3: Install Max
99
+
100
+ ```bash
101
+ # Clone and install
102
+ git clone https://github.com/Abubakr-Alsheikh/max-cli.git
103
+ cd max-cli
104
+ pip install -e .
105
+ ```
106
+
107
+ ### Step 4: Configure AI (Optional but Recommended)
108
+
109
+ Max's AI features need an API key. The easiest setup:
110
+
111
+ ```bash
112
+ max config setup
113
+ ```
114
+
115
+ This wizard will guide you through:
116
+
117
+ - Choosing your AI provider (Google Gemini, OpenAI, or custom)
118
+ - Entering your API key
119
+ - Setting preferences
120
+
121
+ **Get a free API key:**
122
+
123
+ - [Google AI Studio](https://aistudio.google.com/app/apikey) - Free tier available
124
+ - [OpenAI](https://platform.openai.com/api-keys) - Pay-as-you-go
125
+
126
+ ### Step 5: Start Using Max
127
+
128
+ ```bash
129
+ # See all available commands
130
+ max --help
131
+
132
+ # Download a video
133
+ max grab "https://youtube.com/watch?v=..."
134
+
135
+ # Compress a video
136
+ max video compress mymovie.mp4
137
+
138
+ # Compress images in a folder
139
+ max img compress ./photos
140
+ ```
141
+
142
+ ---
143
+
144
+ ## πŸ“– User Guide
145
+
146
+ ### πŸŽ₯ Video & Audio
147
+
148
+ #### Compress Video (Shrink File Size)
149
+
150
+ ```bash
151
+ # Simple compression
152
+ max video compress video.mp4
153
+
154
+ # High quality compression
155
+ max video compress video.mp4 --preset high
156
+
157
+ # Specific quality (1-100)
158
+ max video compress video.mp4 -q 75
159
+ ```
160
+
161
+ #### Convert Video to Audio
162
+
163
+ ```bash
164
+ # To MP3 (default, high quality)
165
+ max video to-audio lecture.mp4
166
+
167
+ # To WAV (lossless, for editing)
168
+ max video to-audio lecture.mp4 --format wav
169
+
170
+ # To MP3 320kbps
171
+ max video to-audio lecture.mp4 -q x
172
+ ```
173
+
174
+ #### Trim/Cut Video
175
+
176
+ ```bash
177
+ # Cut from 0:30 to 1:00
178
+ max video cut movie.mp4 --start 0:30 --end 1:00
179
+
180
+ # First 30 seconds only
181
+ max video cut movie.mp4 --duration 30
182
+ ```
183
+
184
+ #### Other Video Commands
185
+
186
+ ```bash
187
+ max video gif clip.mp4 # Convert to GIF
188
+ max video louder audio.mp4 --db 10 # Boost volume by 10dB
189
+ max video snap video.mp4 --time 1:30 # Take screenshot at 1:30
190
+ max video mute video.mp4 # Remove audio track
191
+ ```
192
+
193
+ ---
194
+
195
+ ### πŸ“„ PDF Documents
196
+
197
+ #### Merge PDFs
198
+
199
+ ```bash
200
+ # Merge all PDFs in a folder
201
+ max pdf bundle mydocs/
202
+
203
+ # Merge specific files
204
+ max pdf bundle file1.pdf file2.pdf
205
+ ```
206
+
207
+ #### Split PDF
208
+
209
+ ```bash
210
+ # Extract pages 1-5 and page 8
211
+ max pdf split document.pdf -p 1-5,8
212
+ ```
213
+
214
+ #### Compress PDF
215
+
216
+ ```bash
217
+ max pdf compress large.pdf
218
+ ```
219
+
220
+ #### Add Watermark
221
+
222
+ ```bash
223
+ max pdf stamp document.pdf "CONFIDENTIAL"
224
+ ```
225
+
226
+ #### Password Protect
227
+
228
+ ```bash
229
+ max pdf lock document.pdf
230
+ ```
231
+
232
+ ---
233
+
234
+ ### πŸ“₯ Downloading (YouTube, Spotify, etc.)
235
+
236
+ Download from almost any website:
237
+
238
+ ```bash
239
+ # Download video (best quality)
240
+ max grab "https://youtube.com/watch?v=..."
241
+
242
+ # Download audio only (MP3)
243
+ max grab "https://youtube.com/watch?v=..." -a
244
+
245
+ # Choose quality: s=480p, m=720p, h=1080p, x=4K
246
+ max grab "..." -q h
247
+
248
+ # Download a playlist
249
+ max grab "https://youtube.com/playlist?list=..."
250
+
251
+ # Download specific video from playlist
252
+ max grab "..." -i 3
253
+ ```
254
+
255
+ #### Quality Presets Explained
256
+
257
+ | Flag | Video Quality | Audio Quality | Best For |
258
+ |------|---------------|---------------|----------|
259
+ | `-q s` | 480p | 64kbps | Saving data |
260
+ | `-q m` | 720p | 128kbps | Phone viewing |
261
+ | `-q h` | 1080p | 192kbps | Desktop viewing |
262
+ | `-q x` | 4K | 320kbps | Best quality |
263
+
264
+ #### Save Your Download Preferences
265
+
266
+ ```bash
267
+ # Set your defaults once
268
+ max config grab
269
+
270
+ # Now just run:
271
+ max grab "url" # Uses your saved preferences
272
+ ```
273
+
274
+ ---
275
+
276
+ ### πŸ–Ό Images
277
+
278
+ #### Compress Images
279
+
280
+ ```bash
281
+ # Compress all images in folder (75% quality)
282
+ max img compress ./photos
283
+
284
+ # Compress single image
285
+ max img compress photo.jpg
286
+
287
+ # Force JPEG output
288
+ max img compress ./photos --jpeg
289
+
290
+ # Limit max dimension to 1080px
291
+ max img compress ./photos --max 1080
292
+ ```
293
+
294
+ #### Resize Images
295
+
296
+ ```bash
297
+ # Resize to specific width
298
+ max img resize image.png --width 800
299
+
300
+ # Resize to specific height
301
+ max img resize image.png --height 600
302
+
303
+ # Scale down by percentage
304
+ max img resize image.png --scale 50
305
+ ```
306
+
307
+ #### Convert Format
308
+
309
+ ```bash
310
+ # Convert to WebP (modern, smaller)
311
+ max img convert photo.jpg --to webp
312
+
313
+ # Convert to PNG
314
+ max img convert photo.png --to png
315
+ ```
316
+
317
+ #### Remove Metadata (Privacy)
318
+
319
+ ```bash
320
+ # Strip EXIF data (GPS, camera info, etc)
321
+ max img strip ./photos
322
+ ```
323
+
324
+ ---
325
+
326
+ ### πŸ€– AI Assistant
327
+
328
+ Max has a smart AI that understands what you want.
329
+
330
+ #### Ask Anything
331
+
332
+ ```bash
333
+ # Get help with a task
334
+ max ai ask "How do I compress this video?"
335
+
336
+ # In a folder with a file, just describe what you want
337
+ max ai ask "Make this image smaller"
338
+ # Max figures out which file you mean!
339
+ ```
340
+
341
+ #### Analyze Images
342
+
343
+ ```bash
344
+ # Analyze a screenshot
345
+ max ai analyze screenshot.png -p "What error is shown?"
346
+
347
+ # Extract data from receipt
348
+ max ai analyze receipt.jpg -p "What is the total amount?"
349
+ ```
350
+
351
+ #### Generate Images
352
+
353
+ ```bash
354
+ # Create from text description
355
+ max ai create "A cute cat sitting on a beach" -o cat.png
356
+
357
+ # Edit existing image
358
+ max ai edit photo.jpg "Add a sunset background" -o new_photo.jpg
359
+ ```
360
+
361
+ #### Chat Mode
362
+
363
+ ```bash
364
+ # Start an interactive conversation
365
+ max ai chat
366
+ ```
367
+
368
+ ---
369
+
370
+ ### πŸ“‚ File Management
371
+
372
+ #### Smart Sort (AI Organizer)
373
+
374
+ ```bash
375
+ # Automatically organize files into categories
376
+ max files smart-sort ./downloads
377
+
378
+ # Max reads filenames and sorts them into folders like:
379
+ # Invoices/, Images/, Documents/, etc.
380
+ ```
381
+
382
+ #### Rename Sequentially
383
+
384
+ ```bash
385
+ # Rename to 1_file, 2_file, etc.
386
+ max files order ./photos
387
+ ```
388
+
389
+ ---
390
+
391
+ ### πŸ”§ System Tools
392
+
393
+ ```bash
394
+ # Generate QR code from URL
395
+ max share "https://example.com"
396
+
397
+ # Copy file contents to clipboard
398
+ max copy file.txt
399
+
400
+ # Save clipboard image to file
401
+ max paste screenshot.png
402
+ ```
403
+
404
+ ---
405
+
406
+ ## βš™οΈ Configuration
407
+
408
+ ### Setting Up Your API Key
409
+
410
+ The easiest way:
411
+
412
+ ```bash
413
+ max config setup
414
+ ```
415
+
416
+ ### Manual Configuration
417
+
418
+ Create a `.env` file in your project folder:
419
+
420
+ ```ini
421
+ # For Google Gemini (recommended - has free tier)
422
+ OPENAI_API_KEY=your_api_key_here
423
+ OPENAI_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai/
424
+ AI_MODEL=gemini-1.5-flash
425
+ AI_IMAGE_MODEL=gemini-2.0-flash-exp
426
+
427
+ # For OpenAI
428
+ OPENAI_API_KEY=sk-...
429
+ OPENAI_BASE_URL=https://api.openai.com/v1
430
+ AI_MODEL=gpt-4o-mini
431
+
432
+ # Default settings
433
+ DEFAULT_QUALITY=80
434
+ GRAB_QUALITY=h
435
+ GRAB_AUDIO_FORMAT=mp3
436
+ ```
437
+
438
+ ### Configuration Locations
439
+
440
+ - **Global:** `~/.max_config.env` - Applied everywhere
441
+ - **Local:** `.env` - Applied to current folder
442
+
443
+ Local settings override global settings.
444
+
445
+ ### Other Config Commands
446
+
447
+ ```bash
448
+ max config show # View current configuration
449
+ max config grab # Configure downloader defaults
450
+ max config save # Save local settings as global defaults
451
+ ```
452
+
453
+ ---
454
+
455
+ ## πŸ’‘ Tips & Tricks
456
+
457
+ ### Working with Folders
458
+
459
+ Most commands work on folders too:
460
+
461
+ ```bash
462
+ # Compress ALL images in a folder
463
+ max img compress ./videos
464
+
465
+ # Merge ALL PDFs in a folder
466
+ max pdf bundle ./documents
467
+ ```
468
+
469
+ ### Default Directory
470
+
471
+ If you don't specify a path, Max uses the current folder:
472
+
473
+ ```bash
474
+ cd ./myphotos
475
+ max img compress # Compresses everything in myphotos
476
+ ```
477
+
478
+ ### Chain Commands
479
+
480
+ You can run multiple commands:
481
+
482
+ ```bash
483
+ # Merge PDFs then compress
484
+ max pdf bundle ./docs && max pdf compress merged.pdf
485
+ ```
486
+
487
+ ### Get Help
488
+
489
+ ```bash
490
+ # See all commands
491
+ max --help
492
+
493
+ # See help for specific command
494
+ max video --help
495
+ max img --help
496
+ max pdf --help
497
+ ```
498
+
499
+ ---
500
+
501
+ ## πŸ†˜ Troubleshooting
502
+
503
+ ### "FFmpeg not found"
504
+
505
+ Install FFmpeg (see Step 2 above) and restart your terminal.
506
+
507
+ ### "API key not found"
508
+
509
+ Run `max config setup` to configure your AI provider.
510
+
511
+ ### "Permission denied" (Windows)
512
+
513
+ Run Command Prompt as Administrator, or use a virtual environment.
514
+
515
+ ### Something else not working?
516
+
517
+ - Check: `max --version`
518
+ - Get help: `max --help`
519
+ - Report issues: [GitHub Issues](https://github.com/Abubakr-Alsheikh/max-cli/issues)
520
+
521
+ ---
522
+
523
+ ## πŸ”§ For Developers
524
+
525
+ ### Installation (Development Mode)
526
+
527
+ ```bash
528
+ # Clone
529
+ git clone https://github.com/Abubakr-Alsheikh/max-cli.git
530
+ cd max-cli
531
+
532
+ # Install with dev dependencies
533
+ pip install -e .[dev]
534
+
535
+ # Run tests
536
+ pytest tests/
537
+
538
+ # Lint code
539
+ ruff check .
540
+ ruff format .
541
+
542
+ # Type check
543
+ mypy src/
544
+ ```
545
+
546
+ ### Documentation
547
+
548
+ Full documentation is available at: https://Abubakr-Alsheikh.github.io/max-cli/
549
+
550
+ Local documentation development:
551
+
552
+ ```bash
553
+ # Install mkdocs
554
+ pip install mkdocs mkdocs-material
555
+
556
+ # Serve locally
557
+ mkdocs serve
558
+
559
+ # Build for production
560
+ mkdocs build
561
+ ```
562
+
563
+ ### Plugin System
564
+
565
+ Max CLI supports plugins for extensibility. Plugins are stored in:
566
+ - `~/.max_cli/plugins/` (user-level)
567
+ - `./plugins/` (project-level)
568
+
569
+ Example plugin structure:
570
+
571
+ ```python
572
+ from max_cli.plugins.base import CLIPlugin
573
+ import typer
574
+
575
+ class MyPlugin(CLIPlugin):
576
+ @property
577
+ def name(self) -> str:
578
+ return "my-plugin"
579
+
580
+ @property
581
+ def version(self) -> str:
582
+ return "1.0.0"
583
+
584
+ @property
585
+ def description(self) -> str:
586
+ return "My custom plugin"
587
+
588
+ def register(self, app: typer.Typer) -> None:
589
+ @app.command("my-command")
590
+ def my_command():
591
+ typer.echo("Hello from my plugin!")
592
+ ```
593
+
594
+ ### Architecture
595
+
596
+ ```
597
+ src/max_cli/
598
+ β”œβ”€β”€ core/ # Business logic (engines)
599
+ β”œβ”€β”€ interface/ # CLI commands (Typer)
600
+ β”œβ”€β”€ common/ # Shared utilities
601
+ └── __init__.py # Package exports
602
+ ```
603
+
604
+ ---
605
+
606
+ ## 🀝 Contributing
607
+
608
+ Found a bug or have a feature request?
609
+
610
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
611
+
612
+ 1. Open an issue: [GitHub Issues](https://github.com/Abubakr-Alsheikh/max-cli/issues)
613
+ 2. Fork the repo
614
+ 3. Submit a PR
615
+
616
+ ---
617
+
618
+ ## πŸ“„ License
619
+
620
+ MIT License - Free to use, modify, and distribute.
621
+
622
+ ---
623
+
624
+ ## πŸ™ Thank You
625
+
626
+ Max was built to make your life easier. If you find it useful, star the repo and share it with others!
627
+
628
+ Questions? Reach out or open an issue.
629
+
630
+ <div style="text-align: center;">
631
+ Build with πŸ’— to make life easier
632
+ </div>