Skip to content

Latest commit

ย 

History

198 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

QR Tool

Build Status PowerShell .NET Framework License

A PowerShell-based tool for automating DICOM study pre-fetching. It monitors an input directory for new DICOM files, and when a new file appears, it automatically queries a PACS for other studies belonging to the same patient, and then issues a move request to have those studies sent to a pre-configured destination.

Table of Contents

Overview

Features

  • Automatic Prefetching: Monitors a directory for incoming DICOM files and triggers a prefetching workflow.
  • Patient-Centric Query: Identifies the patient from the incoming file and queries a PACS for related studies.
  • Configurable Query Parameters: Allows specifying a timeframe for the study search (e.g., last 60 months) and can be configured to query for a fixed modality or the same modality as the trigger file.
  • Flexible Destination: The destination Application Entity (AE) for the C-MOVE operation is configurable.
  • Robust Workflow Management: Uses a multi-stage process with dedicated directories for tracking the state of each task (queued, processed, rejected, no-results).
  • Efficient Processing: Avoids re-processing of already handled studies by keeping a history of processed files.
  • Pixel Data Stripping: Optionally strips pixel data from large DICOM files to save space, as only the header information is needed for the query.
  • Worklist Integration: Connects to DICOM Modality Worklist servers to automatically discover and process scheduled procedures.
  • Privacy Controls: Configurable patient name masking for HIPAA compliance and privacy protection.
  • Retry Mechanisms: Robust error handling with configurable retry logic for network operations.
  • Comprehensive Logging: Detailed logging with configurable levels and file rotation.

Prerequisites

Before running QR Tool, ensure you have the following installed:

