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
4 changes: 2 additions & 2 deletions .github/actions/update-index/src/Helper.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -831,7 +831,7 @@ function Update-ModuleList {
$moduleRepos = $Repos | Where-Object {
$_.Type -eq 'Module' -and $_.Owner -eq 'PSModule'
} | Sort-Object Name
$catalogFolderPath = Join-Path 'docs\content\Modules\Catalog' 'Repositories'
$catalogFolderPath = Join-Path 'docs\content\Modules' 'Repositories'
if (-not (Test-Path $catalogFolderPath)) {
Write-Host "Creating catalog folder [$catalogFolderPath]"
$null = New-Item -Path $catalogFolderPath -ItemType Directory
Expand Down Expand Up @@ -921,7 +921,7 @@ function Update-ModuleList {

LogGroup 'Write module catalog table to docs index' {
$moduleTable = $moduleCatalogTableTemplate.Replace('{{ ROWS }}', $moduleTableRows.TrimEnd())
Update-MDSection -Path '.\docs\content\Modules\Catalog\index.md' -Name 'MODULE_CATALOG' -Content $moduleTable
Update-MDSection -Path '.\docs\content\Modules\index.md' -Name 'MODULE_CATALOG' -Content $moduleTable
Write-Host 'Module catalog table update completed'
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
<table>
<tr>
<th width="24%">Name</th>
<th width="12%"><img src="../../assets/images/module-catalog/githubtags.svg" alt="Version" title="Version" width="16" height="16"></th>
<th width="24%"><img src="../../assets/images/module-catalog/package-variant-closed-check.svg" alt="Process version" title="Process version" width="16" height="16"></th>
<th width="10%"><img src="../../assets/images/module-catalog/githubissues.svg" alt="Issues" title="Issues" width="16" height="16"></th>
<th width="10%"><img src="../../assets/images/module-catalog/githubpullrequests.svg" alt="Pull requests" title="Pull requests" width="16" height="16"></th>
<th width="10%"><img src="../../assets/images/module-catalog/githubstars.svg" alt="Stars" title="Stars" width="16" height="16"></th>
<th width="12%"><img src="../assets/images/module-catalog/githubtags.svg" alt="Version" title="Version" width="16" height="16"></th>
<th width="24%"><img src="../assets/images/module-catalog/package-variant-closed-check.svg" alt="Process version" title="Process version" width="16" height="16"></th>
<th width="10%"><img src="../assets/images/module-catalog/githubissues.svg" alt="Issues" title="Issues" width="16" height="16"></th>
<th width="10%"><img src="../assets/images/module-catalog/githubpullrequests.svg" alt="Pull requests" title="Pull requests" width="16" height="16"></th>
<th width="10%"><img src="../assets/images/module-catalog/githubstars.svg" alt="Stars" title="Stars" width="16" height="16"></th>
</tr>
{{ ROWS }}</table>
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseDeclaredVarsMoreThanAssignments',
'',
Justification = 'The temporary path is assigned before assertions and cleanup.'
)]
[CmdletBinding()]
param()

BeforeAll {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '../src/Helper.psm1') -Force
}

Describe 'Update-ModuleList' {
Context 'catalog page at the Modules root' {
It 'Update-ModuleList - writes the catalog index and repository page to the new Modules paths' {
$testRoot = Join-Path ([System.IO.Path]::GetTempPath()) ("update-index-test-$([guid]::NewGuid())")
$modulesPath = Join-Path $testRoot 'docs/content/Modules'
$catalogIndexPath = Join-Path $modulesPath 'index.md'
New-Item -ItemType Directory -Path $modulesPath -Force | Out-Null
Set-Content -Path $catalogIndexPath -Value @(
'# Modules'
''
'<!-- MODULE_CATALOG_START -->'
'<!-- MODULE_CATALOG_END -->'
)

try {
Push-Location $testRoot
InModuleScope Helper {
Mock Get-RepositoryVersion { '1.2.3' }
Mock Get-RepositoryReadmeContent { '# Example`nExample module summary.' }
Mock Get-MarkdownSummary { 'Example module summary.' }
Mock Get-WorkflowReference { 'v1.2.3' }
Mock Get-ProcessReferenceStatus { 'up-to-date' }
Mock Get-OpenItemCount { 0 }

Update-ModuleList -Repos @(
[pscustomobject]@{
Type = 'Module'
Owner = 'PSModule'
Name = 'Example'
Description = 'Example module.'
DefaultBranch = 'main'
Stars = 1
}
)
}

$catalogContent = Get-Content -Path $catalogIndexPath -Raw
Test-Path (Join-Path $modulesPath 'Repositories/Example.md') | Should -BeTrue
$catalogContent | Should -Match '\./Repositories/Example\.md'
$catalogContent | Should -Match '\.\./assets/images/module-catalog/githubtags\.svg'
} finally {
Pop-Location
Remove-Item -LiteralPath $testRoot -Recurse -Force -ErrorAction SilentlyContinue
}
}
}
}
1 change: 1 addition & 0 deletions .github/workflows/Test-Actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ jobs:
run: |
Install-PSResource -Name Pester -Version '[5.7.1,6.0.0)' -Repository PSGallery -TrustRepository
Install-PSResource -Name PSSemVer -Repository PSGallery -TrustRepository
Install-PSResource -Name GitHub -Version '[0.43.1,0.44.0)' -Repository PSGallery -TrustRepository

- name: Run action unit tests
shell: pwsh
Expand Down
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ If you find a problem or improvement, fix if small; otherwise open an issue.
Regarding repo structure, module source code, and how the Process-PSModule workflow
works. For PSModule-specific build, layout, and process guidance:

- [Process-PSModule docs](https://psmodule.github.io/docs/Modules/Process-PSModule/) —
- [Process-PSModule docs](https://psmodule.io/docs/) —
repository structure, module anatomy, and the build/test/pack/publish pipeline.
- [Repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) —
the expected repository layout and required files.
Expand All @@ -28,11 +28,11 @@ works. For PSModule-specific build, layout, and process guidance:

For cross-cutting ways of working and standards:

- [Agentic Development](https://msxorg.github.io/docs/Ways-of-Working/Agentic-Development/) —
- [Agentic Development](https://msx.no/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
- [Ways of Working](https://msx.no/docs/Ways-of-Working/) — contribution
workflow, branching, PRs, issues.
- [Coding Standards](https://msxorg.github.io/docs/Coding-Standards/) — language-level
- [Coding Standards](https://msx.no/docs/Coding-Standards/) — language-level
conventions.
- [MSXOrg/memory](https://github.com/MSXOrg/memory) — durable agent working memory:
gotchas, knowledge, and agent role notes.
21 changes: 0 additions & 21 deletions docs/content/Modules/Catalog/index.md

This file was deleted.

68 changes: 0 additions & 68 deletions docs/content/Modules/Process-PSModule/index.md

This file was deleted.

30 changes: 17 additions & 13 deletions docs/content/Modules/index.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
# Modules

Process-PSModule now hosts PSModule-org module documentation.
This page indexes modules maintained in the PSModule organization and what each module does.

This section is the local source of truth for:
Modules are separate from the [Process-PSModule framework](../index.md). Use the framework documentation to build and release a module; use this page to discover the modules available to install and use.

- module catalog and module-level specs
- Process-PSModule structure and build flow
- repository anatomy and template onboarding
## Scope

## Sections
Each module page should capture:

- [Repository Standard](Repository-Standard.md)
- [Standards](Standards.md)
- [Module types](Module-Types.md)
- [Test Specification](Test-Specification.md)
- [Versioning](Versioning.md)
- [Catalog](Catalog/index.md) (auto-generated from PSModule repo metadata, release data, and README summaries)
- [Process-PSModule](Process-PSModule/index.md)
- purpose and problem statement
- install and import baseline
- key exported capabilities
- owner and maintenance notes
- lifecycle status

## Module index generation

The module list and linked module pages are generated from PSModule repository metadata and README content, then refreshed automatically.

<!-- MODULE_CATALOG_START -->

<!-- MODULE_CATALOG_END -->
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ If the module needs several interdependent commands before it is usable at all,
| [Your first release](your-first-release.md) | The pull request flow, version labels, and what happens on merge. |
| [Module bootstrap](module-bootstrap.md) | Getting a brand-new module to its first release with an integration branch. |

For framework-level practices, refer to [MSX Ways of Working](https://msxorg.github.io/docs/Ways-of-Working/).
For framework-level practices, refer to [MSX Ways of Working](https://msx.no/docs/Ways-of-Working/).
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ A brand-new module usually has a small **load-bearing core**: the piece(s) every

## Identify the load-bearing core first

What counts as "load-bearing" follows the module's archetype from [Module types](../../Module-Types.md):
What counts as "load-bearing" follows the module's archetype from [Module types](../reference/module-types.md):

- **Data modules** — the conversion pivot: `ConvertFrom-<Format>` / `ConvertTo-<Format>` (and whatever parser/serializer they wrap). Every other function (`Import-`, `Export-`, `Format-`, `Merge-`, ...) is built on top of this pivot and is meaningless without it.
- **Integration (API) modules** — a [`Context`](https://github.com/PSModule/Context)-backed credential/config store, the client setup that uses it, and at least one API function that consumes the context end-to-end. Every other API function needs the same context and client to do anything.
Expand All @@ -19,13 +19,13 @@ Scope the integration branch to exactly that core, not to everything planned for
## Pattern

1. Cut one long-lived branch from the default branch for the initial release, named for the outcome, e.g. `build-thing-module`.
2. Open one pull request per function (or small group of related functions) targeting that branch instead of `main`. These PRs can land in parallel — there is no strict order between them, unlike a [stacked pull request](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/#stacked-pull-requests).
2. Open one pull request per function (or small group of related functions) targeting that branch instead of `main`. These PRs can land in parallel — there is no strict order between them, unlike a [stacked pull request](https://msx.no/docs/Ways-of-Working/Branching-and-Merging/#stacked-pull-requests).
3. Once the load-bearing core is coherent and complete, open the pull request that merges the integration branch into `main`. This becomes the module's first real release (`v1.0.0`).
4. Smaller follow-up features (one more function, a formatter, an alias) can keep targeting the integration branch before it lands, the same way they targeted it during bootstrap.

## After the core lands

Once the core has merged as `v1.0.0`, ordinary [SemVer](../../Versioning.md) applies: a new function built on the stable core is a **minor** bump, a fix is a **patch** bump, and only a change to the core's own contract (signature, exported class shape, behavior) is a **major** bump. No special versioning exception is needed once the core is in place — the bootstrap phase exists only to get that core to a first release quickly.
Once the core has merged as `v1.0.0`, ordinary [SemVer](../reference/versioning.md) applies: a new function built on the stable core is a **minor** bump, a fix is a **patch** bump, and only a change to the core's own contract (signature, exported class shape, behavior) is a **major** bump. No special versioning exception is needed once the core is in place — the bootstrap phase exists only to get that core to a first release quickly.

```mermaid
gitGraph
Expand Down Expand Up @@ -60,6 +60,6 @@ A module bootstrapped this way:
## When to use this

- The module has no usable release yet, and the load-bearing core hasn't landed.
- Use this only for the initial bootstrap. Once `main` has a first release, ongoing feature work targets `main` directly with ordinary topic branches, or a [stacked pull request](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/#stacked-pull-requests) when changes genuinely depend on each other.
- Use this only for the initial bootstrap. Once `main` has a first release, ongoing feature work targets `main` directly with ordinary topic branches, or a [stacked pull request](https://msx.no/docs/Ways-of-Working/Branching-and-Merging/#stacked-pull-requests) when changes genuinely depend on each other.

For the general branching and merge model, see [MSX Branching and Merging](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/).
For the general branching and merge model, see [MSX Branching and Merging](https://msx.no/docs/Ways-of-Working/Branching-and-Merging/).
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ function Format-ComplexData {

Replace `<ModuleName>` with the module's published name. If the public function belongs to a group, insert `<Group>/` between `Functions/` and `Get-ComplexData`.

The skip exempts only `FunctionCount`. Every function in the file must still follow the [PowerShell function standard](https://msxorg.github.io/docs/Coding-Standards/PowerShell/Functions/), including complete comment-based help, matching `[OutputType()]` and `.OUTPUTS` metadata, typed parameters, and implicit output.
The skip exempts only `FunctionCount`. Every function in the file must still follow the [PowerShell function standard](https://msx.no/docs/Coding-Standards/PowerShell/Functions/), including complete comment-based help, matching `[OutputType()]` and `.OUTPUTS` metadata, typed parameters, and implicit output.

## Best Practices

Expand Down
Loading
Loading