pyneat-cli 2.4.0__tar.gz → 2.4.2__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.
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/PKG-INFO +29 -2
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/README.md +28 -1
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/__init__.py +1 -1
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/cli.py +25 -45
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/PKG-INFO +29 -2
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyproject.toml +1 -1
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/LICENSE +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/__main__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/benchmark.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/config.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/__init__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/atomic.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/engine.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/manifest.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/marker_cleanup.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/scope_guard.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/semantic_guard.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/type_shield.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/core/types.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/pre_commit.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/__init__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/ai_bugs.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/base.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/comments.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/conservative.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/dataclass.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/deadcode.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/debug.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/destructive.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/duplication.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/fstring.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/imports.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/init_protection.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/is_not_none.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/isolated.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/magic_numbers.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/match_case.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/naming.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/performance.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/quality.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/range_len_pattern.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/redundant.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/refactoring.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/safe.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/__init__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/critical.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/high.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/info.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/low.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_pack/medium.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/security_registry.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/typing.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/rules/unused.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/scanner/rust_scanner.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/__init__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/github_fuzz/__init__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/github_fuzz/__main__.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/github_fuzz/debug_logger.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/github_fuzz/fuzz_runner.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/github_fuzz/github_client.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/security/advisory_db.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/tools/security/dependency_scanner.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat/utils/naming.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/SOURCES.txt +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/dependency_links.txt +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/entry_points.txt +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/requires.txt +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/pyneat_cli.egg-info/top_level.txt +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/setup.cfg +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/setup.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_engine.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_fuzz.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_fuzz_github.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_integration.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_layers.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_rust_scanner.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_semantic_integrity.py +0 -0
- {pyneat_cli-2.4.0 → pyneat_cli-2.4.2}/tests/test_smoke.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyneat-cli
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.2
|
|
4
4
|
Summary: Neat Python AI Code Cleaner — removes AI-generated code artifacts, dead code, and security vulnerabilities
|
|
5
5
|
License: GNU AGPL-3.0-or-later
|
|
6
6
|
Keywords: ai,code-cleaner,python,linter,formatter,security,dead-code,refactoring,ast,auto-fix
|
|
@@ -32,7 +32,7 @@ Dynamic: license-file
|
|
|
32
32
|
|
|
33
33
|
# PyNeat: The Anti-Spaghetti Code Cleaner
|
|
34
34
|
|
|
35
|
-
**PyNeat 2.
|
|
35
|
+
**PyNeat 2.4.0** is an aggressive, AST-based Python code refactoring tool designed to clean up messy, legacy, or AI-generated code. Unlike standard formatters that only fix whitespace, PyNeat performs deep structural surgery on your logic in a single optimized pass using LibCST.
|
|
36
36
|
|
|
37
37
|
## Features
|
|
38
38
|
|
|
@@ -120,6 +120,33 @@ Aggressive rules that **may break code** — always review changes:
|
|
|
120
120
|
- `--backup` + `--in-place` — safe file modification
|
|
121
121
|
- `--export-manifest` — auto-export PYNAGENT manifest
|
|
122
122
|
|
|
123
|
+
### Interactive Feature Menu
|
|
124
|
+
After running `check` or `clean`, an interactive menu appears with smart suggestions:
|
|
125
|
+
- Shows 4-7 relevant features based on the last command
|
|
126
|
+
- Option names in English, descriptions in Vietnamese
|
|
127
|
+
- Press Enter or q to skip
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
131
|
+
│ EXPLORE MORE FEATURES │
|
|
132
|
+
└─────────────────────────────────────────────────────────────┘
|
|
133
|
+
|
|
134
|
+
[3] 🧹 Clean Code
|
|
135
|
+
Thêm type hints, xóa unused imports, số magic, debug prints...
|
|
136
|
+
→ pyneat clean file.py
|
|
137
|
+
|
|
138
|
+
[2] 📖 Explain Rule
|
|
139
|
+
Nguyên nhân, cách fix, CWE/OWASP, verification steps...
|
|
140
|
+
→ pyneat explain SEC-001
|
|
141
|
+
|
|
142
|
+
[4] 📊 Export Report (JSON/SARIF)
|
|
143
|
+
Tích hợp CI/CD: GitHub Code Scanning, GitLab SAST...
|
|
144
|
+
→ pyneat report . -f sarif -o security.sarif
|
|
145
|
+
|
|
146
|
+
[q] Exit - return to terminal
|
|
147
|
+
[Enter] Skip this menu
|
|
148
|
+
```
|
|
149
|
+
|
|
123
150
|
### Pre-commit + GitHub Actions
|
|
124
151
|
- Auto-generate `.pyneat.manifest.json` on commit
|
|
125
152
|
- CI/CD job for automated manifest export on push/PR
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PyNeat: The Anti-Spaghetti Code Cleaner
|
|
2
2
|
|
|
3
|
-
**PyNeat 2.
|
|
3
|
+
**PyNeat 2.4.0** is an aggressive, AST-based Python code refactoring tool designed to clean up messy, legacy, or AI-generated code. Unlike standard formatters that only fix whitespace, PyNeat performs deep structural surgery on your logic in a single optimized pass using LibCST.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -88,6 +88,33 @@ Aggressive rules that **may break code** — always review changes:
|
|
|
88
88
|
- `--backup` + `--in-place` — safe file modification
|
|
89
89
|
- `--export-manifest` — auto-export PYNAGENT manifest
|
|
90
90
|
|
|
91
|
+
### Interactive Feature Menu
|
|
92
|
+
After running `check` or `clean`, an interactive menu appears with smart suggestions:
|
|
93
|
+
- Shows 4-7 relevant features based on the last command
|
|
94
|
+
- Option names in English, descriptions in Vietnamese
|
|
95
|
+
- Press Enter or q to skip
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
99
|
+
│ EXPLORE MORE FEATURES │
|
|
100
|
+
└─────────────────────────────────────────────────────────────┘
|
|
101
|
+
|
|
102
|
+
[3] 🧹 Clean Code
|
|
103
|
+
Thêm type hints, xóa unused imports, số magic, debug prints...
|
|
104
|
+
→ pyneat clean file.py
|
|
105
|
+
|
|
106
|
+
[2] 📖 Explain Rule
|
|
107
|
+
Nguyên nhân, cách fix, CWE/OWASP, verification steps...
|
|
108
|
+
→ pyneat explain SEC-001
|
|
109
|
+
|
|
110
|
+
[4] 📊 Export Report (JSON/SARIF)
|
|
111
|
+
Tích hợp CI/CD: GitHub Code Scanning, GitLab SAST...
|
|
112
|
+
→ pyneat report . -f sarif -o security.sarif
|
|
113
|
+
|
|
114
|
+
[q] Exit - return to terminal
|
|
115
|
+
[Enter] Skip this menu
|
|
116
|
+
```
|
|
117
|
+
|
|
91
118
|
### Pre-commit + GitHub Actions
|
|
92
119
|
- Auto-generate `.pyneat.manifest.json` on commit
|
|
93
120
|
- CI/CD job for automated manifest export on push/PR
|
|
@@ -1468,13 +1468,13 @@ def show_feature_menu(last_command: str = "", context: str = "") -> None:
|
|
|
1468
1468
|
click.echo(" ────────────────────────────────────────────────────────────")
|
|
1469
1469
|
click.echo("")
|
|
1470
1470
|
|
|
1471
|
-
# Chờ input
|
|
1471
|
+
# Chờ input - giữ nguyên hoa/thường vì dùng phím A, B, C, D
|
|
1472
1472
|
try:
|
|
1473
|
-
choice = input(" Select option (Enter to exit): ").strip().
|
|
1473
|
+
choice = input(" Select option (Enter to exit): ").strip().upper()
|
|
1474
1474
|
except (EOFError, KeyboardInterrupt):
|
|
1475
|
-
choice = '
|
|
1475
|
+
choice = 'Q'
|
|
1476
1476
|
|
|
1477
|
-
if choice in ('
|
|
1477
|
+
if choice in ('Q', 'QUIT', 'EXIT', ''):
|
|
1478
1478
|
return
|
|
1479
1479
|
|
|
1480
1480
|
# Xử lý lựa chọn
|
|
@@ -1486,57 +1486,40 @@ def _get_menu_suggestions(last_command: str, context: str) -> Dict[str, tuple]:
|
|
|
1486
1486
|
|
|
1487
1487
|
Returns dict of {key: (icon, title, description, command_example)}
|
|
1488
1488
|
"""
|
|
1489
|
+
# Chữ cái A, B, C, D cố định - luôn hiển thị 4 lựa chọn liên tục
|
|
1489
1490
|
all_options = {
|
|
1490
|
-
|
|
1491
|
-
'1': ('🔒', 'Security Check',
|
|
1491
|
+
'A': ('🔒', 'Security Check',
|
|
1492
1492
|
'Quét lỗ hổng: SQL injection, path traversal, hardcoded secrets...',
|
|
1493
1493
|
'pyneat check file.py'),
|
|
1494
|
-
'
|
|
1494
|
+
'B': ('📖', 'Explain Rule',
|
|
1495
1495
|
'Nguyên nhân, cách fix, CWE/OWASP, verification steps...',
|
|
1496
1496
|
'pyneat explain SEC-001'),
|
|
1497
|
-
|
|
1498
|
-
# Làm sạch code
|
|
1499
|
-
'3': ('🧹', 'Clean Code',
|
|
1497
|
+
'C': ('🧹', 'Clean Code',
|
|
1500
1498
|
'Thêm type hints, xóa unused imports, số magic, debug prints...',
|
|
1501
1499
|
'pyneat clean file.py'),
|
|
1502
|
-
|
|
1503
|
-
# Báo cáo & CI/CD
|
|
1504
|
-
'4': ('📊', 'Export Report (JSON/SARIF)',
|
|
1500
|
+
'D': ('📊', 'Export Report (JSON/SARIF)',
|
|
1505
1501
|
'Tích hợp CI/CD: GitHub Code Scanning, GitLab SAST...',
|
|
1506
1502
|
'pyneat report . -f sarif -o security.sarif'),
|
|
1507
|
-
|
|
1508
|
-
# So sánh & Debug
|
|
1509
|
-
'5': ('🔍', 'View Diff',
|
|
1510
|
-
'So sánh code trước và sau khi làm sạch...',
|
|
1511
|
-
'pyneat clean file.py --diff'),
|
|
1512
|
-
|
|
1513
|
-
# Cấu hình
|
|
1514
|
-
'6': ('📋', 'View All Rules',
|
|
1515
|
-
'Trạng thái bật/tắt, severity, mô tả ngắn của mỗi rule...',
|
|
1516
|
-
'pyneat rules'),
|
|
1517
|
-
'7': ('⚙️', 'Configure & Optimize',
|
|
1518
|
-
'Bật/tắt rules, đặt ngưỡng, cấu hình package...',
|
|
1519
|
-
'pyneat rules --verbose'),
|
|
1520
1503
|
}
|
|
1521
1504
|
|
|
1522
|
-
# Smart suggestions dựa trên command vừa chạy
|
|
1505
|
+
# Smart suggestions dựa trên command vừa chạy - LUÔN dùng A, B, C, D
|
|
1523
1506
|
if last_command == 'check':
|
|
1524
|
-
# Sau check bảo mật → clean + explain + report
|
|
1525
|
-
ordered = ['
|
|
1507
|
+
# Sau check bảo mật → clean + explain + report + diff
|
|
1508
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1526
1509
|
elif last_command == 'clean':
|
|
1527
|
-
# Sau clean → check bảo mật + diff + report
|
|
1528
|
-
ordered = ['
|
|
1510
|
+
# Sau clean → check bảo mật + diff + report + config
|
|
1511
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1529
1512
|
elif last_command == 'explain':
|
|
1530
|
-
# Sau explain → check + clean + report
|
|
1531
|
-
ordered = ['
|
|
1513
|
+
# Sau explain → check + clean + report + diff
|
|
1514
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1532
1515
|
elif last_command == 'rules':
|
|
1533
|
-
# Sau rules → check + clean
|
|
1534
|
-
ordered = ['
|
|
1516
|
+
# Sau rules → check + clean + explain + report
|
|
1517
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1535
1518
|
elif last_command == 'report':
|
|
1536
|
-
# Sau report → check + clean
|
|
1537
|
-
ordered = ['
|
|
1519
|
+
# Sau report → check + clean + explain + config
|
|
1520
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1538
1521
|
else:
|
|
1539
|
-
ordered = ['
|
|
1522
|
+
ordered = ['A', 'B', 'C', 'D']
|
|
1540
1523
|
|
|
1541
1524
|
return {k: all_options[k] for k in ordered if k in all_options}
|
|
1542
1525
|
|
|
@@ -1544,13 +1527,10 @@ def _get_menu_suggestions(last_command: str, context: str) -> Dict[str, tuple]:
|
|
|
1544
1527
|
def _handle_menu_choice(choice: str, suggestions: Dict[str, tuple]) -> None:
|
|
1545
1528
|
"""Handle user's menu choice."""
|
|
1546
1529
|
choice_map = {
|
|
1547
|
-
'
|
|
1548
|
-
'
|
|
1549
|
-
'
|
|
1550
|
-
'
|
|
1551
|
-
'5': ('diff', 'pyneat clean file.py --diff --help'),
|
|
1552
|
-
'6': ('rules', 'pyneat rules --help'),
|
|
1553
|
-
'7': ('config', 'pyneat rules --help'),
|
|
1530
|
+
'A': ('check', 'pyneat check file.py --help'),
|
|
1531
|
+
'B': ('explain', 'pyneat explain --help'),
|
|
1532
|
+
'C': ('clean', 'pyneat clean file.py --help'),
|
|
1533
|
+
'D': ('report', 'pyneat report --help'),
|
|
1554
1534
|
}
|
|
1555
1535
|
|
|
1556
1536
|
if choice in choice_map:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyneat-cli
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.2
|
|
4
4
|
Summary: Neat Python AI Code Cleaner — removes AI-generated code artifacts, dead code, and security vulnerabilities
|
|
5
5
|
License: GNU AGPL-3.0-or-later
|
|
6
6
|
Keywords: ai,code-cleaner,python,linter,formatter,security,dead-code,refactoring,ast,auto-fix
|
|
@@ -32,7 +32,7 @@ Dynamic: license-file
|
|
|
32
32
|
|
|
33
33
|
# PyNeat: The Anti-Spaghetti Code Cleaner
|
|
34
34
|
|
|
35
|
-
**PyNeat 2.
|
|
35
|
+
**PyNeat 2.4.0** is an aggressive, AST-based Python code refactoring tool designed to clean up messy, legacy, or AI-generated code. Unlike standard formatters that only fix whitespace, PyNeat performs deep structural surgery on your logic in a single optimized pass using LibCST.
|
|
36
36
|
|
|
37
37
|
## Features
|
|
38
38
|
|
|
@@ -120,6 +120,33 @@ Aggressive rules that **may break code** — always review changes:
|
|
|
120
120
|
- `--backup` + `--in-place` — safe file modification
|
|
121
121
|
- `--export-manifest` — auto-export PYNAGENT manifest
|
|
122
122
|
|
|
123
|
+
### Interactive Feature Menu
|
|
124
|
+
After running `check` or `clean`, an interactive menu appears with smart suggestions:
|
|
125
|
+
- Shows 4-7 relevant features based on the last command
|
|
126
|
+
- Option names in English, descriptions in Vietnamese
|
|
127
|
+
- Press Enter or q to skip
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
131
|
+
│ EXPLORE MORE FEATURES │
|
|
132
|
+
└─────────────────────────────────────────────────────────────┘
|
|
133
|
+
|
|
134
|
+
[3] 🧹 Clean Code
|
|
135
|
+
Thêm type hints, xóa unused imports, số magic, debug prints...
|
|
136
|
+
→ pyneat clean file.py
|
|
137
|
+
|
|
138
|
+
[2] 📖 Explain Rule
|
|
139
|
+
Nguyên nhân, cách fix, CWE/OWASP, verification steps...
|
|
140
|
+
→ pyneat explain SEC-001
|
|
141
|
+
|
|
142
|
+
[4] 📊 Export Report (JSON/SARIF)
|
|
143
|
+
Tích hợp CI/CD: GitHub Code Scanning, GitLab SAST...
|
|
144
|
+
→ pyneat report . -f sarif -o security.sarif
|
|
145
|
+
|
|
146
|
+
[q] Exit - return to terminal
|
|
147
|
+
[Enter] Skip this menu
|
|
148
|
+
```
|
|
149
|
+
|
|
123
150
|
### Pre-commit + GitHub Actions
|
|
124
151
|
- Auto-generate `.pyneat.manifest.json` on commit
|
|
125
152
|
- CI/CD job for automated manifest export on push/PR
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyneat-cli"
|
|
7
|
-
version = "2.4.
|
|
7
|
+
version = "2.4.2"
|
|
8
8
|
description = "Neat Python AI Code Cleaner — removes AI-generated code artifacts, dead code, and security vulnerabilities"
|
|
9
9
|
license = {text = "GNU AGPL-3.0-or-later"}
|
|
10
10
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|