diff --git a/.changelog/v0.7.x.md b/.changelog/v0.7.12.md similarity index 95% rename from .changelog/v0.7.x.md rename to .changelog/v0.7.12.md index 6461c9d8..55ee07bb 100644 --- a/.changelog/v0.7.x.md +++ b/.changelog/v0.7.12.md @@ -1,4 +1,4 @@ -# Release v0.7.x - Migration Map, AI Discovery Improvements +# Release v0.7.12 - Migration Map, AI Discovery Improvements Released: Unreleased @@ -23,7 +23,7 @@ This release improves the AI Discovery feature with dismiss functionality, debug - GET `/api/ai-discovery/debug/runs/:runId` - detailed run info including prompt preview and output - Error details capture (last 10 lines of stderr/stdout) stored on failed runs -### Migration Map Visualization (v0.7.x) +### Migration Map Visualization (v0.7.12) - New 6th tree view mode: "Migration Map" plots ancestors on an interactive world map - Leaflet.js map with OpenStreetMap/CartoDB dark tiles - Lineage-colored markers (paternal=blue, maternal=red) with generation depth variation diff --git a/.changelog/v0.8.x.md b/.changelog/v0.8.x.md new file mode 100644 index 00000000..3972aea7 --- /dev/null +++ b/.changelog/v0.8.x.md @@ -0,0 +1,48 @@ +# v0.8.x + +## Added +- 12 shared server utilities (`paths`, `downloadImage`, `parseYear`, `lifespan`, `validation`, `asyncHandler`, `sseHelpers`, `operationTracker`, `resolveCanonical`, `browserConnect`, `applyOverrides`, `batchFetchPersons`) +- `useBrowserConnection` and `useSSE` client hooks for deduplication +- Path traversal defense-in-depth across all file-serving endpoints +- FTS5 query sanitization for search +- CORS origin restriction via `CORS_ORIGIN` env var +- Request body whitelisting on provider/browser routes +- URL validation replacing string `includes()` checks +- `--dry-run` flag for purge script +- AbortController cleanup on PersonDetail navigation +- PWA support: favicon, manifest, apple-touch-icon, theme-color + +## Changed +- CI no longer auto-increments version on push to dev +- Release workflow no longer bumps version after release (changelog archiving preserved) +- CI permissions downgraded from `contents: write` to `contents: read` +- `process.exit(1)` in fetcher replaced with typed error +- ID mapping cache changed from FIFO to LRU eviction +- AI discovery runs bounded with MAX_STORED_RUNS limit +- Path finding guarded against infinite loops +- Error handler now logs stack traces +- `requestTimeout` middleware wired up +- `Person.parents` type corrected to `(string | null)[]` +- Scripts standardized on `import.meta.dirname` and shared types + +## Fixed +- `person_computed` view multi-row bug in vital event joins +- `typeof gen !== '?'` bug in logPerson +- Stale closures in IntegrityPage loader functions +- D3 zoom cleanup missing in SparseTreePage +- `useSocket` spread in deps array causing re-renders +- `useSocketConnection` returning stale snapshot instead of reactive state +- Dead state (`setScrapedData`, `setImportFile`) removed +- Safe JSON.parse on localStorage in PersonDetail +- Purge script whole-token matching (prevents partial ID matches) +- Migration script wrapped in transaction + +## Removed +- 20+ duplicate `DATA_DIR` declarations across services +- 3 duplicate `downloadImage` implementations +- 7 duplicate SSE header setup blocks +- 15 duplicate ULID validation blocks in person routes +- 3 duplicate browser connection blocks +- 3 duplicate operation tracker implementations +- 6 duplicate photo-serve route handlers +- Duplicate `BrowserStatus` interface in IndexerPage diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3b5f3f8..30f757e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ concurrency: cancel-in-progress: true permissions: - contents: write + contents: read jobs: build: @@ -151,41 +151,3 @@ jobs: name: scraper-test-results path: test-results/ retention-days: 7 - - bump-version: - name: Bump Version - runs-on: ubuntu-latest - needs: [unit-tests, integration-tests, scraper-tests] - # Only on push to dev, not PRs, and only if all tests passed - if: | - github.event_name == 'push' && - github.ref == 'refs/heads/dev' && - !contains(github.event.head_commit.message, '[skip ci]') - - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Bump patch version - run: | - CURRENT_VERSION=$(node -p "require('./package.json').version") - MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1) - MINOR=$(echo $CURRENT_VERSION | cut -d. -f2) - PATCH=$(echo $CURRENT_VERSION | cut -d. -f3) - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - - npm version $NEW_VERSION --no-git-tag-version - cd shared && npm version $NEW_VERSION --no-git-tag-version && cd .. - cd client && npm version $NEW_VERSION --no-git-tag-version && cd .. - cd server && npm version $NEW_VERSION --no-git-tag-version && cd .. - - git add package.json package-lock.json shared/package.json client/package.json server/package.json - git commit -m "build: bump version to $NEW_VERSION [skip ci]" - git push diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 10086932..d575d011 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -100,19 +100,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Prep dev branch for next release + - name: Archive changelog on dev branch if: steps.tag-check.outputs.exists == 'false' run: | - # Get current version (the one we just released) CURRENT_VERSION=${{ steps.package-version.outputs.version }} MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1) MINOR=$(echo $CURRENT_VERSION | cut -d. -f2) MAJOR_MINOR="$MAJOR.$MINOR" - # Increment minor, reset patch to 0 - NEW_MINOR=$((MINOR + 1)) - NEW_VERSION="$MAJOR.$NEW_MINOR.0" - # Checkout dev branch git fetch origin dev git checkout dev @@ -143,14 +138,3 @@ jobs: git push origin main git checkout dev fi - - # Update package.json files for next version - npm version $NEW_VERSION --no-git-tag-version - cd shared && npm version $NEW_VERSION --no-git-tag-version && cd .. - cd client && npm version $NEW_VERSION --no-git-tag-version && cd .. - cd server && npm version $NEW_VERSION --no-git-tag-version && cd .. - - # Commit and push version bump - git add package.json package-lock.json shared/package.json client/package.json server/package.json - git commit -m "build: prep v$NEW_VERSION for next release [skip ci]" - git push origin dev diff --git a/.gitignore b/.gitignore index f2ab2667..917284b4 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,7 @@ client/public/playwright-report/ # Screenshots (may contain personal family data) images/ -.playwright-mcp \ No newline at end of file +.playwright-mcp + +# Terminal themes +.ghostty-theme \ No newline at end of file diff --git a/client/index.html b/client/index.html index 1e0db263..d2ed38be 100644 --- a/client/index.html +++ b/client/index.html @@ -2,9 +2,16 @@
-