System Requirements

  • Operating System: Windows 10/11 or Windows Server 2016/2019/2022
  • PowerShell: Version 5.1 or later
  • .NET Framework: Version 4.7.2 or later
  • Visual Studio: 2017 or later (for building the C# cmdlets)

Network Requirements

  • PACS Connectivity: Network access to your DICOM PACS server
  • DICOM Ports: Ensure required DICOM ports (typically 104 or custom) are accessible
  • Application Entity (AE): Your tool's AE must be configured on the PACS server

Dependencies

  • fo-dicom: Version 4.0.8 (automatically managed via NuGet)
  • System.Management.Automation: For PowerShell cmdlet functionality

Installation

Option 1: Clone from Repository

git clone https://github.com/mostlydev/qr-tool.git
cd qr-tool

Option 2: Download Release

  1. Download the latest release from Releases
  2. Extract to your desired directory
  3. Follow the build instructions below

How It Works

The tool operates in a three-stage pipeline:

  1. Stage 1: File Ingestion (stage-1.ps1)

    • Monitors the incoming-stored-items directory for new .dcm files.
    • For each new file, it extracts PatientName, PatientBirthDate, and StudyDate.
    • A unique hash is generated from these tags to identify the study.
    • If the study has not been processed before, the file is moved to the queued-stored-items directory. If it's a large file, the pixel data may be stripped.
    • If the study has already been processed, the incoming file is rejected (either by deleting it or moving it to the rejected-stored-items directory).
  2. Stage 2: Study Discovery (stage-2.ps1)

    • Processes files in the queued-stored-items directory.
    • For each file, it performs a C-FIND query against the configured PACS (qrServerAE) to find other studies for the same patient.
    • The search can be limited by the studyFindMonthsBack parameter and can be configured to look for a specific modality using findAndMoveFixedModality.
    • If studies are found, it creates a .move-request ticket for each study in the queued-study-moves directory. The ticket is named with the StudyInstanceUID.
    • The original file from the queue is then moved to the processed-stored-items directory.
    • If no studies are found, the file is moved to the no-results-stored-items directory.
  3. Stage 3: Study Retrieval (stage-3.ps1)

    • Processes the .move-request tickets in the queued-study-moves directory.
    • For each ticket, it issues a C-MOVE request to the PACS to send the corresponding study to the configured destination AE (qrDestinationAE).
    • Upon successful completion of the C-MOVE, the ticket is moved to the processed-study-moves directory.

Project Structure

qr-tool/
โ”œโ”€โ”€ cache/                    # Working directory for the tool, contains subdirectories for each stage.
โ”‚   โ”œโ”€โ”€ incoming-stored-items/  # Drop new DICOM files here to trigger the workflow.
โ”‚   โ”œโ”€โ”€ queued-stored-items/    # Stage 1 output, Stage 2 input.
โ”‚   โ”œโ”€โ”€ processed-stored-items/ # Files that have been processed by Stage 2.
โ”‚   โ”œโ”€โ”€ rejected-stored-items/  # Files that were rejected in Stage 1.
โ”‚   โ”œโ”€โ”€ no-results-stored-items/ # Files for which no studies were found in Stage 2.
โ”‚   โ”œโ”€โ”€ queued-study-moves/     # Stage 2 output, Stage 3 input.
โ”‚   โ””โ”€โ”€ processed-study-moves/  # Move requests that have been processed by Stage 3.
โ”œโ”€โ”€ config.template.ps1       # Configuration template (copy to config.ps1)
โ”œโ”€โ”€ FoDicomCmdlets/           # C# project for custom DICOM PowerShell cmdlets.
โ”‚   โ””โ”€โ”€ FoDicomCmdlets.cs     # Implements Move-StudyByStudyInstanceUIDSync and Get-StudiesByPatientNameAndBirthDate.
โ”œโ”€โ”€ lib/                      # PowerShell modules for each stage and utility functions.
โ”‚   โ”œโ”€โ”€ dicom-funs.ps1        # DICOM-related helper functions.
โ”‚   โ”œโ”€โ”€ logging.ps1           # Logging functions and utilities.
โ”‚   โ”œโ”€โ”€ retry.ps1             # Retry mechanism for failed operations.
โ”‚   โ”œโ”€โ”€ stage-1.ps1           # Logic for the File Ingestion stage.
โ”‚   โ”œโ”€โ”€ stage-2.ps1           # Logic for the Study Discovery stage.
โ”‚   โ”œโ”€โ”€ stage-3.ps1           # Logic for the Study Retrieval stage.
โ”‚   โ”œโ”€โ”€ utility-funs.ps1      # Common utility functions.
โ”‚   โ””โ”€โ”€ worklist-query.ps1    # Worklist query functionality.
โ”œโ”€โ”€ qr-tool.ps1               # Main script to run the tool.
โ””โ”€โ”€ README.md                 # This file.

Configuration

All configuration is done by copying config.template.ps1 to config.ps1 and editing the settings.

DICOM Configuration:

  • $global:myAE: The Application Entity Title (AET) of this tool (default: "QR-TOOL")
  • $global:qrServerAE: The AET of the PACS to query (default: "HOROS")
  • $global:qrServerHost: The hostname or IP address of the PACS (default: "localhost")
  • $global:qrServerPort: The port number of the PACS (default: 2763)
  • $global:qrDestinationAE: The AET of the destination where the studies should be sent (default: "FLUXTEST1AB")

Query Parameters:

  • $global:studyFindMonthsBack: The number of months back to search for studies (default: 60)
  • $global:findAndMoveFixedModality: If set to a modality (e.g., "CT"), the tool will query for studies of that modality. If $null, it will query for studies with the same modality as the trigger file

Operational Settings:

  • $global:sleepSeconds: The number of seconds to wait between processing cycles. If set to 0, the script will run once and exit (default: 0)
  • $global:mtimeThreshholdSeconds: A file in the incoming directory is considered "fresh" and will be skipped if its last modified time is less than this many seconds ago (default: 3)
  • $global:largeFileThreshholdBytes: Files larger than this size (in bytes) will have their pixel data stripped in Stage 1 (default: 50000)
  • $global:rejectByDeleting: If $true, rejected files will be deleted. If $false, they will be moved to the rejected-stored-items directory (default: $true)
  • $global:maskPatientNames: If $true, patient names in log output will be masked for privacy (default: $true)

Worklist Configuration:

  • $global:WorklistEndpointAETitle: AE title of the worklist SCP server (default: "FLUX_WORKLIST")
  • $global:WorklistEndpointHost: Hostname/IP of the worklist server (default: "worklist.example.com")
  • $global:WorklistEndpointPort: Port number of the worklist server (default: 1070)
  • $global:WorklistQueryIntervalSeconds: Query interval in seconds (default: 300)
  • $global:EnableImagePrefetch: Enable automatic image prefetching (default: $true)
  • $global:WorklistModalityFilter: Filter by modality (null = all modalities)
  • $global:WorklistScheduledDateFilter: Filter by scheduled date (YYYYMMDD format)

Retry and Logging Configuration:

  • $global:RetryDefaultMaxRetries: Default retry attempts (default: 3)
  • $global:RetryDicomMoveMaxRetries: C-MOVE retry attempts (default: 5)
  • $global:logLevel: Logging level - DEBUG, INFO, WARN, ERROR, FATAL (default: "INFO")
  • $global:logToFile: Enable file logging (default: $true)
  • $global:logToConsole: Enable console logging (default: $true)

Directory Configuration:

  • $global:cacheDirBasePath: The base path for the working directories. Defaults to the cache subdirectory of the project
  • $global:incomingStoredItemsDirPath: The path to the directory where new DICOM files are placed

Usage

Quick Start

  1. Configure the tool:

    # Copy the template and edit with your PACS settings
    copy config.template.ps1 config.ps1
    notepad config.ps1
  2. Run the tool:

    # Windows PowerShell
    powershell -ExecutionPolicy Bypass -File qr-tool.ps1
    
    # Or from remote (SSH)
    ssh windev "cd C:\dev\qr-tool && powershell -ExecutionPolicy Bypass -File qr-tool.ps1"
  3. Drop DICOM files:

    # Place .dcm files in the incoming directory
    cache/incoming-stored-items/
    

Command Line Options

The main script supports the following parameters:

# Standard execution - Run three-stage processing pipeline once
.\qr-tool.ps1

# Start worklist query service - Continuously query worklist server for new items
.\qr-tool.ps1 -StartWorklistQuery

# Get help about the script
Get-Help .\qr-tool.ps1

Parameter Details:

  • No parameters: Runs the standard three-stage processing pipeline once and exits
  • -StartWorklistQuery: Starts the worklist query service that continuously monitors a DICOM Modality Worklist server for new scheduled procedures and automatically creates corresponding DICOM files in the incoming directory

Directory Structure After Setup

qr-tool/
โ”œโ”€โ”€ cache/                       # Working directories (auto-created)
โ”‚   โ”œโ”€โ”€ incoming-stored-items/   # Drop DICOM files here
โ”‚   โ”œโ”€โ”€ queued-stored-items/     # Files awaiting processing
โ”‚   โ”œโ”€โ”€ processed-stored-items/  # Successfully processed files
โ”‚   โ”œโ”€โ”€ rejected-stored-items/   # Duplicate/rejected files
โ”‚   โ”œโ”€โ”€ no-results-stored-items/ # Files with no matching studies
โ”‚   โ”œโ”€โ”€ queued-study-moves/      # Pending study move requests
โ”‚   โ”œโ”€โ”€ processed-study-moves/   # Completed study moves
โ”‚   โ”œโ”€โ”€ worklist-cache/          # Worklist query cache files
โ”‚   โ””โ”€โ”€ logs/                    # Application logs

Build and Run

Building the C# Cmdlets

Important: Prior to running qr-tool.ps1, build the FoDicomCmdlets solution in Release mode as the script will need to make use of both the DLL it will build and the DLL of the copy of fo-dicom that the solution will install in its packages folder.

  1. Open the Solution:

    # Open in Visual Studio
    start FoDicomCmdlets/FoDicomCmdlets.sln
  2. Restore NuGet Packages:

    • Right-click on the solution in Visual Studio
    • Select "Restore NuGet Packages"
    • This will download fo-dicom v4.0.8 and dependencies
  3. Build the Solution:

    # Build in Release mode (recommended)
    MSBuild FoDicomCmdlets/FoDicomCmdlets.sln /p:Configuration=Release

    Or use Visual Studio:

    • Set configuration to "Release"
    • Build โ†’ Build Solution (Ctrl+Shift+B)
  4. Verify Build Output:

    FoDicomCmdlets/bin/Release/
    โ”œโ”€โ”€ FoDicomCmdlets.dll     # Your custom cmdlets
    โ”œโ”€โ”€ Dicom.Core.dll         # fo-dicom library
    โ””โ”€โ”€ Other dependencies...
    
  5. Configure the Application: Before running the script, be sure to copy config.template.ps1 to config.ps1 and make any required changes.

    copy config.template.ps1 config.ps1
    # Edit config.ps1 with your specific PACS settings

Running the Tool

Local Execution (Windows)

# Standard execution - Run three-stage processing pipeline
.\qr-tool.ps1

# Start worklist query service
.\qr-tool.ps1 -StartWorklistQuery

Remote Execution (SSH)

# From Linux/macOS to Windows machine - Standard processing
ssh windev "cd C:\dev\qr-tool && powershell -ExecutionPolicy Bypass -File qr-tool.ps1"

# Start worklist query service remotely
ssh windev "cd C:\dev\qr-tool && powershell -ExecutionPolicy Bypass -File qr-tool.ps1 -StartWorklistQuery"

Service Installation (Optional)

To run as a Windows service:

# Install standard processing service (requires admin privileges)
New-Service -Name "QRTool" -BinaryPathName "powershell.exe -ExecutionPolicy Bypass -File C:\path\to\qr-tool.ps1" -DisplayName "DICOM QR Tool" -Description "Automated DICOM study prefetching service"

# Install worklist query service (requires admin privileges)
New-Service -Name "QRToolWorklist" -BinaryPathName "powershell.exe -ExecutionPolicy Bypass -File C:\path\to\qr-tool.ps1 -StartWorklistQuery" -DisplayName "DICOM QR Tool Worklist" -Description "DICOM worklist query service"

# Start the services
Start-Service -Name "QRTool"
Start-Service -Name "QRToolWorklist"

Testing

End-to-End Test Results

The QR Tool has been successfully tested with the complete workflow:

Worklist Query Service Test

# Clear worklist cache to treat existing items as new
rm cache/worklist-cache/*.json

# Run worklist query service
powershell -ExecutionPolicy Bypass -File qr-tool.ps1 -StartWorklistQuery

Results:

  • โœ… Successfully connected to worklist.fluxinc.ca:1070
  • โœ… Retrieved 10 worklist items from the server
  • โœ… Generated 10 new DICOM files in incoming-stored-items/:
    • worklist-AV35674-00000-20250630081346.dcm (VIVALDI^ANTONIO)
    • worklist-BLV734623-00007-20250630081346.dcm (BEETHOVEN^LUDWIG^VAN)
    • worklist-HF-00004-20250630081346.dcm (HAYDN^FRANZ^JOSEPH)
    • worklist-MWA484763-00001-20250630081346.dcm (MOZART^WOLFGANG^AMADEUS)
    • Plus 6 additional files for the same patients

Standard Processing Pipeline Test

# Run standard processing pipeline
powershell -ExecutionPolicy Bypass -File qr-tool.ps1

Results:

  • โœ… Stage 1 (File Ingestion): Successfully processed 10 incoming files
  • โœ… Deduplication: Correctly identified and rejected duplicate files based on patient name + DOB hash
  • โœ… Stage 2 (Study Discovery): Processed queued files and attempted PACS queries
  • โœ… Error Handling: Gracefully handled expected PACS connection failures with retry mechanism
  • โœ… Logging: Comprehensive logging to cache/logs/qr-tool-YYYYMMDD.log

Key Features Validated

  1. Worklist Integration - Connects to external worklist server and creates DICOM files
  2. File Processing Pipeline - Three-stage processing (ingestion โ†’ discovery โ†’ retrieval)
  3. Patient Deduplication - Prevents duplicate processing using PatientName+DOB+StudyDate hash
  4. Error Handling & Retry - Robust error handling with configurable retry mechanisms
  5. Privacy Controls - Patient name masking functionality (configurable)
  6. Configuration Management - Template-based configuration system

Manual Testing

To test the QR Tool manually:

  1. Setup Configuration:

    copy config.template.ps1 config.ps1
    # Edit config.ps1 with your PACS settings
  2. Test Worklist Service:

    # Start worklist query service (runs continuously)
    .\qr-tool.ps1 -StartWorklistQuery
  3. Test File Processing:

    # Place test DICOM files in cache/incoming-stored-items/
    # Then run the processing pipeline
    .\qr-tool.ps1
  4. Monitor Results:

    # Check processing stages
    dir cache\queued-stored-items\      # Stage 1 output
    dir cache\processed-stored-items\   # Stage 2 output  
    dir cache\queued-study-moves\       # Stage 2 โ†’ Stage 3
    dir cache\processed-study-moves\    # Stage 3 output
    
    # Check logs
    type cache\logs\qr-tool-YYYYMMDD.log

API Documentation

PowerShell Cmdlets

The tool provides two custom PowerShell cmdlets:

Move-StudyByStudyInstanceUIDSync

Performs a synchronous DICOM C-MOVE operation.

Move-StudyByStudyInstanceUIDSync -StudyInstanceUID "1.2.3.4.5" -DestinationAE "WORKSTATION" -ServerHost "192.168.1.100" -ServerPort 104 -MyAE "QR_TOOL" -ServerAE "PACS_SERVER"

Parameters:

  • StudyInstanceUID (Required): The study to move
  • DestinationAE (Required): Target AE for the study
  • ServerHost (Required): PACS server hostname/IP
  • ServerPort (Required): PACS server port
  • MyAE (Required): This tool's AE title
  • ServerAE (Required): PACS server AE title

Get-StudiesByPatientNameAndBirthDate

Queries PACS for studies matching patient criteria.

Get-StudiesByPatientNameAndBirthDate -PatientName "DOE^JOHN" -PatientBirthDate "19800101" -ServerHost "192.168.1.100" -ServerPort 104 -MyAE "QR_TOOL" -ServerAE "PACS_SERVER"

PowerShell Functions

Key functions available in the lib/ modules:

  • Get-DicomPatientInfo: Extract patient data from DICOM files
  • Test-DicomFile: Validate DICOM file integrity
  • New-StudyHash: Generate unique study identifiers
  • Invoke-StageOne: Execute file ingestion logic
  • Invoke-StageTwo: Execute study discovery logic
  • Invoke-StageThree: Execute study retrieval logic

Contributing

We welcome contributions to the QR Tool project! Please follow these guidelines:

Development Setup

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature-name
  3. Follow the existing code style and conventions
  4. Test your changes thoroughly
  5. Submit a pull request with a clear description

Code Style

  • Use consistent PowerShell formatting
  • Include inline comments for complex logic
  • Follow existing naming conventions
  • Ensure all C# code compiles without warnings

Reporting Issues

Please use the GitHub issue tracker to report bugs or request features:

  1. Check existing issues first
  2. Provide detailed reproduction steps
  3. Include system information (OS, PowerShell version, etc.)
  4. Attach relevant log files if available

Troubleshooting

Common Issues

Build Errors

Issue: NuGet package restore fails

Solution: Ensure you have internet connectivity and try:
- Clean solution in Visual Studio
- Delete packages/, bin/ and obj/ folders and rebuild
- Check NuGet sources in Visual Studio settings

Issue: fo-dicom compatibility errors

Solution: Verify .NET Framework version compatibility:
- Ensure .NET Framework 4.7.2 or later is installed
- Check project target framework in .csproj file

Runtime Errors

Issue: "Access Denied" when running PowerShell script

# Solution: Set execution policy:
powershell -ExecutionPolicy Bypass -File qr-tool.ps1

Issue: DICOM connection timeouts

Solution: Check network configuration:
- Verify PACS server is accessible
- Confirm AE titles are configured correctly
- Test connectivity with DICOM tools like dcmtk

Issue: Files not being processed

Solution: Check directory permissions and file states:
- Ensure write permissions on cache directories
- Verify files meet the mtime threshold requirements
- Check logs for processing errors

Debug Mode

Enable verbose logging for troubleshooting by setting the log level in your configuration:

# Edit config.ps1 to enable debug logging
$global:logLevel = "DEBUG"

# Then run normally
.\qr-tool.ps1
# or
.\qr-tool.ps1 -StartWorklistQuery

FAQ

Q: Can this tool work with non-Windows PACS servers? A: Yes, the tool communicates using standard DICOM protocols and can work with any DICOM-compliant PACS, regardless of the server's operating system.

Q: How do I configure multiple destination AEs? A: Currently, the tool supports a single destination AE per configuration. You can run multiple instances with different configurations for multiple destinations.

Q: What happens if the PACS server is temporarily unavailable? A: The tool will log connection errors and continue processing. Implement the retry mechanism (Task #13) for automatic retry functionality.

Q: Can I modify the query criteria beyond patient name and birth date? A: Yes, you can modify the Get-StudiesByPatientNameAndBirthDate cmdlet to include additional DICOM tags in the query.

Q: Is there a way to preview what studies will be moved before they're actually transferred? A: Currently, the tool processes automatically. You can modify Stage 3 to add a confirmation step or implement a dry-run mode.

Changelog

Version 1.0.0 (Current)

  • Initial release with three-stage processing pipeline
  • Support for fo-dicom 4.0.8
  • Configurable PACS connectivity
  • Pixel data stripping for large files
  • Basic error handling and logging

Planned Features

  • Enhanced error handling and retry mechanisms
  • Performance monitoring and metrics
  • Study deduplication
  • Unit test coverage
  • Web-based monitoring interface

License

Copyright (c) 2025 [Your Organization Name]. All rights reserved.

This software is proprietary and confidential. No part of this software may be reproduced, distributed, or transmitted in any form or by any means, including photocopying, recording, or other electronic or mechanical methods, without the prior written permission of the copyright holder.

Third-Party Licenses

This project uses the following third-party libraries:

fo-dicom

The fo-dicom library is licensed under the Microsoft Public License (MS-PL), which permits use, modification, and distribution under certain conditions. The full license text is available at the link above.

System.Management.Automation

Acknowledgments

  • fo-dicom Team - For providing the excellent DICOM library that powers our C# cmdlets
  • Microsoft PowerShell Team - For the robust automation framework
  • DICOM Standards Committee - For maintaining the DICOM standard that enables medical imaging interoperability
  • Contributors - Thanks to all who have contributed to this project

Support

For technical support or questions, please:

  1. Check the FAQ section
  2. Review Troubleshooting guide
  3. Search existing GitHub Issues
  4. Create a new issue with detailed information

Built with โค๏ธ for the medical imaging community

๐ŸŽฏ Taskmaster Export - 2025-07-03 17:48:30 UTC ๐Ÿ“‹ Export: without subtasks โ€ข Status filter: none ๐Ÿ”— Powered by Task Master

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                         โ”‚โ”‚                                                         โ”‚
โ”‚   Project Dashboard                                     โ”‚โ”‚   Dependency Status & Next Task                         โ”‚
โ”‚   Tasks Progress: โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 0%    โ”‚โ”‚   Dependency Metrics:                                   โ”‚
โ”‚   0%                                                   โ”‚โ”‚   โ€ข Tasks with no dependencies: 1                      โ”‚
โ”‚   Done: 0  In Progress: 0  Pending: 10  Blocked: 0     โ”‚โ”‚   โ€ข Tasks ready to work on: 1                          โ”‚
โ”‚   Deferred: 0  Cancelled: 0                             โ”‚โ”‚   โ€ข Tasks blocked by dependencies: 9                    โ”‚
โ”‚                                                         โ”‚โ”‚   โ€ข Most depended-on task: #1 (5 dependents)           โ”‚
โ”‚   Subtasks Progress: โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘     โ”‚โ”‚   โ€ข Avg dependencies per task: 1.1                      โ”‚
โ”‚   0% 0%                                               โ”‚โ”‚                                                         โ”‚
โ”‚   Completed: 0/0  In Progress: 0  Pending: 0      โ”‚โ”‚   Next Task to Work On:                                 โ”‚
โ”‚   Blocked: 0  Deferred: 0  Cancelled: 0                 โ”‚โ”‚   ID: 1 - Implement Comprehensive Unit Testing ...     โ”‚
โ”‚                                                         โ”‚โ”‚   Priority: high  Dependencies: None                    โ”‚
โ”‚   Priority Breakdown:                                   โ”‚โ”‚   Complexity: โ— 7                                       โ”‚
โ”‚   โ€ข High priority: 5                                   โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
โ”‚   โ€ข Medium priority: 5                                 โ”‚
โ”‚   โ€ข Low priority: 0                                     โ”‚
โ”‚                                                         โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ID        โ”‚ Title                                โ”‚ Status          โ”‚ Priority     โ”‚ Dependencies          โ”‚ Complexiโ€ฆ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1         โ”‚ Implement Comprehensive Unit Testing โ”‚ โ—‹ pending       โ”‚ high         โ”‚ None                  โ”‚ โ— 7       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 2         โ”‚ Implement Startup Configuration Vali โ”‚ โ—‹ pending       โ”‚ high         โ”‚ 1                     โ”‚ โ— 4       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 3         โ”‚ Implement Performance Monitoring Mod โ”‚ โ—‹ pending       โ”‚ high         โ”‚ 1                     โ”‚ โ— 5       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 4         โ”‚ Enhance Study Deduplication with Exp โ”‚ โ—‹ pending       โ”‚ high         โ”‚ 1                     โ”‚ โ— 6       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 5         โ”‚ Improve Error Recovery with Exponent โ”‚ โ—‹ pending       โ”‚ high         โ”‚ 1                     โ”‚ โ— 7       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 6         โ”‚ Implement Structured Logging         โ”‚ โ—‹ pending       โ”‚ medium       โ”‚ 1                     โ”‚ โ— 6       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 7         โ”‚ Optimize Code and Memory Management  โ”‚ โ—‹ pending       โ”‚ medium       โ”‚ 3                     โ”‚ โ— 8       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 8         โ”‚ Develop Backend API for Monitoring D โ”‚ โ—‹ pending       โ”‚ medium       โ”‚ 3, 6                  โ”‚ โ— 6       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 9         โ”‚ Build Web-Based Monitoring Dashboard โ”‚ โ—‹ pending       โ”‚ medium       โ”‚ 8                     โ”‚ โ— 5       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 10        โ”‚ Implement Container Support with Doc โ”‚ โ—‹ pending       โ”‚ medium       โ”‚ 2, 9                  โ”‚ โ— 8       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โšก RECOMMENDED NEXT TASK โšก โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ โ”‚ ๐Ÿ”ฅ Next Task to Work On: #1 - Implement Comprehensive Unit Testing Framework โ”‚ โ”‚ โ”‚ โ”‚ Priority: high Status: โ—‹ pending โ”‚ โ”‚ Dependencies: None โ”‚ โ”‚ โ”‚ โ”‚ Description: Establish a comprehensive unit testing framework for the PowerShell Core Engine and the FoDicomCmdlets C# library. This is a foundational step to ensure code quality, enable safe refactoring, and prevent regressions as new features are added. โ”‚ โ”‚ โ”‚ โ”‚ Start working: task-master set-status --id=1 --status=in-progress โ”‚ โ”‚ View details: task-master show 1 โ”‚ โ”‚ โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ โ”‚ Suggested Next Steps: โ”‚ โ”‚ โ”‚ โ”‚ 1. Run task-master next to see what to work on next โ”‚ โ”‚ 2. Run task-master expand --id= to break down a task into subtasks โ”‚ โ”‚ 3. Run task-master set-status --id= --status=done to mark a task as complete โ”‚ โ”‚ โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

๐Ÿ“‹ End of Taskmaster Export - Tasks are synced from your project using the sync-readme command.

Prior to runninig qr-tool.ps1, build the FoDicomCmdlets solution in Release mode as the script will need to make use of both the DLL it will build and the DLL of the copy of fo-dicom that the solution will install in itjs packages folder.

Before running the script, be sure to copy config.template.ps1 to config.ps1 to and make any required changes.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages