firstsun-dev_git-files-sync/archive/2026-07.md
ClaudiaFang 4fb27854fa chore: update harness state for GraphQL push + post-push status fix
Records feat-014 (GitHub GraphQL batch push/delete, commit 114a575) and
feat-015 (avoid stale remote-tree read after push, commit 7676325) as
done. Also archived feat-011/012/013 and other completed narratives out
of progress.md (had grown past its own 80-line cleanup threshold) into
archive/2026-07.md, and trimmed feature_list.json evidence strings under
300 chars — harness self-audit was 96/100, now 100/100.
2026-07-14 11:54:32 +00:00

3.1 KiB

Progress Archive — 2026-07

One archive file per calendar month. Each entry is one line: feature id/name + commit hash. Debugging narrative and design discussion belong in the commit message, not here. Start a new archive/YYYY-MM.md file when the month rolls over — don't let a single archive file grow without bound either.

  • feat-001: Project Setup verified clean (npm install/lint/build/test) (commit 28f4f8e)
  • feat-002: Settings UX bundle implemented — conflict modal resize + tabs (#42), connection status badge (#41), local ignore patterns (#40); 254 tests pass, lint/build clean (commit 28f4f8e, branch claude/settings-ux-improvements-260713)
  • feat-005: Folder picker for root path / vault folder settings (#48) (commit c107979)
  • feat-003: Symlinked directories no longer break pull discovery (#33) — root cause: local scan recursed into a directory symlink as if it were a real tree, producing bogus remote .gitignore 404s and a permanently-stuck "remote only" status (commit 4c8896b)
  • feat-006: Tree-SHA-based refresh (#36) — status check now compares a locally-computed git blob SHA against each tree entry's SHA instead of a per-file getFile network request; diff content fetched on demand via new getBlob(sha,path) (commit 2ed5a43)
  • feat-007: Clear error when requestUrl() itself rejects with an HTML body (#31) — some Obsidian versions eagerly JSON-parse inside requestUrl(), so a login/proxy HTML page rejected the whole call with a raw SyntaxError bypassing the existing parseJson() HTML-detection wrapper (commit a867217)
  • feat-008: "What's new" modal after a version bump (#39) — hand-curated src/changelog.ts (separate from auto-generated CHANGELOG.md) with a notable flag per entry, numeric compareVersions(), WhatsNewModal shown once per upgrade (commit 4eebebc)
  • All six of the above (feat-002/003/005/006/007/008) consolidated onto branch claude/fix-directory-symlink-pull-260713 → PR #51 (open, not yet merged) to keep the PR count down per user request; PRs #49/#50/#52/#53 closed/auto-resolved as superseded
  • feat-011: perf(push): batch-commit push-all + SHA-based diffing — new GitServiceInterface.pushBatch, sync-manager classifies files via local git blob SHA vs. one pre-fetched tree instead of per-file getFile (commit c28e0ec)
  • feat-012: perf(delete): batch-commit remote-only file deletion — new GitServiceInterface.deleteBatch, mirrors pushBatch (commit d8e3663)
  • Issue #78: remote-repo root path picker now suggests from the remote tree, delete-remote-only-file silent failures fixed (3 root causes: unencoded path 404s, EISDIR on folder/remote-record collisions, wrong vaultFolder-prefixed path passed to deleteFile), SyncStatusView test coverage added (commits 896d77b, 563a28e merge, fa42fea, f1420f0)
  • feat(ui): persistent connection status badge in the global status bar, plus a theme-contrast follow-up fix (commits 83499c9, 12cce64)
  • feat-013: perf(push): parallelize blob creation within a batch commit — BaseGitService.mapWithConcurrency + BLOB_CREATE_CONCURRENCY=8 for GitHub/Gitea's pushBatch (GitLab unaffected, already single-request) (commit c7ae0f6)