Skip to content

docs: documentation improvements: - #3

Merged
JustAGhosT merged 30 commits into
mainfrom
feat/docs-updated
Jul 30, 2025
Merged

docs: documentation improvements:#3
JustAGhosT merged 30 commits into
mainfrom
feat/docs-updated

Conversation

@JustAGhosT

@JustAGhosT JustAGhosT commented Jul 28, 2025

Copy link
Copy Markdown
Owner
  • Added new comprehensive documentation files:

    • API-REFERENCE.md: Detailed function reference for all modules
    • CHANGELOG.md: Version history and release notes
    • DEVELOPMENT.md: Development environment setup and guidelines
    • GITHUB-INTEGRATION.md: GitHub Actions and deployment workflows
    • TESTING.md: Testing framework and procedures
    • TROUBLESHOOTING.md: Common issues and solutions
  • Reorganized directory structure:

    • Moved utility scripts to tools/ directory
    • Organized docs/ into logical subdirectories
    • Relocated markdown_lint to tools/ directory
    • Improved test organization
  • Enhanced existing documentation:

    • Updated README with current costs and features
    • Expanded security checklist with GitHub and CI/CD security
    • Modernized testing approach and documentation
  • Code improvements:

    • Fixed potential ReDoS vulnerability in markdown linter
    • Updated test runner script
    • Improved project organization for better maintainability
  • Added GitHub integration features:

    • Workflows for testing, deployment, and code quality
    • OIDC federation support for secure authentication
    • Repository deployment capabilities

This restructuring improves maintainability, enhances documentation, and prepares the project for future development.

➕ What does this PR do?

🔨 Changes

  • Feature / enhancement
  • Bug fix
  • Chore / refactor

✅ Checklist

  • Tests added/updated
  • Docs updated (or NA)
  • No secrets in diff
  • Linked to issue #____
  • Screenshots / GIF added (UI changes)

🗒 Notes for reviewer

Summary by CodeRabbit

  • New Features

    • Added a comprehensive Markdown linter tool with CLI, auto-fix, and pre-commit integration.
    • Introduced detailed API reference, testing, troubleshooting, GitHub integration, and development guides.
    • Launched a main application loop function for HomeLab management with debug mode support.
  • Enhancements

    • Expanded and reorganized documentation for modules, architecture, and security practices.
    • Improved user prompts, input validation, and error handling across scripts.
    • Updated documentation links and formatting for clarity and consistency.
    • Enhanced test scripts with better directory validation, error reporting, and integration test inclusion.
    • Refined module import and initialization logic for robustness.
    • Added Mermaid.js integration for diagram rendering in documentation.
    • Improved diagnostic tool wrappers and cleanup for better error handling and logging.
  • Bug Fixes

    • Corrected environment variable names and documentation file paths.
    • Fixed PowerShell syntax errors and enhanced prompt input validation.
    • Resolved issues with module availability checks and logging initialization.
  • Removals

    • Deleted outdated deployment and testing strategy guides, consolidating information into new documentation.
    • Removed GitHub Secrets and website deployment guides replaced by integrated GitHub workflow documentation.
  • Style

    • Reformatted markdown tables and code for improved readability.
    • Updated HTML includes and navigation links for security and consistency.
    • Adjusted PowerShell script formatting and alignment for clarity.
  • Chores

    • Updated .gitignore to exclude Python build artifacts.
    • Added Python package requirements for the markdown linter.
    • Added new optional parameters to module import and availability test functions for flexibility.

- Added new comprehensive documentation files:
  - API-REFERENCE.md: Detailed function reference for all modules
  - CHANGELOG.md: Version history and release notes
  - DEVELOPMENT.md: Development environment setup and guidelines
  - GITHUB-INTEGRATION.md: GitHub Actions and deployment workflows
  - TESTING.md: Testing framework and procedures
  - TROUBLESHOOTING.md: Common issues and solutions

- Reorganized directory structure:
  - Moved utility scripts to tools/ directory
  - Organized docs/ into logical subdirectories
  - Relocated markdown_lint to tools/ directory
  - Improved test organization

- Enhanced existing documentation:
  - Updated README with current costs and features
  - Expanded security checklist with GitHub and CI/CD security
  - Modernized testing approach and documentation

- Code improvements:
  - Fixed potential ReDoS vulnerability in markdown linter
  - Updated test runner script
  - Improved project organization for better maintainability

- Added GitHub integration features:
  - Workflows for testing, deployment, and code quality
  - OIDC federation support for secure authentication
  - Repository deployment capabilities

This restructuring improves maintainability, enhances documentation, and prepares the project for future development.
@coderabbitai

coderabbitai Bot commented Jul 28, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

This set of changes introduces a comprehensive markdown linting and fixing tool, including a Python CLI, linter engine, pre-commit hook, requirements, and supporting utilities. It also updates documentation, project structure, and code to reflect new features, improved robustness, and enhanced workflows for documentation, testing, and module management. Numerous documentation files are added, updated, moved, or deleted for clarity and organization.

Changes

Cohort / File(s) Change Summary
Markdown Linter Tooling (Python CLI, Engine, Utilities)
tools/markdown_lint/cli.py, tools/markdown_lint/linter.py, tools/markdown_lint/find_markdown_files.py, tools/markdown_lint/pre-commit-hook.py, tools/markdown_lint/__init__.py, tools/markdown_lint/requirements.txt, tools/markdown_lint/setup.py
Introduces a full-featured markdown linter and fixer: CLI for linting/fixing, linter engine with rules, file finder, pre-commit hook, version export, requirements, and setup script.
Markdown Lint Documentation
tools/markdown_lint/README.md
Updates usage instructions, repository URL, and formatting for the markdown linter.
Python Artifacts Ignore
.gitignore
Adds ignores for Python build artifacts and related files.
Changelog and Release Documentation
CHANGELOG.md, docs/CHANGELOG.md
Revises main changelog, adds detailed docs changelog using keep-a-changelog format.
API Reference and New Docs
docs/API-REFERENCE.md, docs/DEVELOPMENT.md, docs/GITHUB-INTEGRATION.md, docs/TESTING.md, docs/TROUBLESHOOTING.md
Adds comprehensive API reference, development, GitHub integration, testing, and troubleshooting guides.
Testing Documentation Restructure
docs/TESTING-STRATEGY.md, docs/HOW-TO-DEPLOY-WEBSITES.md
Deletes detailed testing strategy and website deployment guides (content replaced elsewhere).
Documentation Table Formatting
docs/TESTING-STRATEGY-DETAILED.md, docs/diagrams/network-security.md
Improves markdown table formatting for clarity and alignment.
Documentation Link and Path Updates
docs/index.md, docs/SETUP.md, docs/background/main-overview.md, docs/background/why-build.md, docs/diagrams/README.md, docs/bicep/vpn-gateway.md, docs/personal/my-home-setup/centralized-docking-station.md, docs/personal/my-home-setup/software-kvm-alternatives.md, docs/testing/TESTING-IMPLEMENTATION.md
Updates documentation links, file paths, and minor content for consistency and new structure.
Security and Certificate Docs
docs/security/client-certificate-management.md, docs/networking/vpn-gateway.md, docs/SECURITY-CHECKLIST.md
Updates certificate export/revocation instructions, VPN deployment examples, and security checklist for new features and best practices.
Mermaid Diagram Integration
docs/_includes/head.html
Adds Mermaid.js support for rendering diagrams in documentation.
Documentation Layout and Navigation
docs/_layouts/default.html
Updates navigation links and stylesheet security attributes.
Module and Core README Updates
README.md, HomeLab/modules/HomeLab.Core/README.md
Expands project and module documentation for new features, structure, and usage.
Main Module and Environment Initialization
HomeLab/HomeLab.psm1, HomeLab/functions/Initialize-Environment.ps1, HomeLab/functions/Import-RequiredModules.ps1, HomeLab/functions/Test-ModuleAvailability.ps1
Improves formatting, robustness, environment variable handling, and error messaging for module loading and environment setup.
Testing and Test Runner Scripts
tests/Run-HomeLab-Tests.ps1, tests/unit/Run-UnitTests.ps1, tools/Test-HomeLab.ps1
Adds directory validation, improved error handling, and clearer output in test runners.
Azure Connection Prompt Robustness
HomeLab/functions/Get-AzureConnection.ps1, tools/functions/Get-AzureConnection.ps1
Enhances user prompt with input validation for connecting to Azure.
Module Import and Availability Functions
tools/functions/Import-RequiredModules.ps1, tools/functions/Test-ModuleAvailability.ps1
Adds checks for required modules, new parameters, and improved user feedback.
Splash Screen and Main Loop Enhancements
tools/functions/Show-Splashscreen.ps1, tools/functions/Wait-BeforeSplash.ps1, tools/functions/Start-MainLoop.ps1
Adds splash screen options, input validation, and a new exported main loop function with debug support.
Environment and Logging Initialization
tools/functions/Initialize-Environment.ps1
Corrects environment variable names, improves error handling, and aligns formatting.
Documentation Handler Update
HomeLab/modules/HomeLab.UI/Public/Handlers/6-DocumentationHandler.ps1
Updates VPN Gateway documentation file path lookup logic.
Diagnose Script Enhancements
tools/Demo-GitHubIntegration.ps1, tools/Diagnose-HomeLab.ps1
Improves module import robustness and diagnostic command cleanup, adds new functions and parameters.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant PreCommitHook
    participant MarkdownLinterCLI
    participant MarkdownLinterEngine
    participant Git

    User->>PreCommitHook: git commit (pre-commit triggered)
    PreCommitHook->>MarkdownLinterCLI: Run linter with --fix on staged files
    MarkdownLinterCLI->>MarkdownLinterEngine: Lint and (optionally) fix files
    MarkdownLinterEngine-->>MarkdownLinterCLI: Report issues, apply fixes
    MarkdownLinterCLI-->>PreCommitHook: Return lint/fix results
    PreCommitHook->>Git: git add <modified files>
    PreCommitHook-->>User: Print summary and allow commit
Loading
sequenceDiagram
    participant User
    participant HomeLabMainLoop
    participant MainMenuHandler

    User->>HomeLabMainLoop: Start-MainLoop (optionally with DebugMode)
    HomeLabMainLoop->>MainMenuHandler: Invoke-MainMenu
    MainMenuHandler-->>HomeLabMainLoop: Return result (true/restart/exit)
    HomeLabMainLoop->>HomeLabMainLoop: Handle errors, prompt restart if needed
    HomeLabMainLoop-->>User: Exit or restart as per user input
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

In the warren where markdown lines grow,
A rabbit with linting skills in tow,
Checks every heading, list, and code,
Fixes the fences, polishes the road.
Now docs are neat, the tests all pass—
Hippity-hop! This code’s first class! 🐇✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f67759 and 6539f2a.

📒 Files selected for processing (1)
  • docs/DEVELOPMENT.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/DEVELOPMENT.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
  • GitHub Check: test
✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/docs-updated

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (14)
tests/Run-HomeLab-Tests.ps1 (1)

170-170: Strip the newly-introduced trailing whitespace

The only change in this file is a run of spaces after the closing brace.
This adds noise to future diffs and can trip pre-commit linters.

-}        
+}
docs/SECURITY-CHECKLIST.md (2)

12-17: Great swap to “Microsoft Defender for Cloud” – ensure consistency elsewhere

Nice catch updating the checklist, but the Security Tools section (lines 222-229) still lists “Azure Security Center”.
Update that bullet for consistency.


108-111: Align naming with the actual tool

“PowerShell Script Analyzer” is referred to elsewhere (and on PSGallery) as PSScriptAnalyzer.
Consider standardising the wording here to avoid confusion.

docs/API-REFERENCE.md (1)

92-96: Dash in function name deviates from PowerShell naming pattern

Get-HomeLab-Configuration (with an extra dash) doesn’t match the earlier declaration Get-HomeLabConfiguration.
If the function really is Get-HomeLabConfiguration, fix the example to avoid copy-paste errors:

-$result = Get-HomeLab-Configuration
+$result = Get-HomeLabConfiguration
docs/TESTING.md (1)

91-101: Unit-test example uses mismatching cmdlet name

The sample test block calls Get-HomeLab-Configuration, but the module exposes Get-HomeLabConfiguration.
Readers may assume the dashed version exists and hit “command not found”.

