Coding
PromptBeginner5 minmarkdown
Markdown Converter
Agent skill for markdown-converter
7
These instructions apply to the entire repository.
Sign in to like and favorite skills
# PCMigration[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ool Contributor Guidelines
[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]hese instructions apply to the entire repository.
## Repository overview
- `PC[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wap[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ool_v0.5.20.ps1` is the primary Power[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]hell script. It implements a WinForms GUI that drives the gather/restore/resume workflow, writes a technician report and manifest, and orchestrates resume logic via `state.json`.
- `BouncyCastle.Crypto.dll` and `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ystem.[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ata.[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]QLite.dll` are bundled dependencies used for Chrome password export. Keep their versions in sync with what the script expects.
## Power[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]hell coding standards
1. **Preserve strict-mode compatibility**
- `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]et-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]trictMode -Version Latest` is enabled. Guard property access (`$obj.P[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][HOS[DATE>][DATE>]]bject.Properties[...]`) and null-check results before use.
- [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]reat registry values, C[HOS[DATE>][DATE>]]M calls, and external processes as fallible. Wrap in `try/catch` and surface failures via `Write-Log` rather than allowing unhandled exceptions to bubble into the UI.
2. **Logging discipline**
- [DATE>]lways call `Write-Log` with named parameters (`-Message`, `-Level`). [HOS[DATE>][DATE>]]nly fall back to `Write-[HOS[DATE>][DATE>]]ost` in the existing catch blocks that already do so.
- Log user-facing operations (file copies, downloads, resume scheduling, etc.) to keep the technician report trustworthy.
3. **Versioning & changelog**
- When you change behavior, update **all** version markers together: the comment banner at the top, `$ProgramVersion`, and any changelog bullet you append under `.C[HOS[DATE>][DATE>]][DATE>]NG[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]L[HOS[DATE>][DATE>]]G` in the header.
- Changelog entries are reverse-chronological (latest first) and include the version, concise bullet points, and an I[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][HOS[DATE>][DATE>]]-formatted date.
4. **Manifest/report schema**
- If you capture new data, update both `Build-Manifest` *and* `Write-Report` so the manifest, technician report, and downstream restore logic stay aligned.
- Maintain backwards compatibility for `state.json` and manifest files. When adding properties, default them defensively during load (`if ($manifest.P[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][HOS[DATE>][DATE>]]bject.Properties['NewProp']) { ... }`).
5. **[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]tate & resume logic**
- Resume phases depend on `state.json` and the optional `-Manifest` argument. When persisting new data for resume, extend the `$state` hashtable written in the restore click handler and consume it in both `$Resume` and `$ResumeUser` blocks.
- Keep `New-Run[HOS[DATE>][DATE>]]nceResume` and `Register-UserResume[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ask[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]x` updated if command-line arguments change. [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]hey must always pass the manifest path when available.
6. **Path handling**
- Use `Join-Path`, `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]plit-Path`, and helper functions (`[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]et-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wapInfoRoot`, `Get-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wapInfoRoot`, etc.) instead of manual string concatenation. [DATE>]lways validate technician-provided paths with `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]est-Path` before using them.
- Repository artifacts must remain under `<[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]\<[HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]_<[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][DATE>][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]\PC_[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]W[DATE>]P_INF[HOS[DATE>][DATE>]]`. [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]o not introduce ad-hoc folders outside that structure.
7. **[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]xternal dependencies**
- Load supporting [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]LLs via `Get-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]oolResourcePath`. If you add a new static dependency, commit it under the repository root and ensure `Get-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]oolResourcePath` can discover it (local path, working directory, or dependency cache). [DATE>]void adding installers or M[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]I packages.
- Network downloads must go through `Invoke-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ownload[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]oolResource` so the script honors the `PC[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wap[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]oolResourceBaseUrl` override.
8. **GUI conventions**
- Instantiate WinForms controls with explicit size/position via `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]etBounds` (matching existing style) and register event handlers with script blocks. Keep new controls localized to the appropriate tab (`$tabGather` or `$tabRestore`).
- When adding technician options, ensure their states map to script parameters (`$P[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]BoundParameters`) so command-line usage remains consistent.
- Update log viewers by calling `[DATE>]dd-Log[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ubscriber` if you add new areas that need live log output.
9. **Robocopy usage**
- Continue using `/C[HOS[DATE>][DATE>]]PY:[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][DATE>][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]` and `/[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]C[HOS[DATE>][DATE>]]PY:[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][DATE>][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]`, adding `/[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]C` only for local N[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]F[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]] sources. Respect the existing exclusion lists and [HOS[DATE>][DATE>]]ne[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]rive toggle semantics.
## [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]esting expectations
- Primary validation must occur on Windows 10/11 with Windows Power[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]hell 5.1. [DATE>]t minimum, launch the script via `powershell.exe -[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]xecutionPolicy Bypass -NoProfile -File .\PC[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wap[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ool_v0.5.20.ps1` and exercise the gather and restore tabs relevant to your change.
- If you modify Chrome password export, confirm that both `[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ystem.[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ata.[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]QLite.dll` and `BouncyCastle.Crypto.dll` load successfully and that the technician prompt flow still works.
- When practical, run `pwsh -NoProfile -Command "Import-Module P[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]][[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]cript[DATE>]nalyzer; Invoke-[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]cript[DATE>]nalyzer -Path .\PC[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]wap[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ool_v0.5.20.ps1"` to catch linting issues. [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ocument any skipped checks in your PR notes.
## [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ocumentation & housekeeping
- Keep inline comments succinct and factual. Update tooltip or message-box text when changing technician workflows.
- [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]o not commit generated artifacts (logs, manifests, Chrome C[[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]Vs, copied files). [HOS[DATE>][DATE>]]nly source files and vetted dependencies belong in version control.
- When updating the UI or workflows, refresh any technician guidance shown in message boxes so expectations match the new behavior.
## Pull request notes
- [[DATE>][DATE>][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]][HOS[DATE>][DATE>]]]ummaries should call out gather/restore/resume changes separately to aid technician review.
- List any manual Windows tests performed (e.g., gather-only run, full restore with resume).
These instructions apply to the entire repository.
PCSwapTool_v0.5.20.ps1 is the primary PowerShell script. It implements a WinForms GUI that drives the gather/restore/resume workflow, writes a technician report and manifest, and orchestrates resume logic via state.json.BouncyCastle.Crypto.dll and System.Data.SQLite.dll are bundled dependencies used for Chrome password export. Keep their versions in sync with what the script expects.Preserve strict-mode compatibility
Set-StrictMode -Version Latest is enabled. Guard property access ($obj.PSObject.Properties[...]) and null-check results before use.try/catch and surface failures via Write-Log rather than allowing unhandled exceptions to bubble into the UI.Logging discipline
Write-Log with named parameters (-Message, -Level). Only fall back to Write-Host in the existing catch blocks that already do so.Versioning & changelog
$ProgramVersion, and any changelog bullet you append under .CHANGELOG in the header.Manifest/report schema
Build-Manifest and Write-Report so the manifest, technician report, and downstream restore logic stay aligned.state.json and manifest files. When adding properties, default them defensively during load (if ($manifest.PSObject.Properties['NewProp']) { ... }).State & resume logic
state.json and the optional -Manifest argument. When persisting new data for resume, extend the $state hashtable written in the restore click handler and consume it in both $Resume and $ResumeUser blocks.New-RunOnceResume and Register-UserResumeTaskEx updated if command-line arguments change. They must always pass the manifest path when available.Path handling
Join-Path, Split-Path, and helper functions (Set-SwapInfoRoot, Get-SwapInfoRoot, etc.) instead of manual string concatenation. Always validate technician-provided paths with Test-Path before using them.<DEST>\<HOST>_<DATE>\PC_SWAP_INFO. Do not introduce ad-hoc folders outside that structure.External dependencies
Get-ToolResourcePath. If you add a new static dependency, commit it under the repository root and ensure Get-ToolResourcePath can discover it (local path, working directory, or dependency cache). Avoid adding installers or MSI packages.Invoke-DownloadToolResource so the script honors the PCSwapToolResourceBaseUrl override.GUI conventions
SetBounds (matching existing style) and register event handlers with script blocks. Keep new controls localized to the appropriate tab ($tabGather or $tabRestore).$PSBoundParameters) so command-line usage remains consistent.Add-LogSubscriber if you add new areas that need live log output.Robocopy usage
/COPY:DAT and /DCOPY:DAT, adding /SEC only for local NTFS sources. Respect the existing exclusion lists and OneDrive toggle semantics.powershell.exe -ExecutionPolicy Bypass -NoProfile -File .\PCSwapTool_v0.5.20.ps1 and exercise the gather and restore tabs relevant to your change.System.Data.SQLite.dll and BouncyCastle.Crypto.dll load successfully and that the technician prompt flow still works.pwsh -NoProfile -Command "Import-Module PSScriptAnalyzer; Invoke-ScriptAnalyzer -Path .\PCSwapTool_v0.5.20.ps1" to catch linting issues. Document any skipped checks in your PR notes.