Phase 1 foundation + repo conventions#1
Merged
Conversation
Lands the UI-free Core (domain, substitution engine, JSON store, settings,
backup, first-run seed) with 63 unit tests, plus the project-wide ground rules
that the rest of the build will follow.
Core (Snipdeck.Core, net10.0):
- Models: Cli, Snip, Parameter (Text / Choice), AppConfig, HotkeyBinding
(values matching Win32 MOD_*), ThemePreference, CloseBehaviour, BackupInfo,
versioned SnipStoreDocument.
- Engine: SubstitutionEngine with a strict {placeholder} regex (so JSON braces
pass through), returning resolved text plus the unresolved-token list in
first-appearance order for live previews.
- Abstractions: ISnipStore, ISettingsStore, IBackupService, IClock.
- Services: JsonSnipStore / JsonSettingsStore with temp-file-then-rename
atomic writes and schema-version guards; BackupService with default
retention 20 + collision-safe filenames + prune-by-pattern-only;
SystemClock; ExamplesSeed for the first-run "Examples" CLI.
Repo conventions:
- Apache 2.0 LICENSE.
- README and Keep-a-Changelog CHANGELOG.
- CONTRIBUTING.md covering prerequisites, the Core/App boundary discipline,
package policy, brace rule, British English, the tag-driven release flow.
- .editorconfig taken verbatim from
StuartMeeks/NextIteration.SpectreConsole.SelfUpdate.
- Directory.Build.props with Authors / Company / dynamic copyright, nullable,
implicit usings, LangVersion=latest, TreatWarningsAsErrors=true,
EnforceCodeStyleInBuild=true.
- Directory.Packages.props for Central Package Management
(ManagePackageVersionsCentrally + CentralPackageTransitivePinningEnabled).
- GitHub Actions: ci.yml (Core on ubuntu, full solution on windows) and
release.yml (tag-driven, stable vs pre-release detected from the tag,
publishes Snipdeck.App and packs with Velopack).
CLAUDE.md updated with the four confirmed product decisions (configurable
hide-to-tray default, every-write backups keeping 20, default Ctrl+Alt+S
hotkey, single Examples CLI on first run) plus the latest-NuGet,
README/CHANGELOG-as-you-go, and Apache 2.0 conventions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* maps to Stuart so any change automatically requests his review under the branch ruleset. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
App.xaml.cs and MainWindow.xaml.cs shipped with the Visual Studio template's cargo-culted using list (System / Windows / Microsoft.UI.Xaml in the wrong group order, with most entries unused). Under TreatWarningsAsErrors this trips IDE0005 (unused using) and IDE0055 (formatting / group ordering). Reduce each file to the single using actually needed (Microsoft.UI.Xaml) and drop the boilerplate comment. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Snipdeck.Core(domain models, substitution engine, JSON store with atomic writes, settings, backup, first-run seed) with 63 unit tests.editorconfig,Directory.Build.props(TreatWarningsAsErrors,Authors = Stuart Meeks,Company = Next Iteration), Central Package Management viaDirectory.Packages.propsCONTRIBUTING.md, Keep-a-ChangelogCHANGELOG.md,CODEOWNERS, CI + tag-driven Velopack release workflowsWhat's in
Snipdeck.CoreModels/:Cli,Snip,Parameter(Text / Choice),AppConfig,HotkeyBinding(values matching Win32MOD_*),ThemePreference,CloseBehaviour,BackupInfo, versionedSnipStoreDocumentEngine/SubstitutionEngine— strict{placeholder}source-generated regex; JSON braces pass through; returns resolved text + unresolved tokens in first-appearance order for live previewAbstractions/:ISnipStore,ISettingsStore,IBackupService,IClockServices/:JsonSnipStoreandJsonSettingsStorewith temp-file-then-rename atomic writes + schema-version guards;BackupServicewith default retention 20 + collision-safe filenames;SystemClock;ExamplesSeedfor the first-run "Examples" CLICLAUDE.md decisions baked in
Test plan
dotnet build src/Snipdeck.Coreclean, 0 warnings underTreatWarningsAsErrorsdotnet test tests/Snipdeck.Core.Tests— 63 passed, 0 failed in ReleaseSnipdeck.Appbuilds on Windows (CI'sapp-buildjob onwindows-latest)🤖 Generated with Claude Code