Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: futuremotiondev/powershell-fmdevtoolbox
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: main
Choose a base ref
...
head repository: futuremotiondev/powershell-fmdevtoolbox
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: dev
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 17 commits
  • 647 files changed
  • 2 contributors

Commits on Jan 23, 2026

  1. Add various font processing scripts and utilities

    - Introduced new scripts for font family name retrieval, font renaming, and font format conversion.
    - Implemented functionality to extract font metadata and save it in JSON format.
    - Added scripts for converting between font formats (OTF to TTF, TTF to SVG, etc.).
    - Created utilities for managing open directories and saving window sets.
    - Enhanced error handling and logging throughout the scripts.
    - Updated existing scripts to improve performance and usability.
    - Removed deprecated or redundant scripts to streamline the codebase.
    futuremotiondev committed Jan 23, 2026
    Configuration menu
    Copy the full SHA
    c2caab1 View commit details
    Browse the repository at this point in the history

Commits on Jan 24, 2026

  1. feat(svg): add SVG color conversion and git cloning utilities

    - Add Convert-SVGColor function to recolor SVG files with comprehensive color format support including hex, rgb, hsl, named colors, and CSS custom properties
    - Implement parallel processing for batch SVG conversion with configurable thread limits and automatic output directory management
    - Add Copy-GitRepository function for parallel git repository cloning with intelligent owner prefix detection
    - Support multiple git hosting platforms including GitHub, GitLab, Bitbucket, Azure DevOps, Codeberg, and SourceHut
    - Implement automatic folder naming with owner/organization prefix for cloned repositories
    - Fix typo in Build.ps1 changing PrivateAliasesNames to PrivateAliasNames for consistency
    - Update module manifest to export new Convert-SVGColor function
    - Refactor Remove-AllMacOSJunkFiles to use dynamic thread calculation based on processor count
    - Add comprehensive validation for path strings, hex colors, and URL parsing in new functions
    futuremotiondev committed Jan 24, 2026
    Configuration menu
    Copy the full SHA
    05d51f0 View commit details
    Browse the repository at this point in the history

