diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 858eab7b..b9a9fc6d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -12,7 +12,7 @@ When executing terminal commands (using `run_in_terminal` or similar tools): ## Other instructions -| Tech | Instruction file | -|------|------------------| +| Tech | Instruction file | +|------------|-------------------------------------------------------------| | PowerShell | [pwsh.instructions.md](./instructions/pwsh.instructions.md) | -| Markdown | [md.instructions.md](./instructions/md.instructions.md) | +| Markdown | [md.instructions.md](./instructions/md.instructions.md) | diff --git a/.github/linters/.markdown-lint.yml b/.github/linters/.markdown-lint.yml index b9ecdfa9..bb432af1 100644 --- a/.github/linters/.markdown-lint.yml +++ b/.github/linters/.markdown-lint.yml @@ -18,6 +18,8 @@ MD026: MD029: false # Ordered list item prefix MD033: false # Allow inline HTML MD036: false # Emphasis used instead of a heading +MD060: + style: "leading" # Table column style (leading avoids emoji width issues) ################# # Rules by tags # diff --git a/.github/prompts/constitution.prompt.md b/.github/prompts/constitution.prompt.md index 4a78dfe6..454a3a03 100644 --- a/.github/prompts/constitution.prompt.md +++ b/.github/prompts/constitution.prompt.md @@ -29,9 +29,9 @@ Two operating modes: Replacement Analysis Table (when overlap detected): -| Existing Item | Proposed New / Change | Overlap Basis | Suggested Action | -|---------------|-----------------------|---------------|------------------| -| | <incoming title / change> | e.g. semantic similarity, scope duplication | Replace / Merge / Keep Both | +| Existing Item | Proposed New / Change | Overlap Basis | Suggested Action | +|---------------------|---------------------------|----------------------------------------------|----------------------------| +| <title / section> | <incoming title / change> | e.g. semantic similarity, scope duplication | Replace / Merge / Keep Both | Heuristics for overlap: - Title similarity score (case-insensitive) >= 0.6 (rough string similarity) OR diff --git a/.github/prompts/plan.prompt.md b/.github/prompts/plan.prompt.md index 5fda97f5..26959b24 100644 --- a/.github/prompts/plan.prompt.md +++ b/.github/prompts/plan.prompt.md @@ -102,14 +102,14 @@ Given the implementation details provided as an argument, do this: - **Use the same title for the PR**: The PR title must match the issue title exactly - If unable to retrieve the issue title, determine the PR type and icon based on the changes: - | Type of change | Icon | Label | - |-|-|-| - | Docs | πŸ“– | Docs | - | Fix | πŸͺ² | Fix, Patch | - | Security fix | ⚠️ | Fix | - | Patch | 🩹 | Patch | - | Feature | πŸš€ | Minor | - | Breaking change | 🌟 | Major | + | Type of change | Icon | Label | + | --------------- | ---- | ---------- | + | Docs | πŸ“– | Docs | + | Fix | πŸͺ² | Fix, Patch | + | Security fix | ⚠️ | Fix | + | Patch | 🩹 | Patch | + | Feature | πŸš€ | Minor | + | Breaking change | 🌟 | Major | - Fallback PR title format (if issue title unavailable): `<Icon> [Type of change]: <Short description>` - Create PR description: diff --git a/.github/prompts/pr.prompt.md b/.github/prompts/pr.prompt.md index 8baabc88..75661c9a 100644 --- a/.github/prompts/pr.prompt.md +++ b/.github/prompts/pr.prompt.md @@ -14,13 +14,13 @@ $ARGUMENTS ## Supported Change Types -| Type | Icon | Labels | Description | -|------|------|--------|-------------| -| Major | 🌟 | `Major` | Breaking changes that affect compatibility | -| Minor | πŸš€ | `Minor` | New features or enhancements | -| Patch | 🩹 | `Patch` | Small fixes or improvements | -| Fix | πŸͺ² | `Fix`, `Patch` | Bugfixes | -| Docs | πŸ“– | `Docs` | Documentation changes only | +| Type | Icon | Labels | Description | +| ----- | ---- | -------------- | ------------------------------------------ | +| Major | 🌟 | `Major` | Breaking changes that affect compatibility | +| Minor | πŸš€ | `Minor` | New features or enhancements | +| Patch | 🩹 | `Patch` | Small fixes or improvements | +| Fix | πŸͺ² | `Fix`, `Patch` | Bugfixes | +| Docs | πŸ“– | `Docs` | Documentation changes only | ## Execution Steps diff --git a/.github/workflows/Auto-Release.yml b/.github/workflows/Auto-Release.yml index 50a5a410..60a51ed9 100644 --- a/.github/workflows/Auto-Release.yml +++ b/.github/workflows/Auto-Release.yml @@ -26,9 +26,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Auto-Release - uses: PSModule/Auto-Release@v1 + uses: PSModule/Auto-Release@eabd533035e2cb9822160f26f2eda584bd012356 # v1.9.5 with: IncrementalPrerelease: false diff --git a/.github/workflows/Build-Docs.yml b/.github/workflows/Build-Docs.yml index a8d9ceb8..08e28cd4 100644 --- a/.github/workflows/Build-Docs.yml +++ b/.github/workflows/Build-Docs.yml @@ -48,25 +48,25 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Download module artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: module path: ${{ inputs.WorkingDirectory }}/outputs/module - name: Document module - uses: PSModule/Document-PSModule@v1 + uses: PSModule/Document-PSModule@15dc407c99e408fc0a4023d4f16aee2a5507ba74 # v1.0.12 with: Name: ${{ inputs.Name }} WorkingDirectory: ${{ inputs.WorkingDirectory }} - name: Upload docs artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: docs path: ${{ inputs.WorkingDirectory }}/outputs/docs @@ -74,7 +74,7 @@ jobs: retention-days: 1 - name: Commit all changes - uses: PSModule/GitHub-Script@v1 + uses: PSModule/GitHub-Script@00547bff5a143fbfc23a912a783fbfe9c470815c # v1.7.4 with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -102,7 +102,7 @@ jobs: - name: Lint documentation id: super-linter - uses: super-linter/super-linter/slim@7bba2eeb89d01dc9bfd93c497477a57e72c83240 # v8.2.0 + uses: super-linter/super-linter/slim@502f4fe48a81a392756e173e39a861f8c8efe056 # v8.3.0 env: RUN_LOCAL: true DEFAULT_BRANCH: main diff --git a/.github/workflows/Build-Module.yml b/.github/workflows/Build-Module.yml index 328c4d56..71049df6 100644 --- a/.github/workflows/Build-Module.yml +++ b/.github/workflows/Build-Module.yml @@ -29,13 +29,13 @@ jobs: GH_TOKEN: ${{ github.token }} steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Build module - uses: PSModule/Build-PSModule@v4 + uses: PSModule/Build-PSModule@fe8cc14a7192066cc46cb9514659772ebde05849 # v4.0.9 with: Name: ${{ inputs.Name }} ArtifactName: ${{ inputs.ArtifactName }} diff --git a/.github/workflows/Build-Site.yml b/.github/workflows/Build-Site.yml index b13face7..53ec0e8a 100644 --- a/.github/workflows/Build-Site.yml +++ b/.github/workflows/Build-Site.yml @@ -42,16 +42,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Install-PSModuleHelpers - uses: PSModule/Install-PSModuleHelpers@v1 + uses: PSModule/Install-PSModuleHelpers@d60d63e4be477d1ca0c67c6085101fb109bce8f1 # v1.0.6 - name: Download docs artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: docs path: ${{ inputs.WorkingDirectory }}/outputs/docs @@ -65,7 +65,7 @@ jobs: pip install mkdocs-git-committers-plugin-2 - name: Structure site - uses: PSModule/GitHub-Script@v1 + uses: PSModule/GitHub-Script@00547bff5a143fbfc23a912a783fbfe9c470815c # v1.7.4 with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -173,7 +173,7 @@ jobs: mkdocs build --config-file mkdocs.yml --site-dir ../../_site } - - uses: actions/upload-pages-artifact@v4 + - uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 with: name: github-pages path: ${{ inputs.WorkingDirectory }}/_site diff --git a/.github/workflows/Get-CodeCoverage.yml b/.github/workflows/Get-CodeCoverage.yml index e82496c6..26c7f2c6 100644 --- a/.github/workflows/Get-CodeCoverage.yml +++ b/.github/workflows/Get-CodeCoverage.yml @@ -48,7 +48,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Get-CodeCoverage - uses: PSModule/Get-PesterCodeCoverage@v1 + uses: PSModule/Get-PesterCodeCoverage@a7923eefbf55b452f9b1534c5b50ca9bd192f810 # v1.0.3 id: Get-CodeCoverage with: CodeCoveragePercentTarget: ${{ inputs.CodeCoveragePercentTarget }} diff --git a/.github/workflows/Get-Settings.yml b/.github/workflows/Get-Settings.yml index 62a6e5b5..d4cf4e85 100644 --- a/.github/workflows/Get-Settings.yml +++ b/.github/workflows/Get-Settings.yml @@ -65,13 +65,13 @@ jobs: ModuleTestSuites: ${{ fromJson(steps.Get-Settings.outputs.result).ModuleTestSuites }} steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Get-Settings - uses: PSModule/GitHub-Script@v1 + uses: PSModule/GitHub-Script@00547bff5a143fbfc23a912a783fbfe9c470815c # v1.7.4 id: Get-Settings env: PSMODULE_GET_SETTINGS_INPUT_Name: ${{ inputs.Name }} diff --git a/.github/workflows/Get-TestResults.yml b/.github/workflows/Get-TestResults.yml index aa6148ad..52fc82b5 100644 --- a/.github/workflows/Get-TestResults.yml +++ b/.github/workflows/Get-TestResults.yml @@ -50,7 +50,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Get-TestResults - uses: PSModule/Get-PesterTestResults@v1 + uses: PSModule/Get-PesterTestResults@0c1d8cde9575b192831f76e87d3f7e825a7d8ff4 # v1.0.7 id: Get-TestResults with: SourceCodeTestSuites: ${{ inputs.SourceCodeTestSuites }} diff --git a/.github/workflows/Lint-SourceCode.yml b/.github/workflows/Lint-SourceCode.yml index 21ef6db1..7753995b 100644 --- a/.github/workflows/Lint-SourceCode.yml +++ b/.github/workflows/Lint-SourceCode.yml @@ -50,20 +50,18 @@ jobs: runs-on: ${{ inputs.RunsOn }} steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false - fetch-depth: 0 - name: Lint-SourceCode - uses: PSModule/Invoke-ScriptAnalyzer@v3 + uses: PSModule/Invoke-ScriptAnalyzer@0b13023a981f4c94136bba6193a9abd2d936cbc1 # v4.1.1 with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} Verbose: ${{ inputs.Verbose }} Version: ${{ inputs.Version }} Path: src - Settings: SourceCode WorkingDirectory: ${{ inputs.WorkingDirectory }} TestResult_Enabled: true TestResult_TestSuiteName: PSModuleLint-SourceCode-${{ runner.os }} diff --git a/.github/workflows/Linter.yml b/.github/workflows/Linter.yml index 22d68469..8d3dbfb9 100644 --- a/.github/workflows/Linter.yml +++ b/.github/workflows/Linter.yml @@ -19,13 +19,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Lint code base - uses: super-linter/super-linter@7bba2eeb89d01dc9bfd93c497477a57e72c83240 # v8.2.0 + uses: super-linter/super-linter@502f4fe48a81a392756e173e39a861f8c8efe056 # v8.3.0 env: GITHUB_TOKEN: ${{ github.token }} VALIDATE_BIOME_FORMAT: false diff --git a/.github/workflows/Test-Module.yml b/.github/workflows/Test-Module.yml index 01b9fa24..77644516 100644 --- a/.github/workflows/Test-Module.yml +++ b/.github/workflows/Test-Module.yml @@ -81,19 +81,18 @@ jobs: runs-on: ${{ inputs.RunsOn }} steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false - fetch-depth: 0 - name: Download module artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: module path: ${{ inputs.WorkingDirectory }}/outputs/module - name: Test-Module - uses: PSModule/Test-PSModule@v3 + uses: PSModule/Test-PSModule@7d94ed751a60973867e84ea8d44521e94b7c485d # v3.0.7 with: Name: ${{ inputs.Name }} Debug: ${{ inputs.Debug }} @@ -107,14 +106,19 @@ jobs: name: Lint-Module (${{ inputs.RunsOn }}) runs-on: ${{ inputs.RunsOn }} steps: + - name: Checkout repository + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + with: + persist-credentials: false + - name: Download module artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: module path: ${{ inputs.WorkingDirectory }}/outputs/module - name: Lint-Module - uses: PSModule/Invoke-ScriptAnalyzer@v3 + uses: PSModule/Invoke-ScriptAnalyzer@0b13023a981f4c94136bba6193a9abd2d936cbc1 # v4.1.1 with: Path: outputs/module Debug: ${{ inputs.Debug }} @@ -122,6 +126,5 @@ jobs: Verbose: ${{ inputs.Verbose }} Version: ${{ inputs.Version }} WorkingDirectory: ${{ inputs.WorkingDirectory }} - Settings: Module TestResult_Enabled: true TestResult_TestSuiteName: PSModuleLint-Module-${{ runner.os }} diff --git a/.github/workflows/Test-ModuleLocal.yml b/.github/workflows/Test-ModuleLocal.yml index 68f4e3f2..fa4dde48 100644 --- a/.github/workflows/Test-ModuleLocal.yml +++ b/.github/workflows/Test-ModuleLocal.yml @@ -92,19 +92,19 @@ jobs: runs-on: ${{ inputs.RunsOn }} steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Download module artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: module path: ${{ inputs.WorkingDirectory }}/outputs/module - name: Install-PSModuleHelpers - uses: PSModule/Install-PSModuleHelpers@v1 + uses: PSModule/Install-PSModuleHelpers@d60d63e4be477d1ca0c67c6085101fb109bce8f1 # v1.0.6 - name: Import-Module id: import-module @@ -118,7 +118,7 @@ jobs: "path=$path" >> $env:GITHUB_OUTPUT - name: Test-ModuleLocal - uses: PSModule/Invoke-Pester@v4 + uses: PSModule/Invoke-Pester@882994cbe1ff07c3fc8afdac52404c940f99b331 # v4.2.2 with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} diff --git a/.github/workflows/Test-SourceCode.yml b/.github/workflows/Test-SourceCode.yml index 3d36e736..b9001ad9 100644 --- a/.github/workflows/Test-SourceCode.yml +++ b/.github/workflows/Test-SourceCode.yml @@ -50,13 +50,13 @@ jobs: runs-on: ${{ inputs.RunsOn }} steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Test-SourceCode - uses: PSModule/Test-PSModule@v3 + uses: PSModule/Test-PSModule@7d94ed751a60973867e84ea8d44521e94b7c485d # v3.0.7 with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} diff --git a/.github/workflows/Workflow-Test-WithManifest.yml b/.github/workflows/Workflow-Test-WithManifest.yml index 8caaabc1..85409571 100644 --- a/.github/workflows/Workflow-Test-WithManifest.yml +++ b/.github/workflows/Workflow-Test-WithManifest.yml @@ -25,5 +25,4 @@ jobs: secrets: inherit with: WorkingDirectory: tests/srcWithManifestTestRepo - Name: PSModuleTest2 SettingsPath: .github/PSModule.yml diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 85d441e8..f5c0ece6 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -104,7 +104,7 @@ jobs: - Get-Settings steps: - name: Checkout repo - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 @@ -133,7 +133,7 @@ jobs: - name: Lint code base id: super-linter - uses: super-linter/super-linter@7bba2eeb89d01dc9bfd93c497477a57e72c83240 # v8.2.0 + uses: super-linter/super-linter@502f4fe48a81a392756e173e39a861f8c8efe056 # v8.3.0 env: GITHUB_TOKEN: ${{ github.token }} DEFAULT_WORKSPACE: ${{ inputs.WorkingDirectory }} @@ -295,13 +295,13 @@ jobs: - Get-Settings steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Run BeforeAll Setup Scripts - uses: PSModule/GitHub-Script@v1 + uses: PSModule/GitHub-Script@00547bff5a143fbfc23a912a783fbfe9c470815c # v1.7.4 with: Name: BeforeAll-ModuleLocal ShowInfo: false @@ -372,14 +372,14 @@ jobs: - Test-ModuleLocal steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Run AfterAll Teardown Scripts if: always() - uses: PSModule/GitHub-Script@v1 + uses: PSModule/GitHub-Script@00547bff5a143fbfc23a912a783fbfe9c470815c # v1.7.4 with: Name: AfterAll-ModuleLocal ShowInfo: false @@ -473,11 +473,11 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - uses: actions/configure-pages@v5 + - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 # Runs on: # - βœ… Open/Updated PR - Publishes prerelease when all tests/coverage/build succeed @@ -499,13 +499,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v5 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false fetch-depth: 0 - name: Download module artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: module path: ${{ inputs.WorkingDirectory }}/outputs/module @@ -516,7 +516,7 @@ jobs: Install-PSResource -Name Microsoft.PowerShell.PSResourceGet -Repository PSGallery -TrustRepository - name: Publish module - uses: PSModule/Publish-PSModule@v2 + uses: PSModule/Publish-PSModule@6c25d139fe51b890f75c057897bd58ac344b192a # v2.0.8 env: GH_TOKEN: ${{ github.token }} with: diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index 4bc59ab8..5b52fc91 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -495,21 +495,21 @@ The Process-PSModule workflow uses **dynamic conditions** to determine job execu ### Publishing Behavior Examples -| PR State | Labels | Build/Test | Publish-Module | Publish-Site | Version | -|----------|--------|------------|----------------|--------------|---------| -| Opened | `minor` | βœ… Yes | ❌ No | ❌ No | N/A (not published) | -| Opened | `prerelease` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname001` | -| Opened | `prerelease`, `minor` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname001` | -| Synchronized | `major` | βœ… Yes | ❌ No | ❌ No | N/A (not published) | -| Synchronized | `prerelease` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname002` | -| Merged | `minor` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.3.0` | -| Merged | `major` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `2.0.0` | -| Merged | `patch` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.2.4` | -| Merged | (no label) | βœ… Yes | βœ… Yes (if AutoPatching) | βœ… Yes | `1.2.4` (patch) | -| Merged | `NoRelease` | βœ… Yes | ❌ No | ❌ No | N/A (skipped) | -| Merged | `prerelease`, `minor` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.3.0` (prerelease ignored) | -| Scheduled (cron) | N/A | βœ… Yes | ❌ No | ❌ No | N/A (validation only) | -| Manual (workflow_dispatch) | N/A | βœ… Yes | ❌ No | ❌ No | N/A (validation only) | +| PR State | Labels | Build/Test | Publish-Module | Publish-Site | Version | +| -------------------------- | --------------------- | ---------- | ------------------------ | ------------ | ---------------------------- | +| Opened | `minor` | βœ… Yes | ❌ No | ❌ No | N/A (not published) | +| Opened | `prerelease` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname001` | +| Opened | `prerelease`, `minor` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname001` | +| Synchronized | `major` | βœ… Yes | ❌ No | ❌ No | N/A (not published) | +| Synchronized | `prerelease` | βœ… Yes | βœ… Yes (prerelease) | ❌ No | `1.3.0-branchname002` | +| Merged | `minor` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.3.0` | +| Merged | `major` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `2.0.0` | +| Merged | `patch` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.2.4` | +| Merged | (no label) | βœ… Yes | βœ… Yes (if AutoPatching) | βœ… Yes | `1.2.4` (patch) | +| Merged | `NoRelease` | βœ… Yes | ❌ No | ❌ No | N/A (skipped) | +| Merged | `prerelease`, `minor` | βœ… Yes | βœ… Yes (normal) | βœ… Yes | `1.3.0` (prerelease ignored) | +| Scheduled (cron) | N/A | βœ… Yes | ❌ No | ❌ No | N/A (validation only) | +| Manual (workflow_dispatch) | N/A | βœ… Yes | ❌ No | ❌ No | N/A (validation only) | ### Version Calculation Process diff --git a/.specify/scripts/powershell/check-prerequisites.ps1 b/.specify/scripts/powershell/check-prerequisites.ps1 index 44a0e16a..9ac7a434 100644 --- a/.specify/scripts/powershell/check-prerequisites.ps1 +++ b/.specify/scripts/powershell/check-prerequisites.ps1 @@ -1,4 +1,4 @@ -#!/usr/bin/env pwsh +ο»Ώ#!/usr/bin/env pwsh # Consolidated prerequisite checking script (PowerShell) # diff --git a/.specify/scripts/powershell/common.ps1 b/.specify/scripts/powershell/common.ps1 index ca4cdbed..029bd9a7 100644 --- a/.specify/scripts/powershell/common.ps1 +++ b/.specify/scripts/powershell/common.ps1 @@ -1,4 +1,4 @@ -#!/usr/bin/env pwsh +ο»Ώ#!/usr/bin/env pwsh # Common PowerShell functions analogous to common.sh function Get-RepoRoot { diff --git a/.specify/scripts/powershell/create-new-feature.ps1 b/.specify/scripts/powershell/create-new-feature.ps1 index 7ab08058..c05032e3 100644 --- a/.specify/scripts/powershell/create-new-feature.ps1 +++ b/.specify/scripts/powershell/create-new-feature.ps1 @@ -1,4 +1,4 @@ -#!/usr/bin/env pwsh +ο»Ώ#!/usr/bin/env pwsh # Create a new feature [CmdletBinding()] param( diff --git a/.specify/scripts/powershell/setup-plan.ps1 b/.specify/scripts/powershell/setup-plan.ps1 index c1020b67..5f2859b1 100644 --- a/.specify/scripts/powershell/setup-plan.ps1 +++ b/.specify/scripts/powershell/setup-plan.ps1 @@ -1,4 +1,4 @@ -#!/usr/bin/env pwsh +ο»Ώ#!/usr/bin/env pwsh # Setup implementation plan for a feature [CmdletBinding()] diff --git a/.specify/scripts/powershell/update-agent-context.ps1 b/.specify/scripts/powershell/update-agent-context.ps1 index d1d2a5c8..73a662c4 100644 --- a/.specify/scripts/powershell/update-agent-context.ps1 +++ b/.specify/scripts/powershell/update-agent-context.ps1 @@ -1,4 +1,4 @@ -#!/usr/bin/env pwsh +ο»Ώ#!/usr/bin/env pwsh <#! .SYNOPSIS Update agent context files with information from plan.md (PowerShell version) diff --git a/.specify/templates/plan-template.md b/.specify/templates/plan-template.md index 53ee1010..c1a663b8 100644 --- a/.specify/templates/plan-template.md +++ b/.specify/templates/plan-template.md @@ -35,17 +35,17 @@ ## Technical Context -| Aspect | Details | -|--------|---------| -| **Language/Version** | [e.g., Python 3.11, Swift 5.9, Rust 1.75 or NEEDS CLARIFICATION] | -| **Primary Dependencies** | [e.g., FastAPI, UIKit, LLVM or NEEDS CLARIFICATION] | -| **Storage** | [if applicable, e.g., PostgreSQL, CoreData, files or N/A] | -| **Testing** | [e.g., pytest, XCTest, cargo test or NEEDS CLARIFICATION] | -| **Target Platform** | [e.g., Linux server, iOS 15+, Wasm or NEEDS CLARIFICATION] | -| **Project Type** | [single/web/mobile - determines source structure] | -| **Performance Goals** | [domain-specific, e.g., 1000 req/s, 10k lines/sec, 60 fps or NEEDS CLARIFICATION] | -| **Constraints** | [domain-specific, e.g., <200ms p95, <100MB memory, offline-capable or NEEDS CLARIFICATION] | -| **Scale/Scope** | [domain-specific, e.g., 10k users, 1M LOC, 50 screens or NEEDS CLARIFICATION] | +| Aspect | Details | +| ------------------------ | ------------------------------------------------------------------------------------------ | +| **Language/Version** | [e.g., Python 3.11, Swift 5.9, Rust 1.75 or NEEDS CLARIFICATION] | +| **Primary Dependencies** | [e.g., FastAPI, UIKit, LLVM or NEEDS CLARIFICATION] | +| **Storage** | [if applicable, e.g., PostgreSQL, CoreData, files or N/A] | +| **Testing** | [e.g., pytest, XCTest, cargo test or NEEDS CLARIFICATION] | +| **Target Platform** | [e.g., Linux server, iOS 15+, Wasm or NEEDS CLARIFICATION] | +| **Project Type** | [single/web/mobile - determines source structure] | +| **Performance Goals** | [domain-specific, e.g., 1000 req/s, 10k lines/sec, 60 fps or NEEDS CLARIFICATION] | +| **Constraints** | [domain-specific, e.g., <200ms p95, <100MB memory, offline-capable or NEEDS CLARIFICATION] | +| **Scale/Scope** | [domain-specific, e.g., 10k users, 1M LOC, 50 screens or NEEDS CLARIFICATION] | ## Constitution Check @@ -243,10 +243,10 @@ directories captured above] *Fill ONLY if Constitution Check has violations that must be justified* -| Violation | Why Needed | Simpler Alternative Rejected Because | -|-----------|------------|-------------------------------------| -| [e.g., 4th project] | [current need] | [why 3 projects insufficient] | -| [e.g., Repository pattern] | [specific problem] | [why direct DB access insufficient] | +| Violation | Why Needed | Simpler Alternative Rejected Because | +| -------------------------- | ------------------ | ------------------------------------ | +| [e.g., 4th project] | [current need] | [why 3 projects insufficient] | +| [e.g., Repository pattern] | [specific problem] | [why direct DB access insufficient] | ## Progress Tracking diff --git a/.specify/templates/spec-template.md b/.specify/templates/spec-template.md index 9e2de0cb..600e8d0b 100644 --- a/.specify/templates/spec-template.md +++ b/.specify/templates/spec-template.md @@ -20,53 +20,53 @@ ### Functional Requirements -| ID | Requirement | -|----|-------------| -| **FR-001** | System MUST [specific capability, e.g., "allow users to create accounts"] | -| **FR-002** | System MUST [specific capability, e.g., "validate email addresses"] | -| **FR-003** | Users MUST be able to [key interaction, e.g., "reset their password"] | -| **FR-004** | System MUST [data requirement, e.g., "persist user preferences"] | -| **FR-005** | System MUST [behavior, e.g., "log all security events"] | +| ID | Requirement | +| ---------- | ----------------------------------------------------------------------------------------------------------------- | +| **FR-001** | System MUST [specific capability, e.g., "allow users to create accounts"] | +| **FR-002** | System MUST [specific capability, e.g., "validate email addresses"] | +| **FR-003** | Users MUST be able to [key interaction, e.g., "reset their password"] | +| **FR-004** | System MUST [data requirement, e.g., "persist user preferences"] | +| **FR-005** | System MUST [behavior, e.g., "log all security events"] | | **FR-006** | System MUST authenticate users via [NEEDS CLARIFICATION: auth method not specified - email/password, SSO, OAuth?] | -| **FR-007** | System MUST retain user data for [NEEDS CLARIFICATION: retention period not specified] | +| **FR-007** | System MUST retain user data for [NEEDS CLARIFICATION: retention period not specified] | ### Non-Functional Requirements -| ID | Requirement | -|----|-------------| -| **NFR-001** | System MUST respond within [specific time, e.g., "500ms for 95th percentile"] | -| **NFR-002** | System MUST handle [specific load, e.g., "1000 concurrent users"] | -| **NFR-003** | System MUST maintain [availability target, e.g., "99.9% uptime"] | -| **NFR-004** | System MUST scale to [capacity limit, e.g., "10,000 transactions per second"] | -| **NFR-005** | System MUST recover within [time period, e.g., "5 minutes after failure"] | +| ID | Requirement | +| ----------- | ------------------------------------------------------------------------------------------------------------ | +| **NFR-001** | System MUST respond within [specific time, e.g., "500ms for 95th percentile"] | +| **NFR-002** | System MUST handle [specific load, e.g., "1000 concurrent users"] | +| **NFR-003** | System MUST maintain [availability target, e.g., "99.9% uptime"] | +| **NFR-004** | System MUST scale to [capacity limit, e.g., "10,000 transactions per second"] | +| **NFR-005** | System MUST recover within [time period, e.g., "5 minutes after failure"] | | **NFR-006** | System MUST encrypt data [NEEDS CLARIFICATION: encryption scope not specified - at rest, in transit, both?] | -| **NFR-007** | System MUST maintain audit logs for [NEEDS CLARIFICATION: retention period not specified] | +| **NFR-007** | System MUST maintain audit logs for [NEEDS CLARIFICATION: retention period not specified] | ### Quality Attributes Addressed -| Attribute | Target Metric | -|-----------|---------------| -| **Performance** | [e.g., "Response time < 200ms", "Throughput > 5000 TPS"] | -| **Scalability** | [e.g., "Support 100,000 concurrent users", "Linear scaling to 10 nodes"] | -| **Availability** | [e.g., "99.95% uptime", "Max 4 hours downtime per year"] | -| **Reliability** | [e.g., "MTBF > 720 hours", "Error rate < 0.01%"] | -| **Security** | [e.g., "OWASP Top 10 compliant", "SOC 2 Type II certified"] | -| **Maintainability** | [e.g., "Code coverage > 80%", "Cyclomatic complexity < 10"] | -| **Usability** | [e.g., "Task completion time < 2 minutes", "User satisfaction > 4.5/5"] | +| Attribute | Target Metric | +| ------------------- | ------------------------------------------------------------------------- | +| **Performance** | [e.g., "Response time < 200ms", "Throughput > 5000 TPS"] | +| **Scalability** | [e.g., "Support 100,000 concurrent users", "Linear scaling to 10 nodes"] | +| **Availability** | [e.g., "99.95% uptime", "Max 4 hours downtime per year"] | +| **Reliability** | [e.g., "MTBF > 720 hours", "Error rate < 0.01%"] | +| **Security** | [e.g., "OWASP Top 10 compliant", "SOC 2 Type II certified"] | +| **Maintainability** | [e.g., "Code coverage > 80%", "Cyclomatic complexity < 10"] | +| **Usability** | [e.g., "Task completion time < 2 minutes", "User satisfaction > 4.5/5"] | ### Constraints *(include if applicable)* -| Constraint | Description | -|------------|-------------| +| Constraint | Description | +| ------------------ | --------------------------------------------------------------------- | | **[Constraint 1]** | [Limitation or restriction, e.g., "Must run on Windows Server 2019+"] | -| **[Constraint 2]** | [Compliance requirement, e.g., "Must comply with GDPR"] | +| **[Constraint 2]** | [Compliance requirement, e.g., "Must comply with GDPR"] | ### Key Entities *(include if feature involves data)* -| Entity | Description | -|--------|-------------| +| Entity | Description | +| -------------- | ----------------------------------------------------------- | | **[Entity 1]** | [What it represents, key attributes without implementation] | -| **[Entity 2]** | [What it represents, relationships to other entities] | +| **[Entity 2]** | [What it represents, relationships to other entities] | --- diff --git a/README.md b/README.md index 899725ed..c3538716 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,9 @@ To use the workflow, create a new file in the `.github/workflows` directory of t name: Process-PSModule on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' pull_request: branches: - main @@ -96,10 +99,13 @@ concurrency: permissions: contents: write pull-requests: write + statuses: write + pages: write + id-token: write jobs: Process-PSModule: - uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v2 + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5 secrets: APIKEY: ${{ secrets.APIKEY }} @@ -194,23 +200,23 @@ For more info see [Deploy GitHub Pages site](https://github.com/marketplace/acti This table shows when each job runs based on the trigger scenario: -| Job | Open/Updated PR | Merged PR | Abandoned PR | Manual Run | -|-----|-----------------|-----------|--------------|------------| -| **Get-Settings** | βœ… Always | βœ… Always | βœ… Always | βœ… Always | -| **Lint-Repository** | βœ… Yes | ❌ No | ❌ No | ❌ No | -| **Build-Module** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Build-Docs** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Build-Site** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Test-SourceCode** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Lint-SourceCode** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Test-Module** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **BeforeAll-ModuleLocal** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Test-ModuleLocal** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **AfterAll-ModuleLocal** | βœ… Yes | βœ… Yes | βœ… Yes* | βœ… Yes | -| **Get-TestResults** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Get-CodeCoverage** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | -| **Publish-Site** | ❌ No | βœ… Yes | ❌ No | ❌ No | -| **Publish-Module** | βœ… Yes** | βœ… Yes** | βœ… Yes*** | βœ… Yes** | +| Job | Open/Updated PR | Merged PR | Abandoned PR | Manual Run | +| ------------------------- | --------------- | ---------- | ------------ | ---------- | +| **Get-Settings** | βœ… Always | βœ… Always | βœ… Always | βœ… Always | +| **Lint-Repository** | βœ… Yes | ❌ No | ❌ No | ❌ No | +| **Build-Module** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Build-Docs** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Build-Site** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Test-SourceCode** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Lint-SourceCode** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Test-Module** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **BeforeAll-ModuleLocal** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Test-ModuleLocal** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **AfterAll-ModuleLocal** | βœ… Yes | βœ… Yes | βœ… Yes* | βœ… Yes | +| **Get-TestResults** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Get-CodeCoverage** | βœ… Yes | βœ… Yes | ❌ No | βœ… Yes | +| **Publish-Site** | ❌ No | βœ… Yes | ❌ No | ❌ No | +| **Publish-Module** | βœ… Yes** | βœ… Yes** | βœ… Yes*** | βœ… Yes** | \* Runs for cleanup if tests were started \*\* Only when all tests/coverage/build succeed @@ -255,7 +261,7 @@ The following settings are available in the settings file: | `Publish.Module.AutoCleanup` | `Boolean` | Automatically cleanup old prerelease module versions | `true` | | `Publish.Module.AutoPatching` | `Boolean` | Automatically patch module version | `true` | | `Publish.Module.IncrementalPrerelease` | `Boolean` | Use incremental prerelease versioning | `true` | -| `Publish.Module.DatePrereleaseFormat` | `String` | Format for date-based prerelease ([.NET DateTime](https://learn.microsoft.com/dotnet/standard/base-types/standard-date-and-time-format-strings)) | `''` | +| `Publish.Module.DatePrereleaseFormat` | `String` | Format for date-based prerelease ([.NET DateTime][netdt]) | `''` | | `Publish.Module.VersionPrefix` | `String` | Prefix for version tags | `'v'` | | `Publish.Module.MajorLabels` | `String` | Labels indicating a major version bump | `'major, breaking'` | | `Publish.Module.MinorLabels` | `String` | Labels indicating a minor version bump | `'minor, feature'` | @@ -447,3 +453,5 @@ The process is compatible with: - [GitHub Flow specifications](https://docs.github.com/en/get-started/using-github/github-flow) - [SemVer 2.0.0 specifications](https://semver.org) - [Continuous Delivery practices](https://en.wikipedia.org/wiki/Continuous_delivery) + +[netdt]: https://learn.microsoft.com/dotnet/standard/base-types/standard-date-and-time-format-strings diff --git a/tests/srcTestRepo/src/variables/public/Planets.ps1 b/tests/srcTestRepo/src/variables/public/Planets.ps1 index 736584b9..5927bc51 100644 --- a/tests/srcTestRepo/src/variables/public/Planets.ps1 +++ b/tests/srcTestRepo/src/variables/public/Planets.ps1 @@ -1,4 +1,4 @@ -$script:Planets = @( +ο»Ώ$script:Planets = @( @{ Name = 'Mercury' Mass = 0.330 diff --git a/tests/srcTestRepo/tests/AfterAll.ps1 b/tests/srcTestRepo/tests/AfterAll.ps1 index 4329d916..8933adae 100644 --- a/tests/srcTestRepo/tests/AfterAll.ps1 +++ b/tests/srcTestRepo/tests/AfterAll.ps1 @@ -1,4 +1,4 @@ -Write-Warning "=== AFTERALL TEARDOWN SCRIPT EXECUTING ===" +ο»ΏWrite-Warning "=== AFTERALL TEARDOWN SCRIPT EXECUTING ===" Write-Warning "Tearing down test environment..." # Example teardown tasks: diff --git a/tests/srcTestRepo/tests/BeforeAll.ps1 b/tests/srcTestRepo/tests/BeforeAll.ps1 index 2001ccab..f487de58 100644 --- a/tests/srcTestRepo/tests/BeforeAll.ps1 +++ b/tests/srcTestRepo/tests/BeforeAll.ps1 @@ -1,4 +1,4 @@ -Write-Warning "=== BEFOREALL SETUP SCRIPT EXECUTING ===" +ο»ΏWrite-Warning "=== BEFOREALL SETUP SCRIPT EXECUTING ===" Write-Warning "Setting up test environment..." # Example setup tasks: diff --git a/tests/srcWithManifestTestRepo/.github/linters/.powershell-psscriptanalyzer.psd1 b/tests/srcWithManifestTestRepo/.github/linters/.powershell-psscriptanalyzer.psd1 new file mode 100644 index 00000000..09cc3d0c --- /dev/null +++ b/tests/srcWithManifestTestRepo/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -0,0 +1,56 @@ +ο»Ώ@{ + Rules = @{ + PSAlignAssignmentStatement = @{ + Enable = $true + CheckHashtable = $true + } + PSAvoidLongLines = @{ + Enable = $true + MaximumLineLength = 150 + } + PSAvoidSemicolonsAsLineTerminators = @{ + Enable = $true + } + PSPlaceCloseBrace = @{ + Enable = $true + NewLineAfter = $false + IgnoreOneLineBlock = $true + NoEmptyLineBefore = $false + } + PSPlaceOpenBrace = @{ + Enable = $true + OnSameLine = $true + NewLineAfter = $true + IgnoreOneLineBlock = $true + } + PSProvideCommentHelp = @{ + Enable = $true + ExportedOnly = $false + BlockComment = $true + VSCodeSnippetCorrection = $false + Placement = 'begin' + } + PSUseConsistentIndentation = @{ + Enable = $true + IndentationSize = 4 + PipelineIndentation = 'IncreaseIndentationForFirstPipeline' + Kind = 'space' + } + PSUseConsistentWhitespace = @{ + Enable = $true + CheckInnerBrace = $true + CheckOpenBrace = $true + CheckOpenParen = $true + CheckOperator = $true + CheckPipe = $true + CheckPipeForRedundantWhitespace = $true + CheckSeparator = $true + CheckParameter = $true + IgnoreAssignmentOperatorInsideHashTable = $true + } + } + ExcludeRules = @( + 'PSMissingModuleManifestField', # This rule is not applicable until the module is built. + 'PSUseToExportFieldsInManifest' + ) +} diff --git a/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 index 736584b9..5927bc51 100644 --- a/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 +++ b/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 @@ -1,4 +1,4 @@ -$script:Planets = @( +ο»Ώ$script:Planets = @( @{ Name = 'Mercury' Mass = 0.330 diff --git a/tests/srcWithManifestTestRepo/tests/AfterAll.ps1 b/tests/srcWithManifestTestRepo/tests/AfterAll.ps1 index 3d81902f..f6728d6f 100644 --- a/tests/srcWithManifestTestRepo/tests/AfterAll.ps1 +++ b/tests/srcWithManifestTestRepo/tests/AfterAll.ps1 @@ -1,4 +1,4 @@ -Write-Warning "=== AFTERALL TEARDOWN SCRIPT (Environments) EXECUTING ===" +ο»ΏWrite-Warning "=== AFTERALL TEARDOWN SCRIPT (Environments) EXECUTING ===" Write-Warning "Tearing down test environment for Environments..." # Example teardown tasks for Environments directory: diff --git a/tests/srcWithManifestTestRepo/tests/BeforeAll.ps1 b/tests/srcWithManifestTestRepo/tests/BeforeAll.ps1 index f0362f39..0b6bbcdc 100644 --- a/tests/srcWithManifestTestRepo/tests/BeforeAll.ps1 +++ b/tests/srcWithManifestTestRepo/tests/BeforeAll.ps1 @@ -1,4 +1,4 @@ -Write-Warning "=== BEFOREALL SETUP SCRIPT EXECUTING ===" +ο»ΏWrite-Warning "=== BEFOREALL SETUP SCRIPT EXECUTING ===" Write-Warning "Setting up test environment..." # Example setup tasks for test environment: