diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e531b9..33f8512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 1.1.0 + +#### πŸš€ Enhancement + +- Save and Upload now write a BIDS-Study-shaped tree instead of a single ad hoc folder: the source video under `sourcedata/rawbids/`, the extracted clip or frame and anything rendered from it under `derivatives/clip-extractor/`, each named per BEP047 and described by its own sidecar and `dataset_description.json` ([#41](https://github.com/brain-bbqs/clip-extractor/pull/41)) + ## 1.0.0 #### πŸ› Bug Fix diff --git a/CLAUDE.md b/CLAUDE.md index 8d7d732..b3b0862 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,6 +6,7 @@ - Always bump the version in `package.json` appropriately when any file under `src/` (except `tests/`), `configs/`, `index.html`, or `package.json`/`package-lock.json` itself, is changed. Bump once per PR: if the version was already bumped by earlier work on the same PR/branch and it hasn't been merged yet, do not bump it again for follow-up commits on that same PR, keep adding entries under the existing top-most `CHANGELOG.md` heading instead - This project has no formal releases, so there is no `## Upcoming` staging section in `CHANGELOG.md`. Leave a short description of the change or addition directly under the top-most version heading (the same version just bumped in `package.json`; create the heading if it does not yet exist) under the appropriate subsection (`#### πŸš€ Enhancement`, `#### πŸ› Bug Fix`, or `#### 🏠 Internal`); create the subsection if it does not yet exist; include the GitHub PR link at the end of each entry in the format `([#N](https://github.com/brain-bbqs/clip-extractor/pull/N))` - Keep `CHANGELOG.md` entries concise: one sentence each, naming what changed and what it means for someone using the app. Leave the reasoning, the measurements and the mechanism to the code comments and the PR +- Prefer a single `CHANGELOG.md` entry per PR, describing the change as a whole at the level someone using the app would notice. Follow-up commits on the same PR should usually revise that entry rather than add another: a PR that ends up with a list of entries is almost always narrating its own development (including steps a later commit reversed) instead of stating where it landed. Add a second entry only for a genuinely separate change that happens to ride along. Field names, filename shapes, flag spellings and other such detail belong in the code comments and the PR description, not here - PR titles should be human-readable and in the past tense; they should NOT use conventional commit style - Keep PR descriptions short and to the point - End every PR description with the prompts that asked for the work, verbatim, inside a collapsed `
` block titled `Original prompt`; when follow-up prompts refine the same PR, append each one to that block diff --git a/docs/README.md b/docs/README.md index c2c5abd..a685fb3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,20 +2,24 @@ ## Live test injections -| URL | Expected Appearance | Link | -| -------------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| `?test&signed_out` | Page as seen by a signed-out visitor | [Open](https://clip-extractor.brain-bbqs.org/?test&signed_out) | -| `?test&num_datasets=0` | "Not added to any direct-upload datasets" | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=0) | -| `?test&num_datasets=1` | Single fake dataset, Upload enabled | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1) | -| `?test&num_datasets=2` | Dropdown of 2 fake datasets | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=2) | -| `?test&num_datasets=1&embargoed=false` | Non-embargoed fake dataset: error card, Upload disabled | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1&embargoed=false) | -| `?test&num_datasets=1&human_subjects` | Flagged dataset: warning banner, blur tool, gated Upload | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1&human_subjects) | -| `?test&mock_video` | A synthesized 30-frame clip loaded, as if dropped | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video) | -| `?test&mock_video=200` | Same, 200 frames, enough to see the trim track | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video=200) | -| `?test&mock_video_long` | A 4-hour clip: the sliding-window timeline and width | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video_long) | -| `?test&mock_video&mock_slp` | Loaded clip with a synthesized, matching pose overlay | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_slp) | -| `?test&mock_video&mock_slp&mismatch` | Same, but refused: the SLEAP card's mismatch state | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_slp&mismatch) | -| `?test&remote_listing=12` | Browse pane, 12 fake videos across 3 fake datasets | [Open](https://clip-extractor.brain-bbqs.org/?test&remote_listing=12) | +| URL | Expected Appearance | Link | +| ------------------------------------------------ | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `?test&signed_out` | Page as seen by a signed-out visitor | [Open](https://clip-extractor.brain-bbqs.org/?test&signed_out) | +| `?test&num_datasets=0` | "Not added to any direct-upload datasets" | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=0) | +| `?test&num_datasets=1` | Single fake dataset, Upload enabled | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1) | +| `?test&num_datasets=2` | Dropdown of 2 fake datasets | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=2) | +| `?test&num_datasets=1&embargoed=false` | Non-embargoed fake dataset: error card, Upload disabled | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1&embargoed=false) | +| `?test&num_datasets=1&human_subjects` | Flagged dataset: warning banner, blur tool, gated Upload | [Open](https://clip-extractor.brain-bbqs.org/?test&num_datasets=1&human_subjects) | +| `?test&mock_video` | A synthesized 30-frame clip loaded, as if dropped | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video) | +| `?test&mock_video=200` | Same, 200 frames, enough to see the trim track | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video=200) | +| `?test&mock_video_long` | A 4-hour clip: the sliding-window timeline and width | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video_long) | +| `?test&mock_video&mock_slp` | Loaded clip with a synthesized, matching pose overlay | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_slp) | +| `?test&mock_video&mock_slp&mismatch` | Same, but refused: the SLEAP card's mismatch state | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_slp&mismatch) | +| `?test&remote_listing=12` | Browse pane, 12 fake videos named `sub-01/ses-01/…` and up | [Open](https://clip-extractor.brain-bbqs.org/?test&remote_listing=12) | +| `?test&mock_video&mock_ready&from_local&frame` | Selected, described, Save/Upload enabled β€” no clicking | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_ready&from_local&frame) | +| `?test&mock_video&mock_ready&from_local&snippet` | A marked range of a locally dropped video | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_ready&from_local&snippet) | +| `?test&mock_video&mock_ready&from_ember&frame` | A still frame of an archive-sourced `sub-01/ses-02` video | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_ready&from_ember&frame) | +| `?test&mock_video&mock_ready&from_ember&snippet` | A marked range of that same archive-sourced video | [Open](https://clip-extractor.brain-bbqs.org/?test&mock_video&mock_ready&from_ember&snippet) | **Safety**: `?test` alone, with none of the params below, is a no-op. Nothing here writes to real `localStorage`, nothing touches real sign-in tokens, and every fake id is chosen from a range no real @@ -39,7 +43,28 @@ fixture, and loads it exactly as if it had been dropped onto the picker. It is t injection: the player, the timeline, the delivery panes and the SLEAP card are all only interesting once a video is on screen. Add `mock_slp` to also synthesize a matching pose model over it, drawn through the same overlay code a real `.slp` would be, or `mock_slp&mismatch` to make that pose -describe a different recording, previewing the SLEAP card's mismatch refusal. +describe a different recording, previewing the SLEAP card's mismatch refusal. Save works fully +offline, so the resulting `.tar.gz` can be downloaded and unpacked to see the whole tree, without +needing a real EMBER sign-in. Add `mock_ready` to skip the manual steps Save/Upload gate on entirely β€” +marking a selection and typing a description β€” so the link lands directly on a saveable state, ready +for one click, rather than the gated "describe it first" state `mock_video` alone previews (itself +worth trying, since it is what a real visitor sees too). Pair it with the two choices below, the way +the four links in the table do, rather than leaning on their defaults. + +**What a ready link previews**: `mock_ready` crosses two choices, and the four links in the table +above are that grid spelled out. _Where the video came from_: `from_local` (the default) is the +"dropped locally" case β€” no archive path, so the output falls back to `sub-unknown`, its derivatives +sit in a `recording-