Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
91f086d
refactor(engine): extract toFileRecord mapper and QUARANTINE_DIR_NAME…
curtyo18 May 18, 2026
c936136
feat(catalog): schema hardening migration 0006
curtyo18 May 18, 2026
cfeb719
refactor(engine): code hygiene — magic numbers, identifier names, str…
curtyo18 May 18, 2026
20f2c6e
fix(organize): write post_hash on completed move/copy/dedupe ops
curtyo18 May 19, 2026
4b1f45f
fix(organize): fsync destination before quarantine + cleanup partial …
curtyo18 May 19, 2026
283fa25
fix(catalog): reconcile branches on op.kind; logs hash-read errors; a…
curtyo18 May 19, 2026
03c356f
fix(organize): failed-undo op records inverse-undo kind via shared he…
curtyo18 May 19, 2026
a5e21e3
feat(catalog): refuse to start on PRAGMA integrity_check failure
curtyo18 May 19, 2026
2a854fe
feat(scan): refuse to scan on volume serial mismatch (spec §5.1)
curtyo18 May 19, 2026
8dff6e3
feat(dedupe): exclude NTFS hardlinks from duplicate proposals (spec §…
curtyo18 May 19, 2026
6b8c6fe
fix(dedupe): respect throttle profile in apply path (spec §6.3)
curtyo18 May 19, 2026
a7b6606
fix(throttle): scheduler aligns to boundary; catches up after sleep (…
curtyo18 May 19, 2026
20dc57d
fix(scan): replace silent catches with structured warn logs
curtyo18 May 19, 2026
3dab575
refactor(scan): extract processOneFile + finishScan from runScan
curtyo18 May 19, 2026
6f20267
fix(api): POST /api/scans fails fast on pre-onStart runScan rejection
curtyo18 May 19, 2026
17fa2e3
feat(api): input hardening + centralised error handler
curtyo18 May 19, 2026
ea191fc
fix(cli): five hardening items — --flag=value, --version, unknown-cmd…
curtyo18 May 19, 2026
1b69d87
fix(catalog): migration FK check inside the transaction (real-migrati…
curtyo18 May 19, 2026
8f8ec90
fix(drives): isPathUnderRoot helper — case-insensitive on Windows
curtyo18 May 19, 2026
bc0fb72
fix(rules): matcher hardening — compile reuse, Windows paths, glob gu…
curtyo18 May 19, 2026
e19eee1
refactor(catalog): settings schema + optimizer through SettingsRepo +…
curtyo18 May 19, 2026
ece89c8
chore(deps): dependency audit — exifr documented; piexifjs removed; v…
curtyo18 May 19, 2026
1b955b8
security(fetch-binaries): SHA-256 verify downloaded MediaInfo + tmpfi…
curtyo18 May 19, 2026
9824dc6
chore(ci): hardening — npm cache, drop lockfile fallback, pin node, t…
curtyo18 May 19, 2026
610ed6b
test(engine): silentLogger / waitForScanStatus / drain helpers + Wind…
curtyo18 May 19, 2026
7fe5b42
chore: address code-review polish — layer inversion, log shape, test …
curtyo18 May 19, 2026
0ea557f
chore: address /code-review feedback — dead code, narrow catch, helpe…
curtyo18 May 19, 2026
3e14126
fix(catalog): migration 0007 — use constant default + UPDATE backfill
curtyo18 May 19, 2026
cf4ab6c
chore(launcher): add Windows start.bat with WSL-aware native-module r…
curtyo18 May 19, 2026
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
10 changes: 3 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,11 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: '22'
node-version: '22.x'
cache: 'npm'

- name: Install dependencies
run: |
if [ -f package-lock.json ]; then
npm ci
else
npm install
fi
run: npm ci

- name: Typecheck
run: npm run typecheck
Expand Down
2 changes: 1 addition & 1 deletion docs/superpowers/specs/2026-04-25-file-organizer-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ The catalog is the single source of truth. One SQLite file, on a user-chosen dri
| last_verified_at | DATETIME | |
| scan_id | TEXT FK | |

**Indexes:** `(sha256)`, unique `(drive_id, path)`, `(category, exif_date)`, `(state)`.
**Indexes:** `(sha256)`, unique `(drive_id, path)`, `(category, exif_date)`, `(scan_id)`, `(state)` (partial: `WHERE state != 'indexed'` — only non-indexed states are stored, keeping write cost low).

**`rules`** — user-defined organizing rules. Schema in §6.1.

Expand Down
31 changes: 21 additions & 10 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,37 @@
import tsParser from '@typescript-eslint/parser';
import tsPlugin from '@typescript-eslint/eslint-plugin';
import tseslint from 'typescript-eslint';

export default [
export default tseslint.config(
{
ignores: ['**/dist/**', '**/node_modules/**'],
},
// Base recommended (non-type-checked) rules
...tseslint.configs.recommended,
{
files: ['**/*.ts', '**/*.tsx'],
languageOptions: {
parser: tsParser,
parserOptions: {
sourceType: 'module',
ecmaVersion: 2022,
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
plugins: {
'@typescript-eslint': tsPlugin,
},
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'@typescript-eslint/no-explicit-any': 'warn',
'no-console': 'off',
// Type-checked rules: high-value subset that catches real bugs.
// Full recommendedTypeChecked was not enabled because no-unsafe-* produces
// excessive noise on legitimate use of untyped external libraries (exifr,
// better-sqlite3 raw rows, MediaInfo subprocess output). These two rules
// catch the load-bearing correctness issues without the noise.
'@typescript-eslint/no-floating-promises': 'error',
'@typescript-eslint/no-misused-promises': [
'error',
{
// JSX event-handler attributes (onClick, onChange, etc.) accept async
// functions in Preact — false positives otherwise.
checksVoidReturn: { attributes: false },
},
],
},
},
// Engine HTTP path: ban synchronous directory reads. Recursing
Expand Down Expand Up @@ -54,4 +65,4 @@ export default [
],
},
},
];
);
161 changes: 94 additions & 67 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading