Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ powershell -ExecutionPolicy Bypass -File Tests\pssa-check.ps1

## Pull Request Checklist

- [ ] All 4,500+ tests pass (`Run-Tests.ps1` exits with code 0)
- [ ] All 4,759 tests pass (`Run-Tests.ps1` exits with code 0)
- [ ] PSScriptAnalyzer reports 0 errors (`pssa-check.ps1`)
- [ ] Monolithic synced (`sync-to-monolithic.ps1` shows 0 parse errors)
- [ ] New functions follow PowerShell verb-noun naming (`Get-`, `Set-`, `Test-`, `Show-`)
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
<a href="https://www.bestpractices.dev/projects/12921"><img alt="OpenSSF Best Practices" src="https://www.bestpractices.dev/projects/12921/badge"></a>
<a href="https://codecov.io/gh/TheAbider/RackStack"><img alt="codecov" src="https://codecov.io/gh/TheAbider/RackStack/branch/master/graph/badge.svg"></a>
<img alt="PSScriptAnalyzer 0 errors" src="https://img.shields.io/badge/PSScriptAnalyzer-0%20errors-brightgreen">
<img alt="4500+ Tests" src="https://img.shields.io/badge/tests-4500%2B-brightgreen">
<img alt="4759 tests" src="https://img.shields.io/badge/tests-4759-brightgreen">
<img alt="Pester 312 tests" src="https://img.shields.io/badge/Pester-312%20tests-brightgreen">
<img alt="Coverage 100%" src="https://img.shields.io/badge/coverage-100%25-brightgreen">
<img alt="line coverage 100%" src="https://img.shields.io/badge/line%20coverage-100%25-brightgreen">
<img alt="SLSA Level 3" src="https://slsa.dev/images/gh-badge-level3.svg">
</p>

Expand Down Expand Up @@ -481,10 +481,10 @@ RackStack/
├── Modules/
│ ├── 00-Initialization.ps1 # Constants, variables, config loading
│ ├── 01-Console.ps1 # Console window management
│ ├── ... # 61 more modules
│ └── 64-SystemDebloat.ps1
│ ├── ... # 67 more modules
│ └── 69-StorageMigration.ps1
├── Tests/
│ ├── Run-Tests.ps1 # 4500+ automated tests
│ ├── Run-Tests.ps1 # 4,759 automated tests
│ ├── Validate-Release.ps1 # Pre-release validation suite
│ └── ...
└── docs/
Expand Down Expand Up @@ -514,7 +514,7 @@ RackStack/
## Testing

```powershell
# Full test suite (~4,500+ tests, ~4 minutes)
# Full test suite (4,759 tests, ~4 minutes)
powershell -ExecutionPolicy Bypass -File Tests\Run-Tests.ps1

# PSScriptAnalyzer (0 errors on all 70 modules + monolithic)
Expand Down
25 changes: 10 additions & 15 deletions dist/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,16 @@ transitive action that the repo's SHA-pinning policy rejects.
that is automated.

**Setup:**
1. Create a Personal Access Token (classic) with `public_repo` scope at
https://github.com/settings/tokens/new?scopes=public_repo
2. Save it as `WINGET_TOKEN` at
https://github.com/TheAbider/RackStack/settings/secrets/actions/new
3. **First submission (one-time, manual):** on a Windows machine, install
wingetcreate (`winget install wingetcreate`) and run:
```powershell
$ver = '1.99.0' # current release
wingetcreate new "https://github.com/TheAbider/RackStack/releases/download/v$ver/RackStack.exe"
```
Follow the prompts (PackageIdentifier `TheAbider.RackStack`, MIT
license, etc.), then submit. It opens a PR against `winget-pkgs` for
review.
4. After that first PR merges, every release auto-submits via the ci.yml
step — no further action needed.
1. `WINGET_TOKEN` (a Personal Access Token, classic, `public_repo` scope)
is already set as a repo secret — the ci.yml step uses it for the
automated update PRs.
2. **First submission (one-time, manual):** the three ready-to-submit
manifest files are pre-authored in `dist/winget/1.99.1/`. Fork
`microsoft/winget-pkgs`, drop those three files into
`manifests/t/TheAbider/RackStack/1.99.1/`, and open a PR. Full steps
in `dist/winget/README.md`.
3. After that first PR merges, every release auto-submits via the ci.yml
`wingetcreate update` step — no further action needed.

## Scoop

Expand Down
17 changes: 17 additions & 0 deletions dist/winget/1.99.1/TheAbider.RackStack.installer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.6.0.schema.json
PackageIdentifier: TheAbider.RackStack
PackageVersion: 1.99.1
Platform:
- Windows.Desktop
- Windows.Server
MinimumOSVersion: 6.1.0.0
InstallerType: portable
Commands:
- rackstack
ReleaseDate: 2026-05-21
Installers:
- Architecture: x64
InstallerUrl: https://github.com/TheAbider/RackStack/releases/download/v1.99.1/RackStack.exe
InstallerSha256: 31C43ED5717F5A9D9D47AE151D4E68B44A0C4EAEB7BCFB6C8A8316DA1274A44C
ManifestType: installer
ManifestVersion: 1.6.0
33 changes: 33 additions & 0 deletions dist/winget/1.99.1/TheAbider.RackStack.locale.en-US.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.6.0.schema.json
PackageIdentifier: TheAbider.RackStack
PackageVersion: 1.99.1
PackageLocale: en-US
Publisher: TheAbider
PublisherUrl: https://github.com/TheAbider
PublisherSupportUrl: https://github.com/TheAbider/RackStack/issues
PackageName: RackStack
PackageUrl: https://github.com/TheAbider/RackStack
License: MIT
LicenseUrl: https://github.com/TheAbider/RackStack/blob/master/LICENSE
Copyright: Copyright (c) 2026 TheAbider
ShortDescription: PowerShell automation toolkit for configuring Windows Server hosts.
Description: |-
RackStack is a menu-driven PowerShell tool that automates everything between
"Windows is installed" and "server is in production." It provides 181 CLI
actions and 60+ interactive menus covering networking, Hyper-V, SAN/iSCSI,
clustering, VM deployment, cloud onboarding, and batch automation, all with
undo, transaction rollback, and audit logging. Built for MSPs, sysadmins,
and infrastructure teams who build Windows Servers repeatedly.
Moniker: rackstack
Tags:
- windows-server
- hyper-v
- iscsi
- clustering
- powershell
- sysadmin
- automation
- msp
ReleaseNotesUrl: https://github.com/TheAbider/RackStack/releases/tag/v1.99.1
ManifestType: defaultLocale
ManifestVersion: 1.6.0
6 changes: 6 additions & 0 deletions dist/winget/1.99.1/TheAbider.RackStack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.6.0.schema.json
PackageIdentifier: TheAbider.RackStack
PackageVersion: 1.99.1
DefaultLocale: en-US
ManifestType: version
ManifestVersion: 1.6.0
47 changes: 47 additions & 0 deletions dist/winget/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# winget manifests

The very first submission of `TheAbider.RackStack` to winget has to be
done by hand — `wingetcreate update` (the CI automation in `ci.yml`) only
works once the package already exists in `microsoft/winget-pkgs`.

`1.99.1/` contains the three ready-to-submit manifest files. After this
first PR merges, every future release auto-submits via the ci.yml step.

## First submission — copy-paste PR

1. Fork **https://github.com/microsoft/winget-pkgs**.
2. In your fork, create the path:
`manifests/t/TheAbider/RackStack/1.99.1/`
3. Copy the three files from `1.99.1/` here into that folder:
- `TheAbider.RackStack.yaml` (version)
- `TheAbider.RackStack.installer.yaml` (installer)
- `TheAbider.RackStack.locale.en-US.yaml` (default locale)
4. (Optional, on a Windows box) validate before submitting:
```powershell
winget validate --manifest manifests\t\TheAbider\RackStack\1.99.1
```
5. Commit and open a PR against `microsoft/winget-pkgs`. Title it
`New package: TheAbider.RackStack version 1.99.1`.
6. The winget-pkgs validation pipeline runs automatically (it installs
the package in a sandbox and checks the manifests). Once it's green
and a moderator approves, `winget install TheAbider.RackStack` goes
live.

## After the first submission

Don't hand-maintain these files going forward. The `ci.yml` release job
runs `wingetcreate update TheAbider.RackStack ...` on every release,
which regenerates the manifests from the winget-pkgs entry and opens the
update PR automatically. This `1.99.1/` folder is kept only as a record
of the initial submission.

## Notes on the manifest choices

- **`InstallerType: portable`** — `RackStack.exe` is a standalone
ps2exe-compiled executable, not an installer. winget installs it as a
portable package: it places the EXE and registers a PATH alias.
- **`Commands: [rackstack]`** — so `rackstack` works from any shell
after install. The EXE auto-elevates itself when run.
- **`InstallerSha256`** — must match the v1.99.1 `RackStack.exe`. If you
re-author for a later version, update the version, URL, SHA-256, and
`ReleaseDate` in all three files.
Loading