Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## What changed

<!-- Summarize the implementation. -->

## Safety impact

- [ ] Audit-only change
- [ ] Changes Windows policy
- [ ] Changes an optional feature
- [ ] May delete existing Recall snapshots
- [ ] May require restart

## Validation

- [ ] PSScriptAnalyzer
- [ ] Pester on Windows PowerShell 5.1
- [ ] Pester on PowerShell 7
- [ ] Tested on a device where Recall is unavailable
- [ ] Tested on an eligible Copilot+ PC
- [ ] Restore tested
- [ ] Screenshots redacted

## Documentation

<!-- Note updated diagrams, screenshots, policy references, or release notes. -->
52 changes: 52 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Package RecallManager release

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: Version without the v prefix
required: true
default: 1.0.0-beta.1

permissions:
contents: write

jobs:
package:
runs-on: windows-latest
steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Resolve version
id: version
shell: pwsh
run: |
if ('${{ github.event_name }}' -eq 'workflow_dispatch') {
$version = '${{ inputs.version }}'
}
else {
$version = '${{ github.ref_name }}'.TrimStart('v')
}
"version=$version" >> $env:GITHUB_OUTPUT

- name: Build ZIP and checksum
shell: powershell
run: .\build\Package-Release.ps1 -Version '${{ steps.version.outputs.version }}'

- name: Upload package artifact
uses: actions/upload-artifact@v4
with:
name: RecallManager-${{ steps.version.outputs.version }}
path: dist/*

- name: Attach files to GitHub release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
prerelease: ${{ contains(github.ref_name, 'beta') || contains(github.ref_name, 'rc') }}
files: dist/*
generate_release_notes: true
58 changes: 58 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Validate RecallManager

on:
pull_request:
push:
branches:
- main
- 'agent/**'

permissions:
contents: read

jobs:
test:
runs-on: windows-latest
strategy:
matrix:
shell:
- powershell
- pwsh

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Install validation modules
shell: ${{ matrix.shell }}
run: |
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module Pester -MinimumVersion 5.5.0 -Force -Scope CurrentUser
Install-Module PSScriptAnalyzer -Force -Scope CurrentUser

- name: Run PSScriptAnalyzer
shell: ${{ matrix.shell }}
run: |
# RecallManager intentionally uses Write-Host for its interactive terminal UI.
$results = Invoke-ScriptAnalyzer -Path . -Recurse -Severity Warning,Error -ExcludeRule PSAvoidUsingWriteHost
$results | Format-Table -AutoSize
if ($results) { throw 'PSScriptAnalyzer reported findings.' }

- name: Run Pester
shell: ${{ matrix.shell }}
run: |
$config = New-PesterConfiguration
$config.Run.Path = '.\tests'
$config.Output.Verbosity = 'Detailed'
$config.TestResult.Enabled = $true
$config.TestResult.OutputPath = 'TestResults.xml'
$config.TestResult.OutputFormat = 'NUnitXml'
Invoke-Pester -Configuration $config

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: pester-${{ matrix.shell }}
path: TestResults.xml
if-no-files-found: ignore
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
*.log
*.tmp
*.bak
TestResults/
coverage/
.vscode/
.idea/
RecallManager-Audit-*.json
recall-backup-*.json
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Changelog

All notable changes to RecallManager are documented here.

## [1.0.0-beta.1] - 2026-07-18

### Added

- State-aware Recall audit covering Windows build, optional-feature state, machine policy, and current-user policy.
- Effective-state explanation instead of a raw enabled/disabled flag.
- Four desired-state profiles: AuditOnly, UserControlled, SnapshotsOff, and PrivacyHardened.
- Change planning, native `WhatIf`, confirmation gates, pre-change JSON backup, post-change verification, and restore.
- Human-readable and JSON output for support, RMM, and endpoint workflows.
- PowerShell module architecture with public/private separation.
- Pester and PSScriptAnalyzer workflow for Windows.
- Product documentation, Mermaid diagrams, screenshot placeholders, and a website launch brief.

### Changed

- Replaced the original interactive-only DISM toggle with a command-oriented CLI while retaining an interactive menu.

### Safety

- Snapshot contents are never read.
- Destructive profiles are clearly identified and require confirmation by default.
- Main is not targeted by this launch work until testing is complete.
21 changes: 21 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Contributing

RecallManager changes can affect Windows privacy settings and optional features. Contributions should favor documented Windows interfaces, idempotent behavior, explicit confirmation, and reversible changes.

## Development flow

1. Create a branch from `main`.
2. Keep public commands in `src/RecallManager/Public` and internal helpers in `Private`.
3. Add or update Pester tests.
4. Run PSScriptAnalyzer and Pester on Windows PowerShell 5.1 and PowerShell 7 where practical.
5. Document any destructive or restart-requiring behavior.
6. Open a pull request; do not commit feature development directly to `main`.

## Design rules

- Prefer official PowerShell, DISM, Group Policy, or Policy CSP surfaces.
- Never open, copy, decrypt, or inspect Recall snapshot contents.
- Build a plan before changing state.
- Back up every setting RecallManager changes.
- Re-query Windows after changes; do not treat command success as verification.
- Keep profiles declarative in `config/profiles.json`.
Loading