From 7ce8764832d0763e506a8823318517c6b1ab7602 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:27:23 +0000 Subject: [PATCH 1/6] Initial plan From 8d568360d806a31c701ccfd0350b6dfdb81f5fb4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:31:27 +0000 Subject: [PATCH 2/6] Initialize Copilot instructions setup plan Co-authored-by: talltechy <43618761+talltechy@users.noreply.github.com> --- tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 166 bytes .../conftest.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 10383 bytes ...standardization.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 13555 bytes .../test_auth.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 24998 bytes .../test_client.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 36665 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 178 bytes .../test_assets.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 30559 bytes .../test_base.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 30354 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc create mode 100644 tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc create mode 100644 tests/__pycache__/test_auth.cpython-312-pytest-8.4.2.pyc create mode 100644 tests/__pycache__/test_client.cpython-312-pytest-8.4.2.pyc create mode 100644 tests/test_rapid7/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/test_rapid7/__pycache__/test_assets.cpython-312-pytest-8.4.2.pyc create mode 100644 tests/test_rapid7/__pycache__/test_base.cpython-312-pytest-8.4.2.pyc diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a9960157bb75b6122e57fab9d13a31baf57d39b GIT binary patch literal 166 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d805179e6bad18414a8a7b8e025b4f5b6e1ab55 GIT binary patch literal 13555 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 bVm~*Z_HJ}1K5-$qxu@0Lc-@77J^cRzlqluB literal 0 HcmV?d00001 diff --git a/tests/test_rapid7/__pycache__/__init__.cpython-312.pyc b/tests/test_rapid7/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db3c0ac2866a08c246519fa42b93f99bac3f9e74 GIT binary patch literal 178 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 f{~>MpYiZj Date: Mon, 13 Oct 2025 20:33:55 +0000 Subject: [PATCH 3/6] Add comprehensive GitHub Copilot instructions and clean up cache files Co-authored-by: talltechy <43618761+talltechy@users.noreply.github.com> --- .github/copilot-instructions.md | 486 ++++++++++++++++++++++++++++++++ 1 file changed, 486 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..9927121 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,486 @@ +# GitHub Copilot Instructions for InsightVM-Python + +This document provides guidance for GitHub Copilot when working with the InsightVM-Python repository. + +## Project Overview + +InsightVM-Python is a modern Python client library for Rapid7 InsightVM and Palo Alto Cortex XDR APIs. The project follows industry-standard patterns with comprehensive type hints and clean, intuitive interfaces. + +**Version:** 2.0.0 +**Python Support:** 3.8+ +**Architecture:** BaseAPI inheritance pattern with unified client interface + +## Project Structure + +``` +insightvm-python/ +├── src/rapid7/ # Main package +│ ├── __init__.py # Public API exports +│ ├── auth.py # Authentication classes (InsightVMAuth, PlatformAuth) +│ ├── client.py # InsightVMClient (main entry point) +│ ├── config.py # Configuration management +│ ├── constants.py # API constants +│ ├── ui.py # User interface utilities +│ ├── api/ # API modules +│ │ ├── base.py # BaseAPI foundation class +│ │ ├── assets.py # Asset operations +│ │ ├── asset_groups.py # Asset group operations +│ │ ├── scans.py # Scan management +│ │ ├── reports.py # Report generation +│ │ ├── sites.py # Site management +│ │ ├── scan_engines.py # Scan engine management +│ │ ├── scan_templates.py # Template management +│ │ └── sonar_queries.py # Sonar integration +│ └── tools/ # Standalone utility scripts +├── src/paloalto/ # Palo Alto Cortex XDR package +├── docs/ # Documentation +├── tests/ # Test suite +│ ├── conftest.py # Shared pytest fixtures +│ ├── test_*.py # Test modules +│ └── test_rapid7/ # API-specific tests +└── requirements.txt # Dependencies +``` + +## Development Setup + +### Environment Setup + +```bash +# Create virtual environment +python3 -m venv .venv +source .venv/bin/activate # On Windows: .venv\Scripts\activate + +# Install dependencies +pip install -r requirements.txt + +# Configure environment +cp .env.example .env +# Edit .env with credentials +``` + +### Required Environment Variables + +```bash +INSIGHTVM_API_USERNAME=your_username +INSIGHTVM_API_PASSWORD=your_password +INSIGHTVM_BASE_URL=https://your-console:3780 +INSIGHTVM_VERIFY_SSL=false # For self-signed certificates +``` + +## Coding Standards + +### Python Style Guide + +Follow **PEP 8** with these modifications: +- **Line length:** 100 characters (not 79) +- **Imports:** Group by standard library, third-party, local +- **Docstrings:** Google style for all public methods +- **Type hints:** Required for all functions and methods + +### Type Hints + +All functions **must** include type hints: + +```python +from typing import Dict, List, Optional, Any + +def list_assets( + page: int = 0, + size: int = 500, + sort: Optional[List[str]] = None +) -> Dict[str, Any]: + """List assets with pagination.""" + pass +``` + +### Docstring Format + +Use **Google-style docstrings** for all public functions, classes, and methods: + +```python +def example_function(param1: str, param2: int) -> bool: + """ + Brief description of function. + + Longer description if needed. Can span multiple + lines and include details about the function's + behavior. + + Args: + param1: Description of param1 + param2: Description of param2 + + Returns: + Description of return value + + Raises: + ValueError: When param1 is invalid + TypeError: When param2 is wrong type + + Example: + >>> example_function("test", 42) + True + """ + pass +``` + +### Code Formatting + +- **Formatter:** Use `black` for automatic formatting +- **Linter:** Use `flake8` for code quality +- **Type Checker:** Use `mypy` for static type checking + +```bash +# Format code +black src/ + +# Check formatting +black --check src/ + +# Lint code +flake8 --max-line-length=100 --ignore=E203,W503 src/ + +# Check types +mypy src/ +``` + +## Architecture Patterns + +### BaseAPI Inheritance + +All API modules **must** inherit from `BaseAPI`: + +```python +from typing import Dict, Any +from .base import BaseAPI + +class ExampleAPI(BaseAPI): + """ + Example API operations. + + This class provides methods for managing example resources. + """ + + # Define pagination limits + MAX_PAGE_SIZE = 500 + + def list(self, page: int = 0, size: int = 500) -> Dict[str, Any]: + """ + List all resources. + + Args: + page: Page number (0-indexed) + size: Number of items per page (max 500) + + Returns: + Dict with resources and pagination info + """ + size = min(size, self.MAX_PAGE_SIZE) + return self._request('GET', '/examples', params={'page': page, 'size': size}) +``` + +### Unified Client Pattern + +All API modules are accessed through the `InsightVMClient`: + +```python +# Client initialization +from rapid7 import InsightVMClient + +client = InsightVMClient() + +# API module access +client.assets.list() # Asset operations +client.scans.list() # Scan operations +client.reports.list() # Report operations +``` + +### Error Handling + +Use appropriate exception handling: + +```python +import requests + +try: + result = client.scans.start_site_scan(site_id=123) +except ValueError as e: + # Configuration errors + print(f"Configuration error: {e}") +except TimeoutError as e: + # Timeout errors + print(f"Operation timed out: {e}") +except requests.exceptions.RequestException as e: + # API errors + print(f"API error: {e}") +``` + +## Testing Requirements + +### Test Framework + +- **Framework:** pytest +- **Coverage:** pytest-cov +- **Minimum Coverage:** 70% +- **Target Coverage:** 80% + +### Running Tests + +```bash +# Run all tests +pytest + +# Run with coverage +pytest --cov=src --cov-report=html + +# Run specific test file +pytest tests/test_auth.py + +# Run verbose +pytest -v + +# Skip coverage (faster) +pytest --no-cov +``` + +### Writing Tests + +Create tests following the existing patterns: + +```python +# tests/test_example.py +import pytest +from rapid7 import InsightVMClient + +class TestExampleAPI: + """Test suite for Example API.""" + + def test_list_resources(self, mock_client): + """Test listing resources.""" + result = mock_client.examples.list(page=0, size=10) + + assert 'resources' in result + assert 'page' in result + assert len(result['resources']) <= 10 + + def test_get_resource(self, mock_client): + """Test getting single resource.""" + result = mock_client.examples.get(resource_id=123) + + assert result['id'] == 123 + assert 'name' in result +``` + +### Test Fixtures + +Use shared fixtures from `tests/conftest.py`: + +```python +def test_with_mock_auth(mock_auth): + """Test using mock authentication.""" + # mock_auth fixture provides pre-configured auth + pass + +def test_with_mock_client(mock_client): + """Test using mock client.""" + # mock_client fixture provides InsightVMClient with mocked responses + pass +``` + +## Documentation Standards + +### When to Update Documentation + +Update documentation when: +- Adding new API modules +- Adding new methods to existing modules +- Changing method signatures +- Adding new features or tools +- Changing configuration options +- Updating dependencies + +### Documentation Files + +- **README.md:** Project overview, quick start, features +- **CONTRIBUTING.md:** Development guidelines, coding standards +- **docs/API_REFERENCE.md:** Complete API documentation +- **docs/EXAMPLES.md:** Practical code examples +- **docs/[MODULE]_API.md:** Module-specific documentation + +### Docstring Requirements + +All public functions, classes, and methods **must** have: +- Brief description +- Args section (for parameters) +- Returns section +- Raises section (if applicable) +- Example section (for complex functions) + +## Adding New API Modules + +### Step-by-Step Process + +1. **Create Module File** in `src/rapid7/api/` +2. **Inherit from BaseAPI** +3. **Add to Client** in `src/rapid7/client.py` +4. **Export in __init__.py** in `src/rapid7/api/__init__.py` +5. **Add Tests** in `tests/test_rapid7/` +6. **Update Documentation** + +### Example Implementation + +```python +# 1. src/rapid7/api/examples.py +from typing import Dict, Any +from .base import BaseAPI + +class ExampleAPI(BaseAPI): + """Example API operations.""" + + MAX_PAGE_SIZE = 500 + + def list(self, page: int = 0, size: int = 500) -> Dict[str, Any]: + """List all examples.""" + size = min(size, self.MAX_PAGE_SIZE) + return self._request('GET', '/examples', params={'page': page, 'size': size}) + +# 2. src/rapid7/client.py +from .api.examples import ExampleAPI + +class InsightVMClient: + def __init__(self, ...): + # ... existing code ... + self.examples = ExampleAPI(self.auth, verify_ssl, timeout) + +# 3. src/rapid7/api/__init__.py +from .examples import ExampleAPI +__all__ = [..., 'ExampleAPI'] + +# 4. tests/test_rapid7/test_examples.py +def test_list_examples(): + client = InsightVMClient() + examples = client.examples.list() + assert 'resources' in examples +``` + +## CI/CD Workflows + +### GitHub Actions + +The project uses these workflows: +- **test-coverage.yml:** Run tests and upload coverage to Codacy +- **pylint.yml:** Static code analysis +- **bandit.yml:** Security scanning +- **dependency-review.yml:** Dependency vulnerability checks + +### Before Committing + +Always run: +```bash +# Format code +black src/ + +# Run tests +pytest + +# Check types +mypy src/ + +# Lint code +flake8 src/ +``` + +## Git Commit Guidelines + +### Branch Naming + +- `feature/short-description` - New features +- `bugfix/short-description` - Bug fixes +- `docs/short-description` - Documentation changes +- `refactor/short-description` - Code refactoring + +### Commit Messages + +Write clear, descriptive commit messages: + +``` +Short (50 chars or less) summary + +More detailed explanatory text, if necessary. Wrap it to +about 72 characters. Use present tense ("Add feature" not +"Added feature"). + +- Bullet points are okay +- Reference issues: "Fixes #123" or "Relates to #456" +``` + +## Common Patterns + +### Pagination + +```python +# Manual pagination +page1 = client.assets.list(page=0, size=500) +page2 = client.assets.list(page=1, size=500) + +# Auto-pagination +all_assets = client.assets.get_all(batch_size=500) +``` + +### SSL Configuration + +```python +# Disable SSL verification (self-signed certificates) +client = InsightVMClient(verify_ssl=False) + +# Enable SSL verification (default) +client = InsightVMClient(verify_ssl=True) +``` + +### Context Manager + +```python +# Recommended: Use context manager for proper cleanup +with InsightVMClient() as client: + assets = client.assets.list() + print(f"Found {len(assets['resources'])} assets") +``` + +## Important Notes + +### Breaking Changes in v2.0 + +- Replaced manual Base64 encoding with HTTPBasicAuth +- Unified client interface with sub-clients +- Sites API standardized with `SiteManagementTools` for advanced operations +- Scan Engines API methods renamed to avoid conflicts + +### Security Considerations + +- **Never commit credentials** - Use environment variables +- **Use HTTPS only** - All API communication must be secure +- **SSL verification** - Only disable for self-signed certificates in trusted environments +- **Secret management** - Use `.env` for development, secret management services for production + +### Performance Optimization + +- Use `MAX_PAGE_SIZE` constants (typically 500) +- Implement auto-pagination for large datasets +- Configure appropriate timeouts +- Use batch operations when available + +## Questions or Issues? + +If you have questions: +1. Check existing [documentation](docs/) +2. Search [issues](https://github.com/talltechy/insightvm-python/issues) +3. Review [CONTRIBUTING.md](CONTRIBUTING.md) +4. Open a [new issue](https://github.com/talltechy/insightvm-python/issues/new) + +## Related Documentation + +- [CONTRIBUTING.md](../CONTRIBUTING.md) - Development guidelines +- [README.md](../README.md) - Project overview +- [MIGRATION.md](../MIGRATION.md) - Upgrading from v1.0 +- [SECURITY.md](../SECURITY.md) - Security policy +- [docs/API_REFERENCE.md](../docs/API_REFERENCE.md) - Complete API docs From d387b8da586a7e3c3315a1de538f89d4c94300f3 Mon Sep 17 00:00:00 2001 From: Matt Wyen Date: Mon, 13 Oct 2025 16:59:38 -0400 Subject: [PATCH 4/6] docs(copilot): prefer Context7 for InsightVM API --- .github/copilot-instructions.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 9927121..5288ece 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -10,6 +10,16 @@ InsightVM-Python is a modern Python client library for Rapid7 InsightVM and Palo **Python Support:** 3.8+ **Architecture:** BaseAPI inheritance pattern with unified client interface +## Context Sources + +The repository integrates an external MCP knowledge source called "Context7" for up-to-date Rapid7 InsightVM API information. When generating, updating, or reviewing code that interacts with the InsightVM API, prefer Context7 as the primary reference for: +- Endpoint paths and HTTP methods +- Request and response payload shapes and fields +- Supported query parameters, filters, and operators +- Example requests, responses, and usage patterns + +Context7 MCP reference: `/riza/rapid7-insightvm-api-docs` (high-coverage snippets and a high trust score). Always validate generated code against the local `docs/` files and, where possible, test against a live InsightVM instance. + ## Project Structure ``` From 9b39fcac76394e37b341ef5023e13a9790d3cede Mon Sep 17 00:00:00 2001 From: Matt Wyen Date: Mon, 13 Oct 2025 17:09:10 -0400 Subject: [PATCH 5/6] chore: remove tracked compiled Python files --- tests/__pycache__/__init__.cpython-312.pyc | Bin 166 -> 0 bytes .../conftest.cpython-312-pytest-8.4.2.pyc | Bin 10383 -> 0 bytes ...standardization.cpython-312-pytest-8.4.2.pyc | Bin 13555 -> 0 bytes .../test_auth.cpython-312-pytest-8.4.2.pyc | Bin 24998 -> 0 bytes .../test_client.cpython-312-pytest-8.4.2.pyc | Bin 36665 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 0 bytes .../test_assets.cpython-312-pytest-8.4.2.pyc | Bin 30559 -> 0 bytes .../test_base.cpython-312-pytest-8.4.2.pyc | Bin 30354 -> 0 bytes 8 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 tests/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_auth.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_client.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/test_rapid7/__pycache__/__init__.cpython-312.pyc delete mode 100644 tests/test_rapid7/__pycache__/test_assets.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/test_rapid7/__pycache__/test_base.cpython-312-pytest-8.4.2.pyc diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7a9960157bb75b6122e57fab9d13a31baf57d39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 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 diff --git a/tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_api_standardization.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 8d805179e6bad18414a8a7b8e025b4f5b6e1ab55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13555 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 bVm~*Z_HJ}1K5-$qxu@0Lc-@77J^cRzlqluB diff --git a/tests/test_rapid7/__pycache__/__init__.cpython-312.pyc b/tests/test_rapid7/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index db3c0ac2866a08c246519fa42b93f99bac3f9e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 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 f{~>MpYiZj Date: Mon, 13 Oct 2025 17:15:32 -0400 Subject: [PATCH 6/6] chore: ignore .venv virtualenv directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4744d0f..16c4411 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ memory-bank/* /memory-bank/ # Pycharm venv/* +.venv/ ### Backup ### *.bak