Commits on Feb 18, 2026

  1. refactor(build): ♻️ rewrite build system to use AST parsing and add m…

    …odule
    
    - Replace runtime module import with AST-based function/alias discovery in Build.ps1
    - Add Get-FunctionInfoFromFile helper that parses PS1 files using System.Management.Automation.Language.Parser
    - Add Get-ModuleFunctionsAndAliases to collect public/private functions with exclusion pattern support
    - Add Update-ModuleManifestVersion for semantic version bumping (major, minor, patch, explicit)
    - Rename Update-FMModule to Update-FMModuleManifest with ShouldProcess support and structured output
    - Add Build-QuickRefresh.ps1 as a convenience wrapper for manifest updates with parameter passthrough
    - Introduce FMDevToolbox.Config.psd1 for external tool paths, Python venvs, and runtime defaults
    - Add typed configuration classes in PSM1 (FMDevToolboxConfig, FMExternalToolsConfig, etc.)
    - Load configuration from PSD1 at module import and apply computed defaults for script paths
    - Add FMNodeDependencies class for declaring required npm packages (otf2svg, ttf2svg, svgo)
    - Add DevelopmentMode flag to control whether Internal- prefixed functions are exported
    - Add exclusion patterns to prevent Internal-, Private-, and Helper- prefixed functions from export in production
    - Add SkipParseWarningFiles list to suppress expected parse errors for files with external type dependencies
    - Update FunctionsToExport in manifest
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    1611a71 View commit details
    Browse the repository at this point in the history
  2. ✨ [FEATURE] Add font conversion, renaming, and organization utilities

    - Add Activate-FoundryToolsCLI function to activate Python virtual environments for stable or new FoundryTools CLI versions
    - Add Convert-FontToWoff function to convert OTF/TTF fonts to WOFF/WOFF2 formats with parallel processing support via ForEach-Object -Parallel
    - Add Convert-WoffToFont function to decompress WOFF/WOFF2 files back to OTF/TTF font formats with parallel processing support
    - Add Get-FoundryToolsFtcli function to locate and activate the FoundryTools CLI executable from configured Python virtual environments
    - Add Move-FontFamiliesToSubfolders function to organize font files into family-named subdirectories using fontbro Python script for family name detection
    - Add Rename-Fonts function to rename font files based on metadata using three methods: FamilyNameStyleName, PostScriptName, or FullFontName
    - Support pipeline input via ValueFromPipeline and ValueFromPipelineByPropertyName across all font functions
    - Support -Recurse parameter for directory-based batch processing in Convert-FontToWoff, Convert-WoffToFont, and Rename-Fonts
    - Support configurable -OutputDirectory parameter with automatic creation and validation for conversion functions
    - Support -NoRecalculateBBoxes and -ReorderTables flags for fine-grained control over font table handling during conversion
    - Implement configurable -MaxThreads parameter defaulting to 75%
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    47a6da2 View commit details
    Browse the repository at this point in the history
  3. ✨ [BUILD] Add Prettier configuration and AI agent instructions

    - Add .prettierrc with project-wide formatting rules including 250 char print width, 4-space default tab width, double quotes, trailing commas, and auto line endings
    - Configure per-file-type tab width overrides: 3 spaces for CSS/SCSS/JS/TS, 2 spaces for HTML/SVG, 4 spaces for JSON/YAML/Markdown
    - Add parser overrides for SVG (html parser) and .prettierrc/.code-workspace files (jsonc parser)
    - Add CLAUDE.md with comprehensive AI agent instructions for the FMDevToolbox PowerShell module
    - Document repository structure including main module folder, public/private functions, scripts, wrappers, and build tooling
    - Define explicit AI agent rules
    - Document the wrapper system architecture using SingleInstanceAccumulator.exe for Windows Explorer context menu integration
    - Specify mandatory wrapper format requirements including $FileList parameter, cleanup, and toast notification conventions
    - Document key public functions (Show-UWPToast, Invoke-FlattenFolders, Rename-Fonts, font conversion utilities) and important internal helpers
    - More additions
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    b92978d View commit details
    Browse the repository at this point in the history
  4. ✨ [FEATURE] Add Git clone utility functions for single and multi-repo

    - Add Invoke-GitCloneMulti function supporting batch cloning of multiple Git repositories with both sequential and parallel execution modes
    - Add Invoke-GitCloneSingle function for cloning individual repositories with custom directory naming options
    - Implement Internal-ParseGitUrl helper to extract owner and repo name from URLs across multiple Git hosting providers including GitHub, GitLab, Bitbucket, Azure DevOps, Codeberg, SourceHut, Gitea, and Forgejo
    - Support automatic owner/org prefix for cloned directory names via -AutoUserPrefix switch to avoid naming collisions
    - Support custom directory naming in single-clone mode via -CustomDirectory parameter with mutual exclusivity validation against -AutoUserPrefix
    - Enable parallel cloning with configurable thread limits defaulting to 75% of available CPU cores, capped at 8 threads
    - Pre-create target directories in parallel mode to prevent race conditions when multiple repos resolve to similar paths
    - Handle duplicate target paths gracefully by generating unique directory names via Internal-GetUniqueFilenameIfDuplicate
    - Include --recurse-submodules -j8 flags by default with opt-out via -NoRecurseSubmodules switch
    - Validate output paths for invalid characters and ensure directories are created automatically when they do not exist
    - Return structured PSCustomObject results with Path, URL, Success, and ErrorMessage properties for downstream pipeline consumption
    - Support pipeline input for repository URLs enabling integration with other commands that output URL collections
    - Parse both HTTPS and SSH
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    bbb9633 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    e39ba92 View commit details
    Browse the repository at this point in the history
  6. [CHORE] Major Reorganization of Module Structure

    - Removed Obsolete PublicOld folder with old functions
    - Added several Internal functions
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    0e65b93 View commit details
    Browse the repository at this point in the history
  7. ⬆️ [CLEANUP] Refactor Get-YoutubeVideosWithYTDlp

    - Rewrite Get-YoutubeVideosWithYTDlp to remove hundreds of lines of redundant validation, dead code, and copy-pasted git clone logic that was never adapted for yt-dlp
    - Remove -CustomYTDLPPath parameter in favor of reading yt-dlp path from $script:FMConfig.Tools.YtDlp configuration
    - Add proper YouTube URL validation regex pattern (youtube.com, youtu.be, m.youtube.com) in the process block
    - Implement proper sequential and parallel download paths with consistent [PSCustomObject] output including URL, Success, OutputPath, and ErrorMessage properties
    - Add clipboard URL retrieval logic in begin block instead of process block for correct pipeline behavior
    - Constrain -MaxThreads ValidateRange to [1, 10] to prevent aggressive parallel downloads that could trigger rate limiting
    - Add proper $LASTEXITCODE checking after each yt-dlp invocation with appropriate warning messages
    - Refactor Get-FoundryToolsFtcli
    - Updated CLAUDE.md to reflect current coding standards and module structure
    futuremotiondev committed Feb 18, 2026
    Configuration menu
    Copy the full SHA
    994ce9e View commit details
    Browse the repository at this point in the history

