CopilotAtelier.psd1
|
@{ RootModule = 'CopilotAtelier.psm1' # Replaced at build time by GitVersion. ModuleVersion = '4.0.0' GUID = '67bbef0b-f4de-4c1b-bb5a-b34104beb5b7' Author = 'raandree' CompanyName = 'raandree' Copyright = '(c) raandree. All rights reserved.' Description = 'Portable GitHub Copilot customization library. Ships custom agents, auto-applied instructions, on-demand skills, prompt templates, and lifecycle hooks, and installs them into the well-known ~/.copilot discovery folders that VS Code, the GitHub Copilot CLI, and Claude Code read.' PowerShellVersion = '5.1' FunctionsToExport = @('Get-CopilotAtelierVersion','Install-CopilotAtelier','Update-CopilotAtelier') CmdletsToExport = @() VariablesToExport = @() AliasesToExport = @() PrivateData = @{ PSData = @{ Tags = @( 'Copilot' 'GitHubCopilot' 'VSCode' 'Agents' 'Skills' 'Prompts' 'Instructions' 'Hooks' 'AI' 'Windows' 'Linux' 'MacOS' ) LicenseUri = 'https://github.com/raandree/CopilotAtelier/blob/main/LICENSE' ProjectUri = 'https://github.com/raandree/CopilotAtelier' IconUri = 'https://raw.githubusercontent.com/raandree/CopilotAtelier/main/assets/CA-glyph-on-light.png' Prerelease = 'preview0003' ReleaseNotes = '## [4.0.0-preview0003] - 2026-08-15 ### Added - **`brand-logo` Prompt** (2026-08-14). `brand-logo-system` answers "how do I build the asset set" but nothing started the conversation, and the first question an identity task needs — what should the mark actually show — is the one an agent is most likely to skip and guess. The Prompt front-loads it: search the repository for an existing mark first and, when one is found, ask only whether to keep, refine, or replace it rather than interviewing the user about a decision the repository already made; otherwise interview in two `vscode_askQuestions` clusters covering subject, visual treatment, character, colour source, wordmark split, and delivery target. Concepts are proposed as 256 px proofs before eleven assets are built from a guess, and the closing rules restate the two claims that cost time in practice: never invent an identity for a project that already has one, and never assert favicon legibility without a 16 px render. - **`brand-logo-system` Skill** (2026-08-14). Producing a project identity had been done by hand twice, and both runs rediscovered the same three failures. A text substitution over `width=`/`height=` to resize an SVG also matches every nested `<use>` and `<rect>` and silently scales each one to the full canvas — the fix is to set the attributes on the root element only. The "transparent" assets in the shared logo library are opaque PNGs with a checkerboard painted into their pixels, measured at 0 % transparent pixels, so their transparency cannot be reused and must not be imitated. And a design board that asserts the mark "holds its silhouette" at favicon size is a claim, not a fact: the 16 px render of a detailed mark disproved it, which is why the renderer now takes an optional reduced favicon glyph and a caller-supplied scalability note. The Skill carries the eleven-slot library layout, the dark-mode-means-reversed convention, and a measured verification gate over count, naming, slot parity, canvas size, corner alpha, painted bounds, centring, and ink coverage at 32 and 16 px. [`scripts/Export-BrandLogoSet.ps1`](Skills/brand-logo-system/scripts/Export-BrandLogoSet.ps1) composes all eleven slots from one `.psd1` plus two or three glyph fragments, so a project''s only bespoke artwork is its glyph. Proven end to end against AutomatedLab, whose palette and gear-and-flask mark were recovered from the project''s own 2025 logo by pixel count rather than invented. ### Changed - **`brand-logo-system` covers integrating the assets into a project** (2026-08-14). The Skill produced a library set and stopped, so wiring the mark into a repository was improvised every time it came up. Step 5 now carries it, and carries the parts that are not guessable: a `<table>` cannot give the README a borderless two-column header because github.com draws a 1px border on every cell and its sanitiser strips the style that would remove it, so the mark is floated and closed with `<br clear="left">`; the wordmark replaces the `<h1>` rather than sitting above one, which is why `MD041` stays disabled for the file; a package `IconUri` must be a direct image URL, because a repository URL is accepted and then silently shows a placeholder. Integration asks which repository first — the library holds many projects and a session usually has several open, so "add the logo" names no target and a brand commit in the wrong project is noise its owner has to find and revert — and a project that is not the user''s to change gets a block to paste instead. The trigger queries said the opposite of the new boundary: "add an IconUri to the module manifest" was a negative pointing at `sampler-framework` and is now a positive, joined by header-layout, placeholder-icon, and social-preview positives, and by a screenshot-in-the-README negative that keeps `windows-gui-screenshot-capture` from being swallowed. The `brand-logo` Prompt gained the matching phase, and its delivery-target option no longer names a folder the Skill contradicts. - **`AGENTS.md` states the atomic change set for a Skill and a Custom agent** (2026-08-12). A Customization is never one file, and a half-added one leaves the catalogue, the trigger coverage, and the changelog disagreeing with each other. The new *Atomic change sets* section names every artifact that has to move in the same commit for each, and tables which test catches which kind of drift — so the answer to "what else does this change need?" is in the house rules rather than in a reviewer''s memory. - **`pester-patterns` split into a body plus two references** (2026-08-11). The body was 796 lines against the 500-line progressive-disclosure budget and had been carried on the `SkillFrontmatter` over-budget baseline rather than fixed. It is now 149 lines. What stayed is what an agent needs on *every* Pester run: pattern 0, run tests through the fully detached launcher, and pattern 14, helpers used inside `It` must live in `BeforeAll`. What moved is what it needs *sometimes* — patterns 1 to 3 into [`references/mocking-external-dependencies.md`](Skills/pester-patterns/references/mocking-external-dependencies.md) and patterns 4 to 13 into [`references/testing-powershell-constructs.md`](Skills/pester-patterns/references/testing-powershell-constructs.md), both one level deep, both keeping their original numbers so existing references still resolve. The frontmatter `description` is untouched, so the trigger surface is unchanged and no eval re-run is owed. Its baseline entry is removed in the same change, so the gate proves the fix rather than recording the intent; nine Skills remain baselined, `german-legal-research` at 780 lines the worst of them. - **`.memory-bank/systemPatterns.md` curated from 106 lines to 86** (2026-08-11). It sat 4 lines under its 110-line budget and warned on every build, while the Decision index that must stay grows by a line per record. The repository tree at the top is what went: a changing inventory of the working tree, duplicating `techContext.md`''s module layout, deployment boundary, and discovery model, and contradicting the file''s own closing rule to index durable relationships only. The build warning is gone and the routing reduction improved from 55.69 % to 56.11 % against its 50 % floor — curation moves that gate the right way, which is the direction to check before any Memory Bank edit. Two recorded premises did not survive inspection and are corrected here: `techContext.md`''s per-test-file inventory had already been curated away, and the routing gate is not at 49.57 % with roughly 1 KB of headroom. ### Fixed - **CI resolves the `uv` install step again** (2026-08-12). Every test leg failed before it ran a single job step, at *Prepare all required actions*: `Unable to resolve action astral-sh/setup-uv@v9, unable to find version v9`. `astral-sh/setup-uv` stopped publishing a floating major alias after `v7` — `v8.3.2` and `v9.0.0` exist as full release tags, `refs/tags/v8` and `refs/tags/v9` do not — so the reference had never been resolvable. The step is now pinned to `v9.0.0`, which the workflow comment explains, and the step takes no inputs so the major bump carries no configuration risk. The three `actions/*` references in the same workflow were checked against the tag API and all resolve. - **`Set-CustomizationLink` no longer prompts, discards, or follows a link out of the tree** (2026-08-11). Three review findings had been recorded and deferred; all three still reproduced, and the reproductions are now regression tests. The `Read-Host` before replacing a non-empty discovery folder is gone. The function is reachable unattended through the shipped `Update-CopilotAtelier -Force` path, where a prompt does not fail — it waits forever on a host with no console. The opt-in is now `-Force`, surfaced on `Install-CopilotAtelier` and on [`Setup-CopilotSettings.ps1`](Setup-CopilotSettings.ps1); without it a populated folder is left alone and the message names the switch. Interactive users who previously answered `y` in-flight now re-run with `-Force`. A child present in both the folder and the target used to be skipped and then destroyed by the `Remove-Item -Recurse` that followed. Measured against the previous implementation: a file holding `deployed copy, 126 lines` was gone after the merge, leaving only `repository copy, 106 lines` — the same shape as the drift `.memory-bank` already recorded in the wild, where the deployed copy was the newer one. And `Copy-Item -Recurse` followed a junction inside the folder, materialising content from outside the tree inside the target. Both are closed by one rule, recorded as [decision 0020](.memory-bank/decisions/0020-refuse-lossy-customization-merges.md): anything that cannot be merged without losing content stops the merge, and nothing is copied or removed. A child already in the target is dropped only when both sides are files with the same length and the same SHA-256; a directory on either side, a differing file, a child that is a reparse point, and a child containing one at any depth all stop the merge and are named in the report. *Newest wins* was rejected because a timestamp is not evidence, and *source always wins* was rejected because it is the defect. The seven new tests create real junctions on Windows and real symbolic links elsewhere, neither of which needs elevation, so the reparse-point cases are exercised rather than skipped. ### Added - **Pester 4 to 5 migration tooling in `pester-patterns`** (2026-08-12). A v4 suite does not fail loudly on v5, it fails quietly: setup that ran per test now runs once during Discovery, a mock that covered a `Describe` now covers only where it sits, and `Should -Throw` matches with `-like`. A migrated test can pass while asserting less than it did before, so the work needs a detection sweep and a baseline count rather than a careful read of the diff. [`scripts/Find-PesterV4Pattern.ps1`](Skills/pester-patterns/scripts/Find-PesterV4Pattern.ps' } } } |