{"id":34241624,"url":"https://github.com/phellams/miniforge","last_synced_at":"2026-05-29T17:31:40.256Z","repository":{"id":323080309,"uuid":"1092059483","full_name":"phellams/miniforge","owner":"phellams","description":"A unified tool for performing CRUD and array manipulation on various PowerShell data structures","archived":false,"fork":false,"pushed_at":"2025-11-07T23:46:03.000Z","size":34,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-08T01:18:02.000Z","etag":null,"topics":["arrays","crud","dictionary","hashtable","module","pscustomobject","psobject","sortedlist"],"latest_commit_sha":null,"homepage":"https://github.com/phellams/miniforge","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phellams.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-07T23:38:51.000Z","updated_at":"2025-11-07T23:46:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/phellams/miniforge","commit_stats":null,"previous_names":["phellams/miniforge"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/phellams/miniforge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phellams%2Fminiforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phellams%2Fminiforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phellams%2Fminiforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phellams%2Fminiforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phellams","download_url":"https://codeload.github.com/phellams/miniforge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phellams%2Fminiforge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33664259,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arrays","crud","dictionary","hashtable","module","pscustomobject","psobject","sortedlist"],"created_at":"2025-12-16T04:11:36.209Z","updated_at":"2026-05-29T17:31:40.250Z","avatar_url":"https://github.com/phellams.png","language":"PowerShell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\r\n    \u003cH1\u003eMINIFORGE\u003c/H1\u003e\r\n    \u003cimg src=\"https://raw.githubusercontent.com/phellams/phellams-general-resources/main/misc/hr/wings-diamond.svg\" alt=\"hr\"\u003e\r\n    \u003cimg src=\"https://img.shields.io/badge/MIT-License-blue?style=flat-square\u0026labelColor=%23002F6C\u0026color=%23E2522F\" alt=\"license\" /\u003e \u003cimg src=\"https://img.shields.io/badge/Utility-Module-blue?style=flat-square\u0026labelColor=%23002F6C\u0026color=%23E2522F\" alt=\"utility-module-blue\" /\u003e\r\n\u003c/div\u003e\r\n\u003c/br\u003e\r\n\r\nThe **MiniForge** module provides the `Invoke-ForgeAction` function (with aliases `miniforge` and `imini`), a unified tool for performing **CRUD** (Create, Read, Update, Delete) and **array manipulation** (push/pull) operations on various PowerShell data structures. It abstracts the underlying differences in how properties/keys are managed across **Hashtables**, **PSObjects**, **PSCustomObjects**, **Dictionary**, and **SortedList** types.\r\n\r\n\r\n\r\n## 🟠 Table of Contents\r\n\r\n- [Quick Start](#-quick-start)\r\n- [Features](#features)\r\n- [Getting Started](#getting-started)\r\n- [Cmdlets](#cmdlets)\r\n- [Examples](#examples)\r\n  - [🟢 ***Create***](#create)\r\n  - [🟡 ***Update***](#update)\r\n  - [🟣 ***Push***](#push)\r\n  - [🟠 ***Pull***](#pull)\r\n  - [🔴 ***Delete***](#delete)\r\n  - [🔵 ***Read***](#read)\r\n- [Data Accelerators](#data-accelerators)\r\n- [Complete Example Workflow](#complete-example-workflow)\r\n- [Supported Data Types](#supported-data-types-comparison)\r\n- [Advanced Usage](#advanced-usage)\r\n- [Troubleshooting](#troubleshooting)\r\n- [TODO](#-todo)\r\n- [License](#-license)\r\n\r\n---\r\n\r\n### Installation Resources:\r\n \r\n|▓▓▓▓▒▒▒▒░░░|▓▓▓▓▒▒▒▒░░░|▓▓▓▓▒▒▒▒░░░|\r\n|-|-|-|\r\n|💼 Releases/Tags | \u003ca href=\"https://gitlab.com/phellams/miniforge/-/releases\"\u003e \u003cimg src=\"https://img.shields.io/gitlab/v/release/phellams%2Fminiforge?include_prereleases\u0026style=flat-square\u0026logoColor=%2300B2A9\u0026labelColor=%23CD5C5C\u0026color=%231E3D59\" alt=\"gitlab-release\"\u003e\u003c/a\u003e | \u003ca href=\"https://gitlab.com/phellams/fastfsc/-/tags\"\u003e \u003cimg src=\"https://img.shields.io/gitlab/v/tag/phellams%2Fminiforge?include_prereleases\u0026style=flat-square\u0026logoColor=%\u0026labelColor=%23CD5C5C\u0026color=%231E3D59\" alt=\"gitlab tags\"\u003e\u003c/a\u003e |\r\n\r\n\r\n---\r\n\r\n## 🚀 Quick Start\r\n\r\n```powershell\r\n# Import the module\r\nImport-Module .\\miniforge.psm1\r\n\r\n# using with another module\r\nusing module .\\miniforge.psm1\r\n\r\n# Create a data object\r\n$data = [PSCustomObject]@{ Name = 'Test' }\r\n\r\n# or create another data type using miniforge data accelerators\r\n\r\n# SortedList \r\n$sl = imini\r\n\r\n# Use the function with full syntax\r\nInvoke-ForgeAction -Data $data -Action create -Name 'Status' -Value 'Active'\r\n\r\n# Or use the short alias\r\nminiforge $data update 'Status' 'Complete'\r\n\r\n# Even shorter\r\nimini $data read 'Status'\r\n```\r\n\r\n---\r\n\r\n# Features\r\n\r\n- **CRUD Operations** (*Create*, *Read*, *Update*, *Delete*) on:\r\n    - **Hashtables**\r\n    - **PSObjects** and **PSCustomObjects**\r\n    - **Dictionary** (`System.Collections.Generic.Dictionary`)\r\n    - **SortedList** (`System.Collections.Generic.SortedList`)\r\n- **Array Manipulation** (*push*, *pull*) for array-type properties in:\r\n    - Arrays: `[string[]]`, `[object[]]`, `[int[]]`, `[hashtable[]]`\r\n    - Custom arrays: `[psobject[]]`, `[pscustomobject[]]`\r\n- **Debug Logging** with colored console output\r\n    - Enable globally via `$global:__logging = $true`\r\n    - Disable globally via `$global:__logging = $false`\r\n- **Easy-to-use** aliases: `miniforge`, `imini`\r\n- **Flexible Integration**: Import as a module or load via `using module`\r\n\r\n## Getting Started\r\n\r\n### 🔨 Installation\r\n\r\n1. Download or clone the module from [https://github.com/sgkens/miniforge](https://github.com/sgkens/miniforge)\r\n2. Navigate to the `miniforge` directory\r\n\r\n### 🔨 Loading the Module\r\n\r\n**Option 1: Import Module (Standard)**\r\n\r\n```powershell\r\ncd path\\to\\miniforge\r\nImport-Module .\\miniforge.psm1\r\n```\r\n\r\n**Option 2: Using Module Statement**\r\n\r\n```powershell\r\nusing module .\\miniforge.psm1\r\n```\r\n\r\n**Option 3: Install to PowerShell Modules Path**\r\n\r\nCopy the entire `miniforge` folder to one of your PowerShell module paths, then:\r\n\r\n```powershell\r\nImport-Module miniforge\r\n```\r\n\r\nTo find your module paths, run: `$env:PSModulePath -split ';'`\r\n\r\n\r\n# Cmdlets\r\n\r\n### 🟢 Invoke-ForgeAction\r\n\r\n**Aliases**: `miniforge`, `imini`\r\n\r\nThis is the main (and only) function exposed by the module.\r\n\r\n#### Parameters\r\n\r\n| Name       | Type                                  | Description                                                          | Required |\r\n| :--------- | :------------------------------------ | :------------------------------------------------------------------- | :------- |\r\n| **Data**   | *PSObject*, *PSCustomObject*, *Hashtable*, *Dictionary*, *SortedList* | The target data structure to modify. | Yes |\r\n| **Action** | *String* | The operation to perform: `create`, `read`, `update`, `delete`, `push`, `pull` | Yes |\r\n| **Name**   | *String* | The property or key name to target. | Yes |\r\n| **Value**  | *Any* | The value to set (for create/update/push) or remove (for pull). Not required for read/delete. | No |\r\n\r\n#### Logging Control\r\n\r\n**Enable logging globally:**\r\n\r\n```powershell\r\n$global:__logging = $true\r\n```\r\n\r\n**Disable logging globally:**\r\n\r\n```powershell\r\n$global:__logging = $false\r\n```\r\n\r\n# Examples\r\n\r\n### **Create**\r\n\r\n🟢 **Adding a Property to a PSCustomObject**\r\n\r\n```powershell\r\n$obj = [PSCustomObject]@{ ID = 1 }\r\nInvoke-ForgeAction -Data $obj -Action create -Name 'Status' -Value 'Active'\r\n# Output: $obj now has { ID = 1; Status = 'Active' }\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\nminiforge -Data $obj -Action create -Name 'Status' -Value 'Active'\r\n# or even shorter with aliases:\r\nimini $obj create 'Status' 'Active'\r\n```\r\n\r\n🟢 **Adding a Key to a Hashtable**\r\n\r\n```powershell\r\n$ht = @{ Name = 'Test' }\r\nInvoke-ForgeAction -Data $ht -Action create -Name 'Price' -Value 99.99\r\n# Output: $ht now has @{ Name = 'Test'; Price = 99.99 }\r\n```\r\n\r\n🟢 **Adding to a Dictionary**\r\n\r\n```powershell\r\n$dict = [System.Collections.Generic.Dictionary[string,string]]::new()\r\nInvoke-ForgeAction -Data $dict -Action create -Name 'Server' -Value 'localhost'\r\n```\r\n\r\n\u003e **Note:** The `create` action will prevent overwriting existing properties. Use `update` to modify existing values.\r\n\r\n---\r\n\r\n### **Update**\r\n\r\n🟡 **Updating a Key in a Hashtable**\r\n\r\n```powershell\r\n$ht = @{ Price = 100.00; Name = 'Product' }\r\nInvoke-ForgeAction -Data $ht -Action update -Name 'Price' -Value 109.99\r\n# Output: $ht now has @{ Price = 109.99; Name = 'Product' }\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\nminiforge $ht update 'Price' 109.99\r\n```\r\n\r\n🟡 **Updating a PSCustomObject Property**\r\n\r\n```powershell\r\n$obj = [PSCustomObject]@{ Status = 'Pending'; Count = 10 }\r\nInvoke-ForgeAction -Data $obj -Action update -Name 'Status' -Value 'Complete'\r\n# Output: $obj now has { Status = 'Complete'; Count = 10 }\r\n```\r\n\r\n\u003e **Note:** The `update` action will warn if the property doesn't exist. Use `create` to add new properties.\r\n\r\n---\r\n\r\n### **Push** \r\n\r\n🟠 **Pushing an Item to an Array Property**\r\n\r\nThe `push` action appends a value to an existing array. The target property must already be an array type.\r\n\r\n```powershell\r\n$obj = [PSCustomObject]@{ Tags = @('red', 'green') }\r\nInvoke-ForgeAction -Data $obj -Action push -Name 'Tags' -Value 'blue'\r\n# Output: $obj.Tags is now @('red', 'green', 'blue')\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\nminiforge $obj push 'Tags' 'blue'\r\n```\r\n\r\n🟠 **Pushing to a Hashtable Array**\r\n\r\n```powershell\r\n$config = @{ Servers = @('server1', 'server2') }\r\nInvoke-ForgeAction -Data $config -Action push -Name 'Servers' -Value 'server3'\r\n# Output: $config.Servers is now @('server1', 'server2', 'server3')\r\n```\r\n\r\n🟠 **Supported Array Types**\r\n\r\n```powershell\r\n# Works with: [string[]], [object[]], [int[]], [hashtable[]], [psobject[]], [pscustomobject[]]\r\n$data = @{ Numbers = @(1, 2, 3) }\r\nInvoke-ForgeAction -Data $data -Action push -Name 'Numbers' -Value 4\r\n```\r\n\r\n\u003e **Note:** The property must already exist as an array. Use `create` first to initialize array properties.\r\n\r\n---\r\n\r\n### **Pull** \r\n\r\n🟣 **Pulling (Removing) an Item from an Array**\r\n\r\nThe `pull` action removes a specific value from an array property.\r\n\r\n```powershell\r\n$ht = @{ Colors = @('red', 'green', 'blue') }\r\nInvoke-ForgeAction -Data $ht -Action pull -Name 'Colors' -Value 'green'\r\n# Output: $ht.Colors is now @('red', 'blue')\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\nminiforge $ht pull 'Colors' 'green'\r\n```\r\n\r\n🟣 **Removing from PSCustomObject Array**\r\n\r\n```powershell\r\n$user = [PSCustomObject]@{ Roles = @('Admin', 'Editor', 'Viewer') }\r\nInvoke-ForgeAction -Data $user -Action pull -Name 'Roles' -Value 'Editor'\r\n# Output: $user.Roles is now @('Admin', 'Viewer')\r\n```\r\n\r\n\u003e **Note:** If the value appears multiple times in the array, all instances will be removed.\r\n\r\n---\r\n\r\n### **Delete** \r\n\r\n🔴 **Removing a Property from a PSCustomObject**\r\n\r\nThe `delete` action completely removes a property or key from the data structure.\r\n\r\n```powershell\r\n$obj = [PSCustomObject]@{ ID = 1; Name = 'Test'; Status = 'Active' }\r\nInvoke-ForgeAction -Data $obj -Action delete -Name 'Status'\r\n# Output: $obj now has { ID = 1; Name = 'Test' }\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\nminiforge $obj delete 'Status'\r\n```\r\n\r\n🔴 **Removing a Key from a Hashtable**\r\n\r\n```powershell\r\n$ht = @{ Price = 100.00; Name = 'Product'; SKU = 'ABC123' }\r\nInvoke-ForgeAction -Data $ht -Action delete -Name 'SKU'\r\n# Output: $ht now has @{ Price = 100.00; Name = 'Product' }\r\n```\r\n\r\n🔴 **Removing from Dictionary or SortedList**\r\n\r\n```powershell\r\n$dict = [System.Collections.Generic.Dictionary[string,string]]::new()\r\n$dict.Add('Key1', 'Value1')\r\n$dict.Add('Key2', 'Value2')\r\nInvoke-ForgeAction -Data $dict -Action delete -Name 'Key1'\r\n# Output: $dict only contains Key2\r\n```\r\n\r\n\u003e **Note:** The `delete` action will warn if the property doesn't exist.\r\n\r\n\r\n---\r\n\r\n### **Read** \r\n\r\n🔵 **Getting a Property Value**\r\n\r\nThe `read` action retrieves the value of a property or key from the data structure.\r\n\r\n```powershell\r\n$obj = [PSCustomObject]@{ ID = 1; Name = 'TestUser'; Email = 'test@example.com' }\r\n$id = Invoke-ForgeAction -Data $obj -Action read -Name 'ID'\r\n# Output: $id contains 1\r\n```\r\n\r\n**Shorthand:**\r\n\r\n```powershell\r\n$email = miniforge $obj read 'Email'\r\n```\r\n\r\n🔵 **Reading from a Hashtable**\r\n\r\n```powershell\r\n$config = @{ Server = 'localhost'; Port = 8080; SSL = $true }\r\n$port = Invoke-ForgeAction -Data $config -Action read -Name 'Port'\r\n# Output: $port contains 8080\r\n```\r\n\r\n🔵 **Reading from Dictionary**\r\n\r\n```powershell\r\n$settings = [System.Collections.Generic.Dictionary[string,string]]::new()\r\n$settings.Add('Theme', 'Dark')\r\n$theme = Invoke-ForgeAction -Data $settings -Action read -Name 'Theme'\r\n# Output: $theme contains 'Dark'\r\n```\r\n\r\n\u003e **Note:** The `read` action returns `$null` and logs a warning if the property doesn't exist.\r\n\r\n---\r\n\r\n### 🟢 Convert-IminiData\r\n\r\nConvert and hashtable into `psobject`, `pscustomobject`, `dictionary`, `SortedList`\r\n\r\n```powershell\r\n@{ count=126; files=@('file1.txt', 'file2.txt') } | Convert-IminiData -Type PsCustomObject\r\n@{ count=126; files=@('file1.txt', 'file2.txt') } | Convert-IminiData -Type PsObject\r\n@{ count=126; files=@('file1.txt', 'file2.txt') } | Convert-IminiData -Type Dictionary\r\n@{ count=126; files=@('file1.txt', 'file2.txt') } | Convert-IminiData -Type SortedList\r\n```\r\n\r\n\r\n# Data Accelerators\r\n\r\n### 🔷 New-Iminpso \r\n\r\n**Alias**: `iminpso`\r\n\r\nGenerates a `PSObject` from `hashtable`.\r\n\r\n```powershell\r\n$pso = iminipso @{ prop1 = 'prop1value'; level = 1 }\r\n```\r\n\r\n### 🔷  New-Iminipsco\r\n\r\n**Alias**: iminipsco\r\n\r\nGenerates a `PSCustomObject` from `hashtable`.\r\n\r\n```powershell\r\n$psco = iminipsco @{ prop1 = 'prop1value'; level = 1 }\r\n```\r\n\r\n### 🔷 New-Iminiht\r\n\r\n**Alias**: iminiht\r\n\r\nGenerates a `Hashtable` from `hashtable`.\r\n\r\n```powershell\r\n$psht = iminipsco @{ prop1 = 'prop1value'; level = 1 }\r\n```\r\n\r\n### 🔷 New-Iminidic\r\n\r\n**Alias**: iminidic\r\n\r\nGenerates a `System.Collections.Generic.Dictionary[string, object]` from `Hashtable`.\r\n\r\n```powershell\r\n$psdic = iminidic @{ prop1 = 'prop1value'; level = 1 }\r\n```\r\n\r\n### 🔷 New-Iminisl\r\n\r\n**Alias**: iminisl\r\n\r\nGenerates a `System.Collections.SortedList` from `Hashtable`.\r\n\r\n```powershell\r\n$psdsl = iminisl @{ prop1 = 'prop1value'; level = 1 }\r\n```\r\n\r\n## Complete Example Workflow\r\n\r\nHere's a comprehensive example showing multiple operations:\r\n\r\n```powershell\r\n# Import the module\r\nImport-Module .\\miniforge.psm1\r\n\r\n# Enable logging to see what's happening\r\n$global:__logging = $true\r\n\r\n# Create a configuration object\r\n$appConfig = [PSCustomObject]@{\r\n    AppName = 'MyApp'\r\n    Version = '1.0.0'\r\n    Features = @('Auth', 'API')\r\n}\r\n\r\n# Add a new property\r\nInvoke-ForgeAction -Data $appConfig -Action create -Name 'Environment' -Value 'Development'\r\n\r\n# Update the version\r\nInvoke-ForgeAction -Data $appConfig -Action update -Name 'Version' -Value '1.1.0'\r\n\r\n# Add a feature to the array\r\nInvoke-ForgeAction -Data $appConfig -Action push -Name 'Features' -Value 'Logging'\r\n\r\n# Read a value\r\n$env = Invoke-ForgeAction -Data $appConfig -Action read -Name 'Environment'\r\nWrite-Host \"Current Environment: $env\"\r\n\r\n# Remove a feature from the array\r\nInvoke-ForgeAction -Data $appConfig -Action pull -Name 'Features' -Value 'API'\r\n\r\n# Delete a property\r\nInvoke-ForgeAction -Data $appConfig -Action delete -Name 'Environment'\r\n\r\n# Display final result\r\n$appConfig | Format-List\r\n```\r\n\r\n---\r\n\r\n## Supported Data Types Comparison\r\n\r\n| Data Type | Create | Read | Update | Delete | Push/Pull Arrays |\r\n|:----------|:------:|:----:|:------:|:------:|:----------------:|\r\n| **Hashtable** | ✅ | ✅ | ✅ | ✅ | ✅ |\r\n| **PSObject** | ✅ | ✅ | ✅ | ✅ | ✅ |\r\n| **PSCustomObject** | ✅ | ✅ | ✅ | ✅ | ✅ |\r\n| **Dictionary** | ✅ | ✅ | ✅ | ✅ | ✅ |\r\n| **SortedList** | ✅ | ✅ | ✅ | ✅ | ✅ |\r\n\r\n**Array Support**: `[string[]]`, `[object[]]`, `[int[]]`, `[hashtable[]]`, `[psobject[]]`, `[pscustomobject[]]`\r\n\r\n---\r\n\r\n## Advanced Usage\r\n\r\n### Working with Nested Objects\r\n\r\n```powershell\r\n$server = @{\r\n    Config = @{\r\n        Host = 'localhost'\r\n        Port = 8080\r\n    }\r\n}\r\n\r\n# Access nested hashtable and modify it\r\n$nestedConfig = $server.Config\r\nInvoke-ForgeAction -Data $nestedConfig -Action update -Name 'Port' -Value 9090\r\n```\r\n\r\n### Pipeline Support\r\n\r\n```powershell\r\n# The Data parameter accepts pipeline input\r\n$myHashtable = @{ Status = 'Active' }\r\n$myHashtable | Invoke-ForgeAction -Action create -Name 'Count' -Value 100\r\n```\r\n\r\n### Disable Logging for Production\r\n\r\n```powershell\r\n# At the start of your script\r\n$global:__logging = $false\r\n\r\n# All Invoke-ForgeAction calls will now run silently\r\nminiforge $data create 'Key' 'Value'\r\n```\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n### Property Already Exists Error\r\n\r\nIf you see a warning about a property already existing when using `create`:\r\n\r\n```powershell\r\n# Use update instead of create for existing properties\r\nInvoke-ForgeAction -Data $obj -Action update -Name 'ExistingProp' -Value 'NewValue'\r\n```\r\n\r\n### Property Not Found Error\r\n\r\nIf you see a warning about a property not found when using `update`, `read`, or `delete`:\r\n\r\n```powershell\r\n# Use create first to add the property\r\nInvoke-ForgeAction -Data $obj -Action create -Name 'NewProp' -Value 'Value'\r\n```\r\n\r\n### Push/Pull Only Works on Arrays\r\n\r\nThe `push` and `pull` actions require the property to be an array:\r\n\r\n```powershell\r\n# First, create an array property\r\nInvoke-ForgeAction -Data $obj -Action create -Name 'Items' -Value @()\r\n\r\n# Then push values to it\r\nInvoke-ForgeAction -Data $obj -Action push -Name 'Items' -Value 'Item1'\r\n```\r\n\r\n---\r\n\r\n\u003c!-- ROADMAP --\u003e\r\n# Roadmap\r\n\r\n🟡 **Task List**\r\n- [x] Add Support for Dictionary, SortedList\r\n- [ ] Add comprehensive Pester tests\r\n- [ ] Create module manifest (.psd1) with proper versioning\r\n- [x] Add support for Dictionary\r\n- [ ] Optimize performance for large datasets\r\n- [x] Add `-WhatIf` and `-Confirm` support\r\n\r\n\r\n\r\n# Contributing\r\n\r\nFeel free to contribute!  Fork the repo and submit a **merge request** with your improvements.  Or, open an **issue** with the `enhancement` tag to discuss your ideas.\r\n\r\n1. Fork the Project from `git clone https://gitlab.com/phellams/miniforge.git`\r\n2. Create your Feature Branch check out the branch dev `git switch dev`.\r\n   1. `git switch -c feature/AmazingFeature`\r\n   2. or \r\n   3. `git checkout -b feature/AmazingFeature`\r\n3. Commit your Changes `git commit -m 'Add some AmazingFeature'`\r\n4. Push to the Branch `git push origin feature/AmazingFeature`\r\n5. [Open a Merge Request](https://gitlab.com/phellams/miniforge/-/merge_requests/new)\r\n\r\n\r\n# 📝 License\r\n\r\nThis module is released under the [MIT License](https://opensource.org/licenses/MIT).\r\n\r\n# 📧 Contact\r\n\r\nFor issues, questions, or suggestions, please open an issue on the [GitHub repository](https://github.com/sgkens/miniforge).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphellams%2Fminiforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphellams%2Fminiforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphellams%2Fminiforge/lists"}