Commits on Feb 22, 2026

  1. feat(config): implement dual-object configuration architecture

    Replace the monolithic FMDevToolboxConfig class with a two-object system
    that cleanly separates user-editable preferences from internal module state.
    This solves the fundamental constraint that PowerShell .psd1 data files
    cannot contain dynamic expressions ([Math]::Max, [Environment]::ProcessorCount,
    scriptblocks) because they are parsed in Constrained Language Mode.
    
    --- FMDevToolbox.psm1 — Class Definitions ---
    
    $script:FMConfig [FMConfig] — User/developer preferences loaded from .psd1:
      - [FMToolPaths] Tools: 13 external tool executable paths
        - ImageMagick, ImageMagickIdentify, Inkscape, RsvgConvert,
          FontForge, YtDlp, ExifTool, Den4bRenamer, Woff2Compress,
          Woff2Decompress, jsxer, LockHunter (new), NuGet (new)
      - [FMPythonPaths] Python: venv root and FoundryTools CLI paths
        - VenvRoot, FoundryToolsCLI, FoundryToolsCLING
      - [FMCondaConfig] Conda: conda environment name for Demucs
    
    $script:FMInternal [FMInternal] — Internal module state built in code:
      - [FMThreadPresets] Threads: computed from ProcessorCount at module load
        - Percent25/33/50/65/75, AllButOne, All
        - Each preset uses [Math]::Max(1, ...) to guarantee minimum of 1
      - [FMModulePaths] Paths: computed from $PSScriptRoot at module load
        - ModuleRoot, AssemblyRoot, ScriptsRoot, FontScripts, AdminScripts
        - ConfigFile (points to .psd1), UserConfigFile (~/.fmconfig.psd1)
      - [FMMinVersions] MinVersions: static class-level defaults
        - Node 24.13.1, Python 3.13.12, Conda 25.11.1, CondaPython 3.13.9,
          ImageMagick 7.1.2-13 Q16 HDRI, Svgo 4.0.0
      - [FMNodePackages] NodePackages: required npm packages as static defaults
        - otf2svg, @marmooo/ttf2svg, svgo, boxen-cli
      - [FMModuleFlags] Flags: module behavior toggles as static defaults
        - DevelopmentMode (controls Internal-* export), CheckNodeDependencies,
          CheckToolsMinVersion
      - [FMCondaRuntime] Conda: auto-discovered binary path + activation hook
        - Binary (string), InjectHook (scriptblock)
    
    --- FMDevToolbox.psm1 — Initialization Flow ---
    
      1. Import-PowerShellDataFile → cast to [FMConfig] → $script:FMConfig
      2. [FMInternal]::new() → $script:FMInternal (static defaults from classes)
      3. Compute Paths.* from $PSScriptRoot using [Path]::Combine()
      4. Compute Threads.* from [Environment]::ProcessorCount
      5. Load assemblies, dot-source functions, Export-ModuleMember
    
    --- FMDevToolbox.psm1 — Removed ---
    
      - FMDevToolboxConfig (old monolithic class)
      - FMDefaultVersionsConfig, FMExternalToolsConfig, FMPythonVenvsConfig,
        FMPythonScriptsConfig, FMDefaultsConfig (old sub-classes)
      - FMNodeDependencies class and $script:NodeDependencies variable
        (replaced by $script:FMInternal.NodePackages)
      - Loose $script:ModuleRoot, $script:ModuleAssemblyRoot,
        $script:ModuleScriptsRoot variables (replaced by FMModulePaths)
      - Write-Host "Importing assembly/function" debug messages during load
    
    --- FMDevToolbox.Config.psd1 ---
    
      - Restructured sections: Tools (unchanged paths + 2 new), Python
        (renamed from PythonVenvs, renamed Root→VenvRoot), Conda (new)
      - Removed: Versions section (now in FMMinVersions class defaults),
        PythonScripts section (now in FMModulePaths computed paths),
        Defaults section (MaxThreads→FMThreadPresets, DevelopmentMode and
        CheckNodeDependencies→FMModuleFlags class defaults)
      - Added: LockHunter and NuGet tool paths, Conda.DemucsEnv
    
    --- Build.ps1 ---
    
      - DevelopmentMode now a static $true constant mirroring [FMModuleFlags]
        default (was dynamically read from .psd1 Defaults section)
      - Added FMDevToolboxSchemas.dll to RequiredAssemblies list
      - Added Build-FMSchemasLib function: builds the Src/FMDevToolboxSchemas
        C# project and copies the DLL to the module Lib folder, with
        rename-swap strategy to handle locked files
      - Added -UpdateFMSchemasLib switch to Update-FMModuleManifest
    
    --- Docs/Architecture/configuration-system.md (new) ---
    
      - Comprehensive design rationale for the dual-object split
      - Full class hierarchy diagrams for FMConfig and FMInternal
      - Initialization flow documentation
      - Recipes for adding user-editable, internal static, and internal
        computed config properties
      - Design decision table covering all architectural trade-offs
    futuremotiondev committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    aedae96 View commit details
    Browse the repository at this point in the history
  2. feat(svg): add folder-level SVG-to-PNG conversion and refactor wrappers

    Add Convert-SVGFolderToPNGBySize as a directory-oriented orchestrator
    that enumerates SVG files from folders and delegates conversion to the
    existing Convert-SVGToPNGBySize. This completes the two-function
    architecture (Approach A from design doc) where file-level and
    folder-level workflows are cleanly separated, matching the two distinct
    Explorer context menu use cases.
    
    Convert-SVGToPNGBySize refactoring:
    - Wire MaxThreads default to $script:FMInternal.Threads.Percent75
      instead of hardcoded [Environment]::ProcessorCount - 4
    - Wire rsvg-convert tool path to $script:FMConfig.Tools.RsvgConvert
      instead of bare Get-Command discovery
    - Add excess thread count warning with PwshSpectreConsole formatted
      panel when MaxThreads exceeds processor count
    - Replace [string[]] accumulator with [List[String]] for O(1) appends
    - Add using namespace System.Collections.Generic
    - Use [Path] and [Directory] short names via existing using namespace
    - Add -ErrorAction Continue + continue to parallel block error handling
      so one failed conversion does not abort the entire batch
    - Clone $Using: rsvg-convert path in parallel block to avoid
      serialization issues
    
    Convert-SVGFolderToPNGBySize (new):
    - Accepts directory paths via -LiteralPath (mandatory, pipeline, Position 0)
    - Supports -Recurse and -Depth for subdirectory traversal
    - Without -OutputFolder, creates per-directory "PNG Conversion" subfolder
      with recursive SVGs flattened into the top-level folder
    - With -OutputFolder, routes all PNGs to a single destination
    - Validates -Depth requires -Recurse, emitting Write-Error otherwise
    - Skips non-directory inputs with Write-Warning guiding user to the
      file-level function
    - Uses [List[String]] for directory accumulation, [Path]::Combine for
      path joining, and splatting for delegation
    
    Image-01-ConvertSVGToPNGBySize wrapper (new):
    - Reads SVG paths from SingleInstanceAccumulator temp file
    - Supports -OutputSizes and -GetSizesFromDialog (Ookii input dialog)
      with mutual exclusion validation
    - OutputFolder path validation with UWP toast error reporting
    - Cleans up temp file on both success and error paths
    
    Image-01-ConvertSVGToPNGBySizeInFolder wrapper (new, replaces broken):
    - Previous version referenced undefined $Folders variable and
      nonexistent -Files/-Sizes parameters
    - Reads folder paths from SingleInstanceAccumulator temp file
    - Same size-input UX as file wrapper (OutputSizes / GetSizesFromDialog)
    - Passes -Recurse through to Convert-SVGFolderToPNGBySize
    - Structured error handling with UWP toast notifications
    
    Design rationale documented in:
    - Docs/Plans/2026-02-22-svg-folder-to-png-design.md
    - Docs/Plans/2026-02-22-svg-folder-to-png-plan.md
    futuremotiondev committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    00a407c View commit details
    Browse the repository at this point in the history
  3. refactor(font): replace legacy venv helpers with Initialize-FoundryTo…

    …olsCli
    
    Consolidate Activate-FoundryToolsCLI and Get-FoundryToolsFtcli into a
    single Initialize-FoundryToolsCli function that handles venv activation,
    deactivation, path validation, and returns a typed [FoundryToolsResult].
    
    - Add Initialize-FoundryToolsCli with -Version (Stable/New), -Activate,
      -Deactivate switches and comprehensive path validation
    - Delete Activate-FoundryToolsCLI.ps1 (superseded)
    - Delete Get-FoundryToolsFtcli.ps1 (superseded)
    - Update Convert-FontToWoff to use Initialize-FoundryToolsCli for venv
      lifecycle and $script:FMInternal.Threads.Percent75 for thread defaults
    - Update Convert-WoffToFont to use Initialize-FoundryToolsCli for venv
      lifecycle and $script:FMInternal.Threads.Percent75 for thread defaults
    - Update Rename-Fonts to use Initialize-FoundryToolsCli, wire config
      threads, add HelpMessage on all parameters
    - Remove manual deactivate pattern (Get-Command deactivate + & deactivate)
      from all three dependent functions
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    futuremotiondev and claude committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    3380c6d View commit details
    Browse the repository at this point in the history
  4. refactor(font): rewrite Convert-FontGlyphsToSVGs and Move-FontFamilie…

    …sToSubfolders
    
    Complete rewrite of both font processing functions with config system
    wiring, bug fixes, and convention alignment.
    
    Convert-FontGlyphsToSVGs:
    - Move from PublicOld/ to Public/Font/ with full rewrite
    - Fix undefined $currentItem variable (was referencing wrong scope)
    - Fix $curFont = $_ overwriting foreach variable with null in parallel
    - Fix -Include with -LiteralPath (silently fails; use Where-Object)
    - Fix Initialize-FoundryToolsCli -Deactivate missing mandatory -Version
    - Wire to $script:FMConfig.Tools.FontForge for FontForge path
    - Wire to $script:FMInternal.Threads.Percent75 for thread defaults
    - Add [PSCustomObject] output with SourcePath/OutputPath/Successful pattern
    - Add case-insensitive HashSet for deduplication, $LASTEXITCODE checks
    
    Move-FontFamiliesToSubfolders:
    - Replace deleted Activate-FoundryToolsCLI with Initialize-FoundryToolsCli
    - Replace $env:FM_PY_FONT_SCRIPTS with $script:FMInternal.Paths.FontScripts
    - Fix Internal-GetUniqueFilenameIfDuplicate called inside parallel block
      (module functions not accessible in parallel runspaces)
    - Restructure to two-phase: parallel family name lookup, sequential moves
    - Use $ftResult.VenvPythonBinary instead of hardcoded & python
    - Wire to $script:FMInternal.Threads.Percent75 for thread defaults
    - Add [PSCustomObject] output with FamilyName property
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    futuremotiondev and claude committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    187d672 View commit details
    Browse the repository at this point in the history
  5. refactor(svg): rewrite all SVG functions with config wiring and bug f…

    …ixes
    
    Complete rewrite of four SVG functions with dual-object config system
    wiring, bug fixes, and coding convention alignment.
    
    Convert-CropSVGWithInkscape (new):
    - Wire to $script:FMConfig.Tools.Inkscape for tool path
    - Fix [List[Object]] to [List[String]] for type safety
    - Fix double Get-Item calls with [Path]::* static methods
    - Fix string interpolation paths with [Path]::Combine()
    - Fix Write-Error + return for mutually exclusive params (use throw)
    - Add using namespace declarations, [ValidateNotNullOrEmpty()]
    
    Convert-SVGColor:
    - Wire $MaxThreads to $script:FMInternal.Threads.Percent75
    - Fix O(n²) array concatenation (+=) with [HashSet[String]] and
      [List[String]] collections
    - Fix directories silently dropped without -Recurse (now always expanded)
    - Add $skipProcessing flag pattern for early-exit from begin block
    - Rename helper functions from Internal-* to Local-* to avoid confusion
    
    Convert-SVGToICO:
    - Wire tools to $script:FMConfig.Tools.RsvgConvert and .ImageMagick
    - Wire $MaxThreads to $script:FMInternal.Threads.Percent75
    - Fix ContainsKey('OutputInSubfolder') to .IsPresent (ContainsKey
      returns true even with -Switch:$false)
    - Replace [string[]] arrays with [List[String]], Join-Path with
      [Path]::Combine(), New-Item with [Directory]::CreateDirectory()
    - Remove Get-Item calls inside parallel blocks
    
    Optimize-SVGWithSVGO:
    - Fix dead config: [FMNodeDependencies] $nodeDeps = $script:NodeDependencies
      replaced with $script:FMInternal.NodePackages.Svgo
    - Fix Get-Command svgo.cmd re-resolved in each parallel runspace
      (now resolved once, passed via $Using:)
    - Wire $MaxThreads to $script:FMInternal.Threads.Percent75
    - Fix $svgo variable naming to $cmdSvgo per $cmd* convention
    - Remove misleading [OutputType([PSCustomObject])] (no objects returned)
    - Replace Internal-NewLog with Write-Warning
    - Add $LASTEXITCODE checks after every SVGO call
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    futuremotiondev and claude committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    98a5c92 View commit details
    Browse the repository at this point in the history
  6. fix(internal): fix broken config reference disabling all node depende…

    …ncy checks
    
    Internal-AssertNodeDependency referenced $script:FMConfig.Defaults.CheckNodeDependencies
    which does not exist (FMConfig has no Defaults property). This caused the
    guard to always return early ($null is falsy), silently disabling ALL
    node dependency validation for every caller (e.g. Optimize-SVGWithSVGO).
    
    - Fix config reference to $script:FMInternal.Flags.CheckNodeDependencies
    - Replace O(n²) array concatenation ($missingPackages += $pkg) with
      [List[String]] and .Add()
    - Add [ValidateNotNullOrEmpty()] and HelpMessage to $Package parameter
    - Extract $cmdNpmSrc from command object for consistent $cmd* naming
    - Remove ASCII line art from comments per coding conventions
    - Add using namespace System.Collections.Generic
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    futuremotiondev and claude committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    4d5ef17 View commit details
    Browse the repository at this point in the history
  7. chore: update module manifest, CLAUDE.md, and supporting files

    - Update CLAUDE.md configuration docs to reflect dual-object architecture
      ($script:FMConfig + $script:FMInternal) with correct property paths
    - Update Internal-AssertNodeDependency usage example in CLAUDE.md
    - Add Architecture Documentation section linking to Docs/Architecture/
    - Update FMDevToolbox.psd1 manifest: add Initialize-FoundryToolsCli,
      Convert-FontGlyphsToSVGs, Convert-SVGFolderToPNGBySize,
      Reset-WindowsFileAssociation; remove deleted Activate-FoundryToolsCLI
      and Get-FoundryToolsFtcli
    - Add FMDevToolboxSchemas.dll to RequiredAssemblies
    - Migrate Reset-WindowsFileAssociation from PublicOld/ to Public/Windows/
      with formatting cleanup
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    futuremotiondev and claude committed Feb 22, 2026
    Configuration menu
    Copy the full SHA
    6e3ca54 View commit details
    Browse the repository at this point in the history

