diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f8672be..07b13896 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
### Fixed
+- Website layout and copy now keep expanding with the browser width instead of stopping at fixed max-width caps on wide windows; the shared site stylesheet no longer limits the outer page shell, guide intros, leads, section headings, or guide body text to narrow fixed widths.
+- The command cheat sheet now keeps the "Set up a project" section balanced by summarizing scaffold extras instead of repeating the full internal Agentic guidance list.
+- The getting-started guide now splits the Agentic quickstart explanation into shorter paragraphs so the scaffold flow stays readable on the site.
+- The core workflows guide now splits the scaffold and Agentic starter explanation into shorter paragraphs so the page stays readable on the site.
+- The command cheat sheet now stacks the three "Set up a project" cards vertically so the section reads top-to-bottom without a missing grid slot.
+- The Agentic Copilot starter shipped by `nova init` no longer tells generated projects to use a `run.ps1` quality wrapper that the template does not include.
+ - The scaffold now points generated documentation and agent guidance to the repository quality loop wording plus the existing analyzer and `Test-NovaBuild` entrypoints instead.
+- `nova init --example` now ships the packaged example with source-mirrored tests and `Pester.CodeCoverage.Enabled = true` by default.
+ - The example scaffold now runs `Test-NovaBuild` against `src/**/*.ps1` without requiring a prior build, and the bundled docs describe that source-first coverage flow.
+
### Security
## [3.0.0] - 2026-05-17
@@ -417,4 +427,3 @@ This release was yanked because it removed the implicit `Pester` dependency, bef
[0.0.6]: https://github.com/stiwicourage/NovaModuleTools/compare/Version_0.0.5...Version_0.0.6
[0.0.5]: https://github.com/stiwicourage/NovaModuleTools/compare/Version_0.0.4...Version_0.0.5
[0.0.4]: https://github.com/stiwicourage/NovaModuleTools/compare/Version_0.0.3...Version_0.0.4
-
diff --git a/RELEASE_NOTE.md b/RELEASE_NOTE.md
index 03f01298..c7617814 100644
--- a/RELEASE_NOTE.md
+++ b/RELEASE_NOTE.md
@@ -14,6 +14,9 @@ This file summarizes the release notes for NovaModuleTools. **UNRELEASED** chang
### Fixed
+- The Agentic Copilot starter shipped by `nova init` no longer tells generated projects to use a `run.ps1` quality wrapper that the template does not include.
+- `nova init --example` now ships the packaged example with source-mirrored tests and code coverage enabled by default, so `Test-NovaBuild` works before a build and measures `src/**/*.ps1`.
+
### Security
## [3.0.0] - 2026-05-17
@@ -188,4 +191,3 @@ This release was yanked because it removed the implicit `Pester` dependency befo
## [0.0.4] - 2024-06-25
### Added
- First PowerShell Gallery release of NovaModuleTools with the initial module workflow support.
-
diff --git a/docs/NovaModuleTools/en-US/Initialize-NovaModule.md b/docs/NovaModuleTools/en-US/Initialize-NovaModule.md
index cfd64b5f..ae42d956 100644
--- a/docs/NovaModuleTools/en-US/Initialize-NovaModule.md
+++ b/docs/NovaModuleTools/en-US/Initialize-NovaModule.md
@@ -27,7 +27,7 @@ PS> Initialize-NovaModule [-Path ] [-Example] [-WhatIf] [-Confirm] [*`; for NovaModuleTools the short name is `Nova`, but it could also have been
`NMT`. The Agentic package follows Nova's maintained agentic guidance through a filtered starter mirror, including Nova build/test/package expectations, `project.json`
@@ -40,7 +40,7 @@ Use this command when you want to start a new module in the NovaModuleTools stru
Use `-Path` when you want to create the project under a specific base directory. Positional path syntax is no longer supported.
-Use `-Example` when you want the scaffold to start from the packaged example project instead of the minimal default layout. The example flow keeps the example source, resource, and test files, skips the Pester enable/disable question, and applies the interactive metadata values to the copied `project.json`, including the same disabled-by-default `CodeCoverage` block that the standard scaffold uses. The standard and example flows share the same upfront Nova update warning, inline validation and retry behavior for interactive answers, and optional Agentic Copilot setup prompt after the Git question. When Git is enabled in either flow, Nova also ensures the generated project root has the default `.gitignore` entries for local and CI artifacts without overwriting any existing `.gitignore` content. When you answer
+Use `-Example` when you want the scaffold to start from the packaged example project instead of the minimal default layout. The example flow keeps the example source, resource, and source-mirrored test files, skips the Pester enable/disable question, and applies the interactive metadata values to the copied `project.json`, including an enabled-by-default `CodeCoverage` block that targets `src/**/*.ps1`. The packaged example can run `Test-NovaBuild` before `Invoke-NovaBuild`, and the same test flow writes JaCoCo coverage to `artifacts/coverage.xml`. The standard and example flows share the same upfront Nova update warning, inline validation and retry behavior for interactive answers, and optional Agentic Copilot setup prompt after the Git question. When Git is enabled in either flow, Nova also ensures the generated project root has the default `.gitignore` entries for local and CI artifacts without overwriting any existing `.gitignore` content. When you answer
`Yes`, Nova asks for the short project name, adds the same starter package to either scaffold style, and merges the example README instead of replacing it with the generic starter README outright.
This command supports `-WhatIf` and `-Confirm` through PowerShell `SupportsShouldProcess`. Use `-WhatIf` to preview the scaffold target after the interactive answers have been collected, without creating folders, writing `project.json`, or initializing Git.
@@ -142,7 +142,7 @@ This cmdlet does not emit an output object.
## NOTES
-Generated projects start with NovaModuleTools defaults for recursive discovery, source markers, duplicate-function validation, an opt-in Pester `CodeCoverage` block (`Enabled=false`, shared `src/` paths, JaCoCo output in `artifacts/coverage.xml`, and a `90` percent target), and—when Git is enabled—a default `.gitignore` for common local and CI artifact paths. The packaged example scaffold keeps its bundled example source and tests, while still updating prompt-driven metadata such as project name, description, version, author, and PowerShell host version. The optional Agentic Copilot starter package adds repository-local Copilot workflow files under the project root and `.github/` that tell agents to keep build/test/package workflows on Nova, treat `project.json` `Manifest.PowerShellHostVersion` as the PowerShell compatibility target, run ScriptAnalyzer before build/test through the repo-standard `Invoke-ScriptAnalyzerCI.ps1` /
+Generated projects start with NovaModuleTools defaults for recursive discovery, source markers, duplicate-function validation, and—when Git is enabled—a default `.gitignore` for common local and CI artifact paths. The standard scaffold keeps Pester `CodeCoverage` opt-in (`Enabled=false`, shared `src/` paths, JaCoCo output in `artifacts/coverage.xml`, and a `90` percent target). The packaged example scaffold keeps its bundled example source and source-mirrored tests, while also enabling that same `CodeCoverage` block by default so `Test-NovaBuild` measures `src/**/*.ps1` without requiring a prior build. Both scaffold styles still update prompt-driven metadata such as project name, description, version, author, and PowerShell host version. The optional Agentic Copilot starter package adds repository-local Copilot workflow files under the project root and `.github/` that tell agents to keep build/test/package workflows on Nova, treat `project.json` `Manifest.PowerShellHostVersion` as the PowerShell compatibility target, run ScriptAnalyzer before build/test through the repo-standard `Invoke-ScriptAnalyzerCI.ps1` /
`run.ps1` workflow, fix any ScriptAnalyzer findings before handoff, run project tests through `Test-NovaBuild` instead of direct `Invoke-Pester`, leave `.psm1` / `.psd1` files to generated
`dist` output, generate and validate command help with the Microsoft.PowerShell.PlatyPS cmdlets instead of hand-written Markdown structure, require a matching help file for every new public entry point in the same change, mirror new tests to source files, and add a text-file-formatting guardrail helper plus a Pester guardrail test when project tests are enabled.
diff --git a/docs/assets/site.css b/docs/assets/site.css
index b5f949ca..958fc032 100644
--- a/docs/assets/site.css
+++ b/docs/assets/site.css
@@ -11,7 +11,7 @@
--outline: rgba(255, 255, 255, 0.12);
--shadow: 0 20px 60px rgba(0, 0, 0, 0.28);
--radius: 22px;
- --max-width: 1600px;
+ --max-width: none;
--anchor-offset: 2.90rem;
}
@@ -254,7 +254,7 @@ pre code {
.guide-hero {
margin-bottom: 3rem;
- max-width: 880px;
+ max-width: none;
}
@@ -331,7 +331,7 @@ pre code {
.guide-content .content-section > p,
.guide-content .content-section > ul,
.guide-content .content-section > ol {
- max-width: 72ch;
+ max-width: none;
}
.guide-grid {
@@ -380,7 +380,7 @@ h3 {
h1 {
font-size: clamp(2.6rem, 5vw, 4.6rem);
- max-width: 12ch;
+ max-width: none;
}
h2 {
@@ -398,7 +398,7 @@ p {
.lead {
font-size: 1.1rem;
- max-width: 68ch;
+ max-width: none;
}
.hero__actions {
@@ -517,11 +517,11 @@ p {
}
.narrow {
- max-width: 760px;
+ max-width: none;
}
.section-heading {
- max-width: 760px;
+ max-width: none;
margin-bottom: 2.5rem;
}
@@ -772,6 +772,10 @@ td {
gap: 1.5rem;
}
+.command-card-grid--stacked {
+ grid-template-columns: 1fr;
+}
+
.command-card h3 {
margin-bottom: 0.75rem;
}
diff --git a/docs/commands.html b/docs/commands.html
index f49a6311..5e8b8637 100644
--- a/docs/commands.html
+++ b/docs/commands.html
@@ -89,7 +89,7 @@ Keep one workflow surface in view
On this page
- Choose your surface
- - Setup and project
+ - Set up a project
- Build and validate
- Package and ship
- Version and update
@@ -146,8 +146,8 @@ Choose your surface
- Setup and project
-
+
Set up a project
+
Install the nova launcher
Use this one-time PowerShell setup when you want nova available directly from
@@ -174,37 +174,17 @@
Start a new project
Cmdlet: Initialize-NovaModule
- Create the minimal scaffold or the example scaffold for a new module project. Before the
- first interactive question, Nova checks whether a newer NovaModuleTools release is
- available and warns without blocking the scaffold flow. When Git is enabled, Nova also
- creates or updates a default .gitignore in the generated project root so
- common local and CI artifact paths are ignored without overwriting existing rules. Both
- interactive flows can also add the optional Agentic Copilot starter package,
- which follows Nova's maintained agentic guidance through a filtered starter mirror, including Nova build/test
- expectations, project.json Manifest.PowerShellHostVersion
- compatibility guidance, strict ScriptAnalyzer guidance without excluded rules, generated
- dist module files, command-help ownership, source-mirrored test guidance,
- instructions to fix ScriptAnalyzer findings reported by run.ps1 before
- handoff, explicit public/private PowerShell file ownership guidance, a best-effort
- source/helper-script maintainability guidance plus separate test-design guidance delivered
- through best-effort source/helper-script maintainability guidance plus separate test-design guidance, explicit PSScriptAnalyzer
- workflow guidance for ./scripts/build/Invoke-ScriptAnalyzerCI.ps1,
- ./run.ps1, focused Invoke-ScriptAnalyzer usage, and
- Test-NovaBuild-only project test guidance that forbids direct
- Invoke-Pester, explicit
- valid-PlatyPS help guidance for docs/<ProjectName>/en-US/*.md using
- New-MarkdownCommandHelp, Update-MarkdownCommandHelp, and
- Test-MarkdownCommandHelp, with a matching help file required for every new
- public entry point, and a strict file-ending rule for changed or
- generated text files.
-
- New projects also start with Nova's default Pester.CodeCoverage block in
- project.json, but keep it disabled until you choose to enable coverage.
- If you enable the Agentic package, Nova also asks for a short project name used in generated
- guidance placeholders such as Invoke-<ShortName>*. For NovaModuleTools the
- short name is Nova, but it could also have been NMT.
+ Create the minimal scaffold or the example scaffold for a new module project.
-
Both scaffold styles ask the same core project questions, and both now offer an optional Agentic
- Copilot starter package after the Git prompt. The starting version prompt now defaults to
- 0.1.0-preview, so new projects begin on Nova's prerelease-friendly starter line unless
- you choose a different version. Before the first question, Nova also checks whether a
- newer NovaModuleTools release is available and warns without blocking the scaffold flow. When you
- enable Git in either scaffold style, Nova also creates or updates a default .gitignore
- in the generated project root so common local and CI artifact paths are ignored without
- overwriting existing rules. The Agentic prompt defaults to No, and the package
- follows Nova's maintained agentic guidance through a
- filtered starter mirror, including
- Nova build/test/package expectations, project.json
- Manifest.PowerShellHostVersion compatibility guidance, strict ScriptAnalyzer guidance
- without excluded rules, generated dist module files, command-help ownership,
- source-mirrored test guidance, instructions to fix ScriptAnalyzer findings reported by
- run.ps1 before handoff, explicit public/private PowerShell file ownership guidance, a
- best-effort source/helper-script maintainability guidance plus separate test-design guidance
- delivered through Agentic Copilot guidance files, explicit PSScriptAnalyzer workflow
- guidance for ./scripts/build/Invoke-ScriptAnalyzerCI.ps1, ./run.ps1, and
- focused Invoke-ScriptAnalyzer usage, Test-NovaBuild-only project test guidance that
- forbids direct Invoke-Pester, explicit valid-PlatyPS help guidance for
- docs/<ProjectName>/en-US/*.md using
+
Both scaffold styles ask the same core project questions, and both now offer an optional
+ Agentic Copilot starter package after the Git prompt.
+
The starting version prompt now defaults to 0.1.0-preview, so new projects begin on
+ Nova's prerelease-friendly starter line unless you choose a different version. Before the first
+ question, Nova also checks whether a newer NovaModuleTools release is available and warns without
+ blocking the scaffold flow. When you enable Git in either scaffold style, Nova also creates or
+ updates a default .gitignore in the generated project root so common local and CI
+ artifact paths are ignored without overwriting existing rules.
+
The Agentic prompt defaults to No, and the package follows Nova's maintained agentic
+ guidance through a filtered starter mirror, including Nova build/test/package expectations,
+ project.json Manifest.PowerShellHostVersion compatibility guidance,
+ strict ScriptAnalyzer guidance without excluded rules, generated dist module files,
+ command-help ownership, source-mirrored test guidance, instructions to fix ScriptAnalyzer findings
+ reported by run.ps1 before handoff, explicit public/private PowerShell file ownership
+ guidance, a best-effort source/helper-script maintainability guidance plus separate test-design
+ guidance delivered through Agentic Copilot guidance files, explicit
+ PSScriptAnalyzer workflow guidance for ./scripts/build/Invoke-ScriptAnalyzerCI.ps1,
+ ./run.ps1, and focused Invoke-ScriptAnalyzer usage, Test-NovaBuild-only
+ project test guidance that forbids direct Invoke-Pester, explicit valid-PlatyPS help
+ guidance for docs/<ProjectName>/en-US/*.md using
New-MarkdownCommandHelp, Update-MarkdownCommandHelp, and
Test-MarkdownCommandHelp, with a matching help file required for every new public
- entry point, and a strict file-ending rule for changed or generated text
- files.
+ entry point, and a strict file-ending rule for changed or generated text files.
The generated project.json also starts with Nova's standard Pester
- defaults, including a disabled CodeCoverage block with explicit source coverage paths
- for src/public/, nested src/private/ helper folders, and
- src/classes/, so you can enable coverage later without hand-authoring the structure.
+ defaults, including explicit source coverage paths for
src/public/, nested
+
src/private/ helper folders, and
src/classes/. The minimal scaffold keeps
+
CodeCoverage disabled until you opt in, while the packaged example scaffold enables it
+ by default so
Test-NovaBuild can measure
src/**/*.ps1 without requiring a
+ prior build.
When you answer Yes, Nova also asks for a short project name used in generated guidance
placeholders such as Invoke-<ShortName>*. For NovaModuleTools the short name is
Nova, but it could also have been NMT.
diff --git a/docs/getting-started.html b/docs/getting-started.html
index 521b52ba..bb0f601d 100644
--- a/docs/getting-started.html
+++ b/docs/getting-started.html
@@ -194,36 +194,36 @@
4. Scaffold the packaged example
Nova asks for the project name, description, version, author, minimum PowerShell version, whether
- Git should be initialized, and whether Nova should add the optional Agentic Copilot starter package.
- The starting version prompt now defaults to 0.1.0-preview, so new projects begin on
- Nova's prerelease-friendly starter line unless you choose a different version.
- Before the first question, Nova also checks whether a newer NovaModuleTools release is available and
- warns without blocking the scaffold flow.
- When you enable Git, Nova also creates or updates a default .gitignore in the new
- project root so common local and CI artifact paths start ignored without overwriting existing ignore
- rules.
- The Agentic package follows Nova's maintained agentic guidance through a filtered starter mirror,
+ Git should be initialized, and whether Nova should add the optional Agentic Copilot starter package.
+ The starting version prompt now defaults to 0.1.0-preview, so new projects begin on
+ Nova's prerelease-friendly starter line unless you choose a different version. Before the first
+ question, Nova also checks whether a newer NovaModuleTools release is available and warns without
+ blocking the scaffold flow. When you enable Git, Nova also creates or updates a default
+ .gitignore in the new project root so common local and CI artifact paths start ignored
+ without overwriting existing ignore rules.
+ The Agentic package follows Nova's maintained agentic guidance through a filtered starter mirror,
including Nova build/test/package expectations, project.json
Manifest.PowerShellHostVersion compatibility guidance, strict ScriptAnalyzer guidance
without excluded rules, generated dist module files, command-help ownership,
source-mirrored test guidance, instructions to fix ScriptAnalyzer findings reported by
run.ps1 before handoff, explicit public/private PowerShell file ownership guidance, a
best-effort source/helper-script maintainability guidance plus separate test-design guidance
- delivered through Agentic Copilot guidance files, explicit PSScriptAnalyzer workflow
+ delivered through Agentic Copilot guidance files, explicit PSScriptAnalyzer workflow
guidance for ./scripts/build/Invoke-ScriptAnalyzerCI.ps1, ./run.ps1, and
focused Invoke-ScriptAnalyzer usage, Test-NovaBuild-only project test guidance that
forbids direct Invoke-Pester, explicit valid-PlatyPS help guidance for
docs/<ProjectName>/en-US/*.md using
New-MarkdownCommandHelp, Update-MarkdownCommandHelp, and
Test-MarkdownCommandHelp, with a matching help file required for every new public
- entry point, and a strict file-ending rule for changed or generated text
- files.
- Nova then creates a project folder under the path you selected.
+ entry point, and a strict file-ending rule for changed or generated text files.
+ Nova then creates a project folder under the path you selected.
The generated project.json also starts with Nova's standard Pester
- defaults, including an opt-in CodeCoverage block with Enabled=false,
- explicit source coverage paths for src/public/, nested src/private/
- helper folders, and src/classes/, JaCoCo output in artifacts/coverage.xml,
- and a 90 percent target you can enable later.
+ defaults, including explicit source coverage paths for src/public/, nested
+ src/private/ helper folders, and src/classes/, JaCoCo output in
+ artifacts/coverage.xml, and a 90 percent target. The minimal scaffold
+ keeps that CodeCoverage block opt-in with Enabled=false, while the
+ packaged example scaffold enables coverage by default so Test-NovaBuild measures
+ src/**/*.ps1 before any build step.
If you enable the Agentic package, Nova also asks for a short project name used in generated guidance
placeholders such as Invoke-<ShortName>*. For NovaModuleTools the short name is
Nova, but it could also have been NMT.
diff --git a/docs/project-json-reference.html b/docs/project-json-reference.html
index 4893b5e4..17754fb4 100644
--- a/docs/project-json-reference.html
+++ b/docs/project-json-reference.html
@@ -675,10 +675,11 @@ Pester settings
Starter projects now include the full Pester.CodeCoverage block with
- Enabled=false and the explicit default source globs shown above, so turning coverage on
- usually means changing only that switch. At runtime, Test-NovaBuild also lets you
- override verbosity and render mode temporarily with -OutputVerbosity and
- -OutputRenderMode.
+ the explicit default source globs shown above. The minimal scaffold keeps
+ Enabled=false, while the packaged example scaffold sets Enabled=true so
+ coverage works against src/**/*.ps1 immediately. At runtime,
+ Test-NovaBuild also lets you override verbosity and render mode temporarily with
+ -OutputVerbosity and -OutputRenderMode.
When you enable coverage, Nova writes JaCoCo output to artifacts/coverage.xml and fails
the test workflow if the measured percentage is lower than
Pester.CodeCoverage.CoveragePercentTarget.
@@ -698,8 +699,9 @@ Minimal module project
}
}
Use this when you want the smallest hand-authored Nova project. Scaffolded projects start with
- additional Pester defaults, including a disabled CodeCoverage block, but
- Nova can still resolve its normal defaults when those sections are omitted.
+ additional Pester defaults; the minimal scaffold keeps CodeCoverage
+ disabled until you opt in, while the packaged example scaffold enables it by default. Nova can
+ still resolve its normal defaults when those sections are omitted.
Create both NuGet and Zip artifacts, plus latest aliases
{
diff --git a/project.json b/project.json
index 3d63b609..f3d3df3b 100644
--- a/project.json
+++ b/project.json
@@ -1,7 +1,7 @@
{
"ProjectName": "NovaModuleTools",
"Description": "NovaModuleTools is an enterprise-focused evolution of ModuleTools, designed for large-scale PowerShell projects with a strong emphasis on structure, maintainability, and automated CI/CD pipelines.",
- "Version": "3.0.0",
+ "Version": "3.0.1-preview",
"Preamble": [
"Set-StrictMode -Version Latest",
"$ErrorActionPreference = 'Stop'"
diff --git a/scripts/build/Sync-AgenticCopilotScaffold.psd1 b/scripts/build/Sync-AgenticCopilotScaffold.psd1
index ffc2e8ca..b0a18e7f 100644
--- a/scripts/build/Sync-AgenticCopilotScaffold.psd1
+++ b/scripts/build/Sync-AgenticCopilotScaffold.psd1
@@ -254,6 +254,18 @@
Old = 'applyTo: "tests/**/*.ps1,scripts/build/**/*.ps1,"'
New = 'applyTo: "tests/**/*.ps1,scripts/build/**/*.ps1"'
}
+ @{
+ Old = 'applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,run.ps1,reload.ps1"'
+ New = 'applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,reload.ps1"'
+ }
+ @{
+ Old = 'applyTo: "src/**/*.ps1,scripts/**/*.ps1,run.ps1,reload.ps1"'
+ New = 'applyTo: "src/**/*.ps1,scripts/**/*.ps1,reload.ps1"'
+ }
+ @{
+ Old = '- Use these rules when writing or reviewing `src/**/*.ps1`, `scripts/**/*.ps1`, `run.ps1`, and `reload.ps1`.'
+ New = '- Use these rules when writing or reviewing `src/**/*.ps1`, `scripts/**/*.ps1`, and `reload.ps1`.'
+ }
@{
Old = 'quality tooling tooling'
New = 'quality tooling'
@@ -268,7 +280,55 @@
}
@{
Old = '- Run `./run.ps1`'
- New = '- Run full regression tests'
+ New = '- Run the repository quality loop when one exists'
+ }
+ @{
+ Old = '- local quality loop: `pwsh -NoLogo -NoProfile -File ./run.ps1`'
+ New = '- local quality loop: use the repository quality wrapper when one exists; otherwise run ScriptAnalyzer, build, and `Test-NovaBuild` in the documented project order'
+ }
+ @{
+ Old = 'If `run.ps1` or `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` reports findings, fix them before review, handoff, or commit. Do not treat a failing local quality loop as an acceptable stopping point.'
+ New = 'If the repository quality loop or `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` reports findings, fix them before review, handoff, or commit. Do not treat a failing validation run as an acceptable stopping point.'
+ }
+ @{
+ Old = ' - full local loop: `./run.ps1`'
+ New = ' - full local loop: the repository quality wrapper, when present'
+ }
+ @{
+ Old = '- Prefer one focused analyzer run on the changed files while iterating, then rerun `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`, then `./run.ps1` before handoff.'
+ New = '- Prefer one focused analyzer run on the changed files while iterating, then rerun `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`, then the repository quality loop before handoff when the project defines one.'
+ }
+ @{
+ Old = 'Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and `./run.ps1`'
+ New = 'Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present'
+ }
+ @{
+ Old = 'Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present for normal analyzer loops; use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.'
+ New = 'Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present, for normal analyzer loops; use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.'
+ }
+ @{
+ Old = 'If `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings'
+ New = 'If the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings'
+ }
+ @{
+ Old = 'reported by `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1`'
+ New = 'reported by the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1`'
+ }
+ @{
+ Old = 'from `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1`'
+ New = 'from the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1`'
+ }
+ @{
+ Old = '`run.ps1`-style local checks ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild`.'
+ New = 'local quality checks ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild` when the project defines a combined wrapper.'
+ }
+ @{
+ Old = 'Resolve any ScriptAnalyzer findings that `./run.ps1` reports before handoff.'
+ New = 'Resolve any ScriptAnalyzer findings reported by the repository quality loop before handoff.'
+ }
+ @{
+ Old = '4. After meaningful steps, run `./run.ps1` (analyzer → build → `Test-NovaBuild`).'
+ New = '4. After meaningful steps, run the repository quality loop when present (typically analyzer → build → `Test-NovaBuild`).'
}
@{
Old = 'or GitHub release automation.'
@@ -316,11 +376,11 @@
}
@{
Old = '- `pwsh -NoLogo -NoProfile -File ./run.ps1` before completion'
- New = ''
+ New = '- the repository quality loop before completion'
}
@{
Old = '- `pwsh -NoLogo -NoProfile -File ./run.ps1`'
- New = ''
+ New = '- the repository quality loop, when present'
}
@{
Old = '- `./scripts/build/ci/Invoke-{{ProjectName}}CI.ps1 -OutputDirectory ./artifacts`'
@@ -360,7 +420,7 @@
}
@{
Old = '- a `code_health_review`, reviewer, or `./run.ps1` run flags maintainability problems'
- New = '- a reviewer or `./run.ps1` run flags maintainability problems'
+ New = '- a reviewer or the repository quality loop flags maintainability problems'
}
@{
Old = '- measuring or driving a single file''s score across steps — use `guiding-refactoring-with-code-health` for that'
diff --git a/src/resources/agentic-copilot/.github/agents/powershell-developer.agent.md b/src/resources/agentic-copilot/.github/agents/powershell-developer.agent.md
index eae5739d..3bab9676 100644
--- a/src/resources/agentic-copilot/.github/agents/powershell-developer.agent.md
+++ b/src/resources/agentic-copilot/.github/agents/powershell-developer.agent.md
@@ -42,7 +42,7 @@ Implement PowerShell command and helper changes in the {{ProjectName}} style.
- Keep raw infrastructure calls behind approved adapters.
- Preserve existing command names, warning semantics, and output shape.
- Keep new or heavily changed source functions aligned with `.github/instructions/code-quality-matrix.instructions.md`: short, single-purpose, low-duplication, and split by clear responsibility unless the scope explicitly justifies otherwise.
-- Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and `./run.ps1` for normal analyzer loops; use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.
+- Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present, for normal analyzer loops; use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.
- Validate Nova-managed project tests through `Test-NovaBuild`; do not call `Invoke-Pester` directly.
- When help files change, keep `docs/{{ProjectName}}/en-US/*.md` valid for `Import-MarkdownCommandHelp`: build and import the dist module first (`Import-Module ./dist/{{ProjectName}}/{{ProjectName}}.psd1 -Force`), then use `New-MarkdownCommandHelp` for new files, `Update-MarkdownCommandHelp` after command-surface changes, and `Test-MarkdownCommandHelp` before handoff. Generating help without the module imported causes `external help file` to default to the command name instead of the module name, producing per-command XML files that the manifest cannot find. A new public `src/public/*.ps1` file is not done until its matching help file exists.
@@ -53,7 +53,7 @@ Implement PowerShell command and helper changes in the {{ProjectName}} style.
- Public/private file ownership still follows the one externally called function per file rule, with private helpers kept as sibling top-level functions instead of nested function declarations.
- Every new public entry point has its matching help file.
- Project test validation ran through `Test-NovaBuild`.
-- Any ScriptAnalyzer findings reported by `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` are resolved.
+- Any ScriptAnalyzer findings reported by the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` are resolved.
- Every changed or generated text file has been checked and ends with exactly one trailing newline and no extra blank lines at the bottom.
- Docs/changelog review is complete.
- The relevant validation commands have been run.
diff --git a/src/resources/agentic-copilot/.github/agents/reviewer.agent.md b/src/resources/agentic-copilot/.github/agents/reviewer.agent.md
index 7488840d..a3c0de94 100644
--- a/src/resources/agentic-copilot/.github/agents/reviewer.agent.md
+++ b/src/resources/agentic-copilot/.github/agents/reviewer.agent.md
@@ -29,7 +29,7 @@ Review changes for correctness, maintainability, test coverage, workflow safety,
- Flag broad catch-all test files when focused source-mirrored tests would make ownership clearer.
- Flag Nova-managed validation that bypasses `Test-NovaBuild` with direct `Invoke-Pester`.
- Flag any PSScriptAnalyzer rule excludes or suppressions; the code should be fixed instead.
-- Flag unresolved ScriptAnalyzer findings from `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1`; they should be fixed instead of deferred.
+- Flag unresolved ScriptAnalyzer findings from the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1`; they should be fixed instead of deferred.
- Flag every changed or generated text file if they do not exactly have one trailing newline with no extra blank lines at the bottom.
## Inputs to inspect
diff --git a/src/resources/agentic-copilot/.github/instructions/code-quality-matrix.instructions.md b/src/resources/agentic-copilot/.github/instructions/code-quality-matrix.instructions.md
index 8575a52b..3d3c2753 100644
--- a/src/resources/agentic-copilot/.github/instructions/code-quality-matrix.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/code-quality-matrix.instructions.md
@@ -1,5 +1,5 @@
---
-applyTo: "src/**/*.ps1,scripts/**/*.ps1,run.ps1,reload.ps1"
+applyTo: "src/**/*.ps1,scripts/**/*.ps1,reload.ps1"
---
# Code quality matrix
@@ -14,7 +14,7 @@ This file tells Agentic Copilot how to shape source code from the start. Test-sp
## How to apply this guidance
-- Use these rules when writing or reviewing `src/**/*.ps1`, `scripts/**/*.ps1`, `run.ps1`, and `reload.ps1`.
+- Use these rules when writing or reviewing `src/**/*.ps1`, `scripts/**/*.ps1`, and `reload.ps1`.
- Prefer these patterns in new or heavily changed code instead of leaving cleanup for later.
- Treat the thresholds as default goals, not as opinions. Use them to decide whether a function or file should be split.
- If a change must violate one of these rules, keep the exception narrow and explain the trade-off clearly in the handoff.
diff --git a/src/resources/agentic-copilot/.github/instructions/powershell-coding-standards.instructions.md b/src/resources/agentic-copilot/.github/instructions/powershell-coding-standards.instructions.md
index 93811d05..f5251f3f 100644
--- a/src/resources/agentic-copilot/.github/instructions/powershell-coding-standards.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/powershell-coding-standards.instructions.md
@@ -1,5 +1,5 @@
---
-applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,run.ps1,reload.ps1"
+applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,reload.ps1"
---
# {{ProjectName}} PowerShell coding standards
@@ -39,7 +39,7 @@ Use this file when changing `src/public/`, `src/private/`, or PowerShell build/r
- When public command help changes, follow `.github/instructions/platyps-help.instructions.md` and use `New-MarkdownCommandHelp`, `Update-MarkdownCommandHelp`, and `Test-MarkdownCommandHelp` instead of hand-authoring the help structure.
- Do not add PSScriptAnalyzer `ExcludeRule`, `ExcludeRules`, suppression attributes, or generated settings that hide analyzer findings. Fix the rule violation instead.
- Keep local quality wrappers ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild`.
-- If `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before treating the change as complete.
+- If the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before treating the change as complete.
## Formatting rules
@@ -93,6 +93,6 @@ Use this file when changing `src/public/`, `src/private/`, or PowerShell build/r
- Update or add Pester coverage for behavior changes.
- Recheck `tests/*Architecture*.Tests.ps1` when changing layering or helper placement.
-- Run full regression tests before considering a code change complete.
-- Resolve any ScriptAnalyzer findings that `./run.ps1` reports before handoff.
+- Run the repository quality loop when one exists before considering a code change complete.
+- Resolve any ScriptAnalyzer findings reported by the repository quality loop before handoff.
- Before handoff, review the changed/generated text files and normalize any file endings that violate the single-trailing-newline rule.
diff --git a/src/resources/agentic-copilot/.github/instructions/psscriptanalyzer.instructions.md b/src/resources/agentic-copilot/.github/instructions/psscriptanalyzer.instructions.md
index 82cf78a7..dc11a678 100644
--- a/src/resources/agentic-copilot/.github/instructions/psscriptanalyzer.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/psscriptanalyzer.instructions.md
@@ -1,5 +1,5 @@
---
-applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,run.ps1,reload.ps1"
+applyTo: "src/**/*.ps1,tests/**/*.ps1,scripts/**/*.ps1,reload.ps1"
---
# PSScriptAnalyzer workflow rules
@@ -17,7 +17,7 @@ Use this file when changing PowerShell code, tests, build helpers, or analyzer w
1. Use the repository wrappers as the authoritative entrypoints:
- analyzer only: `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`
- - full local loop: `./run.ps1`
+ - full local loop: the repository quality wrapper, when present
2. Use raw `Invoke-ScriptAnalyzer` only for focused local investigation or when you are deliberately changing analyzer tooling.
3. When you call `Invoke-ScriptAnalyzer` directly, point it at real `.ps1`, `.psm1`, or `.psd1` paths, use `-Recurse` when analyzing a directory, and reuse the repository-approved analyzer settings through `-Settings` instead of inventing a new rule selection.
4. Treat `Error`, `Warning`, and `ParseError` diagnostics as findings to fix before handoff. Parser errors are analyzer diagnostics too and are not something to suppress away.
@@ -27,7 +27,7 @@ Use this file when changing PowerShell code, tests, build helpers, or analyzer w
## Authoring guidance
-- Prefer one focused analyzer run on the changed files while iterating, then rerun `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`, then `./run.ps1` before handoff.
+- Prefer one focused analyzer run on the changed files while iterating, then rerun `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`, then the repository quality loop before handoff when the project defines one.
- Keep analyzer wrappers focused on source files and helper scripts, not generated output such as `dist/` or `artifacts/`.
- If the repository has a `PSScriptAnalyzerSettings.psd1` file or a wrapper-owned settings hashtable, treat that configuration as authoritative for direct `Invoke-ScriptAnalyzer` runs.
- Built-in presets such as `PSGallery` or `CodeFormatting` exist, but do not switch to them unless the repository explicitly adopts them.
diff --git a/src/resources/agentic-copilot/.github/instructions/release-policy.instructions.md b/src/resources/agentic-copilot/.github/instructions/release-policy.instructions.md
index 47d4baf5..76f678eb 100644
--- a/src/resources/agentic-copilot/.github/instructions/release-policy.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/release-policy.instructions.md
@@ -47,5 +47,5 @@ Use this file when changing versioning, changelog handling, package metadata, pu
## Verification
- Validate the touched release or versioning path with targeted tests.
-- Run full regression tests after code changes.
+- Run the repository quality loop when one exists after code changes.
- Re-read `.github/pull_request_template.md` before preparing release-related summaries.
diff --git a/src/resources/agentic-copilot/.github/instructions/repository-conventions.instructions.md b/src/resources/agentic-copilot/.github/instructions/repository-conventions.instructions.md
index e398bb3a..f6674e62 100644
--- a/src/resources/agentic-copilot/.github/instructions/repository-conventions.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/repository-conventions.instructions.md
@@ -27,12 +27,12 @@ Canonical rule source for cross-cutting {{ProjectName}} conventions that apply t
Use the smallest validation set that proves the change, then run the repository quality loop before finishing code work:
-- local quality loop: `pwsh -NoLogo -NoProfile -File ./run.ps1`
+- local quality loop: use the repository quality wrapper when one exists; otherwise run ScriptAnalyzer, build, and `Test-NovaBuild` in the documented project order
- test validation: `Test-NovaBuild`
- analyzer only: `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`
- CI-parity coverage flow: use the repository-specific CI helper when one exists
-If `run.ps1` or `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` reports findings, fix them before review, handoff, or commit. Do not treat a failing local quality loop as an acceptable stopping point.
+If the repository quality loop or `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` reports findings, fix them before review, handoff, or commit. Do not treat a failing validation run as an acceptable stopping point.
When project-specific quality tooling is available:
diff --git a/src/resources/agentic-copilot/.github/instructions/testing-policy.instructions.md b/src/resources/agentic-copilot/.github/instructions/testing-policy.instructions.md
index 8cc3f94b..a777486c 100644
--- a/src/resources/agentic-copilot/.github/instructions/testing-policy.instructions.md
+++ b/src/resources/agentic-copilot/.github/instructions/testing-policy.instructions.md
@@ -101,4 +101,4 @@ A non-blocking mirror status helper is available at `scripts/build/Get-TestMirro
- `Test-NovaBuild`
- `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` when PowerShell code changed
-
+- the repository quality loop before completion
diff --git a/src/resources/agentic-copilot/.github/prompts/implement-issue.prompt.md b/src/resources/agentic-copilot/.github/prompts/implement-issue.prompt.md
index 26c46a15..78941273 100644
--- a/src/resources/agentic-copilot/.github/prompts/implement-issue.prompt.md
+++ b/src/resources/agentic-copilot/.github/prompts/implement-issue.prompt.md
@@ -20,9 +20,9 @@ Implement the issue in the {{ProjectName}} repository using the repository-local
6. Inspect `project.json` `Manifest.PowerShellHostVersion` before changing PowerShell code, tests, or examples, and keep the implementation compatible with that target.
7. Implement the smallest maintainable fix.
8. Use `.github/instructions/code-quality-matrix.instructions.md` for changed source/helper scripts and `.github/instructions/testing-policy.instructions.md` for changed tests; keep new or heavily changed code short, single-purpose, low-duplication, and easy to scan unless the scope explicitly justifies otherwise.
-9. Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and `./run.ps1`, and use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.
+9. Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present, and use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repository-approved settings.
10. Do not add PSScriptAnalyzer excluded rules, suppressions, or ad hoc analyzer settings that hide findings; fix analyzer findings in the code.
-11. If `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before handoff instead of only reporting the failure.
+11. If the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before handoff instead of only reporting the failure.
12. Keep file/function ownership explicit: one externally called function per file, with private-file extras limited to related same-file top-level support helpers, keep the file name aligned to the entry function, and do not declare functions inside functions.
13. Before handoff, review every changed or generated text file and normalize it to exactly one trailing newline with no extra blank lines at the bottom.
14. Add or update the matching source-mirrored Pester file for every changed `src/**/*.ps1` file; if the behavior is genuinely cross-cutting, document which integration/guardrail test owns it and why a mirrored unit test is not practical.
diff --git a/src/resources/agentic-copilot/.github/skills/building-maintainable-code/SKILL.md b/src/resources/agentic-copilot/.github/skills/building-maintainable-code/SKILL.md
index d4e4ec1f..b1ad6b01 100644
--- a/src/resources/agentic-copilot/.github/skills/building-maintainable-code/SKILL.md
+++ b/src/resources/agentic-copilot/.github/skills/building-maintainable-code/SKILL.md
@@ -11,7 +11,7 @@ Use this skill when:
- adding a new public command or private helper to {{ProjectName}}
- refactoring a function, file, or domain folder that has grown over time
-- a reviewer or `./run.ps1` run flags maintainability problems
+- a reviewer or the repository quality loop flags maintainability problems
- you want a concrete, PowerShell-aware playbook for the guidelines
Do not use this skill for:
@@ -26,7 +26,7 @@ The companion instruction file is `.github/instructions/code-quality-matrix.inst
- `src/public/*.ps1` and `src/private//*.ps1`
- `tests/*Architecture*.Tests.ps1`
-
+- the repository quality loop, when present
- `./scripts/build/Invoke-ScriptAnalyzerCI.ps1`
- `Test-NovaBuild`
@@ -67,7 +67,7 @@ Follow these steps for any non-trivial PowerShell change.
1. Read the changed function and surrounding file. Note where it sits in `src/public/`, `src/private//`, or `scripts/`.
2. For each new or heavily changed function, walk the checklist below in order.
3. If a step requires a refactor, make it the smallest structural step that fixes the specific finding. Do not bundle unrelated cleanup.
-4. After meaningful steps, run `./run.ps1` (analyzer → build → `Test-NovaBuild`).
+4. After meaningful steps, run the repository quality loop when present (typically analyzer → build → `Test-NovaBuild`).
5. Before handoff, normalize every changed text file to exactly one trailing newline.
### Step 1 — Short units (≤ 15 lines)
@@ -227,6 +227,7 @@ Run this short pass before handoff on every changed source file:
## Verification
+- the repository quality loop, when present
- `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` when iterating quickly on PowerShell changes
- `Test-NovaBuild` for behavior validation
diff --git a/src/resources/agentic-copilot/.github/skills/pester-testing/SKILL.md b/src/resources/agentic-copilot/.github/skills/pester-testing/SKILL.md
index ab4f930b..50f42d58 100644
--- a/src/resources/agentic-copilot/.github/skills/pester-testing/SKILL.md
+++ b/src/resources/agentic-copilot/.github/skills/pester-testing/SKILL.md
@@ -14,7 +14,7 @@ Use this skill when adding tests, closing coverage gaps, fixing regressions, or
- `tests/*.Tests.ps1`
- `tests/*TestSupport.ps1`
- `Test-NovaBuild`
-
+- the repository quality loop, when present
- `./scripts/build/ci/Invoke-{{ProjectName}}CI.ps1 -OutputDirectory ./artifacts`
## Expected practices
@@ -60,5 +60,5 @@ Describe 'Initialize-NovaPesterCoverageConfiguration' {
## Verification
- Run `Test-NovaBuild`
-- Run full regression tests before finishing code changes
+- Run the repository quality loop when one exists before finishing code changes
- If coverage is the goal, inspect `artifacts/coverage.xml` produced by the CI helper flow. Coverage is JaCoCo and references source files under `src/**/*.ps1` directly.
diff --git a/src/resources/agentic-copilot/.github/skills/powershell-module-development/SKILL.md b/src/resources/agentic-copilot/.github/skills/powershell-module-development/SKILL.md
index bd7a87b8..f0adeb0b 100644
--- a/src/resources/agentic-copilot/.github/skills/powershell-module-development/SKILL.md
+++ b/src/resources/agentic-copilot/.github/skills/powershell-module-development/SKILL.md
@@ -33,10 +33,10 @@ Use this skill when changing public commands, private helpers, CLI routing suppo
- Use `.github/instructions/code-quality-matrix.instructions.md` as the best-effort source-code maintainability guidance. Keep new or heavily changed code short, single-purpose, low-duplication, lightly nested, and split by clear responsibility; group related inputs instead of growing long parameter lists.
- Reuse existing workflow-context helpers and shared adapters.
- Follow the repository's PowerShell style rules: 4-space indentation, same-line opening braces, restrained blank lines, full cmdlet names, and readable operator spacing.
-- Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and `./run.ps1`, and use direct `Invoke-ScriptAnalyzer` only for focused local checks or deliberate analyzer-tooling work.
+- Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present, and use direct `Invoke-ScriptAnalyzer` only for focused local checks or deliberate analyzer-tooling work.
- Keep ScriptAnalyzer strict: do not add excluded rules, suppression attributes, or settings that hide analyzer findings.
-- Keep `run.ps1`-style local checks ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild`.
-- If `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before handoff instead of just reporting the failure.
+- Keep local quality checks ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild` when the project defines a combined wrapper.
+- If the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before handoff instead of just reporting the failure.
- Before handoff, review every changed or generated text file and normalize it to exactly one trailing newline with no extra blank lines at the end.
- Add or update valid PlatyPS-compatible help under `docs/{{ProjectName}}/en-US/` when public commands or public classes change. Always build and import the dist module first (`Import-Module ./dist/{{ProjectName}}/{{ProjectName}}.psd1 -Force`) before running `New-MarkdownCommandHelp` or `Update-MarkdownCommandHelp`, so PlatyPS writes the module name — not the command name — into `external help file` and `Module Name`. Use `Test-MarkdownCommandHelp` to validate structure before handoff instead of writing plain Markdown from scratch.
- For every new public `src/public/*.ps1` file, create the matching help file immediately in the same change.
@@ -64,4 +64,4 @@ Use this skill when changing public commands, private helpers, CLI routing suppo
- `Test-NovaBuild` for the changed behavior
- `tests/*Architecture*.Tests.ps1` implications checked
-
+- the repository quality loop, when present
diff --git a/src/resources/agentic-copilot/.github/skills/release-and-changelog/SKILL.md b/src/resources/agentic-copilot/.github/skills/release-and-changelog/SKILL.md
index 7b4ee9da..ca644824 100644
--- a/src/resources/agentic-copilot/.github/skills/release-and-changelog/SKILL.md
+++ b/src/resources/agentic-copilot/.github/skills/release-and-changelog/SKILL.md
@@ -48,4 +48,4 @@ Use this skill when working on semantic versioning, release automation, package
- Review `CHANGELOG.md`, `RELEASE_NOTE.md`, workflow docs, and affected tests together
- Run targeted versioning/package tests when behavior changed
-- Run full regression tests for code changes
+- Run the repository quality loop when one exists for code changes
diff --git a/src/resources/agentic-copilot/CONTRIBUTING.md b/src/resources/agentic-copilot/CONTRIBUTING.md
index c33ec9e8..eea79664 100644
--- a/src/resources/agentic-copilot/CONTRIBUTING.md
+++ b/src/resources/agentic-copilot/CONTRIBUTING.md
@@ -11,9 +11,9 @@ Before opening a pull request:
- when you add a new public function, create its matching help file in the same change
- use Nova commands and `project.json` for build, test, package, and release behavior
- keep PowerShell code, tests, and examples compatible with `project.json` `Manifest.PowerShellHostVersion`; if the project targets `5.1`, do not add PowerShell 7.x-only features
-- keep `run.ps1` ordered as ScriptAnalyzer, then `Invoke-NovaBuild`, then `Test-NovaBuild`
+- keep local quality checks ordered as ScriptAnalyzer, then `Invoke-NovaBuild`, then `Test-NovaBuild` when your project defines a combined wrapper
- use `Test-NovaBuild` as the project test entrypoint; do not validate with direct `Invoke-Pester`
-- if `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before you ask for review
+- if the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before you ask for review
- follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth; use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repo-approved settings
- keep one externally called function per file and match the file name to that function; private files may keep extra related functions only as same-file top-level support helpers, and PowerShell functions must not declare nested functions inside their bodies
- follow `.github/instructions/code-quality-matrix.instructions.md` for source/helper-script maintainability and `.github/instructions/testing-policy.instructions.md` for test design
diff --git a/src/resources/agentic-copilot/README.md b/src/resources/agentic-copilot/README.md
index d0b0a41f..f84414c6 100644
--- a/src/resources/agentic-copilot/README.md
+++ b/src/resources/agentic-copilot/README.md
@@ -20,10 +20,10 @@ Follow this workflow when working with Copilot in this repository.
- Use Nova commands and `project.json` for build, test, package, and release behavior.
- Treat `project.json` `Manifest.PowerShellHostVersion` as the compatibility target for PowerShell code, tests, and examples. If it is `5.1`, do not introduce PowerShell 7.x-only features.
-- Keep `run.ps1` as the local quality loop: ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild`.
+- Keep local quality checks ordered as ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild` when your project defines a combined wrapper.
- Use `Test-NovaBuild` as the project test entrypoint. Do not validate with direct `Invoke-Pester`, because it can bypass Nova's build/import/StrictMode flow and disagree with later user-visible test runs.
-- If `run.ps1` or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before review or handoff.
-- Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and `./run.ps1`, and use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repo-approved settings.
+- If the repository quality loop or `Invoke-ScriptAnalyzerCI.ps1` reports ScriptAnalyzer findings, fix them before review or handoff.
+- Follow `.github/instructions/psscriptanalyzer.instructions.md` as the ScriptAnalyzer workflow source of truth. Prefer `./scripts/build/Invoke-ScriptAnalyzerCI.ps1` and the repository quality loop, when present, and use direct `Invoke-ScriptAnalyzer` only for focused local checks that reuse the repo-approved settings.
- Keep one externally called function per file and match the file name to that function. Public files own one command each; private files may keep extra related functions only as same-file top-level support helpers, and PowerShell functions must not declare nested functions inside their bodies.
- Follow `.github/instructions/code-quality-matrix.instructions.md` as the best-effort maintainability guidance for source/helper scripts, and `.github/instructions/testing-policy.instructions.md` for test design. These guide agents and reviewers in this generated project.
- Generate valid PlatyPS help under `docs/{{ProjectName}}/en-US/` whenever command help changes. Use `New-MarkdownCommandHelp`, `Update-MarkdownCommandHelp`, and `Test-MarkdownCommandHelp` instead of hand-writing the help structure.
diff --git a/src/resources/example/README.md b/src/resources/example/README.md
index 398f4212..e5e351bd 100644
--- a/src/resources/example/README.md
+++ b/src/resources/example/README.md
@@ -7,7 +7,7 @@ It is meant to help a new user understand the smallest useful setup that can:
- build a module
- include a private helper
- include a resource file
-- run Pester tests against the built module
+- run Pester tests against source files with code coverage enabled
- show the full `project.json` configuration surface in one place
## What is in this example?
@@ -22,7 +22,8 @@ It is meant to help a new user understand the smallest useful setup that can:
- `src/public/Get-ExampleGreeting.ps1` – a public function exported from the built module
- `src/private/Get-ExampleConfiguration.ps1` – a private helper used by the public function
- `src/resources/greeting-config.json` – a resource file bundled into the built module
-- `tests/Pester.Some.Tests.ps1` – tests that import the built module and verify its behavior
+- `tests/public/Get-ExampleGreeting.Tests.ps1` – source-mirrored tests for the public function
+- `tests/private/Get-ExampleConfiguration.Tests.ps1` – source-mirrored tests for the private helper and resource resolution
## Quick start
@@ -35,8 +36,8 @@ If `./dist/NovaModuleTools` is not available yet, build `NovaModuleTools` from t
```text
PS> Import-Module ./dist/NovaModuleTools -Force
PS> Set-Location ./src/resources/example
-PS> Invoke-NovaBuild
PS> Test-NovaBuild
+PS> Invoke-NovaBuild
PS> New-NovaModulePackage
PS> $project = Get-NovaProjectInfo
PS> Import-Module $project.OutputModuleDir -Force
@@ -51,8 +52,8 @@ PS> Install-Module NovaModuleTools
PS> Import-Module NovaModuleTools
PS> $module = Get-Module NovaModuleTools -ListAvailable | Select-Object -First 1
PS> Set-Location (Join-Path $module.ModuleBase 'resources/example')
-PS> Invoke-NovaBuild
PS> Test-NovaBuild
+PS> Invoke-NovaBuild
PS> New-NovaModulePackage
PS> $project = Get-NovaProjectInfo
PS> Import-Module $project.OutputModuleDir -Force
@@ -61,6 +62,12 @@ PS> Get-ExampleGreeting
## Expected result
+After `Test-NovaBuild`, the example tests run against `src/**/*.ps1` and JaCoCo coverage is written to:
+
+```text
+src/resources/example/artifacts/coverage.xml
+```
+
After `Invoke-NovaBuild`, the built module is written to:
```text
@@ -112,7 +119,7 @@ This example is intentionally small, but it demonstrates the most important Nova
- how module-level preamble lines from `project.json` are emitted before the generated source markers and module code
- how public and private functions are combined into one module
- how resource files are copied and used at runtime
-- how tests should import the built module from `dist/`
+- how tests can run against source files before a build while still producing coverage
- where the current package, packaging, and raw-upload configuration keys live in `project.json`
If you want a new project scaffold, use `PS> Initialize-NovaModule` (`% nova init`). If you want a concrete project you can inspect, run, or copy through `% nova init --example` / `% nova init -e`, use this example folder.
diff --git a/src/resources/example/project.json b/src/resources/example/project.json
index 125009ce..4b8083f2 100644
--- a/src/resources/example/project.json
+++ b/src/resources/example/project.json
@@ -83,7 +83,7 @@
},
"Pester": {
"CodeCoverage": {
- "Enabled": false,
+ "Enabled": true,
"Path": [
"src/public/*.ps1",
"src/private/*.ps1",
diff --git a/src/resources/example/src/private/Get-ExampleConfiguration.ps1 b/src/resources/example/src/private/Get-ExampleConfiguration.ps1
index 88674fd6..69e2d134 100644
--- a/src/resources/example/src/private/Get-ExampleConfiguration.ps1
+++ b/src/resources/example/src/private/Get-ExampleConfiguration.ps1
@@ -1,12 +1,28 @@
-function Get-ExampleConfiguration {
+function Get-ExampleConfigurationPath {
[CmdletBinding()]
- param()
+ param(
+ [string]$BasePath = $PSScriptRoot
+ )
+
+ $candidatePathList = @(
+ [System.IO.Path]::GetFullPath((Join-Path $BasePath 'resources/greeting-config.json'))
+ [System.IO.Path]::GetFullPath((Join-Path $BasePath '../resources/greeting-config.json'))
+ ) | Select-Object -Unique
- $configurationPath = Join-Path $PSScriptRoot 'resources/greeting-config.json'
- if (-not (Test-Path -LiteralPath $configurationPath)) {
- Stop-NovaOperation -Message "Example configuration not found: $configurationPath" -ErrorId 'Nova.Environment.ExampleConfigurationNotFound' -Category ObjectNotFound -TargetObject $configurationPath
+ foreach ($candidatePath in $candidatePathList) {
+ if (Test-Path -LiteralPath $candidatePath) {
+ return $candidatePath
+ }
}
+ Stop-NovaOperation -Message "Example configuration not found. Checked: $( $candidatePathList -join ', ' )" -ErrorId 'Nova.Environment.ExampleConfigurationNotFound' -Category ObjectNotFound -TargetObject 'resources/greeting-config.json'
+}
+
+function Get-ExampleConfiguration {
+ [CmdletBinding()]
+ param()
+
+ $configurationPath = Get-ExampleConfigurationPath
$configuration = Get-Content -LiteralPath $configurationPath -Raw | ConvertFrom-Json
return [pscustomobject]@{
GreetingPrefix = $configuration.GreetingPrefix
diff --git a/src/resources/example/tests/Pester.Some.Tests.ps1 b/src/resources/example/tests/Pester.Some.Tests.ps1
deleted file mode 100644
index 7399bebe..00000000
--- a/src/resources/example/tests/Pester.Some.Tests.ps1
+++ /dev/null
@@ -1,23 +0,0 @@
-BeforeAll {
- $project = Get-NovaProjectInfo
- Remove-Module $project.ProjectName -ErrorAction SilentlyContinue
- Import-Module $project.OutputModuleDir -Force
-}
-
-Describe 'Nova example project' {
- It 'returns a default greeting from the bundled configuration' {
- Get-ExampleGreeting | Should -Be 'Hello, Nova user!'
- }
-
- It 'returns a custom greeting when a name is provided' {
- Get-ExampleGreeting -Name 'Stiwi' | Should -Be 'Hello, Stiwi!'
- }
-
- It 'can return greeting metadata for inspection' {
- $result = Get-ExampleGreeting -Name 'CodeScene' -AsObject
-
- $result.Message | Should -Be 'Hello, CodeScene!'
- $result.Audience | Should -Be 'CodeScene'
- (Test-Path -LiteralPath $result.ConfigurationPath) | Should -BeTrue
- }
-}
diff --git a/src/resources/example/tests/private/Get-ExampleConfiguration.Tests.ps1 b/src/resources/example/tests/private/Get-ExampleConfiguration.Tests.ps1
new file mode 100644
index 00000000..dda212e4
--- /dev/null
+++ b/src/resources/example/tests/private/Get-ExampleConfiguration.Tests.ps1
@@ -0,0 +1,49 @@
+BeforeAll {
+ $projectRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
+
+ function Stop-NovaOperation {
+ [CmdletBinding(SupportsShouldProcess)]
+ param($Message, $ErrorId, $Category, $TargetObject)
+
+ $null = $PSCmdlet.ShouldProcess([string]$TargetObject, 'Stop-NovaOperation')
+ throw "$Message [$ErrorId | $Category | $TargetObject]"
+ }
+
+ . (Join-Path $projectRoot 'src/private/Get-ExampleConfiguration.ps1')
+}
+
+Describe 'Get-ExampleConfigurationPath' {
+ It 'resolves the bundled configuration from the source layout' {
+ $expectedPath = [System.IO.Path]::GetFullPath((Join-Path $projectRoot 'src/resources/greeting-config.json'))
+
+ Get-ExampleConfigurationPath | Should -Be $expectedPath
+ }
+
+ It 'resolves the configuration from a built-module style resources folder when one is present' {
+ $moduleRoot = Join-Path $TestDrive 'dist/NovaExampleModule'
+ $resourceRoot = Join-Path $moduleRoot 'resources'
+ $expectedPath = Join-Path $resourceRoot 'greeting-config.json'
+
+ $null = New-Item -ItemType Directory -Path $resourceRoot -Force
+ Set-Content -LiteralPath $expectedPath -Value '{"GreetingPrefix":"Hi","DefaultAudience":"Built user"}' -Encoding utf8 -NoNewline
+
+ Get-ExampleConfigurationPath -BasePath $moduleRoot | Should -Be $expectedPath
+ }
+
+ It 'stops when the configuration file is missing from both source and built layouts' {
+ $basePath = Join-Path (Join-Path $TestDrive 'missing-layout') 'private'
+ $null = New-Item -ItemType Directory -Path $basePath -Force
+
+ { Get-ExampleConfigurationPath -BasePath $basePath } | Should -Throw 'Example configuration not found.*'
+ }
+}
+
+Describe 'Get-ExampleConfiguration' {
+ It 'returns the bundled greeting configuration data' {
+ $result = Get-ExampleConfiguration
+
+ $result.GreetingPrefix | Should -Be 'Hello'
+ $result.DefaultAudience | Should -Be 'Nova user'
+ (Split-Path -Leaf $result.ConfigurationPath) | Should -Be 'greeting-config.json'
+ }
+}
diff --git a/src/resources/example/tests/public/Get-ExampleGreeting.Tests.ps1 b/src/resources/example/tests/public/Get-ExampleGreeting.Tests.ps1
new file mode 100644
index 00000000..79fe902e
--- /dev/null
+++ b/src/resources/example/tests/public/Get-ExampleGreeting.Tests.ps1
@@ -0,0 +1,34 @@
+BeforeAll {
+ $projectRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
+
+ . (Join-Path $projectRoot 'src/private/Get-ExampleConfiguration.ps1')
+ . (Join-Path $projectRoot 'src/public/Get-ExampleGreeting.ps1')
+}
+
+Describe 'Get-ExampleGreeting' {
+ BeforeEach {
+ Mock Get-ExampleConfiguration {
+ return [pscustomobject]@{
+ GreetingPrefix = 'Hello'
+ DefaultAudience = 'Nova user'
+ ConfigurationPath = '/tmp/greeting-config.json'
+ }
+ }
+ }
+
+ It 'returns the default greeting when no name is provided' {
+ Get-ExampleGreeting | Should -Be 'Hello, Nova user!'
+ }
+
+ It 'returns a custom greeting when a name is provided' {
+ Get-ExampleGreeting -Name 'Stiwi' | Should -Be 'Hello, Stiwi!'
+ }
+
+ It 'returns greeting metadata when -AsObject is used' {
+ $result = Get-ExampleGreeting -Name 'CodeScene' -AsObject
+
+ $result.Message | Should -Be 'Hello, CodeScene!'
+ $result.Audience | Should -Be 'CodeScene'
+ $result.ConfigurationPath | Should -Be '/tmp/greeting-config.json'
+ }
+}
diff --git a/tests/AgenticCopilotScaffoldSync.Tests.ps1 b/tests/AgenticCopilotScaffoldSync.Tests.ps1
index 8e39588a..d8cbdda0 100644
--- a/tests/AgenticCopilotScaffoldSync.Tests.ps1
+++ b/tests/AgenticCopilotScaffoldSync.Tests.ps1
@@ -208,13 +208,21 @@ Describe 'Agentic Copilot scaffold sync' {
$content.TestingPolicy | Should -Match 'Invoke-ScriptAnalyzerCI\.ps1'
$content.ReviewerAgent | Should -Match 'psscriptanalyzer\.instructions\.md'
$content.ReviewerAgent | Should -Match 'bypasses repository-approved settings'
- $content.ImplementPrompt | Should -Match 'Prefer `\./scripts/build/Invoke-ScriptAnalyzerCI\.ps1` and `\./run\.ps1`'
+ $content.ImplementPrompt | Should -Match 'Prefer `\./scripts/build/Invoke-ScriptAnalyzerCI\.ps1` and the repository quality loop, when present'
$content.ReviewPrompt | Should -Match 'psscriptanalyzer\.instructions\.md'
$content.Contributing | Should -Match 'psscriptanalyzer\.instructions\.md'
$content.Readme | Should -Match 'psscriptanalyzer\.instructions\.md'
}
+ It 'removes run.ps1 references from generated starter guidance' {
+ $content = & $script:getAgenticScaffoldGuidanceContent
+
+ foreach ($value in $content.PSObject.Properties.Value) {
+ $value | Should -Not -Match 'run\.ps1'
+ }
+ }
+
It 'documents agent and starter expectations consistently' {
$content = & $script:getAgenticScaffoldGuidanceContent
@@ -236,7 +244,7 @@ Describe 'Agentic Copilot scaffold sync' {
$content.Contributing | Should -Match 'make every changed or generated text file end immediately after exactly one newline terminator with no blank spacer line at the bottom'
$content.Readme | Should -Match 'ScriptAnalyzer first, then `Invoke-NovaBuild`, then `Test-NovaBuild`'
- $content.Readme | Should -Match 'If `run\.ps1` or `Invoke-ScriptAnalyzerCI\.ps1` reports ScriptAnalyzer findings, fix them before review or handoff'
+ $content.Readme | Should -Match 'If the repository quality loop or `Invoke-ScriptAnalyzerCI\.ps1` reports ScriptAnalyzer findings, fix them before review or handoff'
$content.Readme | Should -Match 'Keep one externally called function per file and match the file name to that function'
$content.Readme | Should -Match 'must not declare nested functions inside their bodies'
$content.Readme | Should -Match 'Test-TextFileFormatting\.ps1'
diff --git a/tests/DocsSiteLayout.Tests.ps1 b/tests/DocsSiteLayout.Tests.ps1
new file mode 100644
index 00000000..c803d21b
--- /dev/null
+++ b/tests/DocsSiteLayout.Tests.ps1
@@ -0,0 +1,77 @@
+BeforeAll {
+ $script:repoRoot = Split-Path -Parent $PSScriptRoot
+ $script:siteCssPath = Join-Path $script:repoRoot 'docs/assets/site.css'
+ $script:siteCssContent = Get-Content -LiteralPath $script:siteCssPath -Raw
+ $script:getHtmlContent = {
+ param([Parameter(Mandatory)][string]$RelativePath)
+
+ return Get-Content -LiteralPath (Join-Path $script:repoRoot $RelativePath) -Raw
+ }
+}
+
+Describe 'docs site layout guardrails' {
+ It 'keeps wide-screen layout and text containers uncapped in the shared stylesheet' {
+ $script:siteCssContent | Should -Match '(?s):root\s*\{.*?--max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)\.guide-hero\s*\{.*?max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)\.guide-content\s+\.content-section\s*>\s*p,\s*\.guide-content\s+\.content-section\s*>\s*ul,\s*\.guide-content\s+\.content-section\s*>\s*ol\s*\{.*?max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)h1\s*\{.*?max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)\.lead\s*\{.*?max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)\.narrow\s*\{.*?max-width:\s*none;'
+ $script:siteCssContent | Should -Match '(?s)\.section-heading\s*\{.*?max-width:\s*none;'
+ }
+
+ It 'keeps key docs pages on the shared text-width wrappers that the stylesheet protects' {
+ $gettingStartedPage = & $script:getHtmlContent -RelativePath 'docs/getting-started.html'
+ $indexPage = & $script:getHtmlContent -RelativePath 'docs/index.html'
+
+ $gettingStartedPage | Should -Match ''
+ $gettingStartedPage | Should -Match ''
+ $gettingStartedPage | Should -Match ''
+
+ $indexPage | Should -Match ''
+ $indexPage | Should -Match ''
+ $indexPage | Should -Match 'class="section__inner narrow"'
+ $indexPage | Should -Match 'class="section-heading"'
+ }
+
+ It 'keeps the commands page starter card balanced for cheat-sheet use' {
+ $commandsPage = & $script:getHtmlContent -RelativePath 'docs/commands.html'
+
+ $commandsPage | Should -Match '
Set up a project'
+ $commandsPage | Should -Match 'Set up a project
'
+ $commandsPage | Should -Match ''
+ $script:siteCssContent | Should -Match '(?s)\.command-card-grid--stacked\s*\{.*?grid-template-columns:\s*1fr;'
+ $commandsPage | Should -Match '
Includes: a pre-question Nova release warning'
+ $commandsPage | Should -Match 'Optional: add the Agentic Copilot starter package'
+ $commandsPage | Should -Not -Match 'valid-PlatyPS help guidance'
+ $commandsPage | Should -Not -Match 'source/helper-script maintainability guidance'
+ }
+
+ It 'keeps Agentic Copilot bold everywhere on the site' {
+ $sitePages = Get-ChildItem -LiteralPath (Join-Path $script:repoRoot 'docs') -Filter '*.html' -File
+
+ foreach ($page in $sitePages) {
+ $content = Get-Content -LiteralPath $page.FullName -Raw
+ $plainMentions = $content -replace 'Agentic Copilot', ''
+
+ $plainMentions | Should -Not -Match 'Agentic Copilot' -Because $page.Name
+ }
+ }
+
+ It 'keeps the getting-started Agentic quickstart copy split into readable paragraphs' {
+ $gettingStartedPage = & $script:getHtmlContent -RelativePath 'docs/getting-started.html'
+
+ $gettingStartedPage | Should -Match '(?s)optional Agentic Copilot starter package\.\s*The starting version prompt now defaults to 0\.1\.0-preview'
+ $gettingStartedPage | Should -Match '(?s)ignored\s+without overwriting existing ignore\s*rules\.
\s*The Agentic package follows Nova''s maintained agentic guidance'
+ $gettingStartedPage | Should -Match '(?s)changed or generated text files\.
\s*Nova then creates a project folder under the path you selected\.
'
+ }
+
+ It 'keeps the core-workflows scaffold explanation split into readable paragraphs' {
+ $coreWorkflowsPage = & $script:getHtmlContent -RelativePath 'docs/core-workflows.html'
+
+ $coreWorkflowsPage | Should -Match '(?s)optional\s*Agentic Copilot starter package after the Git prompt\.\s*The starting version prompt now defaults to\s*0\.1\.0-preview'
+ $coreWorkflowsPage | Should -Match '(?s)artifact paths are ignored\s+without overwriting existing rules\.
\s*The Agentic prompt defaults to No'
+ $coreWorkflowsPage | Should -Match '(?s)changed or generated text files\.
\s*The generated project\.json also starts with Nova''s standard Pester'
+ }
+
+}
diff --git a/tests/private/scaffold/CopyNovaExampleProjectTemplate.Tests.ps1 b/tests/private/scaffold/CopyNovaExampleProjectTemplate.Tests.ps1
index ad3bad81..5f2da395 100644
--- a/tests/private/scaffold/CopyNovaExampleProjectTemplate.Tests.ps1
+++ b/tests/private/scaffold/CopyNovaExampleProjectTemplate.Tests.ps1
@@ -9,8 +9,10 @@ Describe 'Copy-NovaExampleProjectTemplate' {
BeforeAll {
$script:templateRoot = New-Item -ItemType Directory -Path (Join-Path ([System.IO.Path]::GetTempPath()) ([guid]::NewGuid().Guid))
$null = New-Item -ItemType Directory -Path (Join-Path $script:templateRoot 'src')
+ $null = New-Item -ItemType Directory -Path (Join-Path $script:templateRoot 'tests/public') -Force
Set-Content -LiteralPath (Join-Path $script:templateRoot 'project.json') -Value '{}' -NoNewline
Set-Content -LiteralPath (Join-Path $script:templateRoot 'src/example.ps1') -Value '# example' -NoNewline
+ Set-Content -LiteralPath (Join-Path $script:templateRoot 'tests/public/example.tests.ps1') -Value '# test' -NoNewline
$script:destination = New-Item -ItemType Directory -Path (Join-Path ([System.IO.Path]::GetTempPath()) ([guid]::NewGuid().Guid))
}
@@ -27,6 +29,20 @@ Describe 'Copy-NovaExampleProjectTemplate' {
Test-Path -LiteralPath (Join-Path $script:destination 'project.json') | Should -BeTrue
Test-Path -LiteralPath (Join-Path $script:destination 'src/example.ps1') | Should -BeTrue
+ Test-Path -LiteralPath (Join-Path $script:destination 'tests/public/example.tests.ps1') | Should -BeTrue
Assert-MockCalled Get-NovaModuleProjectTemplatePath -Times 1 -ParameterFilter {$Example.IsPresent}
}
+
+ It 'copies the packaged example template with source-mirrored tests and enabled coverage defaults' {
+ $destination = New-Item -ItemType Directory -Path (Join-Path $TestDrive 'PackagedExample')
+ Mock Get-NovaModuleProjectTemplatePath {return (Join-Path $projectRoot 'src/resources/example/project.json')}
+
+ Copy-NovaExampleProjectTemplate -DestinationPath $destination.FullName
+
+ $projectJson = Get-Content -LiteralPath (Join-Path $destination 'project.json') -Raw | ConvertFrom-Json -AsHashtable
+
+ $projectJson.Pester.CodeCoverage.Enabled | Should -BeTrue
+ Test-Path -LiteralPath (Join-Path $destination 'tests/public/Get-ExampleGreeting.Tests.ps1') | Should -BeTrue
+ Test-Path -LiteralPath (Join-Path $destination 'tests/private/Get-ExampleConfiguration.Tests.ps1') | Should -BeTrue
+ }
}
diff --git a/tests/private/scaffold/WriteNovaModuleProjectJson.Tests.ps1 b/tests/private/scaffold/WriteNovaModuleProjectJson.Tests.ps1
index 669ff52c..af3e09e1 100644
--- a/tests/private/scaffold/WriteNovaModuleProjectJson.Tests.ps1
+++ b/tests/private/scaffold/WriteNovaModuleProjectJson.Tests.ps1
@@ -5,7 +5,14 @@ BeforeAll {
function Read-ProjectJsonData {param($ProjectJsonPath) @{
ProjectName='X'; Description='X desc'; Version='0.0.1'
Manifest = @{Author='?'; PowerShellHostVersion='5.1'; GUID='00000000-0000-0000-0000-000000000000'}
- Pester = @{Enabled=$true}
+ Pester = @{
+ Enabled = $true
+ CodeCoverage = @{
+ Enabled = $true
+ Path = @('src/public/*.ps1')
+ CoveragePercentTarget = 90
+ }
+ }
}}
function Write-ProjectJsonData {param($ProjectJsonPath,$Data) $script:writtenPath=$ProjectJsonPath; $script:writtenData=$Data}
}
@@ -39,5 +46,6 @@ Describe 'Write-NovaModuleProjectJson' {
Write-NovaModuleProjectJson -Answer $answer -ProjectJsonFile '/out/project.json' -Example
$script:writtenData.Manifest.GUID | Should -Be '00000000-0000-0000-0000-000000000000'
$script:writtenData.ContainsKey('Pester') | Should -BeTrue
+ $script:writtenData.Pester.CodeCoverage.Enabled | Should -BeTrue
}
}