Release File Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 08:24:07 +02:00
parent 055f533cf1
commit 91dc9bc2f7
30 changed files with 979 additions and 96 deletions
+5
View File
@@ -1,5 +1,10 @@
# Changelog
## 0.2.0 - 2026-09-02
- Added bounded batch-rename planning with collision-safe copy exports, byte-exact split/join operations, split manifests, and sorted SHA-256/SHA-512 checksum manifests.
- Adopted shared byte formatting and deterministic multi-download helpers, and declared accurate Toolbox I/O and capability metadata.
## 0.1.0 - 2026-09-01
- Added the initial local-first File Tools workbench.
+3 -3
View File
@@ -1,5 +1,5 @@
==============================================================================
@add-ideas/toolbox-contract@0.2.3
@add-ideas/toolbox-contract@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
@@ -198,7 +198,7 @@ Declared licence: Apache-2.0
==============================================================================
@add-ideas/toolbox-helpers@0.1.0
@add-ideas/toolbox-helpers@0.2.0
Declared licence: GPL-3.0-or-later
==============================================================================
--- LICENSE ---
@@ -879,7 +879,7 @@ Public License instead of this License. But first, please read
==============================================================================
@add-ideas/toolbox-shell-react@0.2.3
@add-ideas/toolbox-shell-react@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
+7 -5
View File
@@ -1,17 +1,19 @@
# File Tools
Identify, inspect and inventory local files in the browser.
Inspect, hash, rename, split and join local files in the browser.
File Tools is a standalone local-first application in the [add·ideas Toolbox](https://git.add-ideas.de/lotobo/toolbox-portal). Inputs are processed in the browser and are not uploaded.
## Version 0.1 scope
- Bounded head/tail signature inspection with claimed-versus-detected MIME reporting
- Bounded head/tail signature inspection for every selected file with three-worker concurrency, aggregate progress, cancellation, per-file errors and claimed-versus-detected MIME reporting
- Paged 512-byte hexadecimal/ASCII views plus bounded UTF-8 and extracted-string previews
- Streaming SHA-256 and SHA-512 hashing in a cancellable module worker
- Same-size and same-hash duplicate candidates plus deterministic JSON/CSV inventory manifests
- Same-size and same-hash duplicate candidates plus deterministic JSON/CSV inventory manifests that explicitly report inspection coverage, failures and cancellations
- Deterministic, bounded batch-rename planning with path-safe names and collision suffixes; the plan is visible before separate browser downloads begin
- Zero-copy Blob slicing into manifest-described parts, explicit ordered rejoin, and standard `SHA256SUMS` / `SHA512SUMS` exports
Detection and entropy results are heuristics, not format validation, malware analysis or proof of encryption. A selection is limited to 500 entries; file contents remain represented by browser `File` handles and are read only for an inspection window, the visible hex window, or an explicitly requested streaming hash. File mutation, split/join and batch rename are not part of version 0.1. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
Detection and entropy results are heuristics, not format validation, malware analysis or proof of encryption. A selection is limited to 500 entries; file contents remain represented by browser `File` handles and are read only for an inspection window, visible hex window, explicit streaming hash, or explicit export operation. Rename exports create copies and never rename the source handle. Split parts are downloaded separately because no archive container is implied, while join uses the displayed input order and does not infer a part manifest. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
## Development
@@ -25,7 +27,7 @@ npm run test:browser
## Release
`npm run release:artifact` creates a deterministic `release/file-tools-0.1.0.zip` and checksum sidecar.
`npm run release:artifact` creates a deterministic `release/file-tools-0.2.0.zip` and checksum sidecar.
## Licence
+2 -2
View File
@@ -1,7 +1,7 @@
# Corresponding source
The corresponding source for File Tools 0.1.0 is available at:
The corresponding source for File Tools 0.2.0 is available at:
https://git.add-ideas.de/lotobo/file-tools/src/tag/v0.1.0
https://git.add-ideas.de/lotobo/file-tools/src/tag/v0.2.0
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
+3 -3
View File
@@ -4,9 +4,9 @@ File Tools 0.1.0 directly depends on these runtime packages:
| Package | Pinned version | Declared licence |
| -------------------------------- | -------------: | ---------------- |
| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.1.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 |
| `@add-ideas/toolbox-contract` | 0.3.0 | Apache-2.0 |
| `@add-ideas/toolbox-helpers` | 0.2.0 | GPL-3.0-or-later |
| `@add-ideas/toolbox-shell-react` | 0.3.0 | Apache-2.0 |
| `@noble/hashes` | 2.4.0 | MIT |
| `file-type` | 22.0.2 | MIT |
| `react` | 19.2.8 | MIT |
+4 -2
View File
@@ -1,7 +1,9 @@
# Architecture
File Tools is a static React/Vite application wrapped in the shared Toolbox shell. Browser `File` handles and small metadata records remain on the main thread; one fresh module worker performs each inspection or streaming hash and is terminated on completion, cancellation, timeout, replacement or unmount.
File Tools is a static React/Vite application wrapped in the shared Toolbox shell. Browser `File` handles and small metadata records remain on the main thread. Selection starts an inspection queue with at most three fresh module workers; each worker is terminated on completion, cancellation, timeout, replacement or unmount. Explicit streaming-hash jobs use the same isolated-worker lifecycle.
The worker reads at most 1 MiB from each end for signature, entropy, text and string heuristics. SHA-256 and SHA-512 are updated together in 1 MiB chunks, so hashing does not buffer the complete file. The hex view independently reads one 512-byte window. `file/signatures.ts` contains project-owned evidence heuristics; `file-type` provides broader signature hints; `@noble/hashes` provides incremental hashes.
`file/manifest.ts` sorts by path and emits JSON or spreadsheet-neutralised CSV. Duplicate groups start as same-size candidates and become stronger same-hash candidates after explicit hashing; no deletion or mutation follows. Relative worker and asset URLs keep the build relocatable below a nested portal path.
`file/manifest.ts` sorts by path and emits JSON or spreadsheet-neutralised CSV. Each row carries its own inspection state/error, while JSON also records aggregate inspected, failed, cancelled and pending coverage so an interrupted batch cannot look complete. Duplicate groups start as same-size candidates and become stronger same-hash candidates after explicit hashing; no deletion or mutation follows. Relative worker and asset URLs keep the build relocatable below a nested portal path.
`file/operations.ts` owns the bounded export operations. Rename templates are expanded into a deterministic download plan and passed through the shared collision-safe filename planner before any download. Split uses immutable `Blob.slice` windows and emits a JSON byte-offset manifest; join verifies part count and aggregate size before constructing an ordered Blob. Checksum manifests sort paths and use the conventional escaped GNU sum-file representation. These operations deliberately do not guess which part order, rename semantics, or checksum scope a user intended.
+4 -2
View File
@@ -2,6 +2,8 @@
Selected files remain browser `File` objects and are never uploaded. There is no telemetry, analytics, account, persistence or runtime network path. A selection is limited to 500 entries. Inspection reads bounded samples, the hex view reads one window, and hashing streams the selected file only after an explicit action.
Worker jobs are isolated from the UI thread and are terminated on cancellation, replacement, error, timeout or component teardown. A completed result remains visible while a later operation runs or fails. Exported manifests contain file names/relative paths, sizes, modification times, declared types and any requested hashes; those metadata can themselves be sensitive.
Worker jobs are isolated from the UI thread, limited to three simultaneous inspections, and terminated on cancellation, replacement, error, timeout or component teardown. A completed result remains visible while a later operation runs or fails. Exported manifests expose incomplete/error/cancelled coverage instead of silently treating queued files as inspected. They also contain file names/relative paths, sizes, modification times, declared types and any requested hashes; those metadata can themselves be sensitive.
Signature detection, strings, entropy, embedded markers and trailing-byte findings are heuristics. They do not validate a format or establish encryption, malware, steganography or intent. Equal SHA-256 values are strong byte-identity evidence but the app does not delete, rename, split, join or otherwise mutate files.
Signature detection, strings, entropy, embedded markers and trailing-byte findings are heuristics. They do not validate a format or establish encryption, malware, steganography or intent. Equal SHA-256 values are strong byte-identity evidence.
Rename, split and join are copy-producing downloads: browser-selected sources are never overwritten. Plans and split/join operations are capped at 500 files or parts, and join at 2 GiB. The UI exposes collision-adjusted names before a rename export. Split manifests contain filenames, byte offsets and sizes but no claim that rejoining unrelated or reordered parts is safe. Checksum manifests include original paths and hashes, which may disclose sensitive names or provide stable cross-context identifiers.
+1 -1
View File
@@ -1,5 +1,5 @@
const CACHE_PREFIX = "file-tools-shell-";
const CACHE_NAME = CACHE_PREFIX + "0.1.0";
const CACHE_NAME = CACHE_PREFIX + "0.2.0";
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
self.addEventListener("install", (event) => {
event.waitUntil(
+36 -3
View File
@@ -3,12 +3,21 @@
"schemaVersion": 1,
"id": "de.add-ideas.file-tools",
"name": "File Tools",
"version": "0.1.0",
"description": "Identify, inspect and inventory local files in the browser.",
"version": "0.2.0",
"description": "Inspect, hash, rename, split and join local files in the browser.",
"entry": "./",
"icon": "./favicon.svg",
"categories": ["files", "developer", "productivity"],
"tags": ["file", "hex", "checksum", "manifest", "duplicate"],
"tags": [
"file",
"hex",
"checksum",
"manifest",
"rename",
"split",
"join",
"duplicate"
],
"integration": {
"contextVersion": 1,
"launchModes": ["navigate", "new-tab"],
@@ -21,6 +30,30 @@
"crossOriginIsolated": false,
"topLevelContext": false
},
"io": {
"accepts": [
{ "mediaType": "*/*", "extensions": [], "label": "Any local file" }
],
"produces": [
{
"mediaType": "*/*",
"extensions": [],
"label": "Renamed or joined local file"
},
{
"mediaType": "application/json",
"extensions": [".json"],
"label": "Inventory and split manifests"
},
{ "mediaType": "text/csv", "extensions": [".csv"], "label": "Inventory" },
{
"mediaType": "text/plain",
"extensions": [".sha256", ".sha512"],
"label": "Checksum manifests"
}
]
},
"capabilities": { "required": ["workers", "web-crypto"], "optional": [] },
"privacy": {
"processing": "local",
"fileUploads": true,