Commits on Mar 9, 2026

  1. Generated Commits

    Here's the breakdown of the commits created from the provided changes, along with explanations for each:
    
    Commit 1: feat: add FMDevToolboxSchemas C# project with FoundryTools types
    Introduces a new .NET 9.0 class library containing typed error codes
    and a result class for FoundryTools CLI virtual environment
    initialization. The FoundryToolsError enum covers all validation
    and activation failure scenarios, while the sealed FoundryToolsResult
    class provides structured path resolution with an AddError helper
    for downstream self-healing logic.
    
    The built DLL is copied to the module's Lib/ directory and wired
    into RequiredAssemblies so types are available at module import.
    
    This commit creates the entire FMDevToolboxSchemas C# project from scratch. It includes the .csproj file targeting net9.0, the FoundryToolsError enum with 8 error codes (VenvRootMissing, VenvFolderMissing, VenvScriptsDirMissing, ActivationScriptMissing, FtcliExeMissing, PythonBinaryMissing, PipBinaryMissing, ActivationFailed), and the FoundryToolsResult sealed class with properties for all resolved venv paths, success status, error collections, and an AddError helper method. It also includes all build artifacts (bin/Release, obj/ directories with generated assembly info, NuGet restore files, etc.) and the compiled DLL/PDB/XML documentation outputs. This is the foundational type system that the Initialize-FoundryToolsCli PowerShell function will consume.
    
    Commit 2: feat: update module manifest with new DLL and exported functions
    Adds FMDevToolboxSchemas.dll to RequiredAssemblies so the C# types
    are loaded at module import time. Updates FunctionsToExport to
    include newly added functions like Initialize-FoundryToolsCli,
    Convert-CropSVGWithInkscape, Convert-SVGFolderToPNGBySize,
    Show-AllSystemTrayIcons, and several renamed internal helpers.
    
    Also removes functions that were renamed or consolidated.
    
    This commit updates the FMDevToolbox.psd1 module manifest in three hunks: (1) updates the generated date, (2) adds FMDevToolboxSchemas.dll to RequiredAssemblies alongside the existing Ookii and UWP notification DLLs with minor whitespace cleanup, and (3) significantly updates FunctionsToExport to reflect all the new and renamed functions. Notable additions include Initialize-FoundryToolsCli, Convert-CropSVGWithInkscape, Convert-SVGFolderToPNGBySize, Show-AllSystemTrayIcons, Local-ExpandHexColor, and Local-ValidatePathString. Some functions were removed from the export list (Get-UniqueSubfolderPath, Internal-ExpandHexColor, Internal-ValidatePathString) as they appear to have been renamed.
    
    Commit 3: refactor: rename PlaceInSubfolder to OutputInSubfolder in SVGO function
    Renames the -PlaceInSubfolder parameter to -OutputInSubfolder for
    clearer semantics — the parameter controls where output goes, not
    where files are placed. Also adds enhanced verbose/debug logging
    to the parallel processing path to aid troubleshooting SVGO
    execution issues.
    
    This commit modifies Optimize-SVGWithSVGO.ps1 across six hunks. The first four hunks (14-18) are a straightforward rename of the -PlaceInSubfolder switch parameter to -OutputInSubfolder throughout the function — in the description, parameter help, parameter declaration, and both usage sites in the folder processing and file grouping logic. The sixth hunk (19) adds significant debugging instrumentation to the parallel processing block: it sets VerbosePreference and DebugPreference to Continue, adds pre-execution logging that lists all folders about to be processed, and within the parallel block adds detailed logging of the SVGO path, parameters, and execution status. It also pipes SVGO output to Out-Host for visibility in parallel contexts.
    
    Commit 4: feat: add Show-AllSystemTrayIcons Windows utility
    Promotes all hidden system tray icons to visible by setting the
    IsPromoted registry value under NotifyIconSettings. Returns a
    structured object with counts of promoted and already-visible
    icons for downstream consumption.
    
    This commit adds a new PowerShell function Show-AllSystemTrayIcons.ps1 in the Public/Windows directory. The function reads HKCU:\Control Panel\NotifyIconSettings, iterates all subkeys, checks the IsPromoted DWORD value, and sets it to 1 for any icons not already promoted. It returns a PSCustomObject with TotalEntries, Promoted, and Skipped counts. The function uses proper CmdletBinding, OutputType, verbose logging for each key processed, and graceful handling of the registry path not existing.
    
    Commit 5: feat: add wrapper scripts for new module functions
    Adds context menu wrapper scripts for system tray icon promotion,
    VS Code workspace file creation, SVG-to-ICO conversion, and
    SVGO optimization. These follow the SingleInstanceAccumulator
    pattern with toast notifications for user feedback.
    
    This commit adds four new wrapper scripts in FMDevToolbox.Wrappers/: (1) Admin-02-RefreshSystemTray.ps1 which calls Show-AllSystemTrayIcons with commented-out toast notifications, (2) Dev-02-CreateCodeWorkspaceFile.ps1 which copies a .code-workspace template to a destination with unique filename handling, (3) Image-02-ConvertSVGToICO.ps1 which wraps Optimize-SVGWithSVGO with PlaceInSubfolder support and toast notifications (appears to be mislabeled as ICO but actually calls SVGO), and (4) Image-02-OptimizeSVGsWithSVGO.ps1 which is the correctly named SVGO wrapper using the new OutputInSubfolder parameter name. Both SVGO wrappers follow the standard pattern of reading from FileList, executing with error handling, cleaning up the temp file, and showing toast notifications.
    
    Commit 6: feat: add working/scratch files for PSStyle testing
    Adds experimental PSStyle color palette definitions and an empty
    Show-AsciiBox placeholder for terminal output experimentation.
    
    This commit adds two files to the FMDevToolbox/Working/ directory which appears to be a scratch/experimentation area. PSStyleTesting.ps1 defines a comprehensive color palette using $PSStyle.Foreground.FromRgb() with named variables for greens, whites, grays (100-900), reds (4 variants), and blues (5 variants), plus a formatted system info display string. Show-AsciiBox.ps1 is an empty placeholder file (just a BOM). These are development/experimentation files not exported by the module.
    
    Commit 7: docs: add design and implementation plans
    Adds design documents and step-by-step implementation plans for
    Initialize-FoundryToolsCli (venv path resolution with typed errors)
    and Convert-SVGFolderToPNGBySize (directory-oriented SVG-to-PNG
    conversion). Also adds a comprehensive codebase analysis and
    development roadmap covering module identity, PSGallery readiness,
    25+ new function proposals, and architecture recommendations.
    
    This commit adds five documentation files: (1) The Initialize-FoundryToolsCli design doc covering decisions on function naming, C# type system, error model, and validation flow. (2) The detailed implementation plan with 9 tasks covering framework targeting, C# types, DLL building, manifest wiring, PowerShell function creation, and Pester tests. (3) The SVG folder-to-PNG design doc explaining the two-function approach decision over unified or helper patterns. (4) The SVG folder-to-PNG implementation plan with 3 tasks covering the orchestrator function, wrapper rewrite, and verification. (5) A comprehensive 788-line codebase analysis and roadmap document covering executive summary, domain analysis of all 50+ functions, external tool ecosystem (13 tools, 5 unused), wrapper system issues, strategic vision, PSGallery readiness roadmap, 20+ new function proposals ranked by priority, architecture recommendations, and competitive landscape analysis.
    
    Commit 8: chore: add Claude local settings
    Configures allowed permissions for the Claude AI assistant,
    specifically enabling dotnet restore commands for the project.
    
    This commit adds the .claude/settings.local.json file which configures local permissions for the Claude AI coding assistant. It allows the Bash command 'dotnet restore' with any arguments, which is needed for building the FMDevToolboxSchemas C# project during development.[TAG]: Description
    futuremotiondev committed Mar 9, 2026
    Configuration menu
    Copy the full SHA
    ff8efcb View commit details
    Browse the repository at this point in the history
Loading