-Describe "Get-HomeLab-Configuration" {
+Describe "Get-HomeLabConfiguration" {-    $result = Get-HomeLab-Configuration
+    $result = Get-HomeLabConfiguration
docs/TROUBLESHOOTING.md (1)

130-137: Example loop risks becoming endless – add an exit-condition or max retry note

The do/while example polls Get-AzVirtualNetworkGateway until the provisioning state changes, but there is no safety stop. In real-world usage this pattern can hang indefinitely if Azure never returns a non-“Updating” state. Add guidance such as a maximum iteration count or timeout parameter so copy-pasting readers do not create an infinite loop in production.

docs/CHANGELOG.md (1)

42-44: Replace placeholder release date before merging

## [1.0.0] - 2024-01-XX still contains the “XX” placeholder. Populate the actual release date to keep the changelog authoritative.

docs/DEVELOPMENT.md (1)

131-133: Function-naming example contradicts its own guideline

Get-HomeLab-Configuration includes a second hyphen inside the noun, violating the PowerShell “Verb-SingularNoun” convention that the surrounding text promotes.

-Get-HomeLab-Configuration    # ✓ Good
+Get-HomeLabConfiguration     # ✓ Good
README.md (6)

14-18: Bullet list drifts from earlier scope — consider grouping cloud-agnostic vs CI topics

The two new bullets (“GitHub repository deployment to Azure”, “Automated testing and CI/CD integration”) interrupt the infrastructure-focused list above and mix process topics with resource topics.
Moving them into their dedicated sections (“GitHub Repository Deployment”, “Testing & Quality Assurance”) keeps the overview concise.


24-31: Module list appears twice; maintain a single source to avoid divergence

The exact same enumeration of modules is repeated later (lines 342-351). Duplicating reference lists increases maintenance overhead and risks the two blocks getting out-of-sync when a module is added/removed.

-## Architecture
-
-The HomeLab system uses a modular architecture with the following components:
-
-*…list here…*
+## Architecture
+
+The HomeLab system is modular. See [Module Documentation](#module-documentation) for the component list and details.

178-186: Great addition – a quickstart code sample would boost adoption

The new “GitHub Repository Deployment” section lists powerful features but stops short of showing how to invoke them (e.g., example Start-GitHubDeployment call or minimal azure-deploy.yml snippet). A terse example helps first-time users.


204-212: Clarify test technology names & version requirement

“Comprehensive test suite with unit, integration, and workflow tests” – readers may wonder which frameworks are used (Pester 5?, PSRule?, BATS?). Explicitly naming the primary test harness and minimal version (as the docs/TESTING.md likely does) removes ambiguity.


227-235: Add date/reference for cost estimates

Cloud prices drift; without a timestamp these numbers can mislead budgeting. Append something like “(prices as of 2025-07)”.


342-351: Minor ordering inconsistency

Here the module list starts with Core → Azure → Security, matching earlier order except that UI and Monitoring are flipped. Sorting consistently (alphabetically or by dependency) aids scanning.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 112dac4 and 97ff76f.

⛔ Files ignored due to path filters (5)
  • tools/markdown_lint/__pycache__/__init__.cpython-313.pyc is excluded by !**/*.pyc
  • tools/markdown_lint/__pycache__/__main__.cpython-313.pyc is excluded by !**/*.pyc
  • tools/markdown_lint/__pycache__/cli.cpython-313.pyc is excluded by !**/*.pyc
  • tools/markdown_lint/__pycache__/linter.cpython-313.pyc is excluded by !**/*.pyc
  • tools/markdown_lint/__pycache__/models.cpython-313.pyc is excluded by !**/*.pyc
📒 Files selected for processing (14)
  • CHANGELOG.md (0 hunks)
  • HomeLab/modules/HomeLab.Core/README.md (1 hunks)
  • README.md (7 hunks)
  • docs/API-REFERENCE.md (1 hunks)
  • docs/CHANGELOG.md (1 hunks)
  • docs/DEVELOPMENT.md (1 hunks)
  • docs/GITHUB-INTEGRATION.md (1 hunks)
  • docs/GITHUB-SECRETS.md (0 hunks)
  • docs/HOW-TO-DEPLOY-WEBSITES.md (0 hunks)
  • docs/SECURITY-CHECKLIST.md (3 hunks)
  • docs/TESTING-STRATEGY.md (0 hunks)
  • docs/TESTING.md (1 hunks)
  • docs/TROUBLESHOOTING.md (1 hunks)
  • tests/Run-HomeLab-Tests.ps1 (1 hunks)
💤 Files with no reviewable changes (4)
  • docs/GITHUB-SECRETS.md
  • docs/HOW-TO-DEPLOY-WEBSITES.md
  • CHANGELOG.md
  • docs/TESTING-STRATEGY.md
🧰 Additional context used
🪛 LanguageTool
docs/CHANGELOG.md

[uncategorized] ~229-~229: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...and Infrastructure as Code principles - Open source security practices --- For more infor...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
  • GitHub Check: powershell-analysis
🔇 Additional comments (1)
README.md (1)

92-98: Documentation links verified and correct

I ran a case-sensitive check against README.md and confirmed that all newly added references exist with the correct casing:

  • docs/TESTING.md
  • docs/DEVELOPMENT.md
  • docs/GITHUB-INTEGRATION.md
  • docs/networking/vpn-gateway.md
  • docs/security/client-certificate-management.md

No missing or mis-cased files were found.

Comment thread docs/GITHUB-INTEGRATION.md Outdated
Comment thread HomeLab/modules/HomeLab.Core/README.md
Comment thread README.md
Enhances the Azure connection prompt with proper input validation using a do-while loop and case-insensitive matching for Y/N responses. Updates documentation paths, fixes relative links in markdown files, and improves security in the mermaid rendering configuration. Also updates Az.Accounts dependency version and enhances error handling in various utility scripts.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
README.md (1)

252-252: Inconsistent summary noted in past review still applies.

The past review comment about the directory structure tree was valid - there's still an inconsistency between the PR description mentioning tools/ and the actual structure shown.

HomeLab/modules/HomeLab.Core/README.md (1)

54-56: Previous Markdown issue resolved.

The PowerShell code block is now properly closed with the terminating backticks, fixing the rendering issue mentioned in the previous review.

🧹 Nitpick comments (1)
tools/Diagnose-HomeLab.ps1 (1)

40-40: Fix log level casing inconsistency.

The log level "Warning" should be "WARNING" to maintain consistency with other log levels like "ERROR" and "DEBUG".

-        "Warning" { 
+        "WARNING" { 
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 97ff76f and e78fc30.

📒 Files selected for processing (26)
  • HomeLab/functions/Get-AzureConnection.ps1 (1 hunks)
  • HomeLab/modules/HomeLab.Core/README.md (1 hunks)
  • README.md (7 hunks)
  • docs/DEVELOPMENT.md (1 hunks)
  • docs/GITHUB-INTEGRATION.md (1 hunks)
  • docs/TESTING.md (1 hunks)
  • docs/_includes/head.html (1 hunks)
  • docs/_layouts/default.html (1 hunks)
  • docs/background/why-build.md (1 hunks)
  • docs/diagrams/README.md (1 hunks)
  • docs/index.md (2 hunks)
  • docs/personal/my-home-setup/centralized-docking-station.md (3 hunks)
  • docs/security/client-certificate-management.md (1 hunks)
  • docs/testing/TESTING-IMPLEMENTATION.md (1 hunks)
  • tools/Demo-GitHubIntegration.ps1 (1 hunks)
  • tools/Diagnose-HomeLab.ps1 (8 hunks)
  • tools/Test-HomeLab.ps1 (3 hunks)
  • tools/functions/Get-AzureConnection.ps1 (1 hunks)
  • tools/functions/Import-RequiredModules.ps1 (1 hunks)
  • tools/functions/Test-ModuleAvailability.ps1 (1 hunks)
  • tools/markdown_lint/README.md (1 hunks)
  • tools/markdown_lint/__init__.py (1 hunks)
  • tools/markdown_lint/cli.py (3 hunks)
  • tools/markdown_lint/linter.py (11 hunks)
  • tools/markdown_lint/markdown_lint.egg-info/top_level.txt (1 hunks)
  • tools/markdown_lint/setup.py (1 hunks)
✅ Files skipped from review due to trivial changes (10)
  • tools/markdown_lint/markdown_lint.egg-info/top_level.txt
  • docs/index.md
  • docs/testing/TESTING-IMPLEMENTATION.md
  • tools/markdown_lint/README.md
  • docs/personal/my-home-setup/centralized-docking-station.md
  • docs/_includes/head.html
  • docs/diagrams/README.md
  • tools/markdown_lint/init.py
  • docs/_layouts/default.html
  • docs/background/why-build.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • docs/GITHUB-INTEGRATION.md
  • docs/TESTING.md
  • docs/DEVELOPMENT.md
🧰 Additional context used
🧬 Code Graph Analysis (2)
tools/markdown_lint/cli.py (1)
tools/markdown_lint/models.py (1)
  • IssueSeverity (9-14)
tools/markdown_lint/linter.py (1)
tools/markdown_lint/models.py (2)
  • IssueSeverity (9-14)
  • FileReport (36-69)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: powershell-analysis
  • GitHub Check: test
  • GitHub Check: test
🔇 Additional comments (40)
tools/functions/Get-AzureConnection.ps1 (1)

79-85: Excellent improvement to user input validation!

The enhanced prompt logic with proper input validation is a significant improvement. The do-while loop ensures users provide valid input, and accepting both short (Y/N) and long (YES/NO) forms with case-insensitive comparison makes the interface more user-friendly and robust.

tools/Demo-GitHubIntegration.ps1 (1)

9-15: Good resilient module import pattern!

The try-catch approach with fallback to relative path import is excellent for demo scripts. This ensures the script works both when the module is properly installed and during development/testing scenarios where relative paths are needed.

tools/functions/Test-ModuleAvailability.ps1 (1)

14-16: Good addition of flexibility parameter!

The SkipModuleCheck switch parameter provides useful flexibility for automated scenarios where interactive module installation prompts should be bypassed. The parameter is well-integrated into the existing logic at line 53.

tools/functions/Import-RequiredModules.ps1 (1)

14-16: Excellent addition of force reload capability!

The ForceReload switch parameter provides valuable control over module import behavior. The parameter is consistently applied throughout the function using the -Force:$ForceReload syntax, which is the correct PowerShell pattern for conditional switch parameters.

tools/markdown_lint/setup.py (2)

7-13: Excellent defensive programming for file operations!

Adding try-except blocks with sensible fallback values prevents setup failures when README.md is missing. The fallback description is appropriate and maintains package functionality.


16-22: Good error handling for requirements file!

The try-except pattern with empty list fallback ensures the package can still be installed even if requirements.txt is missing, while properly parsing requirements when the file is present.

tools/Test-HomeLab.ps1 (2)

91-95: LGTM! Proper integration test inclusion logic.

The conditional logic correctly includes integration tests by default unless explicitly excluded with -UnitOnly. The path existence check prevents errors when the integration test directory doesn't exist.


145-146: LGTM! Improved code formatting for readability.

The formatting improvements in the catch block and exit statements enhance readability without changing functionality.

Also applies to: 169-170

HomeLab/functions/Get-AzureConnection.ps1 (1)

79-85: Excellent input validation enhancement!

The robust input validation using a do-while loop with case-insensitive checking for multiple valid response formats ('Y', 'N', 'YES', 'NO') significantly improves user experience and prevents invalid input from causing issues.

tools/markdown_lint/cli.py (3)

12-15: Improved version handling with proper fallback.

The try-catch import with fallback to "unknown" prevents import errors from breaking the version display functionality.


124-124: Version reference updated correctly.

The version argument now uses the imported __version__ variable, which is consistent with the improved import handling above.


219-235: Enhanced severity filtering with explicit ordering.

The severity_order dictionary provides clearer and more controlled severity ordering compared to relying on enum values. The integer ranks (STYLE=1, WARNING=2, ERROR=3) correctly represent increasing severity levels.

README.md (5)

14-14: Great additions highlighting new capabilities.

The additions of "GitHub repository deployment to Azure" and "Automated testing and CI/CD integration" effectively communicate the expanded project scope.

Also applies to: 17-17


24-31: Comprehensive architecture overview with new GitHub module.

The modular architecture description clearly outlines all components including the new HomeLab.GitHub module. This provides users with a clear understanding of the system's capabilities.


178-186: Excellent addition of GitHub deployment features.

The GitHub Repository Deployment section clearly describes the auto-detection capabilities, multi-framework support, and CI/CD integration. This aligns perfectly with the PR's focus on GitHub integration enhancements.


204-212: Valuable addition of testing and quality assurance information.

The new section effectively communicates the comprehensive testing strategy, automated workflows, and quality checks that have been implemented.


227-233: Updated cost estimates reflect current Azure pricing.

The revised cost estimates provide users with current pricing expectations, including the new Static Web Apps and Container Apps services.

tools/markdown_lint/linter.py (8)

61-67: Improved code formatting enhances readability.

The multi-line conditional formatting makes the logic for checking multiple consecutive blank lines more readable without changing functionality.


103-108: Better formatted lambda function for trailing whitespace fix.

The multi-line formatting of the _add_issue call improves readability while maintaining the same functionality.


111-131: Comprehensive line ending consistency checks with proper fixes.

The enhanced line ending logic correctly handles both LF and CRLF formats:

  • Detects CRLF when LF is expected and provides proper conversion
  • Detects LF when CRLF is expected and provides proper conversion
  • The fix functions correctly transform line endings as needed

150-162: Improved final newline check formatting.

The multi-line conditional for checking final newlines enhances readability while preserving the same logic.


193-195: Enhanced method signature formatting.

The multi-line method signature improves readability for the line length fix determination method.


322-353: Well-structured URL validation logic with security considerations.

The refactored URL checking logic maintains security awareness by flagging insecure HTTP URLs while properly detecting bare URLs that aren't part of markdown links. The separation of concerns between security warnings and formatting suggestions is appropriate.


390-408: Improved fix application logic with better separation.

The enhanced _apply_fixes method properly separates file-level and line-level fixes, applying them in the correct order to avoid conflicts. The bottom-to-top application of line-level fixes prevents offset issues.


423-431: Comprehensive directory exclusion list.

The expanded exclude_dirs set covers common directories that should be ignored during linting (.git, node_modules, various cache directories), which improves performance and avoids false positives.

HomeLab/modules/HomeLab.Core/README.md (9)

1-14: LGTM! Clear and comprehensive module overview.

The introduction effectively establishes the foundational role of the HomeLab.Core module and provides a well-organized list of key features.


19-40: LGTM! Well-documented configuration functions.

The configuration management functions are clearly documented with practical examples that demonstrate both default and custom usage patterns.


85-114: LGTM! Comprehensive configuration schema.

The JSON configuration schema is well-structured and covers all essential aspects of the HomeLab system. The inline comments effectively show allowed values and expected formats.


116-132: LGTM! Clear error handling documentation.

The error handling functions are well-documented with practical examples showing both error creation and logging patterns.


143-152: LGTM! Clear dependency documentation.

The dependencies are well-organized, separating required from optional modules with appropriate version requirements specified.


176-217: LGTM! Excellent practical examples.

The examples section provides comprehensive, real-world usage scenarios that effectively demonstrate the module's capabilities and best practices.


219-249: LGTM! Comprehensive troubleshooting guide.

The troubleshooting section effectively addresses common issues with specific error messages and concrete solutions, making it highly practical for users.


251-272: LGTM! Well-structured contributing and support sections.

The contributing guidelines are specific and actionable, and the related modules section clearly shows the dependency relationships within the HomeLab ecosystem.


167-174: Verified Test Script Path – LGTM!

I’ve confirmed that tests/Run-HomeLab-Tests.ps1 exists, so the suggested path is correct. The Testing section is clear and accurate—approving these changes.

tools/Diagnose-HomeLab.ps1 (6)

86-98: LGTM! Improved parameter formatting.

The parameter definitions are now more consistently formatted and readable, with proper positioning attributes.


138-181: LGTM! Enhanced parameter handling.

The addition of Module and RemainingArguments parameters, along with the hashtable-based parameter building approach, makes this wrapper more robust and complete. This is a significant improvement over the previous implementation.


185-246: LGTM! Comprehensive parameter support.

The addition of Directory, File, Include, Exclude, and RemainingArguments parameters makes this wrapper much more complete. The consistent hashtable-based parameter building pattern aligns well with PowerShell best practices.


355-367: LGTM! Improved code formatting.

The reformatted sorting and selection logic is more readable while maintaining the same functionality.


392-393: LGTM! Improved error handling approach.

Removing the global $ErrorActionPreference = 'SilentlyContinue' in favor of command-specific -ErrorAction parameters is a significant improvement. This approach provides better error visibility and more granular control over error handling.


384-387: LGTM! Minor formatting improvement.

The catch block formatting is cleaner and more consistent.

Comment thread docs/security/client-certificate-management.md Outdated
Comment thread README.md Outdated
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

cursor[bot]

This comment was marked as outdated.

- Move markdown_lint and yaml_lint directories under tools/
- Remove integrity hash from Mermaid CDN script for easier updates
- Enhance client certificate revocation documentation with Azure CLI method
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (6)
docs/security/client-certificate-management.md (3)

125-129: Obsolete CRL steps successfully removed – minor Markdown nit

The old CRL-upload bullets are gone 🎉.
For perfect GitHub rendering, insert a blank line after the “Azure Portal Method:” heading; without it, some MD engines treat the list as part of the bold line.

-**Azure Portal Method:**
+**Azure Portal Method:**

 1. Navigate to …

130-138: Add the complementary “remove revoked cert” CLI example

You show how to add a thumbprint but not how to undo it. Including the az network vnet-gateway revoked-cert remove command completes the lifecycle and prevents manual portal clean-up errors.

   --thumbprint "CERTIFICATE_THUMBPRINT"
+
+# Remove a mistakenly-revoked certificate
+az network vnet-gateway revoked-cert remove \
+  --gateway-name "YourVPNGateway" \
+  --resource-group "YourResourceGroup" \
+  --name "RevokedClientCert"

140-145: Clarify thumbprint retrieval for multiple certificates

If several client certs share the same CN, the current filter grabs only the first hit. Safer to pipe to Select-Object so users see every match and can copy the correct thumbprint.

-$clientCert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -eq "CN=P2SClientCert" }
-Write-Host "Certificate thumbprint to revoke: $($clientCert.Thumbprint)"
+$clientCerts = Get-ChildItem Cert:\CurrentUser\My |
+  Where-Object { $_.Subject -eq "CN=P2SClientCert" }
+$clientCerts | Select-Object -Expand Thumbprint
+Write-Host "Copy the relevant thumbprint from the list above."
README.md (3)

24-31: Consider alphabetising or grouping modules logically

The module list is clear, but ordering feels arbitrary. An alphabetical or functional grouping (e.g. core → infra → app → ops) would make scanning easier and avoid merge-conflicts when new modules are inserted later.


178-186: Avoid duplicating information already covered in the GitHub-Integration guide

The “GitHub Repository Deployment” section restates much of the content that lives in docs/GITHUB-INTEGRATION.md. To keep the README succinct, replace the bullet list with a one-sentence teaser and a link to the full guide. That reduces future maintenance overhead.


227-234: Add source or disclaimer for cost figures

Azure pricing changes frequently and varies by region. Consider adding “prices approximate as of ” or linking the official pricing calculator so readers know to re-check before budgeting.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a902017 and e4cae47.

📒 Files selected for processing (3)
  • README.md (7 hunks)
  • docs/_includes/head.html (1 hunks)
  • docs/security/client-certificate-management.md (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • docs/_includes/head.html
🧰 Additional context used
🪛 LanguageTool
docs/security/client-certificate-management.md

[style] ~128-~128: Consider using a different verb to strengthen your wording.
Context: ...tificate thumbprint to revoke access 3. Remove the certificate from client devices man...

(REMOVE_REVOKE)

🪛 GitHub Actions: Code Quality
README.md

[error] 120-120: markdownlint MD001/heading-increment: Heading levels should only increment by one level at a time [Expected: h3; Actual: h4]

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
🔇 Additional comments (3)
README.md (3)

204-212: Resolve markdown-lint MD001 failure – heading level skips

CI flagged a heading-increment error. One culprit is often a #### directly under an ##. Double-check the “Testing & Quality Assurance” subsection and neighbours: ensure the hierarchy follows H2 → H3 → H4 without jumps.


252-288: Directory tree now matches earlier reviewer feedback – nice fix

tools/ replaces the old scripts/, and linting tools sit under it—good alignment with actual repo layout. 🔧


92-98: All documentation links are valid
I ran a verification script against every (docs/…) path in README.md and confirmed that all referenced files—including the newly added docs/TESTING.md, docs/DEVELOPMENT.md, docs/GITHUB-INTEGRATION.md, as well as docs/networking/vpn-gateway.md and docs/security/client-certificate-management.md—exist with the correct, case-sensitive filenames. No broken links detected.

@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

This commit introduces a comprehensive CHANGELOG.md file documenting all notable changes to the HomeLab project, following Keep a Changelog format and Semantic Versioning. It also significantly enhances the markdown linter with:

- Fixed ReDoS vulnerability in regex patterns
- Added support for multiple markdown rules (MD022, MD029, MD031, MD032, MD034, MD040)
- Implemented pre-commit hooks for automatic fixing
- Added URL title extraction and formatting
- Improved code block language detection
- Enhanced spacing and formatting fixes
…cripts

- Update .gitignore to include Python build artifacts
- Fix documentation path references for VPN gateway docs
- Correct diagram in centralized-docking-station.md
- Add scope flag to PowerShell module installations
- Improve Wait-BeforeSplash function with non-interactive host check
- Fix markdown formatting in markdown_lint README
- Fix relative imports in markdown_lint tool
- Remove unnecessary Python build artifacts from repo
- Update repository URLs in markdown_lint setup.py
- Specify PSGallery repository and disable confirmation when installing modules
- Update VPN Gateway documentation paths to use consistent networking/vpn-gateway.md
- Fix Azure environment variable names in Initialize-Environment
- Enhance certificate security by using secure password prompts
- Add NoSplashScreen parameter and improve error handling
- Refactor Start-MainLoop to use loop instead of recursion to prevent stack overflow
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

cursor[bot]

This comment was marked as outdated.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🔭 Outside diff range comments (1)
HomeLab/functions/Test-ModuleAvailability.ps1 (1)

12-14: Add missing SkipModuleCheck parameter.

The function references $SkipModuleCheck on line 51 but this parameter isn't defined in the param() block, which will cause it to be $null and potentially lead to unexpected behavior.

Add the missing parameter to match the functionality described in the AI summary:

 function Test-ModuleAvailability {
     [CmdletBinding()]
-    param()
+    param(
+        [switch]$SkipModuleCheck
+    )
🧹 Nitpick comments (6)
docs/security/client-certificate-management.md (1)

131-131: Consider verb choice for clarity.

The static analysis tool correctly identifies that "Remove the certificate from client devices manually" could be strengthened. Consider using "Uninstall" or "Delete" for more precise action description.

-3. Remove the certificate from client devices manually
+3. Uninstall the certificate from client devices manually
tools/functions/Show-Splashscreen.ps1 (1)

67-132: Consider simplifying the extensive null checking.

While defensive programming is good, the extensive null checks throughout the startup summary make the code quite verbose. Consider consolidating some of these checks or using a more structured approach to handle missing configuration data.

For example, you could create a helper function to safely access nested properties:

function Get-ConfigValue {
    param($Config, $Path, $Default = "Not configured")
    # Navigate the path safely and return default if any part is null
}
tools/markdown_lint/pre-commit-hook.py (1)

29-34: Inconsistent error handling behavior

The script returns 1 when Python validation fails but always returns 0 for all other errors. This inconsistency could be confusing. Consider either always returning 0 (to allow commits) or returning appropriate error codes consistently.

If you want to maintain the fail-fast behavior for critical errors:

     if not linter_script.exists():
         print(f"ERROR: Markdown linter module not found: {linter_script}")
-        return 1
+        return 1  # Critical error - cannot proceed
 
     # At the end, consider returning non-zero for other failures
-    # Always return success so commit proceeds
-    return 0
+    # Return success unless there were critical errors
+    return 0 if files_processed > 0 else 1

Also applies to: 122-123

tools/markdown_lint/linter.py (3)

411-411: Replace lambda with named function

Using lambda assignment is discouraged by PEP 8.

-fix_func = lambda content: fix_ordered_number(content, expected_number)
+def fix_func(content):
+    return fix_ordered_number(content, expected_number)

384-394: Simplify nested if statements

The nested if statements can be combined for better readability.

-if next_line_idx < len(lines):
-    next_line = lines[next_line_idx]
-    if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
+if next_line_idx < len(lines) and (next_line := lines[next_line_idx]).strip() and not self.BLANK_LINE_PATTERN.match(next_line):

306-306: Remove unnecessary f-string prefixes

These strings don't contain any placeholders and don't need the f-prefix.

-if not line.startswith(f"{'#' * level} "):
+if not line.startswith('#' * level + ' '):

Also applies to: 610-610, 638-638

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0fb8c17 and dfcfd1c.

⛔ Files ignored due to path filters (2)
  • tools/markdown_lint/__pycache__/cli.cpython-313.pyc is excluded by !**/*.pyc
  • tools/markdown_lint/__pycache__/linter.cpython-313.pyc is excluded by !**/*.pyc
📒 Files selected for processing (29)
  • .gitignore (1 hunks)
  • CHANGELOG.md (1 hunks)
  • HomeLab/functions/Test-ModuleAvailability.ps1 (1 hunks)
  • HomeLab/modules/HomeLab.UI/Public/Handlers/6-DocumentationHandler.ps1 (1 hunks)
  • docs/SETUP.md (2 hunks)
  • docs/background/main-overview.md (1 hunks)
  • docs/bicep/vpn-gateway.md (1 hunks)
  • docs/index.md (3 hunks)
  • docs/networking/vpn-gateway.md (1 hunks)
  • docs/personal/my-home-setup/centralized-docking-station.md (3 hunks)
  • docs/security/client-certificate-management.md (3 hunks)
  • docs/testing/TESTING-IMPLEMENTATION.md (2 hunks)
  • tests/Run-HomeLab-Tests.ps1 (3 hunks)
  • tools/functions/Initialize-Environment.ps1 (2 hunks)
  • tools/functions/Show-Splashscreen.ps1 (2 hunks)
  • tools/functions/Start-MainLoop.ps1 (2 hunks)
  • tools/functions/Test-ModuleAvailability.ps1 (2 hunks)
  • tools/functions/Wait-BeforeSplash.ps1 (1 hunks)
  • tools/markdown_lint/README.md (2 hunks)
  • tools/markdown_lint/__init__.py (0 hunks)
  • tools/markdown_lint/cli.py (4 hunks)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/pre-commit-hook.py (1 hunks)
  • tools/markdown_lint/pre-commit-markdown-fix.bat (1 hunks)
  • tools/markdown_lint/pre-commit-markdown-fix.ps1 (1 hunks)
  • tools/markdown_lint/requirements.txt (1 hunks)
  • tools/markdown_lint/setup.py (1 hunks)
  • tools/markdown_lint/simple_test.md (1 hunks)
  • tools/markdown_lint/test_minimal.md (1 hunks)
💤 Files with no reviewable changes (1)
  • tools/markdown_lint/init.py
✅ Files skipped from review due to trivial changes (9)
  • tools/markdown_lint/simple_test.md
  • docs/background/main-overview.md
  • docs/SETUP.md
  • tools/markdown_lint/requirements.txt
  • tools/markdown_lint/README.md
  • tools/markdown_lint/test_minimal.md
  • docs/testing/TESTING-IMPLEMENTATION.md
  • docs/bicep/vpn-gateway.md
  • .gitignore
🚧 Files skipped from review as they are similar to previous changes (6)
  • tools/functions/Test-ModuleAvailability.ps1
  • tests/Run-HomeLab-Tests.ps1
  • docs/personal/my-home-setup/centralized-docking-station.md
  • docs/index.md
  • CHANGELOG.md
  • tools/markdown_lint/cli.py
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/pre-commit-hook.py (1)
tools/markdown_lint/cli.py (1)
  • main (230-291)
🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

6-6: typing.Any imported but unused

Remove unused import

(F401)


6-6: typing.Pattern imported but unused

Remove unused import

(F401)


6-6: typing.Set imported but unused

Remove unused import

(F401)


6-6: typing.Tuple imported but unused

Remove unused import

(F401)


68-68: Local variable list_indent is assigned to but never used

Remove assignment to unused variable list_indent

(F841)


134-134: Ambiguous variable name: l

(E741)


144-144: Ambiguous variable name: l

(E741)


258-258: Ambiguous variable name: l

(E741)


306-306: f-string without any placeholders

Remove extraneous f prefix

(F541)


308-308: Ambiguous variable name: l

(E741)


318-318: Ambiguous variable name: l

(E741)


328-328: Ambiguous variable name: l

(E741)


384-386: Use a single if statement instead of nested if statements

(SIM102)


411-411: Do not assign a lambda expression, use a def

Rewrite fix_func as a def

(E731)


579-579: Ambiguous variable name: l

(E741)


610-610: f-string without any placeholders

Remove extraneous f prefix

(F541)


638-638: f-string without any placeholders

Remove extraneous f prefix

(F541)


650-650: Ambiguous variable name: l

(E741)


737-739: Use a single if statement instead of nested if statements

(SIM102)

tools/markdown_lint/setup.py

4-4: os imported but unused

Remove unused import: os

(F401)

🪛 LanguageTool
docs/security/client-certificate-management.md

[style] ~131-~131: Consider using a different verb to strengthen your wording.
Context: ...tificate thumbprint to revoke access 3. Remove the certificate from client devices man...

(REMOVE_REVOKE)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: powershell-analysis
  • GitHub Check: test
🔇 Additional comments (20)
HomeLab/functions/Test-ModuleAvailability.ps1 (3)

61-61: LGTM! Enhanced Install-Module for automation.

The addition of -Repository PSGallery and -Confirm:$false parameters improves the function for automated scenarios by explicitly specifying the source repository and preventing interactive prompts.


19-49: LGTM! Well-structured module validation logic.

The module checking logic properly handles both local and external modules, includes version validation, and provides appropriate logging. The implementation is robust and follows PowerShell best practices.


80-81: LGTM! Proper module export.

The function is correctly exported using Export-ModuleMember, following PowerShell module best practices.

docs/networking/vpn-gateway.md (1)

85-88: Excellent security improvement!

The update from hardcoded password strings to interactive secure password prompts significantly enhances security. The Read-Host -AsSecureString approach prevents password exposure in console history or scripts, and the commented GUID-based alternative provides a good programmatic option.

HomeLab/modules/HomeLab.UI/Public/Handlers/6-DocumentationHandler.ps1 (1)

324-324: LGTM! Good documentation organization.

The path update to networking\vpn-gateway.md aligns with the project's documentation restructuring into logical subdirectories. The function maintains robustness by checking multiple fallback paths.

docs/security/client-certificate-management.md (2)

106-109: Excellent security improvement!

The update to use Read-Host -AsSecureString for password input significantly improves security by preventing password exposure in console history or scripts. The alternative GUID-based approach provides a good programmatic option.


128-160: Well-addressed previous feedback on revocation workflow.

The updated revocation section successfully addresses the previous review comment about obsolete CRL workflow instructions. The documentation now provides clear, modern approaches using both Azure Portal and PowerShell methods, with comprehensive examples and verification steps.

tools/functions/Wait-BeforeSplash.ps1 (2)

15-15: Excellent input validation enhancement.

The ValidateRange(0,60) attribute appropriately constrains the seconds parameter to a reasonable range, preventing negative values and overly long waits.


18-22: Well-implemented interactive environment detection.

The check for $Host.UI and $Host.UI.RawUI properly detects non-interactive environments (like CI/CD pipelines) and gracefully falls back to a simple sleep operation without attempting UI interactions.

tools/functions/Initialize-Environment.ps1 (3)

60-61: Environment variable names corrected appropriately.

The corrected variable names AZURE_PS_SKIP_MODULE_REGISTRATION and AZURE_PS_SKIP_CREDENTIALS_VALIDATION align with proper Azure PowerShell conventions.


128-135: Robust error handling for logging initialization.

The try-catch block properly handles potential failures during logging initialization and provides clear error messaging before returning false, preventing silent failures.


138-140: Appropriate failure handling for missing logging function.

Explicitly returning false when the Initialize-Logging function is not found prevents the script from continuing in an inconsistent state.

tools/functions/Start-MainLoop.ps1 (2)

21-22: Excellent refactoring from recursion to iteration.

Replacing the recursive restart mechanism with a do...while loop eliminates potential stack overflow issues and makes the control flow clearer and more maintainable.


81-85: Proper loop control and termination logic.

The $shouldRestart flag is correctly managed, and the loop properly terminates when the user chooses not to restart after an error.

tools/functions/Show-Splashscreen.ps1 (2)

14-21: Good addition of NoSplashScreen parameter.

The optional NoSplashScreen parameter with immediate return provides a clean way to skip the splash screen in automated scenarios while maintaining backward compatibility.


87-88: Improved log file display with appropriate fallback.

The conditional display showing "Not configured" when $script:LogFile is null or empty provides better user feedback than showing an empty value.

tools/markdown_lint/pre-commit-markdown-fix.ps1 (1)

44-44: Excellent implementation with proper error handling

The script demonstrates several best practices:

  • Uses MD5 hashing for reliable change detection
  • Comprehensive error handling throughout
  • Clear, colored console output for better user experience
  • Proper parameter validation with CmdletBinding

Also applies to: 98-98, 102-102

tools/markdown_lint/pre-commit-hook.py (1)

13-19: Well-implemented utility functions

The get_file_hash function properly handles exceptions and the overall implementation shows good practices:

  • Proper exception handling for file I/O
  • Clean separation of concerns
  • Cross-platform path handling with pathlib

Also applies to: 66-69

tools/markdown_lint/linter.py (2)

53-223: Well-structured main checking logic

The check_file method demonstrates excellent design:

  • Comprehensive state tracking for context-sensitive validation
  • Proper handling of code blocks and HTML comments
  • Clear separation of concerns with individual check methods
  • Good error handling with try-except wrapper

42-45: Potential ReDoS vulnerability in regex patterns

The BARE_URL_PATTERN and EMAIL_PATTERN use complex regex with nested quantifiers that could be vulnerable to ReDoS attacks on malicious input.

Consider using simpler patterns or adding input length limits:

-BARE_URL_PATTERN = re.compile(r"(?<![<\[\(])(https?://[^\s<>\[\]()]+)(?![>\]\)])")
+# Limit URL length to prevent ReDoS
+BARE_URL_PATTERN = re.compile(r"(?<![<\[\(])(https?://[^\s<>\[\]()]{1,2000})(?![>\]\)])")

Likely an incorrect or invalid review comment.

Comment thread tools/markdown_lint/linter.py Outdated
Comment thread tools/markdown_lint/linter.py Outdated
Comment thread tools/markdown_lint/linter.py Outdated
Comment thread tools/markdown_lint/linter.py
Comment thread tools/markdown_lint/pre-commit-markdown-fix.bat Outdated
Comment thread tools/markdown_lint/pre-commit-markdown-fix.bat Outdated
Comment thread tools/markdown_lint/pre-commit-markdown-fix.bat Outdated
Comment thread tools/markdown_lint/pre-commit-markdown-fix.bat Outdated
Comment thread tools/markdown_lint/pre-commit-markdown-fix.ps1 Outdated
Comment thread tools/markdown_lint/setup.py Outdated
- Add size limits to regex patterns to prevent ReDoS attacks
- Implement chunked file reading for hash calculation to handle large files
- Stream HTTP responses with size limit to prevent memory exhaustion
- Improve variable naming in lambda functions for better readability
- Add Python availability check in batch script
- Use git command to dynamically determine repository root
- Use file hashing instead of timestamps for detecting changes
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
tools/markdown_lint/linter.py (3)

620-620: Remove unnecessary f-string prefix

The f-string on this line contains no placeholders and should be a regular string.

-f"Bare URL used, converting to markdown link with title",
+"Bare URL used, converting to markdown link with title",

648-648: Remove unnecessary f-string prefix

The f-string on this line contains no placeholders and should be a regular string.

-f"Bare email address used, converting to angle bracket format",
+"Bare email address used, converting to angle bracket format",

384-387: Simplify nested if statements

These nested if statements can be combined into a single condition for better readability.

-if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
-    # Make sure the next line is not another list item
-    if not self.LIST_ITEM_PATTERN.match(next_line):
+if (next_line.strip() and 
+    not self.BLANK_LINE_PATTERN.match(next_line) and
+    not self.LIST_ITEM_PATTERN.match(next_line)):
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dfcfd1c and 7f5ddbb.

📒 Files selected for processing (4)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/pre-commit-hook.py (1 hunks)
  • tools/markdown_lint/pre-commit-markdown-fix.bat (1 hunks)
  • tools/markdown_lint/pre-commit-markdown-fix.ps1 (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • tools/markdown_lint/pre-commit-markdown-fix.ps1
  • tools/markdown_lint/pre-commit-hook.py
  • tools/markdown_lint/pre-commit-markdown-fix.bat
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/linter.py (1)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

306-306: f-string without any placeholders

Remove extraneous f prefix

(F541)


384-386: Use a single if statement instead of nested if statements

(SIM102)


411-411: Do not assign a lambda expression, use a def

Rewrite fix_func as a def

(E731)


620-620: f-string without any placeholders

Remove extraneous f prefix

(F541)


648-648: f-string without any placeholders

Remove extraneous f prefix

(F541)


747-749: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
  • GitHub Check: test
  • GitHub Check: powershell-analysis

* Change "Added" to "Initial Release" in CHANGELOG.md
* Fix numbered list formatting in DEVELOPMENT.md
* Improve heading structure in GITHUB-INTEGRATION.md and TESTING.md
* Clean up comment formatting in vpn-gateway.md
* Enhance markdown linter regex pattern for closed ATX headings
* Update file hash function to use SHA-256 instead of MD5
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (3)
tools/markdown_lint/linter.py (3)

6-6: Remove unused type imports

The following type imports are not used in the code: Any, Pattern, Set, and Tuple.

-from typing import Callable, Dict, List, Optional, Union
+from typing import Callable, Dict, List, Optional, Union

68-68: Remove unused variable

The list_indent variable is assigned but never used in the code.

 in_code_block = False
 in_html_comment = False
 in_list = False
-list_indent = 0

134-134: Use descriptive parameter names in lambda functions

The parameter name l is ambiguous and can be confused with the number 1. Use line instead for better readability.

Example fix:

-fix=lambda l: l.rstrip()
+fix=lambda line: line.rstrip()

Also applies to: 144-144, 258-258, 308-308, 318-318, 328-328, 589-589, 650-650, 660-660

🧹 Nitpick comments (6)
docs/TESTING.md (4)

49-65: Wrap the directory tree in a fenced text block to preserve alignment

GitHub Markdown collapses multiple leading spaces inside a generic triple-backtick fence, so the ASCII tree will not render as intended.
Specify the language as text (or none) to keep the fixed-width spacing.

-``` 
+```text
 tests/
 ├── unit/                    # Unit tests
 ...
 └── TestResults.xml         # Generated test results
-``` 
+```

17-33: Clarify cross-platform invocation & exit codes for the main test runner

The examples assume Windows PowerShell (./Run-HomeLab-Tests.ps1).
On macOS/Linux the typical entry point is pwsh and the executable bit may not be set.
It is also helpful to state that the script returns a non-zero exit code on failure so it can be chained in CI.

# Windows
./Run-HomeLab-Tests.ps1 -TestType Unit

# macOS / Linux
pwsh ./Run-HomeLab-Tests.ps1 -TestType Unit

A single sentence covering these points will save newcomers a trip to the issues page.


112-128: Add authentication & guaranteed cleanup in the integration test example

The sample deploys Azure resources but:

  1. Skips authentication (Connect-AzAccount, Set-AzContext) so it will fail for users who copy-paste it.
  2. Performs cleanup only on the happy path – if the assertion fails or an exception is thrown the resource group is leaked.

Recommend updating the snippet:

try {
    Connect-AzAccount | Out-Null
    Set-AzContext -SubscriptionId $env:HOMELAB_TEST_SUBSCRIPTION

    $resourceGroup = "test-rg-$(Get-Random)"
    $result = Deploy-VPNGateway -ResourceGroup $resourceGroup
    $result.Status | Should -Be "Succeeded"
}
finally {
    if ($resourceGroup) {
        Remove-AzResourceGroup -Name $resourceGroup -Force -ErrorAction SilentlyContinue
    }
}

This keeps the example production-safe and self-contained.


137-141: Avoid embedding real subscription IDs in docs

Hard-coding a literal "your-test-subscription-id" leads some users to commit real IDs accidentally.
Prefer an obvious placeholder such as "00000000-0000-0000-0000-000000000000" or reference an environment secret managed by your CI ($env:AZURE_SUBSCRIPTION_ID).

$env:HOMELAB_TEST_SUBSCRIPTION = "<subscription-guid>"
tools/markdown_lint/linter.py (2)

620-620: Remove unnecessary f-string prefixes

These strings don't contain any placeholders and should be regular strings.

-f"Bare URL used, converting to markdown link with title",
+"Bare URL used, converting to markdown link with title",
-f"Bare email address used, converting to angle bracket format",
+"Bare email address used, converting to angle bracket format",

Also applies to: 648-648


747-749: Simplify nested if statements

Combine the nested conditions into a single if statement for better readability.

-if "Fenced code blocks should be surrounded by blank lines" in issue.message:
-    # Check if this is a start or end of code block
-    if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
+if ("Fenced code blocks should be surrounded by blank lines" in issue.message and
+    line_idx < len(lines) and lines[line_idx].strip().startswith("```")):
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7f5ddbb and 52df868.

📒 Files selected for processing (8)
  • CHANGELOG.md (1 hunks)
  • HomeLab/modules/HomeLab.Core/README.md (1 hunks)
  • docs/DEVELOPMENT.md (1 hunks)
  • docs/GITHUB-INTEGRATION.md (1 hunks)
  • docs/TESTING.md (1 hunks)
  • docs/networking/vpn-gateway.md (1 hunks)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/pre-commit-hook.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • CHANGELOG.md
  • tools/markdown_lint/pre-commit-hook.py
  • docs/networking/vpn-gateway.md
  • docs/GITHUB-INTEGRATION.md
  • docs/DEVELOPMENT.md
  • HomeLab/modules/HomeLab.Core/README.md
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/linter.py (1)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

306-306: f-string without any placeholders

Remove extraneous f prefix

(F541)


384-386: Use a single if statement instead of nested if statements

(SIM102)


411-411: Do not assign a lambda expression, use a def

Rewrite fix_func as a def

(E731)


620-620: f-string without any placeholders

Remove extraneous f prefix

(F541)


648-648: f-string without any placeholders

Remove extraneous f prefix

(F541)


747-749: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test

Comment thread tools/markdown_lint/linter.py Outdated
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
tools/markdown_lint/linter.py (2)

134-134: Use descriptive variable names instead of 'l'

Lambda functions use 'l' as a parameter name, which is ambiguous and could be confused with '1'.

Example fix:

-fix=lambda l: l.rstrip()
+fix=lambda line: line.rstrip()

Apply similar changes to all occurrences at lines 144, 258, 308, 318, 328, 579, and 650.

Also applies to: 144-144, 258-258, 308-308, 318-318, 328-328, 579-579, 650-650


68-68: Remove unused variable

The variable list_indent is assigned but never used in the code.

-            list_start_line = 0
-            list_indent = 0
+            list_start_line = 0
🧹 Nitpick comments (4)
tools/markdown_lint/linter.py (4)

306-306: Remove unnecessary f-string prefix

The string on line 306 doesn't contain any placeholders, so the f-string prefix is not needed.

-                f"Missing space after heading marker",
+                "Missing space after heading marker",

384-386: Simplify nested if statements

Combine the nested if statements into a single condition for better readability.

-            if next_line_idx < len(lines):
-                next_line = lines[next_line_idx]
-                if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
+            if next_line_idx < len(lines):
+                next_line = lines[next_line_idx]
+                if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):

Actually, this can be further simplified:

-            if next_line_idx < len(lines):
-                next_line = lines[next_line_idx]
-                if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
+            if next_line_idx < len(lines) and (next_line := lines[next_line_idx]).strip() and not self.BLANK_LINE_PATTERN.match(next_line):

621-621: Remove unnecessary f-string prefixes

These strings don't contain any placeholders, so the f-string prefixes are not needed.

-                            f"Bare URL used, converting to markdown link with title",
+                            "Bare URL used, converting to markdown link with title",
-                            f"Bare email address used, converting to angle bracket format",
+                            "Bare email address used, converting to angle bracket format",

Also applies to: 649-649


748-756: Simplify nested if statements

The nested if statements can be combined for better readability.

-                    if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
-                        # Check if previous line needs spacing (start of code block)
-                        if line_idx > 0 and lines[line_idx - 1].strip():
-                            insertions.append((line_idx, "before"))
+                    if (line_idx < len(lines) and lines[line_idx].strip().startswith("```") and
+                        line_idx > 0 and lines[line_idx - 1].strip()):
+                        insertions.append((line_idx, "before"))
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 52df868 and 2703b82.

📒 Files selected for processing (1)
  • tools/markdown_lint/linter.py (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/linter.py (1)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

306-306: f-string without any placeholders

Remove extraneous f prefix

(F541)


384-386: Use a single if statement instead of nested if statements

(SIM102)


621-621: f-string without any placeholders

Remove extraneous f prefix

(F541)


649-649: f-string without any placeholders

Remove extraneous f prefix

(F541)


748-750: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: powershell-analysis
  • GitHub Check: test
  • GitHub Check: Cursor Bugbot
🔇 Additional comments (3)
tools/markdown_lint/linter.py (3)

33-34: Good: ReDoS vulnerability fixed

The HEADING_PATTERN now correctly uses a bounded quantifier {0,1000} instead of an unbounded .+, which addresses the previously identified ReDoS vulnerability.


528-540: Good: Response size limit implemented

The URL fetching now properly limits the response size to 1MB using streaming, which addresses the previously identified security concern about memory exhaustion.


11-828: Well-architected markdown linter implementation

The MarkdownLinter class demonstrates good software engineering practices:

  • Clear separation of concerns with dedicated methods for each check type
  • Comprehensive configuration management
  • Sophisticated fix application system handling line-level, spacing, and file-level fixes
  • Proper error handling and fallback mechanisms
  • Good integration with the data models

The implementation is thorough and handles various edge cases in markdown parsing.

Refactor markdown linter to improve maintainability by extracting helper functions for report formatting and file processing. Split monolithic functions into smaller, focused ones for better readability and testability. No functional changes to the linting process itself.
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

cursor[bot]

This comment was marked as outdated.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
tools/markdown_lint/pre-commit-hook.py (3)

28-32: Consider removing redundant Python availability check.

Since this script is already running in Python, checking Python availability via subprocess is redundant and adds unnecessary overhead.

-    try:
-        subprocess.run([sys.executable, "--version"], capture_output=True, check=True)
-    except (subprocess.CalledProcessError, FileNotFoundError):
-        print("ERROR: Python is not available")
-        return False
-    

75-84: Consider batching git add operations for better performance.

Currently each file is staged individually with separate git add commands. For better performance, consider batching all files into a single git add command.

-    for file_path in modified_files:
-        try:
-            print(f"  Staging: {file_path}")
-            result = subprocess.run(
-                ["git", "add", file_path], capture_output=True, text=True, cwd=repo_root
-            )
-            if result.returncode != 0:
-                print(f"WARNING: Failed to stage {file_path}: {result.stderr}")
-        except Exception as e:
-            print(f"WARNING: Error staging {file_path}: {e}")
+    try:
+        print(f"  Staging: {' '.join(modified_files)}")
+        result = subprocess.run(
+            ["git", "add"] + modified_files, capture_output=True, text=True, cwd=repo_root
+        )
+        if result.returncode != 0:
+            print(f"WARNING: Failed to stage files: {result.stderr}")
+    except Exception as e:
+        print(f"WARNING: Error staging files: {e}")

107-107: Simplify path resolution logic.

The current path resolution can be simplified and made more readable.

-        full_path = Path(file_path) if Path(file_path).is_absolute() else repo_root / file_path
+        full_path = Path(file_path).resolve() if Path(file_path).is_absolute() else (repo_root / file_path).resolve()
tools/markdown_lint/cli.py (1)

13-18: Consider simplifying the version import approach.

The current dynamic import approach works but could be simplified for better readability.

 def get_version():
     """Get package version safely."""
     try:
-        return __import__('tools.markdown_lint', fromlist=['__version__']).__version__
+        from tools.markdown_lint import __version__
+        return __version__
     except (ImportError, AttributeError):
         return "unknown"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 05a8a6b and 4c5d133.

📒 Files selected for processing (2)
  • tools/markdown_lint/cli.py (5 hunks)
  • tools/markdown_lint/pre-commit-hook.py (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/pre-commit-hook.py (1)
tools/markdown_lint/cli.py (1)
  • main (231-292)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
🔇 Additional comments (4)
tools/markdown_lint/pre-commit-hook.py (1)

41-69: LGTM!

Excellent implementation with proper hash-based change detection, comprehensive error handling, and clear progress reporting. The subprocess call is correctly configured with proper arguments and output capture.

tools/markdown_lint/cli.py (3)

67-102: LGTM!

Excellent addition of granular control options for disabling specific linting rules. The naming convention is consistent, help text is informative with MD rule references, and the implementation follows established patterns.


182-216: LGTM!

Excellent refactoring that improves code organization and readability. The helper functions have clear single responsibilities, proper return values, and maintain the original functionality while making the code more maintainable.


218-228: LGTM!

Clean refactoring of the print_report function that improves readability and maintainability. The main function properly integrates all new CLI options into the linter configuration, maintaining consistency with the existing architecture.

Also applies to: 244-249

Comment thread tools/markdown_lint/pre-commit-hook.py Outdated
Comment thread tools/markdown_lint/pre-commit-hook.py
…ization

Refactors the MarkdownLinter class to improve maintainability by:
- Breaking down large methods into smaller, focused functions
- Adding a state dictionary to track parsing context
- Creating helper methods for specific linting operations
- Improving code readability with better method organization
- Separating URL and email checking logic into dedicated methods
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (3)
tools/markdown_lint/linter.py (3)

772-772: Remove unnecessary f-string prefix

The string doesn't contain any placeholders.

-                "Bare URL used, converting to markdown link with title",
+                "Bare URL used, converting to markdown link with title",

800-800: Remove unnecessary f-string prefix

The string doesn't contain any placeholders.

-                "Bare email address used, converting to angle bracket format",
+                "Bare email address used, converting to angle bracket format",

198-207: Fix incomplete HTML comment handling

The current implementation only handles single-line HTML comments but doesn't properly track multi-line HTML comments. This will cause the linter to incorrectly process content inside multi-line HTML comments.

Consider implementing proper multi-line HTML comment detection:

 def _handle_html_comment(
     self, report: FileReport, line_num: int, line: str, state: dict
 ) -> bool:
     """Handle HTML comment processing. Returns True if line was handled."""
-    if self.HTML_COMMENT_PATTERN.match(line):
-        state["in_html_comment"] = False  # Single line comment
-        state["prev_line"] = line
-        state["prev_line_blank"] = False
-        return True
+    if "<!--" in line and "-->" in line:
+        # Single line comment, continue processing
+        state["prev_line"] = line
+        state["prev_line_blank"] = False
+        return True
+    elif "<!--" in line and not state["in_html_comment"]:
+        state["in_html_comment"] = True
+        state["prev_line"] = line
+        state["prev_line_blank"] = False
+        return True
+    elif "-->" in line and state["in_html_comment"]:
+        state["in_html_comment"] = False
+        state["prev_line"] = line
+        state["prev_line_blank"] = False
+        return True
     return False
🧹 Nitpick comments (3)
tools/markdown_lint/linter.py (3)

661-687: Security: Check Content-Length before downloading

While the code limits downloads to 1MB, it could be more efficient by checking the Content-Length header first to avoid downloading large files unnecessarily.

 response = requests.get(
     url,
     timeout=5,
     headers={
         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
     },
     stream=True,
 )
 response.raise_for_status()

+# Check content length first to avoid downloading large files
+content_length = response.headers.get('Content-Length')
+if content_length and int(content_length) > 1024 * 1024:  # 1MB limit
+    response.close()
+    return "Link"
+
 # Read only up to 1MB to prevent memory exhaustion
 content = ""
 max_size = 1024 * 1024  # 1MB limit

521-523: Simplify nested if statements

Combine the nested conditions for better readability.

-                if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
-                    # Make sure the next line is not another list item
-                    if not self.LIST_ITEM_PATTERN.match(next_line):
+                if (next_line.strip() and 
+                    not self.BLANK_LINE_PATTERN.match(next_line) and
+                    not self.LIST_ITEM_PATTERN.match(next_line)):

959-967: Simplify nested if statements

Combine the nested conditions for better readability.

         if self.MSG_FENCED_CODE_BLOCKS_SPACING in message:
             # Check if this is a start or end of code block
-            if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
+            if (line_idx < len(lines) and 
+                lines[line_idx].strip().startswith("```")):
                 # Check if previous line needs spacing (start of code block)
-                if line_idx > 0 and lines[line_idx - 1].strip():
+                if line_idx > 0 and lines[line_idx - 1].strip():
                     insertions.append((line_idx, "before"))
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4c5d133 and 89b8d1f.

📒 Files selected for processing (1)
  • tools/markdown_lint/linter.py (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/linter.py (1)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

443-443: f-string without any placeholders

Remove extraneous f prefix

(F541)


521-523: Use a single if statement instead of nested if statements

(SIM102)


959-961: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cursor Bugbot

…ndant code

Remove unused parameters from several methods in the MarkdownLinter class and eliminate redundant condition checks. This improves code readability and maintainability without changing functionality.
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

cursor[bot]

This comment was marked as outdated.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🔭 Outside diff range comments (1)
HomeLab/functions/Import-RequiredModules.ps1 (1)

26-26: Undefined variable: $ForceReload is used but not declared.

The $ForceReload variable is used in multiple Import-Module calls but is not defined as a parameter or local variable. This will cause the -Force parameter to always be $false or potentially throw an error.

Add $ForceReload as an optional parameter to the function:

 function Import-RequiredModules {
     [CmdletBinding()]
-    param()
+    param(
+        [switch]$ForceReload
+    )

Also applies to: 40-40, 63-63, 67-67

♻️ Duplicate comments (2)
README.md (1)

285-285: Tree shows comment mentioning scripts but directory is tools – update for consistency

The comment still references "scripts" when the actual directory name is "tools". This inconsistency was previously noted and needs to be fixed.

-└── tools/                           # Utility scripts
+└── tools/                           # Utility scripts & linters
tools/markdown_lint/linter.py (1)

34-34: ReDoS vulnerability in HEADING_PATTERN

The regex pattern uses {0,1000} quantifier which can still cause performance issues with malicious input. Consider using a more restrictive pattern or non-greedy matching.

🧹 Nitpick comments (9)
tests/unit/Run-UnitTests.ps1 (2)

4-11: Consider adding version specification and installation validation.

The Pester installation approach has a few areas for improvement:

  • The -SkipPublisherCheck flag bypasses security verification
  • No specific version is installed, which could lead to compatibility issues
  • Missing validation that installation succeeded before importing

Consider this enhanced approach:

# Check if Pester module is installed
if (-not (Get-Module -ListAvailable -Name Pester)) {
    Write-Host "Pester module not found. Installing Pester..."
-    Install-Module -Name Pester -Force -SkipPublisherCheck
+    try {
+        Install-Module -Name Pester -MinimumVersion 5.0.0 -Force -Scope CurrentUser
+        Write-Host "Pester module installed successfully."
+    }
+    catch {
+        Write-Error "Failed to install Pester module: $_"
+        exit 1
+    }
}

# Import Pester module
-Import-Module Pester
+try {
+    Import-Module Pester -ErrorAction Stop
+}
+catch {
+    Write-Error "Failed to import Pester module: $_"
+    exit 1
+}

84-90: Minor formatting improvement needed for the else block.

The exit code logic is correct, but the else block formatting is inconsistent with PowerShell conventions.

Apply this formatting improvement:

# Return exit code based on test results
if ($testResults.FailedCount -gt 0) {
    exit 1
-}
-else {
+} else {
    exit 0
}
tools/markdown_lint/test_find_files.py (1)

13-33: Consider enhancing test coverage

The test verifies that the function runs without error but doesn't validate that exclusions work correctly or that all markdown files are found. Consider adding assertions to verify the function's behavior.

Example enhancement:

def test_find_markdown_files():
    """Test the find_markdown_files function."""
    # Test with current directory
    current_dir = Path(".")
    
    print("Testing find_markdown_files function...")
    print(f"Searching in: {current_dir.resolve()}")
    
    # Find markdown files
    files = find_markdown_files(
        current_dir,
        exclude_dirs={".git", "__pycache__", ".pytest_cache"},
        exclude_files=["test_"],
    )
    
    print(f"Found {len(files)} markdown files:")
    for file in files:
        print(f"  - {file}")
        
    # Verify exclusions work
    assert not any(".git" in str(f) for f in files), "Git directory should be excluded"
    assert not any("test_" in f.name for f in files), "Test files should be excluded"
    
    # Verify we found markdown files (if expected in the directory)
    # This could be made more specific based on known files
    
    return len(files) > 0
tools/markdown_lint/find_markdown_files.py (2)

48-50: Simplify nested if statements

Combine the nested if statements for better readability.

-                    if item.suffix.lower() in markdown_extensions:
-                        if not should_exclude_file(item):
-                            markdown_files.append(item)
+                    if item.suffix.lower() in markdown_extensions and not should_exclude_file(item):
+                        markdown_files.append(item)

51-54: Simplify nested if statements

Combine the nested if statements for better readability.

-                elif item.is_dir():
-                    # Recursively scan subdirectories if not excluded
-                    if not should_exclude_dir(item):
-                        scan_directory(item)
+                elif item.is_dir() and not should_exclude_dir(item):
+                    # Recursively scan subdirectories if not excluded
+                    scan_directory(item)
tools/markdown_lint/linter.py (4)

537-539: Simplify nested if statements

Combine the nested if statements for better readability.

-            if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
-                # Make sure the next line is not another list item
-                if not self.LIST_ITEM_PATTERN.match(next_line):
+            if (next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line) 
+                and not self.LIST_ITEM_PATTERN.match(next_line)):
+                    # Make sure the next line is not another list item

971-979: Simplify nested if statements

Combine the nested if statements for better readability.

         if self.MSG_FENCED_CODE_BLOCKS_SPACING in message:
             # Check if this is a start or end of code block
-            if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
+            if (line_idx < len(lines) and lines[line_idx].strip().startswith("```")):
                 # Check if previous line needs spacing (start of code block)
                 if line_idx > 0 and lines[line_idx - 1].strip():
                     insertions.append((line_idx, "before"))

84-91: Use more specific exception handling

Catching all exceptions can mask programming errors. Consider catching specific exceptions like IOError, UnicodeDecodeError, etc.

-        except Exception as e:
+        except (IOError, OSError, UnicodeDecodeError) as e:
             self._add_issue(
                 report,
                 0,
                 f"Error processing file: {str(e)}",
                 "ERROR",
                 severity=IssueSeverity.ERROR,
             )

678-680: Move imports to module level for better performance

Importing modules inside functions adds overhead on each call. Move these imports to the top of the file.

At the top of the file, add:

import requests
from urllib.parse import urlparse

Then remove the local imports from the _get_url_title method.

Also applies to: 722-722

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 89b8d1f and 9c8289f.

📒 Files selected for processing (21)
  • HomeLab/HomeLab.psm1 (4 hunks)
  • HomeLab/functions/Import-RequiredModules.ps1 (1 hunks)
  • HomeLab/functions/Initialize-Environment.ps1 (4 hunks)
  • HomeLab/functions/Test-ModuleAvailability.ps1 (2 hunks)
  • README.md (7 hunks)
  • docs/GITHUB-INTEGRATION.md (1 hunks)
  • docs/background/main-overview.md (1 hunks)
  • docs/index.md (3 hunks)
  • docs/networking/vpn-gateway.md (4 hunks)
  • docs/personal/my-home-setup/software-kvm-alternatives.md (1 hunks)
  • tests/Run-HomeLab-Tests.ps1 (6 hunks)
  • tests/unit/Run-UnitTests.ps1 (3 hunks)
  • tools/Diagnose-HomeLab.ps1 (8 hunks)
  • tools/functions/Import-RequiredModules.ps1 (1 hunks)
  • tools/functions/Initialize-Environment.ps1 (5 hunks)
  • tools/functions/Start-MainLoop.ps1 (1 hunks)
  • tools/functions/Test-ModuleAvailability.ps1 (2 hunks)
  • tools/markdown_lint/__init__.py (1 hunks)
  • tools/markdown_lint/find_markdown_files.py (1 hunks)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/test_find_files.py (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • docs/personal/my-home-setup/software-kvm-alternatives.md
  • HomeLab/functions/Initialize-Environment.ps1
  • HomeLab/HomeLab.psm1
🚧 Files skipped from review as they are similar to previous changes (9)
  • docs/background/main-overview.md
  • tools/functions/Import-RequiredModules.ps1
  • tools/functions/Test-ModuleAvailability.ps1
  • docs/index.md
  • tools/functions/Initialize-Environment.ps1
  • tests/Run-HomeLab-Tests.ps1
  • docs/GITHUB-INTEGRATION.md
  • HomeLab/functions/Test-ModuleAvailability.ps1
  • docs/networking/vpn-gateway.md
🧰 Additional context used
🧬 Code Graph Analysis (2)
tools/markdown_lint/test_find_files.py (1)
tools/markdown_lint/find_markdown_files.py (1)
  • find_markdown_files (7-63)
tools/markdown_lint/linter.py (2)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
tools/markdown_lint/find_markdown_files.py (1)
  • find_markdown_files (7-63)
🪛 Ruff (0.12.2)
tools/markdown_lint/find_markdown_files.py

48-49: Use a single if statement instead of nested if statements

(SIM102)


51-53: Use a single if statement instead of nested if statements

(SIM102)

tools/markdown_lint/linter.py

537-539: Use a single if statement instead of nested if statements

(SIM102)


971-973: Use a single if statement instead of nested if statements

(SIM102)

🪛 GitHub Actions: Code Quality
README.md

[error] 120-120: markdownlint MD001/heading-increment: Heading levels should only increment by one level at a time [Expected: h3; Actual: h4]

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
  • GitHub Check: test
🔇 Additional comments (14)
HomeLab/functions/Import-RequiredModules.ps1 (1)

12-80: Well-structured module loading with proper dependency handling.

The function implements a solid approach to module loading:

  • Prioritizes critical modules (Logging, Core) first
  • Continues loading other modules even if one fails
  • Provides comprehensive logging and error handling
  • Uses appropriate Import-Module parameters

The guard clause addition improves robustness by validating prerequisites before execution.

tests/unit/Run-UnitTests.ps1 (5)

13-21: Excellent dynamic path handling and validation.

The use of $PSScriptRoot for dynamic path determination and the robust directory validation with clear error messages is a significant improvement. This approach enhances portability and provides better debugging information.


23-41: Well-implemented mock file validation with cross-platform compatibility.

The mock file verification logic is robust:

  • Uses Join-Path for proper path construction across platforms
  • Systematically validates all required mock files
  • Provides clear warnings and error messages
  • Properly exits if any dependencies are missing

43-49: Proper Pester configuration setup.

The Pester configuration is well-structured with appropriate settings for test execution, output verbosity, and result reporting. The consistent use of Join-Path maintains cross-platform compatibility.


51-53: Good user experience enhancement with startup message.

The addition of a colored startup message improves the user experience by clearly indicating when test execution begins. The test execution approach is clean and straightforward.


55-70: Comprehensive test execution validation with excellent error guidance.

The test results validation is thorough and provides excellent troubleshooting guidance:

  • Catches cases where Pester fails to return results
  • Identifies when no tests are discovered
  • Provides specific, actionable error messages
  • Helps users diagnose common issues with test files and naming conventions

This significantly improves the debugging experience for test execution failures.

tools/Diagnose-HomeLab.ps1 (5)

23-56: Good refactoring of console color handling

The try/finally block ensures console color is always restored, and the comment-based help improves documentation.


185-227: Improved parameter handling for Get-Command wrapper

The use of parameter splatting and explicit parameter collection makes the wrapper more robust and maintainable.


233-291: Consistent parameter handling improvements for Get-ChildItem wrapper

The parameter handling follows the same robust pattern as Get-Command, ensuring all parameters are properly forwarded.


356-372: Robust script directory resolution with fallback logic

The improved directory resolution handles edge cases where $PSScriptRoot might be empty, with appropriate diagnostic logging.


457-466: Improved error handling approach

Removing global error suppression in favor of targeted error handling and ensuring cleanup with try/finally is a best practice.

tools/functions/Start-MainLoop.ps1 (1)

1-93: Well-implemented main application loop with robust error handling

The function includes comprehensive error handling, diagnostic capabilities, state management, and user-friendly restart options. The implementation follows PowerShell best practices.

tools/markdown_lint/__init__.py (1)

1-6: Standard Python package initialization

Clean and minimal package initialization following Python conventions.

tools/markdown_lint/linter.py (1)

42-43: Potential ReDoS vulnerability in ORDERED_LIST_PATTERN

Similar to HEADING_PATTERN, this regex uses {0,1000} quantifier which could cause performance issues with malicious input.

Apply this diff to use a more restrictive pattern:

     ORDERED_LIST_PATTERN = re.compile(
-        r"^\s*(?P<number>\d+)\.(?P<content>\s+.{0,1000})$"
+        r"^\s*(?P<number>\d+)\.(?P<content>\s+.*)$"
     )

Likely an incorrect or invalid review comment.

Comment thread HomeLab/functions/Import-RequiredModules.ps1
Comment thread tools/Diagnose-HomeLab.ps1 Outdated
Comment thread tools/markdown_lint/linter.py Outdated
Restructure find_markdown_files.py with helper functions for better readability and maintainability. Add constants for markdown extensions and implement iterative directory scanning instead of recursive approach to avoid potential stack overflow issues with deeply nested directories.
…r handling

Enhance the markdown linter pre-commit hook by adding a new `_get_repo_root()` function that dynamically detects the repository root using Git commands with a fallback mechanism. Update file hash comment to correctly reflect the SHA-256 algorithm being used. Improve code formatting and error handling throughout the script.
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

- Remove `-DisableNameChecking` flag from Import-Module calls
- Replace Write-Log with Write-Error for early error handling
- Fix documentation path references to architecture diagrams
- Fix numbering in ordered lists in documentation
- Improve table formatting in network security documentation
- Enhance security in password generation examples
- Add error handling in Test-HomeLab script
- Fix regex pattern in markdown linter
- Add prerequisite validation in pre-commit script
- Add SRI integrity attribute to CSS reference
…tions

Replace Write-Log with native PowerShell functions (Write-Error, Write-Warning, Write-Host) for improved consistency and simplicity. Also fix markdown linter regex to prevent ReDoS vulnerability and correct documentation numbering in DEVELOPMENT.md.
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (5)
README.md (2)

252-265: Directory structure correctly updated.

The tree now properly shows tools/ instead of scripts/, addressing the previous concern.


285-287: Directory structure properly reflects tool organization.

The markdown and YAML linting tools are correctly shown as subdirectories under tools/, which matches the actual project structure.

tools/markdown_lint/linter.py (3)

623-623: Remove unnecessary f-string prefix.

The string contains no placeholders.

-                            "Bare URL used, converting to markdown link with title",
+                            "Bare URL used, converting to markdown link with title",

651-651: Remove unnecessary f-string prefix.

The string contains no placeholders.

-                            "Bare email address used, converting to angle bracket format",
+                            "Bare email address used, converting to angle bracket format",

566-567: Convert lambda assignment to function definition.

Replace the lambda assignment with a proper function definition for better readability and PEP8 compliance.

-            # Create a closure to capture the expected number
-            def fix_func(content):
-                return fix_ordered_number(content, expected_number)
+            # Create a closure to capture the expected number
+            def fix_func(content):
+                return fix_ordered_number(content, expected_number)
🧹 Nitpick comments (5)
tools/functions/Test-ModuleAvailability.ps1 (1)

67-67: Consider Write-Information for better output stream handling.

While the colored Write-Host output enhances user experience, consider using Write-Information with -InformationAction Continue for installation progress messages. This allows the output to be captured or redirected in automated scenarios while still displaying to users.

-                        Write-Host "Installing/updating module: $moduleName" -ForegroundColor Yellow
-                        Install-Module -Name $moduleName -Force -AllowClobber -Scope CurrentUser -Repository PSGallery -Confirm:$false
-                        Write-Host "Successfully installed/updated module: $moduleName" -ForegroundColor Green
+                        Write-Information "Installing/updating module: $moduleName" -InformationAction Continue
+                        Install-Module -Name $moduleName -Force -AllowClobber -Scope CurrentUser -Repository PSGallery -Confirm:$false
+                        Write-Information "Successfully installed/updated module: $moduleName" -InformationAction Continue

Also applies to: 69-69

docs/security/client-certificate-management.md (1)

128-131: Minor style inconsistency in the numbered list

The heading already labels the block “Azure Portal Method:”; the inner list starts again at “1.” – readers may mis-interpret it as a sub-step of the previous numbered section.
Consider converting the inner list to plain bullets (or indenting) to avoid double numbering.

docs/CHANGELOG.md (1)

229-229: Add hyphen to compound adjective.

"Open source" functions as a compound adjective here and should be hyphenated.

-- Open source security practices
+- Open-source security practices
tools/markdown_lint/linter.py (2)

535-537: Simplify nested if statements.

These nested conditions can be combined into a single if statement.

-            if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
-                # Make sure the next line is not another list item
-                if not self.LIST_ITEM_PATTERN.match(next_line):
+            if (next_line.strip() 
+                and not self.BLANK_LINE_PATTERN.match(next_line)
+                and not self.LIST_ITEM_PATTERN.match(next_line)):

970-972: Simplify nested if statements.

Combine the conditions for better readability.

-        if self.MSG_FENCED_CODE_BLOCKS_SPACING in message:
-            # Check if this is a start or end of code block
-            if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
+        if (self.MSG_FENCED_CODE_BLOCKS_SPACING in message
+            and line_idx < len(lines) 
+            and lines[line_idx].strip().startswith("```")):
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b830727 and abffd50.

📒 Files selected for processing (20)
  • HomeLab/functions/Import-RequiredModules.ps1 (3 hunks)
  • HomeLab/functions/Test-ModuleAvailability.ps1 (3 hunks)
  • README.md (7 hunks)
  • docs/CHANGELOG.md (1 hunks)
  • docs/DEVELOPMENT.md (1 hunks)
  • docs/_layouts/default.html (2 hunks)
  • docs/diagrams/network-security.md (1 hunks)
  • docs/index.md (4 hunks)
  • docs/networking/vpn-gateway.md (4 hunks)
  • docs/security/client-certificate-management.md (3 hunks)
  • tools/Diagnose-HomeLab.ps1 (8 hunks)
  • tools/Test-HomeLab.ps1 (3 hunks)
  • tools/functions/Import-RequiredModules.ps1 (3 hunks)
  • tools/functions/Start-MainLoop.ps1 (1 hunks)
  • tools/functions/Test-ModuleAvailability.ps1 (2 hunks)
  • tools/markdown_lint/cli.py (5 hunks)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/pre-commit-markdown-fix.ps1 (1 hunks)
  • tools/markdown_lint/test_minimal.md (1 hunks)
  • tools/markdown_lint/test_regex_fix.py (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • tools/markdown_lint/test_minimal.md
  • docs/diagrams/network-security.md
  • docs/DEVELOPMENT.md
🚧 Files skipped from review as they are similar to previous changes (8)
  • docs/index.md
  • tools/functions/Import-RequiredModules.ps1
  • tools/markdown_lint/pre-commit-markdown-fix.ps1
  • docs/networking/vpn-gateway.md
  • HomeLab/functions/Import-RequiredModules.ps1
  • docs/_layouts/default.html
  • HomeLab/functions/Test-ModuleAvailability.ps1
  • tools/functions/Start-MainLoop.ps1
🧰 Additional context used
🧬 Code Graph Analysis (1)
tools/markdown_lint/linter.py (2)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
tools/markdown_lint/find_markdown_files.py (1)
  • find_markdown_files (73-99)
🪛 GitHub Actions: Code Quality
README.md

[error] 120-120: markdownlint MD001/heading-increment: Heading levels should only increment by one level at a time [Expected: h3; Actual: h4]

🪛 Ruff (0.12.2)
tools/markdown_lint/linter.py

535-537: Use a single if statement instead of nested if statements

(SIM102)


970-972: Use a single if statement instead of nested if statements

(SIM102)

🪛 LanguageTool
docs/CHANGELOG.md

[uncategorized] ~229-~229: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...and Infrastructure as Code principles - Open source security practices --- For more infor...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/security/client-certificate-management.md

[style] ~131-~131: Consider using a different verb to strengthen your wording.
Context: ...tificate thumbprint to revoke access 3. Remove the certificate from client devices man...

(REMOVE_REVOKE)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
🔇 Additional comments (33)
tools/Test-HomeLab.ps1 (3)

91-95: LGTM! Well-structured conditional test inclusion.

The integration test path inclusion logic is correctly implemented, mirroring the unit test pattern above. The Test-Path check prevents errors when the integration test directory doesn't exist, and the conditional logic properly respects the $UnitOnly parameter.


146-158: Excellent improvement to error handling and result tracking.

The enhanced catch block now properly accounts for test execution failures by creating a mock result object and updating the total counters. This ensures that execution failures are visible in the final test summary rather than being silently ignored.

The mock result structure appears consistent with Pester's result format, but consider verifying that all expected properties are included to ensure compatibility with any downstream result processing.


178-179: Good formatting improvement for readability.

Moving the else keyword to a new line aligns with PowerShell style guidelines and improves the visual structure of the control flow.

tools/functions/Test-ModuleAvailability.ps1 (8)

14-16: LGTM! Well-designed parameter addition.

The SkipModuleCheck switch parameter is properly implemented and provides useful functionality for bypassing module installation prompts in automated scenarios.


18-21: Excellent defensive programming practice.

The guard clause prevents potential null reference exceptions and provides clear error messaging when the required modules collection isn't properly initialized. This is a valuable improvement for robustness.


33-33: Good transition to native PowerShell cmdlets.

The move from custom Write-Log to native PowerShell cmdlets improves consistency and reduces dependencies. The cmdlet selection is appropriate for each message type.

Also applies to: 44-44, 52-52, 59-59, 72-72, 78-78


68-68: Improved Install-Module parameters enhance security and automation.

The addition of -Repository PSGallery explicitly specifies the trusted repository, and -Confirm:$false enables proper automation support. The parameter combination is well-chosen for secure, unattended module installation.


58-58: Conditional logic is correct but consider readability.

The logic correctly implements the SkipModuleCheck functionality. While the double negative works, consider if a positive condition might be more readable, though the current implementation is functionally sound.


66-75: Excellent error handling around module installation.

The try-catch block properly handles potential Install-Module failures with appropriate error logging and boolean return values. The error handling is comprehensive and user-friendly.


12-13: Well-structured PowerShell function following best practices.

The function demonstrates good PowerShell development practices with proper [CmdletBinding()], clear documentation, and appropriate module export. The overall structure is clean and maintainable.

Also applies to: 87-88


46-54: Robust version checking implementation.

The version checking logic properly handles multiple installed versions, uses semantic version comparison with [Version] casting, and correctly identifies when updates are needed. This is a solid implementation.

docs/security/client-certificate-management.md (3)

147-151: Good verification step

Including Get-AzVpnClientRevokedCertificate immediately after the add operation is helpful and reduces user confusion.


153-160: Thumbprint retrieval snippet looks solid

The quick one-liner to obtain the thumbprint directly from the certificate store is clear and copy-paste-ready.


254-254: Verify relative link correctness

../networking/vpn-gateway.md assumes
docs/networking/vpn-gateway.md exists. Please confirm the file was indeed added under that path during the restructuring; otherwise, the link will resolve to a 404 on GitHub.

tools/Diagnose-HomeLab.ps1 (12)

23-32: Excellent documentation enhancement.

The comment-based help follows PowerShell standards and clearly documents the function's purpose and parameters.


42-55: Great refactoring to consolidate color management.

The try/finally block ensures consistent color restoration and eliminates code duplication from the switch cases. This is more maintainable and robust.


68-73: Good documentation addition.

Clear and concise comment-based help that follows PowerShell standards.


85-90: Excellent command preservation strategy.

Storing original commands in a script-scoped hashtable enables proper cleanup and restoration. This is a solid design pattern for command overriding scenarios.


93-107: Well-implemented cleanup function.

The function properly removes global overrides, includes appropriate error handling, and provides logging. The design is robust and follows PowerShell best practices.


110-118: Good API design for manual cleanup.

Exposing the cleanup functionality through a global function provides users with manual control while maintaining proper separation between internal and external interfaces.


120-128: Excellent defensive programming for cleanup.

The combination of exit event registration and trap handling ensures cleanup occurs in all scenarios. Logging errors before re-throwing maintains diagnostic capability while ensuring proper cleanup.


185-227: Significant improvement in parameter handling.

The enhanced parameter support with hashtable construction and splatting is much more robust than partial parameter passing. This maintains full compatibility with the original command.


233-291: Consistent and comprehensive parameter enhancement.

The wrapper now properly handles all common Get-ChildItem parameters using the same robust hashtable and splatting approach. This maintains full compatibility and follows the established pattern.


356-372: Robust script directory resolution enhancement.

The improved logic handles edge cases gracefully with multiple fallback strategies and diagnostic logging. This makes the script more resilient across different PowerShell environments.


411-454: Good formatting and error handling improvements.

The reformatted code is more readable, and the new Get-ErrorDetail function properly handles inner exceptions with appropriate safety measures and documentation.


457-466: Excellent cleanup implementation and error handling improvement.

Removing the global error suppression is good practice, and the try/finally block ensures proper cleanup regardless of script outcome. The function name issue from the previous review has been correctly addressed - Restore-OriginalCommand (singular) is properly used.

tools/markdown_lint/test_regex_fix.py (1)

1-56: Well-implemented ReDoS vulnerability test!

The test effectively demonstrates the vulnerability by:

  • Comparing the vulnerable pattern with the safe alternative
  • Testing both valid inputs and a crafted malicious input
  • Measuring performance impact to quantify the vulnerability
  • Properly handling potential timeouts with KeyboardInterrupt
README.md (1)

120-120: No incorrect heading levels detected around line 120

I reviewed lines 100–140 of README.md and all headings follow a valid H2 (“## Features”) → H3 sequence. There are no H4 headings or level skips in that range, so the markdownlint error appears to be a false positive.

→ You can safely ignore this heading-level warning.

Likely an incorrect or invalid review comment.

tools/markdown_lint/cli.py (3)

13-19: Clean implementation of version retrieval with proper error handling.

The function safely handles import failures and provides a sensible default.


67-102: Well-structured CLI options for granular linting control.

The new flags follow a consistent pattern and provide clear descriptions for disabling specific markdown linting rules.


268-271: Good addition of path validation.

Checking path existence before processing improves user experience by providing clear error messages.

tools/markdown_lint/linter.py (2)

681-702: Excellent security improvements for URL fetching!

The implementation now includes:

  • Connection and read timeouts
  • Size limit (1MB) to prevent memory exhaustion
  • Streaming with chunk-based reading
  • SSL certificate verification
  • Proper error handling

198-222: HTML comment handling properly implemented!

The code now correctly handles both single-line and multi-line HTML comments by:

  • Detecting complete single-line comments
  • Setting state flags for multi-line comment start/end
  • Properly tracking comment state across lines

Comment on lines +106 to +109
# Generate a secure password or prompt user
$password = Read-Host -AsSecureString -Prompt "Enter a secure password for the certificate"
# OR use a cryptographically secure random password for automation scenarios
# $password = ConvertTo-SecureString -String ([System.Web.Security.Membership]::GeneratePassword(16, 4)) -Force -AsPlainText

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Prefer a cross-platform random password generator over System.Web.Security.Membership

[System.Web.Security.Membership]::GeneratePassword() is convenient but only available on Windows PowerShell; it is absent in PowerShell Core where System.Web is not loaded.
To keep the snippet portable across PowerShell editions, generate the password with System.Security.Cryptography.RandomNumberGenerator (or simply New-Guid) and then convert it to a secure string:

-# $password = ConvertTo-SecureString -String ([System.Web.Security.Membership]::GeneratePassword(16, 4)) -Force -AsPlainText
+# $plain = [Convert]::ToBase64String([byte[]]::new(24).ForEach({ [System.Security.Cryptography.RandomNumberGenerator]::Fill($_) }))
+# $password = ConvertTo-SecureString -String $plain -AsPlainText -Force

This keeps the guidance truly “cross-platform” while maintaining cryptographic strength.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In docs/security/client-certificate-management.md around lines 106 to 109,
replace the use of [System.Web.Security.Membership]::GeneratePassword() with a
cross-platform method such as using
System.Security.Cryptography.RandomNumberGenerator or New-Guid to generate a
random password, then convert it to a secure string. This ensures the password
generation works in both Windows PowerShell and PowerShell Core, maintaining
portability and cryptographic strength.

Comment on lines +133 to +146
**Azure PowerShell Method:**
```powershell
# Example: Create a CRL
$rootCert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -eq "CN=P2SRootCert" }
$revocationList = New-Object System.Security.Cryptography.X509Certificates.X509RevocationList
# Add revoked certificate using Azure PowerShell
$RevokedClientCert1 = "RevokedClientCert"
$RevokedThumbprint1 = "CERTIFICATE_THUMBPRINT"
$GWName = "YourVPNGateway"
$RG = "YourResourceGroup"

Add-AzVpnClientRevokedCertificate `
-VpnClientRevokedCertificateName $RevokedClientCert1 `
-VirtualNetworkGatewayName $GWName `
-ResourceGroupName $RG `
-Thumbprint $RevokedThumbprint1

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Cmdlet parameter name appears incorrect – $Name is expected, not $VpnClientRevokedCertificateName

According to the Az.Network module (≥ 5.x) the syntax is:

Add-AzVpnClientRevokedCertificate `
  -Name <String> `
  -VirtualNetworkGatewayName <String> `
  -ResourceGroupName <String> `
  -Thumbprint <String>

If users copy the sample verbatim they will receive “A parameter cannot be found that matches parameter name ‘VpnClientRevokedCertificateName’”.
Update the snippet to use -Name:

-$RevokedClientCert1    = "RevokedClientCert"
-...
-Add-AzVpnClientRevokedCertificate `
-  -VpnClientRevokedCertificateName $RevokedClientCert1 `
+Add-AzVpnClientRevokedCertificate `
+  -Name                       $RevokedClientCert1 `
🤖 Prompt for AI Agents
In docs/security/client-certificate-management.md between lines 133 and 146, the
PowerShell snippet uses an incorrect parameter name
'-VpnClientRevokedCertificateName' for the Add-AzVpnClientRevokedCertificate
cmdlet. Replace '-VpnClientRevokedCertificateName' with '-Name' to match the
correct parameter expected by the Az.Network module version 5.x and above,
ensuring the example runs without errors.

… heading pattern

Split main function into smaller, focused helper functions to improve readability and maintainability. Also fixed the closed ATX heading regex pattern to properly match headings with content, preventing potential ReDoS vulnerability by ensuring pattern matches non-whitespace characters at beginning and end of content.
- Fix heading level in HomeLab.Core README.md
- Format tables in TESTING-STRATEGY-DETAILED.md for better readability
- Fix indentation in PowerShell code sample in vpn-gateway.md
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (1)
tools/markdown_lint/linter.py (1)

50-50: Potential ReDoS vulnerability in CLOSED_ATX_HEADING_PATTERN

The regex pattern contains nested quantifiers that could cause catastrophic backtracking on malicious input.

Consider simplifying the pattern:

-    CLOSED_ATX_HEADING_PATTERN = re.compile(r"^#{1,6}\s+[^\s]{1,1000}(?:\s+[^\s]+)*\s+#{1,6}\s*$")
+    CLOSED_ATX_HEADING_PATTERN = re.compile(r"^#{1,6}\s+.*?\s+#{1,6}\s*$")
🧹 Nitpick comments (5)
HomeLab/modules/HomeLab.Core/README.md (2)

188-191: Example omits -Message parameter used elsewhere – keep usage consistent
Earlier samples invoke Write-HomeLabLog with an explicit -Message parameter, while this block relies on positional binding. Mixing styles is confusing for readers.

-    Write-HomeLabLog "All prerequisites met" -Level Info
+    Write-HomeLabLog -Message "All prerequisites met" -Level Info

90-114: JSON sample isn’t strictly valid JSON – may trip copy-paste automation
Using pipe-separated placeholder values inside quoted strings keeps it syntactically valid, but some tooling expects concrete values or comments. Consider labelling the block as jsonc (JSON-with-comments) or adding a note that the snippet is illustrative only.

tools/markdown_lint/cli.py (1)

296-296: Improve type hints for clarity

The return type should be more specific to indicate the dictionary structure being created.

-) -> Dict[Path, Any]:
+) -> Dict[Path, Dict[str, List[LintIssue]]]:
tools/markdown_lint/linter.py (2)

535-537: Simplify nested if statements

Combine the nested conditions into a single if statement for better readability.

-            if next_line.strip() and not self.BLANK_LINE_PATTERN.match(next_line):
-                # Make sure the next line is not another list item
-                if not self.LIST_ITEM_PATTERN.match(next_line):
+            if (next_line.strip() and 
+                not self.BLANK_LINE_PATTERN.match(next_line) and
+                not self.LIST_ITEM_PATTERN.match(next_line)):

970-978: Simplify nested if statements

Combine the nested conditions for better readability.

-        if self.MSG_FENCED_CODE_BLOCKS_SPACING in message:
-            # Check if this is a start or end of code block
-            if line_idx < len(lines) and lines[line_idx].strip().startswith("```"):
+        if (self.MSG_FENCED_CODE_BLOCKS_SPACING in message and
+            line_idx < len(lines) and 
+            lines[line_idx].strip().startswith("```")):
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between abffd50 and 1d5205b.

📒 Files selected for processing (6)
  • HomeLab/modules/HomeLab.Core/README.md (1 hunks)
  • docs/TESTING-STRATEGY-DETAILED.md (5 hunks)
  • docs/networking/vpn-gateway.md (4 hunks)
  • tools/markdown_lint/cli.py (1 hunks)
  • tools/markdown_lint/linter.py (1 hunks)
  • tools/markdown_lint/test_regex_fix.py (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • docs/TESTING-STRATEGY-DETAILED.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • tools/markdown_lint/test_regex_fix.py
  • docs/networking/vpn-gateway.md
🧰 Additional context used
🧬 Code Graph Analysis (2)
tools/markdown_lint/cli.py (2)
tools/markdown_lint/linter.py (4)
  • MarkdownLinter (11-1062)
  • check_file (62-91)
  • check_directory (1007-1033)
  • fix_files (1035-1062)
tools/markdown_lint/models.py (1)
  • IssueSeverity (9-14)
tools/markdown_lint/linter.py (2)
tools/markdown_lint/models.py (5)
  • FileReport (36-69)
  • IssueSeverity (9-14)
  • LintIssue (18-32)
  • add_issue (63-65)
  • has_fixable_issues (59-61)
tools/markdown_lint/find_markdown_files.py (1)
  • find_markdown_files (73-99)
🪛 Ruff (0.12.2)
tools/markdown_lint/cli.py

7-7: typing.Optional imported but unused

Remove unused import: typing.Optional

(F401)

tools/markdown_lint/linter.py

535-537: Use a single if statement instead of nested if statements

(SIM102)


970-972: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: test
  • GitHub Check: Cursor Bugbot
  • GitHub Check: test
🔇 Additional comments (3)
HomeLab/modules/HomeLab.Core/README.md (1)

54-56: Code-fence now properly closed – markdown renders correctly
The missing back-tick that previously broke rendering has been added. No further action needed.

tools/markdown_lint/cli.py (2)

191-191: Skip previous comment

After reviewing _filter_reports_by_severity, I see that it transforms the FileReport objects into dictionaries before they reach the formatting functions.

Also applies to: 204-204


217-217: Skip previous comment

The reports are correctly transformed into dictionaries by _filter_reports_by_severity before being passed to this function.

Also applies to: 219-219, 221-221

import json
import sys
from pathlib import Path
from typing import Any, Dict, List, Optional

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove unused import Optional

The Optional type is imported but not used in the code.

-from typing import Any, Dict, List, Optional
+from typing import Any, Dict, List
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from typing import Any, Dict, List, Optional
-from typing import Any, Dict, List, Optional
+from typing import Any, Dict, List
🧰 Tools
🪛 Ruff (0.12.2)

7-7: typing.Optional imported but unused

Remove unused import: typing.Optional

(F401)

🤖 Prompt for AI Agents
In tools/markdown_lint/cli.py at line 7, the import statement includes Optional
which is not used anywhere in the code. Remove Optional from the import list to
clean up unused imports and avoid unnecessary dependencies.

"""Format reports as JSON output."""
output = []
for path, report in reports.items():
if report["issues"]:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix incorrect dictionary access for FileReport objects

The code attempts to access report["issues"] but based on the type hints and linter implementation, report should be a FileReport object with an issues attribute, not a dictionary.

-        if report["issues"]:
+        if report.issues:
-                        for issue in report["issues"]
+                        for issue in report.issues

Also applies to: 204-204

🤖 Prompt for AI Agents
In tools/markdown_lint/cli.py at lines 191 and 204, the code incorrectly
accesses the 'issues' property using dictionary syntax (report["issues"]) on a
FileReport object. Change these to use attribute access (report.issues) to
correctly reference the issues attribute of the FileReport instance.

file_count = 0

for path, report in sorted(reports.items()):
if report["issues"]:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix incorrect dictionary access for FileReport objects

The code incorrectly accesses FileReport attributes as dictionary keys.

-        if report["issues"]:
+        if report.issues:
-            issue_count += len(report["issues"])
+            issue_count += len(report.issues)
-            for issue in sorted(report["issues"], key=lambda x: x.line):
+            for issue in sorted(report.issues, key=lambda x: x.line):

Also applies to: 219-219, 221-221

🤖 Prompt for AI Agents
In tools/markdown_lint/cli.py around lines 217, 219, and 221, the code
incorrectly accesses FileReport attributes using dictionary key syntax. Change
these dictionary-style accesses to use attribute access with dot notation
instead, for example, replace report["issues"] with report.issues to correctly
access the FileReport object's attributes.

…e unused markdown lint tools

AI: I've analyzed the diff and prepared a concise conventional commit message that accurately describes the changes.
@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

@sonarqubecloud

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

HomeLab Tests Passed Successfully!

Test Results Summary:

  • Unit Tests: ✅ Passed
  • Integration Tests: ✅ Passed

🚀 Ready for Merge

All tests are passing and the code is ready to be merged into the main branch.

}

# Run tests
Write-Host "Executing tests..." -ForegroundColor Cyan

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Undefined Variable Causes Unintended Test Inclusion

The tools/Test-HomeLab.ps1 script uses the undefined variable $UnitOnly in a conditional check. As $UnitOnly is not a defined parameter (unlike $IntegrationOnly), the condition if (-not $UnitOnly) always evaluates to true, causing integration tests to be unintentionally included in test runs.

Locations (2)
Fix in Cursor Fix in Web

@JustAGhosT
JustAGhosT merged commit 92a8eee into main Jul 30, 2025
@JustAGhosT
JustAGhosT deleted the feat/docs-updated branch July 30, 2025 13:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant