From 9bca84d7fa96e756c260382506a9fc7f52238937 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Thu, 23 Jul 2026 23:16:32 +0200 Subject: [PATCH 01/16] feat: add AGENTS.md, CLAUDE.md, CONTRIBUTING.md, and copilot-instructions.md Establish the guidance chain for agents and contributors: - AGENTS.md: OKF-style pointer file with discovery order and links to PSModule/docs and MSXOrg/docs - CLAUDE.md: Claude Code entry point that imports AGENTS.md - .github/copilot-instructions.md: Copilot entry point pointing to AGENTS.md - CONTRIBUTING.md: self-contained contribution workflow for the template repo Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 3 ++ AGENTS.md | 38 ++++++++++++++++++++++++ CLAUDE.md | 3 ++ CONTRIBUTING.md | 51 +++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 .github/copilot-instructions.md create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 CONTRIBUTING.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..703a191 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,3 @@ +# Copilot Instructions + +See [`AGENTS.md`](../AGENTS.md) for all onboarding and guidance pointers for this repository. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a182910 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,38 @@ +# Agents + +This file is the onboarding entry point for agents working in this repository. +It is a pointer file — guidance lives in the documentation, not here. + +## This repository + +`Template-PSModule` is the canonical starting template for new PowerShell modules in the PSModule organization. +It provides the CI/CD framework wiring, starter layout, and community files that every PSModule module repository begins with. + +Read in this order: + +1. [`README.md`](README.md) — what this repository is and its purpose as a template. +2. [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to work on the template itself. +3. [`.github/PSModule.yml`](.github/PSModule.yml) — framework configuration defaults. + +## PSModule guidance + +For PSModule-specific build, layout, and process guidance: + +- [Template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/) — how to create a new module from this template. +- [Repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) — the expected repository layout and required files. +- [Module anatomy](https://psmodule.github.io/docs/Modules/module-anatomy/) — source layout and framework conventions. +- [Build, test, pack, publish](https://psmodule.github.io/docs/Modules/Process-PSModule/build-test-pack-publish/) — the CI/CD pipeline. +- [Standards](https://psmodule.github.io/docs/Modules/Standards/) — PowerShell module coding standards. + +## Org-wide guidance + +For cross-cutting ways of working and standards: + +- [Agentic Development](https://msxorg.github.io/docs/Ways-of-Working/Agentic-Development/) — how agents and humans collaborate in this ecosystem. +- [Ways of Working](https://msxorg.github.io/docs/Ways-of-Working/) — contribution workflow, branching, PRs, issues. +- [Coding Standards](https://msxorg.github.io/docs/Coding-Standards/) — language-level conventions. + +## Main directive + +Everything is a work in progress and can be improved. +If you find a problem, fix it if it is small; otherwise open an issue in the relevant repository. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..2e5b1fd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +# Claude + +See [`AGENTS.md`](AGENTS.md) for all onboarding and guidance pointers for this repository. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..46af0c6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing + +Thank you for contributing to `Template-PSModule`. +This file describes how to work on the template itself — not how to use it. +If you want to create a new module from this template, see the [template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/). + +## What this repository is + +`Template-PSModule` is the canonical starting template for new PowerShell modules in the PSModule organization. +Changes to this repository affect every module created from it going forward. +Keep changes focused: structural layout, required community files, CI/CD wiring, and framework defaults. + +## Before you start + +1. Read [`AGENTS.md`](AGENTS.md) for the guidance chain and documentation references. +2. Familiarise yourself with the [repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) that this template must satisfy. +3. Check the open issues and pull requests to avoid duplicate work. + +## Workflow + +This project follows the [MSXOrg contribution workflow](https://msxorg.github.io/docs/Ways-of-Working/Contribution-Workflow/): + +1. Open or pick up an issue that describes the change. +2. Create a branch from `main` following the `/-` convention (e.g. `feat/42-add-security-md`). +3. Make small, focused commits and push often. +4. Open a **draft PR** as soon as the change has a basic shape — early feedback is preferred. +5. Mark the PR ready for review once CI is green and the change is complete. + +For branching details, see [Branching and Merging](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/). + +## Pull requests + +- Keep PRs small and focused on a single deliverable. +- The PR title should follow the [commit conventions](https://msxorg.github.io/docs/Ways-of-Working/Commit-Conventions/). +- Auto-merge is enabled; the PR lands as soon as all required checks pass and a reviewer approves. + +For PR format guidance, see [PR Format](https://msxorg.github.io/docs/Ways-of-Working/PR-Format/). + +## Issues + +Use GitHub Issues to report bugs, request features, or propose template changes. +Follow the [issue format](https://msxorg.github.io/docs/Ways-of-Working/Issue-Format/) guidance. + +## Code standards + +PowerShell in this template follows the [PSModule Standards](https://psmodule.github.io/docs/Modules/Standards/) and the +[MSXOrg Coding Standards](https://msxorg.github.io/docs/Coding-Standards/). + +## Questions + +Open a GitHub Discussion or file an issue if something is unclear. From cb7ee46ff53da1699f6327f6680acd3e756d19a4 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Thu, 23 Jul 2026 23:16:37 +0200 Subject: [PATCH 02/16] docs: slim README.md to template purpose and onboarding pointers Replace the filled-in module example content with a concise description of the template's purpose. The README now: - Describes what the template is and why it exists - Lists the post-creation checklist steps - Points contributors to CONTRIBUTING.md and AGENTS.md Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- README.md | 74 +++++++++++++------------------------------------------ 1 file changed, 17 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 6319793..28977f9 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,29 @@ -# {{ NAME }} +# Template-PSModule -{{ DESCRIPTION }} +The canonical starting template for new PowerShell modules in the PSModule organization. -## Prerequisites - -This uses the following external resources: -- The [PSModule framework](https://github.com/PSModule/Process-PSModule) for building, testing and publishing the module. - -## Installation - -To install the module from the PowerShell Gallery, you can use the following command: - -```powershell -Install-PSResource -Name {{ NAME }} -Import-Module -Name {{ NAME }} -``` - -## Usage - -Here is a list of example that are typical use cases for the module. - -### Example 1: Greet an entity - -Provide examples for typical commands that a user would like to do with the module. +## Purpose -```powershell -Greet-Entity -Name 'World' -Hello, World! -``` +Use this template when creating a new PowerShell module repository. +It provides the CI/CD framework wiring, required community files, and starter layout that every PSModule module repository needs. -### Example 2 +For step-by-step instructions, see the [template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/). -Provide examples for typical commands that a user would like to do with the module. +## After creating a repository from this template -```powershell -Import-Module -Name PSModuleTemplate -``` +1. Replace the `{{ NAME }}` and `{{ DESCRIPTION }}` placeholders throughout the repository. +2. Remove the scaffold example functions, tests, and examples that do not represent your module. +3. Set the repository description and custom properties on GitHub. +4. Confirm `.github/PSModule.yml` only overrides defaults when your module needs different behavior. +5. Open a draft pull request and run the full CI pipeline. -### Find more examples +See [repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) for the full checklist. -To find more examples of how to use the module, please refer to the [examples](examples) folder. - -Alternatively, you can use the Get-Command -Module 'This module' to find more commands that are available in the module. -To find examples of each of the commands you can use Get-Help -Examples 'CommandName'. - -## Documentation +## Prerequisites -Link to further documentation if available, or describe where in the repository users can find more detailed documentation about -the module's functions and features. +Modules built from this template use the [PSModule framework](https://github.com/PSModule/Process-PSModule) for building, testing, and publishing. ## Contributing -Coder or not, you can contribute to the project! We welcome all contributions. - -### For Users - -If you don't code, you still sit on valuable information that can make this project even better. If you experience that the -product does unexpected things, throw errors or is missing functionality, you can help by submitting bugs and feature requests. -Please see the issues tab on this project and submit a new issue that matches your needs. - -### For Developers - -If you do code, we'd love to have your contributions. Please read the [Contribution guidelines](CONTRIBUTING.md) for more information. -You can either help by picking up an existing issue or submit a new one if you have an idea for a new feature or improvement. - -## Acknowledgements - -Here is a list of people and projects that helped this project in some way. +To contribute to this template itself, read the [Contribution guidelines](CONTRIBUTING.md). +For agents and AI tools, start with [`AGENTS.md`](AGENTS.md). From 934176f553116b7b116c4b1ef000a23f975828e0 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Thu, 23 Jul 2026 23:27:11 +0200 Subject: [PATCH 03/16] refactor: slim template scaffolding to minimum baseline (#33) ## Summary - remove Process-PSModule TestData showcase wiring and its matching environment test - slim template scaffolding to a minimal, coherent starter module structure - keep guidance-chain files introduced in PR #32 unchanged ## Why This is PR 2 in the stacked simplification. The template should start lean and practical, not present optional feature catalog examples. ## Validation - run the smallest relevant local checks for updated scaffolding --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 3 - .github/mkdocs.yml | 81 ---------- .github/workflows/Process-PSModule.yml | 13 +- .github/zensical.toml | 64 ++++++++ README.md | 2 +- examples/General.ps1 | 20 +-- src/README.md | 3 - src/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes src/classes/private/SecretWriter.ps1 | 15 -- src/classes/public/Book.ps1 | 147 ------------------ src/data/Config.psd1 | 3 - src/data/Settings.psd1 | 3 - src/finally.ps1 | 3 - src/formats/CultureInfo.Format.ps1xml | 37 ----- src/formats/Mygciview.Format.ps1xml | 65 -------- .../private/Get-InternalPSModule.ps1 | 18 --- .../private/Set-InternalPSModule.ps1 | 22 --- ...-PSModuleTest.ps1 => Get-PSModuleTest.ps1} | 6 +- .../public/PSModule/Get-PSModuleTest.ps1 | 26 ---- .../public/PSModule/New-PSModuleTest.ps1 | 40 ----- src/functions/public/PSModule/PSModule.md | 3 - .../public/SomethingElse/Set-PSModuleTest.ps1 | 25 --- src/functions/public/SomethingElse/index.md | 1 - src/functions/public/completers.ps1 | 8 - src/header.ps1 | 3 - src/init/initializer.ps1 | 3 - src/manifest.psd1 | 5 - src/modules/OtherPSModule.psm1 | 19 --- src/scripts/loader.ps1 | 3 - src/types/DirectoryInfo.Types.ps1xml | 21 --- src/types/FileInfo.Types.ps1xml | 14 -- src/variables/private/PrivateVariables.ps1 | 47 ------ src/variables/public/Moons.ps1 | 6 - src/variables/public/Planets.ps1 | 20 --- src/variables/public/SolarSystems.ps1 | 17 -- tests/Environment.Tests.ps1 | 29 ---- tests/PSModuleTest.Tests.ps1 | 9 -- 37 files changed, 74 insertions(+), 730 deletions(-) delete mode 100644 .github/copilot-instructions.md delete mode 100644 .github/mkdocs.yml create mode 100644 .github/zensical.toml delete mode 100644 src/README.md delete mode 100644 src/assemblies/LsonLib.dll delete mode 100644 src/classes/private/SecretWriter.ps1 delete mode 100644 src/classes/public/Book.ps1 delete mode 100644 src/data/Config.psd1 delete mode 100644 src/data/Settings.psd1 delete mode 100644 src/finally.ps1 delete mode 100644 src/formats/CultureInfo.Format.ps1xml delete mode 100644 src/formats/Mygciview.Format.ps1xml delete mode 100644 src/functions/private/Get-InternalPSModule.ps1 delete mode 100644 src/functions/private/Set-InternalPSModule.ps1 rename src/functions/public/{Test-PSModuleTest.ps1 => Get-PSModuleTest.ps1} (75%) delete mode 100644 src/functions/public/PSModule/Get-PSModuleTest.ps1 delete mode 100644 src/functions/public/PSModule/New-PSModuleTest.ps1 delete mode 100644 src/functions/public/PSModule/PSModule.md delete mode 100644 src/functions/public/SomethingElse/Set-PSModuleTest.ps1 delete mode 100644 src/functions/public/SomethingElse/index.md delete mode 100644 src/functions/public/completers.ps1 delete mode 100644 src/header.ps1 delete mode 100644 src/init/initializer.ps1 delete mode 100644 src/manifest.psd1 delete mode 100644 src/modules/OtherPSModule.psm1 delete mode 100644 src/scripts/loader.ps1 delete mode 100644 src/types/DirectoryInfo.Types.ps1xml delete mode 100644 src/types/FileInfo.Types.ps1xml delete mode 100644 src/variables/private/PrivateVariables.ps1 delete mode 100644 src/variables/public/Moons.ps1 delete mode 100644 src/variables/public/Planets.ps1 delete mode 100644 src/variables/public/SolarSystems.ps1 delete mode 100644 tests/Environment.Tests.ps1 diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index 703a191..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,3 +0,0 @@ -# Copilot Instructions - -See [`AGENTS.md`](../AGENTS.md) for all onboarding and guidance pointers for this repository. diff --git a/.github/mkdocs.yml b/.github/mkdocs.yml deleted file mode 100644 index 67bd37a..0000000 --- a/.github/mkdocs.yml +++ /dev/null @@ -1,81 +0,0 @@ -# The '-{{ ... }}-'' are variables that are replaced during deployment, so no need to change. -# Rest of the settings can be changed as per your requirements. -# -# References: -# - https://squidfunk.github.io/mkdocs-material/setup/ - -site_name: -{{ REPO_NAME }}- -theme: - name: material - language: en - font: - text: Roboto - code: Sono - logo: Assets/icon.png - favicon: Assets/icon.png - palette: - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - toggle: - icon: material/link - name: Switch to dark mode - # Palette toggle for dark mode - - media: '(prefers-color-scheme: dark)' - scheme: slate - toggle: - primary: black - accent: green - icon: material/toggle-switch-off-outline - name: Switch to light mode - # Palette toggle for light mode - - media: '(prefers-color-scheme: light)' - scheme: default - toggle: - primary: indigo - accent: green - icon: material/toggle-switch - name: Switch to system preference - icon: - repo: material/github - features: - - navigation.instant - - navigation.instant.progress - - navigation.indexes - - navigation.top - - navigation.tracking - - navigation.expand - - search.suggest - - search.highlight - -repo_name: -{{ REPO_OWNER }}-/-{{ REPO_NAME }}- -repo_url: https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}- - -plugins: - - search - -markdown_extensions: - - toc: - permalink: true # Adds a link icon to headings - - attr_list - - admonition - - md_in_html - - pymdownx.details # Enables collapsible admonitions - -extra: - social: - - icon: fontawesome/brands/discord - link: https://discord.gg/jedJWCPAhD - name: -{{ REPO_OWNER }}- on Discord - - icon: fontawesome/brands/github - link: https://github.com/-{{ REPO_OWNER }}-/ - name: -{{ REPO_OWNER }}- on GitHub - consent: - title: Cookie consent - description: >- - We use cookies to recognize your repeated visits and preferences, as well - as to measure the effectiveness of our documentation and whether users - find what they're searching for. With your consent, you're helping us to - make our documentation better. - actions: - - accept - - reject diff --git a/.github/workflows/Process-PSModule.yml b/.github/workflows/Process-PSModule.yml index 22061b9..aebc8ed 100644 --- a/.github/workflows/Process-PSModule.yml +++ b/.github/workflows/Process-PSModule.yml @@ -27,15 +27,6 @@ permissions: jobs: Process-PSModule: - uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@da180bac16b13bfbcdf08b2e4e221b5b49e5ff28 # v6.1.4 + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@fb1bdb8fefd243292f779d2a856a38db6fe6daf4 # v6.1.13 secrets: - APIKEY: ${{ secrets.APIKEY }} - TestData: >- - { - "secrets": { - "TEST_SECRET": "${{ secrets.TEST_SECRET }}" - }, - "variables": { - "TEST_VARIABLE": "${{ vars.TEST_VARIABLE }}" - } - } + APIKey: ${{ secrets.APIKEY }} diff --git a/.github/zensical.toml b/.github/zensical.toml new file mode 100644 index 0000000..ce7574e --- /dev/null +++ b/.github/zensical.toml @@ -0,0 +1,64 @@ +[project] +site_name = "-{{ REPO_NAME }}-" +repo_name = "-{{ REPO_OWNER }}-/-{{ REPO_NAME }}-" +repo_url = "https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}-" + +[project.theme] +variant = "classic" +language = "en" +logo = "Assets/icon.png" +favicon = "Assets/icon.png" +features = [ + "navigation.instant", + "navigation.instant.progress", + "navigation.indexes", + "navigation.top", + "navigation.tracking", + "navigation.expand", + "search.suggest", + "search.highlight", + "content.code.copy" +] + +[[project.theme.palette]] +media = "(prefers-color-scheme)" +toggle.icon = "lucide/sun-moon" +toggle.name = "Switch to dark mode" + +[[project.theme.palette]] +media = "(prefers-color-scheme: dark)" +scheme = "slate" +primary = "black" +accent = "light-blue" +toggle.icon = "lucide/moon" +toggle.name = "Switch to light mode" + +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" +scheme = "default" +primary = "black" +accent = "light-blue" +toggle.icon = "lucide/sun" +toggle.name = "Switch to system preference" + +[project.theme.icon] +repo = "fontawesome/brands/github" + +[project.markdown_extensions.toc] +permalink = true + +[project.markdown_extensions.attr_list] +[project.markdown_extensions.admonition] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.pymdownx.details] +[project.markdown_extensions.pymdownx.superfences] + +[[project.extra.social]] +icon = "fontawesome/brands/discord" +link = "https://discord.psmodule.io" +name = "-{{ REPO_OWNER }}- on Discord" + +[[project.extra.social]] +icon = "fontawesome/brands/github" +link = "https://github.com/-{{ REPO_OWNER }}-/" +name = "-{{ REPO_OWNER }}- on GitHub" diff --git a/README.md b/README.md index 28977f9..b5361dd 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ For step-by-step instructions, see the [template quickstart](https://psmodule.gi ## After creating a repository from this template 1. Replace the `{{ NAME }}` and `{{ DESCRIPTION }}` placeholders throughout the repository. -2. Remove the scaffold example functions, tests, and examples that do not represent your module. +2. Replace the starter function, test, and example with your module's first real command. 3. Set the repository description and custom properties on GitHub. 4. Confirm `.github/PSModule.yml` only overrides defaults when your module needs different behavior. 5. Open a draft pull request and run the full CI pipeline. diff --git a/examples/General.ps1 b/examples/General.ps1 index e193423..ec2a1ba 100644 --- a/examples/General.ps1 +++ b/examples/General.ps1 @@ -1,19 +1,7 @@ -<# +<<# .SYNOPSIS - This is a general example of how to use the module. + Basic module usage example. #> -# Import the module -Import-Module -Name 'PSModule' - -# Define the path to the font file -$FontFilePath = 'C:\Fonts\CodeNewRoman\CodeNewRomanNerdFontPropo-Regular.tff' - -# Install the font -Install-Font -Path $FontFilePath -Verbose - -# List installed fonts -Get-Font -Name 'CodeNewRomanNerdFontPropo-Regular' - -# Uninstall the font -Get-Font -Name 'CodeNewRomanNerdFontPropo-Regular' | Uninstall-Font -Verbose +Import-Module -Name '{{ NAME }}' +Get-PSModuleTest -Name 'World' diff --git a/src/README.md b/src/README.md deleted file mode 100644 index af76160..0000000 --- a/src/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Details - -For more info about the expected structure of a module repository, please refer to [Build-PSModule](https://github.com/PSModule/Build-PSModule) diff --git a/src/assemblies/LsonLib.dll b/src/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/src/formats/Mygciview.Format.ps1xml b/src/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2..0000000 --- a/src/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/src/functions/private/Get-InternalPSModule.ps1 b/src/functions/private/Get-InternalPSModule.ps1 deleted file mode 100644 index 89f053c..0000000 --- a/src/functions/private/Get-InternalPSModule.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/src/functions/private/Set-InternalPSModule.ps1 b/src/functions/private/Set-InternalPSModule.ps1 deleted file mode 100644 index cf870ba..0000000 --- a/src/functions/private/Set-InternalPSModule.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/src/functions/public/Test-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 similarity index 75% rename from src/functions/public/Test-PSModuleTest.ps1 rename to src/functions/public/Get-PSModuleTest.ps1 index 0c27510..13563b1 100644 --- a/src/functions/public/Test-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -1,4 +1,4 @@ -function Test-PSModuleTest { +function Get-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -7,7 +7,7 @@ Performs tests on a module. .EXAMPLE - Test-PSModule -Name 'World' + Get-PSModuleTest -Name 'World' "Hello, World!" #> @@ -17,5 +17,5 @@ [Parameter(Mandatory)] [string] $Name ) - Write-Output "Hello, $Name!" + "Hello, $Name!" } diff --git a/src/functions/public/PSModule/Get-PSModuleTest.ps1 b/src/functions/public/PSModule/Get-PSModuleTest.ps1 deleted file mode 100644 index a07d05b..0000000 --- a/src/functions/public/PSModule/Get-PSModuleTest.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -#Requires -Modules Utilities -#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.1.4' } -#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } -#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/src/functions/public/PSModule/New-PSModuleTest.ps1 b/src/functions/public/PSModule/New-PSModuleTest.ps1 deleted file mode 100644 index e003841..0000000 --- a/src/functions/public/PSModule/New-PSModuleTest.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.1.4'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - - .NOTES - Testing if a module can have a [Markdown based link](https://example.com). - !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," - \[This is a test\] - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [Alias('New-PSModuleTestAlias1')] - [Alias('New-PSModuleTestAlias2')] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -New-Alias New-PSModuleTestAlias3 New-PSModuleTest -New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest - - -Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/src/functions/public/PSModule/PSModule.md b/src/functions/public/PSModule/PSModule.md deleted file mode 100644 index a657773..0000000 --- a/src/functions/public/PSModule/PSModule.md +++ /dev/null @@ -1,3 +0,0 @@ -# PSModule - -This is a sub page for PSModule. diff --git a/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 deleted file mode 100644 index 23ec98e..0000000 --- a/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/src/functions/public/SomethingElse/index.md b/src/functions/public/SomethingElse/index.md deleted file mode 100644 index d9f7e9e..0000000 --- a/src/functions/public/SomethingElse/index.md +++ /dev/null @@ -1 +0,0 @@ -# This is SomethingElse diff --git a/src/functions/public/completers.ps1 b/src/functions/public/completers.ps1 deleted file mode 100644 index 6b1adbb..0000000 --- a/src/functions/public/completers.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -Register-ArgumentCompleter -CommandName New-PSModuleTest -ParameterName Name -ScriptBlock { - param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) - $null = $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters - - 'Alice', 'Bob', 'Charlie' | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { - [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) - } -} diff --git a/src/header.ps1 b/src/header.ps1 deleted file mode 100644 index cc1fde9..0000000 --- a/src/header.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() diff --git a/src/init/initializer.ps1 b/src/init/initializer.ps1 deleted file mode 100644 index 28396fb..0000000 --- a/src/init/initializer.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------------' -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Write-Verbose '-------------------------------' diff --git a/src/manifest.psd1 b/src/manifest.psd1 deleted file mode 100644 index ff720bd..0000000 --- a/src/manifest.psd1 +++ /dev/null @@ -1,5 +0,0 @@ -# This file always wins! -# Use this file to override any of the framework defaults and generated values. -@{ - ModuleVersion = '0.0.0' -} diff --git a/src/modules/OtherPSModule.psm1 b/src/modules/OtherPSModule.psm1 deleted file mode 100644 index 5d6af8e..0000000 --- a/src/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/src/scripts/loader.ps1 b/src/scripts/loader.ps1 deleted file mode 100644 index 973735a..0000000 --- a/src/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Write-Verbose '--- THIS IS A LOADER ---' -Write-Verbose '-------------------------' diff --git a/src/types/DirectoryInfo.Types.ps1xml b/src/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b..0000000 --- a/src/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/src/types/FileInfo.Types.ps1xml b/src/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b..0000000 --- a/src/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/src/variables/private/PrivateVariables.ps1 b/src/variables/private/PrivateVariables.ps1 deleted file mode 100644 index f1fc2c3..0000000 --- a/src/variables/private/PrivateVariables.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -$script:HabitablePlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - }, - @{ - Name = 'Proxima Centauri b' - Mass = 1.17 - Diameter = 11449 - DayLength = 5.15 - }, - @{ - Name = 'Kepler-442b' - Mass = 2.34 - Diameter = 11349 - DayLength = 5.7 - }, - @{ - Name = 'Kepler-452b' - Mass = 5.0 - Diameter = 17340 - DayLength = 20.0 - } -) - -$script:InhabitedPlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - } -) diff --git a/src/variables/public/Moons.ps1 b/src/variables/public/Moons.ps1 deleted file mode 100644 index dd0f33c..0000000 --- a/src/variables/public/Moons.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$script:Moons = @( - @{ - Planet = 'Earth' - Name = 'Moon' - } -) diff --git a/src/variables/public/Planets.ps1 b/src/variables/public/Planets.ps1 deleted file mode 100644 index 5927bc5..0000000 --- a/src/variables/public/Planets.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$script:Planets = @( - @{ - Name = 'Mercury' - Mass = 0.330 - Diameter = 4879 - DayLength = 4222.6 - }, - @{ - Name = 'Venus' - Mass = 4.87 - Diameter = 12104 - DayLength = 2802.0 - }, - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - } -) diff --git a/src/variables/public/SolarSystems.ps1 b/src/variables/public/SolarSystems.ps1 deleted file mode 100644 index acbcedf..0000000 --- a/src/variables/public/SolarSystems.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$script:SolarSystems = @( - @{ - Name = 'Solar System' - Planets = $script:Planets - Moons = $script:Moons - }, - @{ - Name = 'Alpha Centauri' - Planets = @() - Moons = @() - }, - @{ - Name = 'Sirius' - Planets = @() - Moons = @() - } -) diff --git a/tests/Environment.Tests.ps1 b/tests/Environment.Tests.ps1 deleted file mode 100644 index 01e729e..0000000 --- a/tests/Environment.Tests.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSReviewUnusedParameter', '', - Justification = 'Required for Pester tests' -)] -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseDeclaredVarsMoreThanAssignments', '', - Justification = 'Required for Pester tests' -)] -[CmdletBinding()] -param() - -Describe 'TestData is exposed to the module tests' { - # Showcase for the Process-PSModule 'TestData' feature. The calling workflow - # (.github/workflows/Process-PSModule.yml) passes a repository secret and a repository - # variable through a single TestData object, and the framework exposes each of them to - # the module tests as an environment variable. To see these run, add a repository secret - # named 'TEST_SECRET' and a repository variable named 'TEST_VARIABLE'. When they are not - # configured the tests skip, so a fresh repository created from this template stays green. - - It 'Exposes the secret from the "secrets" map as $env:TEST_SECRET' -Skip:([string]::IsNullOrEmpty($env:TEST_SECRET)) { - # Values in the "secrets" map are masked in the workflow logs. - $env:TEST_SECRET | Should -Not -BeNullOrEmpty - } - - It 'Exposes the variable from the "variables" map as $env:TEST_VARIABLE' -Skip:([string]::IsNullOrEmpty($env:TEST_VARIABLE)) { - # Values in the "variables" map are not masked. - $env:TEST_VARIABLE | Should -Not -BeNullOrEmpty - } -} diff --git a/tests/PSModuleTest.Tests.ps1 b/tests/PSModuleTest.Tests.ps1 index 59ee010..ff69bb3 100644 --- a/tests/PSModuleTest.Tests.ps1 +++ b/tests/PSModuleTest.Tests.ps1 @@ -15,13 +15,4 @@ Describe 'Module' { It 'Function: Get-PSModuleTest' { Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' } - It 'Function: New-PSModuleTest' { - New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Set-PSModuleTest' { - Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Test-PSModuleTest' { - Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } } From c76df31fd8f510ba72b32dbfe7f9a14f0b0783cd Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Thu, 23 Jul 2026 23:35:19 +0200 Subject: [PATCH 04/16] fix: add [OutputType] to scaffold function (PSUseOutputTypeCorrectly) The scaffold Get-PSModuleTest function output a string but was missing the [OutputType([string])] attribute. This triggered a PSScriptAnalyzer PSUseOutputTypeCorrectly failure when README.md changes caused HasImportantChanges to be true and the full lint suite ran. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/functions/public/Get-PSModuleTest.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/functions/public/Get-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 index 13563b1..d1d7793 100644 --- a/src/functions/public/Get-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -11,6 +11,7 @@ function Get-PSModuleTest { "Hello, World!" #> + [OutputType([string])] [CmdletBinding()] param ( # Name of the person to greet. From bf3e3844fbe49e71c6bc388e8f1692395b12cbe5 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Thu, 23 Jul 2026 23:56:44 +0200 Subject: [PATCH 05/16] fix: correct malformed comment block and indentation in examples/General.ps1 The file had a stray '<' and an embedded BOM character before the '<#' comment opener, making it non-ASCII and triggering PSUseBOMForUnicodeEncodedFile. Indentation was also 2-space instead of the required 4-space. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- examples/General.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/General.ps1 b/examples/General.ps1 index ec2a1ba..79d4f26 100644 --- a/examples/General.ps1 +++ b/examples/General.ps1 @@ -1,6 +1,6 @@ -<<# - .SYNOPSIS - Basic module usage example. +<# + .SYNOPSIS + Basic module usage example. #> Import-Module -Name '{{ NAME }}' From b1f4d246e6f41eb07dba055221dd39d0614eb874 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Fri, 24 Jul 2026 00:18:20 +0200 Subject: [PATCH 06/16] Agents --- AGENTS.md | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index a182910..547d2fd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,21 +1,18 @@ # Agents -This file is the onboarding entry point for agents working in this repository. -It is a pointer file — guidance lives in the documentation, not here. - -## This repository +## Main directive -`Template-PSModule` is the canonical starting template for new PowerShell modules in the PSModule organization. -It provides the CI/CD framework wiring, starter layout, and community files that every PSModule module repository begins with. +Everything is a work in progress and can be improved. +If you find a problem or improvement, fix if small; otherwise open an issue. -Read in this order: +## Repo guidance -1. [`README.md`](README.md) — what this repository is and its purpose as a template. -2. [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to work on the template itself. -3. [`.github/PSModule.yml`](.github/PSModule.yml) — framework configuration defaults. +- [`README.md`](README.md) — what this repository is and its purpose as a template. +- [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to work on the template itself. -## PSModule guidance +## PSModule Framework guidance +Regarding repo structure, module source code and how the Process-PSModule workflow works. For PSModule-specific build, layout, and process guidance: - [Template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/) — how to create a new module from this template. @@ -31,8 +28,3 @@ For cross-cutting ways of working and standards: - [Agentic Development](https://msxorg.github.io/docs/Ways-of-Working/Agentic-Development/) — how agents and humans collaborate in this ecosystem. - [Ways of Working](https://msxorg.github.io/docs/Ways-of-Working/) — contribution workflow, branching, PRs, issues. - [Coding Standards](https://msxorg.github.io/docs/Coding-Standards/) — language-level conventions. - -## Main directive - -Everything is a work in progress and can be improved. -If you find a problem, fix it if it is small; otherwise open an issue in the relevant repository. From b61bc88e17766346065f579e8214c2dc01edafff Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Fri, 24 Jul 2026 03:50:01 +0200 Subject: [PATCH 07/16] docs: generalize CONTRIBUTING.md for any PSModule module repo Remove Template-PSModule-specific framing ('template itself', 'propose template changes', 'canonical starting template'). The file now reads correctly whether instantiated as the template repo itself or any module repo created from it. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CONTRIBUTING.md | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 46af0c6..f45a3c3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,19 +1,12 @@ # Contributing -Thank you for contributing to `Template-PSModule`. -This file describes how to work on the template itself — not how to use it. -If you want to create a new module from this template, see the [template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/). - -## What this repository is - -`Template-PSModule` is the canonical starting template for new PowerShell modules in the PSModule organization. -Changes to this repository affect every module created from it going forward. -Keep changes focused: structural layout, required community files, CI/CD wiring, and framework defaults. +Thank you for contributing to this module. +Read [`AGENTS.md`](AGENTS.md) first for the full guidance chain and documentation references. ## Before you start -1. Read [`AGENTS.md`](AGENTS.md) for the guidance chain and documentation references. -2. Familiarise yourself with the [repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) that this template must satisfy. +1. Read [`README.md`](README.md) to understand what the module does. +2. Familiarise yourself with the [repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) that this repository must satisfy. 3. Check the open issues and pull requests to avoid duplicate work. ## Workflow @@ -38,12 +31,12 @@ For PR format guidance, see [PR Format](https://msxorg.github.io/docs/Ways-of-Wo ## Issues -Use GitHub Issues to report bugs, request features, or propose template changes. +Use GitHub Issues to report bugs, request features, or propose improvements. Follow the [issue format](https://msxorg.github.io/docs/Ways-of-Working/Issue-Format/) guidance. ## Code standards -PowerShell in this template follows the [PSModule Standards](https://psmodule.github.io/docs/Modules/Standards/) and the +PowerShell in this module follows the [PSModule Standards](https://psmodule.github.io/docs/Modules/Standards/) and the [MSXOrg Coding Standards](https://msxorg.github.io/docs/Coding-Standards/). ## Questions From a1d2db283927f7497d8a85ec035a9e911247bbe2 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 13:56:38 +0200 Subject: [PATCH 08/16] fix: use @AGENTS.md import syntax in CLAUDE.md Repository-Defaults specifies CLAUDE.md must import AGENTS.md with the '@AGENTS.md' syntax so Claude Code reads it natively, not as prose. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CLAUDE.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2e5b1fd..43c994c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,3 +1 @@ -# Claude - -See [`AGENTS.md`](AGENTS.md) for all onboarding and guidance pointers for this repository. +@AGENTS.md From 71d5cd72d14cad3c5f90a91d3b1883305ae0c9a1 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 13:56:43 +0200 Subject: [PATCH 09/16] fix: correct module-anatomy URL and generalize AGENTS.md wording - Fix wrong URL: /Modules/module-anatomy/ -> /Modules/Process-PSModule/module-anatomy/ - 'how to work on the template itself' -> 'how to contribute to this repository' (same generalization applied to CONTRIBUTING.md earlier) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- AGENTS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 547d2fd..cefdf11 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ If you find a problem or improvement, fix if small; otherwise open an issue. ## Repo guidance - [`README.md`](README.md) — what this repository is and its purpose as a template. -- [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to work on the template itself. +- [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to contribute to this repository. ## PSModule Framework guidance @@ -17,7 +17,7 @@ For PSModule-specific build, layout, and process guidance: - [Template quickstart](https://psmodule.github.io/docs/Modules/Process-PSModule/template-quickstart/) — how to create a new module from this template. - [Repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) — the expected repository layout and required files. -- [Module anatomy](https://psmodule.github.io/docs/Modules/module-anatomy/) — source layout and framework conventions. +- [Module anatomy](https://psmodule.github.io/docs/Modules/Process-PSModule/module-anatomy/) — source layout and framework conventions. - [Build, test, pack, publish](https://psmodule.github.io/docs/Modules/Process-PSModule/build-test-pack-publish/) — the CI/CD pipeline. - [Standards](https://psmodule.github.io/docs/Modules/Standards/) — PowerShell module coding standards. From 3f868a3602d6df6dfe84122f8d1dde5db21bd412 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 13:56:49 +0200 Subject: [PATCH 10/16] docs: add Copilot review loop to contribution workflow The Contribution-Workflow doc defines a mandatory step between opening a draft PR and marking it ready: run the Copilot review loop until it reports a clean round. Add this as step 5. Also fold auto-merge into the same step and remove the redundant mention in the Pull requests section. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f45a3c3..15f724a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,8 @@ This project follows the [MSXOrg contribution workflow](https://msxorg.github.io 2. Create a branch from `main` following the `/-` convention (e.g. `feat/42-add-security-md`). 3. Make small, focused commits and push often. 4. Open a **draft PR** as soon as the change has a basic shape — early feedback is preferred. -5. Mark the PR ready for review once CI is green and the change is complete. +5. Run the **Copilot review loop**: request a Copilot review, address its feedback, and repeat until it reports a clean round. File an issue for any out-of-scope findings rather than expanding the PR. +6. Mark the PR ready for review and enable auto-merge. It lands automatically once the required checks pass and a reviewer approves. For branching details, see [Branching and Merging](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/). @@ -25,7 +26,6 @@ For branching details, see [Branching and Merging](https://msxorg.github.io/docs - Keep PRs small and focused on a single deliverable. - The PR title should follow the [commit conventions](https://msxorg.github.io/docs/Ways-of-Working/Commit-Conventions/). -- Auto-merge is enabled; the PR lands as soon as all required checks pass and a reviewer approves. For PR format guidance, see [PR Format](https://msxorg.github.io/docs/Ways-of-Working/PR-Format/). From 157c0891819ac5ad524173b8537c13c10a7189bb Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 13:56:58 +0200 Subject: [PATCH 11/16] fix: complete comment-based help in scaffold function Add missing .INPUTS and .OUTPUTS sections required by the PowerShell functions standard. Clarify .SYNOPSIS/.DESCRIPTION (they were identical and said 'performs tests' when the function actually greets). Fix the .EXAMPLE output (remove spurious quotes around the output string). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/functions/public/Get-PSModuleTest.ps1 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/functions/public/Get-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 index d1d7793..8816703 100644 --- a/src/functions/public/Get-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -1,20 +1,27 @@ function Get-PSModuleTest { <# .SYNOPSIS - Performs tests on a module. + Greets an entity by name. .DESCRIPTION - Performs tests on a module. + Returns a greeting string for the given name. + This is a scaffold example function. Replace it with your module's first real command. .EXAMPLE Get-PSModuleTest -Name 'World' - "Hello, World!" + Hello, World! + + .INPUTS + None. This function does not accept pipeline input. + + .OUTPUTS + [string] A greeting string. #> [OutputType([string])] [CmdletBinding()] param ( - # Name of the person to greet. + # The name of the entity to greet. [Parameter(Mandatory)] [string] $Name ) From 5dcf9581af7f8ad09bcc64d251d3fcf8ca730571 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 14:07:57 +0200 Subject: [PATCH 12/16] fix: use canonical .INPUTS/.OUTPUTS format in scaffold function Per about_Comment_Based_Help and the PS engine source (HelpCommentsParser.cs): - .INPUTS documents pipeline input only; canonical no-pipeline text is 'None. You can't pipe objects to CommandName.' - .OUTPUTS must use the fully-qualified .NET type name (System.String), not the PowerShell type accelerator ([string]) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/functions/public/Get-PSModuleTest.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/functions/public/Get-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 index 8816703..bc2e377 100644 --- a/src/functions/public/Get-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -13,10 +13,10 @@ function Get-PSModuleTest { Hello, World! .INPUTS - None. This function does not accept pipeline input. + None. You can't pipe objects to Get-PSModuleTest. .OUTPUTS - [string] A greeting string. + System.String. A greeting string for the given name. #> [OutputType([string])] [CmdletBinding()] From 7b59e8d31f097a8279fa037a8c1e694aa8eb5387 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 14:16:33 +0200 Subject: [PATCH 13/16] fix: suppress MD041 in CLAUDE.md to satisfy markdownlint CLAUDE.md is intentionally a single-line Claude Code import directive. MD041 requires an H1 on line 1, which conflicts with the spec for this file. Suppress the rule inline rather than globally. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CLAUDE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CLAUDE.md b/CLAUDE.md index 43c994c..da0659f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1,2 @@ + @AGENTS.md From 5144ac94b6fce36def5cba9d2e11d0fd2aa7029c Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 14:28:39 +0200 Subject: [PATCH 14/16] fix: split .INPUTS/.OUTPUTS type and description onto separate lines PlatyPS renders each .INPUTS/.OUTPUTS line as a ### heading. The canonical PowerShell format puts the type name alone on its first line and the description as body text on the next line. This prevents MD026 (no-trailing-punctuation) violations in generated docs. Correct format: .OUTPUTS System.String A greeting string for the given name. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/functions/public/Get-PSModuleTest.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/functions/public/Get-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 index bc2e377..88c58f0 100644 --- a/src/functions/public/Get-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -13,10 +13,12 @@ function Get-PSModuleTest { Hello, World! .INPUTS - None. You can't pipe objects to Get-PSModuleTest. + None + You can't pipe objects to Get-PSModuleTest. .OUTPUTS - System.String. A greeting string for the given name. + System.String + A greeting string for the given name. #> [OutputType([string])] [CmdletBinding()] From dc53b402d3c3d7786cd81fd6071b663e4c69af55 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 15:58:24 +0200 Subject: [PATCH 15/16] fix: remove inline descriptions from .INPUTS/.OUTPUTS to avoid MD046 PlatyPS renders indented lines after a type entry as indented code blocks, which MD046 rejects (fenced style required). Type-name-only entries generate clean ### headings with no linting issues. The .DESCRIPTION section already documents the return value. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/functions/public/Get-PSModuleTest.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/functions/public/Get-PSModuleTest.ps1 b/src/functions/public/Get-PSModuleTest.ps1 index 88c58f0..db2d300 100644 --- a/src/functions/public/Get-PSModuleTest.ps1 +++ b/src/functions/public/Get-PSModuleTest.ps1 @@ -14,11 +14,9 @@ function Get-PSModuleTest { .INPUTS None - You can't pipe objects to Get-PSModuleTest. .OUTPUTS System.String - A greeting string for the given name. #> [OutputType([string])] [CmdletBinding()] From 09efcac199d6a3b2e36f1dc5734671526382a760 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 25 Jul 2026 18:07:45 +0200 Subject: [PATCH 16/16] docs: add PSModule/memory and MSXOrg/memory to AGENTS.md Both memory repos are now live. Reference them as active resources so agents discover and use them from the onboarding chain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- AGENTS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index cefdf11..0879ad2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,6 +20,7 @@ For PSModule-specific build, layout, and process guidance: - [Module anatomy](https://psmodule.github.io/docs/Modules/Process-PSModule/module-anatomy/) — source layout and framework conventions. - [Build, test, pack, publish](https://psmodule.github.io/docs/Modules/Process-PSModule/build-test-pack-publish/) — the CI/CD pipeline. - [Standards](https://psmodule.github.io/docs/Modules/Standards/) — PowerShell module coding standards. +- [PSModule/memory](https://github.com/PSModule/memory) — durable cross-session agent working memory for the PSModule organization. ## Org-wide guidance @@ -28,3 +29,4 @@ For cross-cutting ways of working and standards: - [Agentic Development](https://msxorg.github.io/docs/Ways-of-Working/Agentic-Development/) — how agents and humans collaborate in this ecosystem. - [Ways of Working](https://msxorg.github.io/docs/Ways-of-Working/) — contribution workflow, branching, PRs, issues. - [Coding Standards](https://msxorg.github.io/docs/Coding-Standards/) — language-level conventions. +- [MSXOrg/memory](https://github.com/MSXOrg/memory) — durable agent working memory: gotchas, knowledge, and agent role notes.