18 Commits

Author SHA1 Message Date
“mkczarkowski” 4d2db4bf9d chore(archive): close content-overwrite, cumulative-manifest, user-edit-protection, e2e
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 21:22:19 +02:00
“mkczarkowski” 796896ca26 chore(content-overwrite): track research change folder
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 21:18:04 +02:00
“mkczarkowski” 201d779bad chore(cumulative-manifest): close out plan + document cumulative manifest (epilogue)
Final SHA write-back into plan progress rows, change.md → implemented.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 20:55:08 +02:00
“mkczarkowski” c37f96f5c3 feat(cumulative-manifest): cumulative writer logic + scoped removal (p2)
Rewrite computeRemovals() for lesson-scoped removal with protected set.
Update manifest building to merge lesson entries, rebuild union files,
and seed from v2/v3-without-lessons manifests. Update existing cleanup
and removal tests for cumulative semantics. Add 8 new behavior tests
covering multi-lesson accumulation, protected-set, upgrade seeding.
Update CLAUDE.md with cumulative manifest documentation.

Files: src/lib/writer.ts, tests/writer.test.ts,
       tests/writer-profiles.test.ts, CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 20:54:41 +02:00
“mkczarkowski” 7c80b292f9 feat(cumulative-manifest): manifest schema extension (p1)
Add LessonFilesEntry type, lessons? field on CliManifest, isManifest()
validation for lessons, and buildUnionFiles() helper. Includes frame
brief, plan, and plan-brief for the change.

Files: src/lib/manifest.ts, tests/manifest.test.ts,
       context/changes/cumulative-manifest/{change,frame,plan,plan-brief}.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 20:49:19 +02:00
“mkczarkowski” 632a946c93 chore(cumulative-manifest): add research for folding into v3
Analysis of how cumulative per-lesson tracking integrates with
user-edit-protection's v3 manifest, proposed schema shape, upgrade
paths, computeRemovals() rewrite strategy, and interaction matrix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 19:06:53 +02:00
“mkczarkowski” 134388a637 docs(user-edit-protection): close out plan + document writer conflict detection (epilogue)
- Update CLAUDE.md with conflict detection, manifest v3, and removal tracking docs
- Set change.md status to implemented
- Write final SHA references into plan progress section

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 18:29:47 +02:00
“mkczarkowski” e0b122c8a2 test(user-edit-protection): comprehensive behavior tests (p4)
- Conflict detection: clean update, user edit, matching edit, each resolution
- v2 manifest upgrade: false positive on diff, clean match, v3 upgrade, 3-way after upgrade
- Removal tracking: skill/prompt removals, empty on fresh, dry-run populates
- Hash persistence: stored after apply, preserved on skip, updated on overwrite/save_user
- Non-TTY conflict resolver: always skips without prompting
- Update get-command test types for new counts.removals field

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 18:28:52 +02:00
“mkczarkowski” 802ea46a63 feat(user-edit-protection): interactive prompts + output rendering (p3)
- Create conflict-prompt.ts with TTY/non-TTY conflict resolver factory
- Wire createConflictResolver and showUpgradeNotice into get command
- Add v2 manifest upgrade detection before applyBundle
- Render [removed] lines for skill/prompt/config removals
- Render conflict-specific action labels (conflict: overwritten/saved .user/skipped)
- Add removals to JSON output envelope with counts.removals
- Update get-command test for new counts shape

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 18:23:59 +02:00
“mkczarkowski” 536ccf6728 feat(user-edit-protection): writer three-way detection + removal tracking (p2)
- Make applyBundle() async with ConflictResolver callback injection
- Three-way conflict detection via stored content hashes in manifest
- Conflict resolutions: overwrite, save-as-.user.<ext>, skip
- Track removals in WriteResult.removals for downstream rendering
- Store per-file contentHashes and promptHashes in v3 manifest
- Update all tests for async applyBundle (writer + writer-profiles)
- Await applyBundle in get.ts command

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 18:21:22 +02:00
“mkczarkowski” ed64a987e1 feat(user-edit-protection): manifest v3 schema + contentHash utility (p1)
- Bump MANIFEST_VERSION to 3 with optional contentHashes/promptHashes fields
- Add contentHash() SHA-256 utility in manifest.ts
- isManifest() accepts both v2 and v3 for backward compat
- Update test assertions for v3 manifest version

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-27 18:16:40 +02:00
“mkczarkowski” 06d841f27a fix(e2e): review fixes — kill timer, fetch check, temp cleanup, earlyExit race
- cli.ts: add 60s kill timer to spawnCli, export cleanupTempDirs()
- auth-flow.test.ts: add earlyExit Promise.race + callback response check
- auth-setup.ts: check callback response status
- doctor.test.ts: use getE2EEnv().testEmail instead of hardcoded string
- all test files: add afterAll(cleanupTempDirs) hooks
- reviews/impl-review.md: save full review report

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 15:31:42 +02:00
“mkczarkowski” 3ce2819345 chore(e2e): close out plan (epilogue)
- plan.md: write SHA e95e9a0 to phase 5 progress rows
- change.md: status → implemented

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 15:18:04 +02:00
“mkczarkowski” e95e9a0c78 feat(e2e): CI workflow — e2e jobs and Windows smoke tests (p5)
- .github/workflows/ci.yml: add e2e + e2e-windows jobs with Resend secrets,
  extend check-windows with build:binary + smoke tests
- docs/reference/platform-support.md: update CI testing table to match reality
- context/changes/e2e/plan.md: mark phase 5 automated steps complete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 15:16:12 +02:00
“mkczarkowski” b12e8ff572 feat(e2e): authenticated command tests — doctor, list, get (p4)
Files: tests/e2e/doctor.test.ts, tests/e2e/list.test.ts,
tests/e2e/get.test.ts, tests/e2e/support/auth-setup.ts,
context/changes/e2e/plan.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 15:08:27 +02:00
“mkczarkowski” d97ed75678 feat(e2e): auth flow e2e test with Resend magic-link verification (p3)
Files: tests/e2e/auth-flow.test.ts, tests/e2e/support/auth-setup.ts,
context/changes/e2e/plan.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 14:49:37 +02:00
“mkczarkowski” 9ec3798294 feat(e2e): auth-free e2e tests — global flags and unauthenticated auth (p2)
Files: tests/e2e/global-flags.test.ts, tests/e2e/auth-no-credentials.test.ts,
context/changes/e2e/plan.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 14:36:09 +02:00
“mkczarkowski” 40454c4eca feat(e2e): e2e infrastructure — spawn helper, Resend utility, env config (p1)
Files: tests/e2e/support/cli.ts, tests/e2e/support/env.ts,
tests/e2e/support/resend-magic-links.ts, tests/e2e/.env.test.example,
.gitignore, context/changes/e2e/{change,research,plan}.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 14:33:13 +02:00