timet 1.6.4 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/README.md +117 -10
  4. data/lib/timet/version.rb +2 -2
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd119a6557987c9bdf16530865c16c60b3aca4cf30ed5424a04649f55bb6f430
4
- data.tar.gz: 6a0e25787dce7bc903e3b2fa6374631db80045ae3dbf353b9cb8b2fd6cbbcf95
3
+ metadata.gz: b43ddbb0c2a4744c09fede5bbe507ea736a9690daebf6cbccba07d427fcd929c
4
+ data.tar.gz: 9b90a62f2e4cc6c7ee089510ca9c1a023c8f35a22164fa1837140109c1cdda77
5
5
  SHA512:
6
- metadata.gz: 74c3b445e264432d4412afef6bdc53e6f2c1f8a1b8d64c430a4c638d70f58190654faa2d7b550ebcc97fb2068d0091fcb7d4f4ce5d365179c7828db4e0076830
7
- data.tar.gz: 9563a33fff69df1b70375f7528174cd5ff064f77b2d78a2f8609d861e095d7f50312e065e21c587786c442ed10b6c7de2803e96e2d556db4626e729cfa04e0e2
6
+ metadata.gz: dbbcb0cf64a60c26147145f010d7213782b25fe627136e4ed1827e41e4c90748b413d8de5877540cab93cde39f1eb4b093df33bc28da8e8d20d67e894a96c5ab
7
+ data.tar.gz: 927452644bc0201d87343845193b46481f20b836d8d197fd7b42ebbaed1a42b835deba4352af8ec5e25c81df62e800e772ab66f53dc9d31cc5e250dba61120bf
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [1.6.5] - 2026-08-01
2
+
3
+ **Improvements:**
4
+
5
+ - **Documentation:** Expanded `README.md` with detailed setup instructions for Supabase S3-compatible storage, environment variable configuration, and usage of the `timet sync` command.
6
+ - **Dependencies:** Updated locked gem dependencies in `Gemfile.lock` including `aws-sdk`, `rubocop`, `sqlite3`, `json`, and `rake`.
7
+
8
+ **Bug Fixes & Security:**
9
+
10
+ - **Security Patches:** Resolved multiple security vulnerabilities by updating locked gem versions:
11
+ - `addressable` (`>= 2.9.0`): Addressed ReDoS vulnerability in Addressable templates ([CVE-2026-35611](https://github.com/sporkmonger/addressable/security/advisories/GHSA-h27x-rffw-24p4)).
12
+ - `json` (`>= 2.19.9`): Fixed heap buffer overflow when streaming to IO ([CVE-2026-54696](https://nvd.nist.gov/vuln/detail/CVE-2026-54696)).
13
+ - `mcp` (`>= 0.23.0`): Resolved SSE stream hijacking, session poisoning, memory exhaustion, and DNS-rebinding protection issues ([CVE-2026-33946](https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35)).
14
+ - `sqlite3` (`>= 2.9.5`): Patched Use-After-Free vulnerabilities when redefining functions and in aggregate callbacks ([CVE-2026-54619](https://www.cve.org/CVERecord/SearchResults?query=CVE-2026-54619), [CVE-2026-54620](https://www.cve.org/CVERecord/SearchResults?query=CVE-2026-54620)).
15
+
1
16
  ## [1.6.4] - 2026-03-26
2
17
 
3
18
  **Improvements:**
@@ -8,6 +23,7 @@
8
23
  - **Test Coverage:** Expanded test suite for bidirectional sync scenarios, including conflict resolution and remote item handling.
9
24
 
10
25
  **Bug Fixes:**
26
+ - Fix validation editor spec to properly stub database update
11
27
 
12
28
  - **Sync Logic:** Fixed item synchronization to properly handle local-only and remote-only items with timestamp-based decision making.
13
29
  - **Database Updates:** Corrected `update_item_from_hash` method to properly bind ID parameter in SQL queries.
data/README.md CHANGED
@@ -251,7 +251,7 @@ Once configured, Timet will automatically send a notification to your Discord ch
251
251
  | `timet su [start_date]..[end_date]` | Display a report of tracked time for a date range. | `timet su 2024-01-02..2024-01-03` |
252
252
  | `timet resume (r) [id]` | Resume tracking a task by ID or the last completed task. | `timet resume [id]` |
253
253
  | `timet resume (r) [id] --pomodoro=[minutes]` | Resume tracking with a Pomodoro timer. | `timet resume 1 --pomodoro=25` |
254
- | `timet sync` | Sync local db with remote (S3) external db | `timet sync` |
254
+ | `timet sync` | Sync local database with S3 storage (bidirectional sync). | `timet sync` |
255
255
  | `timet version` | Display the current version. | `timet version` |
256
256
 
257
257
  ### Date Range in Summary
@@ -260,18 +260,47 @@ The `timet summary` command now supports specifying a date range for generating
260
260
 
261
261
  #### Examples:
262
262
 
263
- - **Single Date:** Display a report for a specific date.
263
+ - **Single Date**: Display a report for a specific date.
264
264
 
265
265
  ```sh
266
266
  timet su 2024-01-03
267
267
  ```
268
268
 
269
- - **Date Range:** Display a report for a date range.
269
+ - **Date Range**: Display a report for a date range.
270
270
 
271
271
  ```sh
272
272
  timet su 2024-01-02..2024-01-03
273
273
  ```
274
274
 
275
+ ### Sync Operations
276
+
277
+ ```bash
278
+ # Sync local database with S3
279
+ timet sync
280
+ ```
281
+
282
+ This command performs a bidirectional sync:
283
+ 1. Creates the S3 bucket if it doesn't exist
284
+ 2. If a remote database exists, downloads it and compares with the local database using MD5 hashing
285
+ 3. If databases differ, syncs the changes
286
+ 4. If no remote database exists, uploads the local database as `timet.db`
287
+
288
+ ### Example Sync Workflow:
289
+
290
+ ```bash
291
+ # First time setup: configure credentials
292
+ mkdir -p ~/.timet && cd ~/.timet
293
+ cat > .env <<-'EOF'
294
+ S3_ENDPOINT=https://abcdefghijklmnop.supabase.co/storage/v1/object
295
+ S3_ACCESS_KEY=your-access-key-here
296
+ S3_SECRET_KEY=your-secret-key-here
297
+ S3_REGION=us-east-1
298
+ EOF
299
+
300
+ # Sync your time tracking data to cloud
301
+ timet sync
302
+ ```
303
+
275
304
  <a name="data"></a>
276
305
 
277
306
  ## 🗃️ Data
@@ -284,23 +313,101 @@ Timet's data is stored in `~/.timet`.
284
313
 
285
314
  Timet supports backing up and syncing your time tracking data with S3-compatible storage services (such as Supabase S3). To configure S3 backup, follow these steps:
286
315
 
287
- ### Environment Variables
316
+ ### Setting Up Supabase S3 Storage
317
+
318
+ #### 1. Create a Database Project in Supabase
288
319
 
289
- Create a `.env` file in your project root (`~/.timet`) with the following variables:
320
+ If you don't have a Supabase project yet:
321
+ 1. Go to [Supabase](https://supabase.com/) and create a new project
322
+ 2. Choose a region close to your location
323
+ 3. Complete the project setup wizard
324
+
325
+ #### 2. Enable S3 Storage in Supabase
326
+
327
+ 1. In your Supabase project dashboard, navigate to **Settings** → **Storage**
328
+ 2. Click **Create storage bucket** or select an existing bucket
329
+ 3. Configure the bucket:
330
+ - **Bucket name**: Use a descriptive name like `timet-data` or `time-tracking`
331
+ - **File size limit**: Choose appropriate limits (e.g., 10MB per file)
332
+ - **Public access**: Set to **Private** for security
333
+
334
+ #### 3. Generate S3 Access Credentials
335
+
336
+ Supabase uses AWS-compatible S3 APIs, so it requires access keys:
337
+
338
+ 1. Go to your Supabase project dashboard → **Settings** → **API**
339
+ 2. Scroll down to **Service Role Secrets** or **S3 Configuration**
340
+ 3. Click **Generate New Key** or view existing credentials
341
+ 4. Copy the following values (you won't be able to see them again after leaving this page):
342
+ - `SERVICE_ROLE_KEY` → This is your S3_ACCESS_KEY
343
+ - The corresponding secret → This is your S3_SECRET_KEY
344
+
345
+ > ⚠️ **Important**: If you don't see these options in Settings, check:
346
+ > - **Security** tab in project settings
347
+ > - **Database** → **Connection Pooling** section (sometimes under **Settings**)
348
+ > - Contact Supabase support if credentials aren't visible
349
+ >
350
+ > Alternatively, create a custom S3-compatible endpoint using Supabase's API:
351
+ > ```bash
352
+ > # Format: https://<project-ref>.supabase.co/storage/v1/object
353
+ > ```
354
+
355
+ #### 4. Configure Environment Variables
356
+
357
+ Create a `.env` file in `~/.timet/` with the following variables:
290
358
 
291
359
  ```bash
292
- S3_ENDPOINT=your_s3_endpoint_url
293
- S3_ACCESS_KEY=your_access_key
294
- S3_SECRET_KEY=your_secret_key
295
- S3_REGION=your_s3_region
360
+ S3_ENDPOINT=https://<your-project-id>.supabase.co/storage/v1/object
361
+ S3_ACCESS_KEY=<your-service-role-key>
362
+ S3_SECRET_KEY=<your-service-role-secret>
363
+ S3_REGION=us-west-1 # Or your Supabase region (e.g., europe-west3, ap-southeast-1)
296
364
  ```
297
365
 
366
+ Replace the placeholders with your actual values from Step 3. Example:
367
+
368
+ ```bash
369
+ S3_ENDPOINT=https://abcdefghijklmnop.supabase.co/storage/v1/object
370
+ S3_ACCESS_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
371
+ S3_SECRET_KEY=xyz987-abc123-def456-ghi789-jkl012
372
+ S3_REGION=us-east-1
373
+ ```
374
+
375
+ #### 5. Create the S3 Bucket (Optional)
376
+
377
+ If you haven't created a bucket yet in Supabase, Timet can create one:
378
+
379
+ ```bash
380
+ timet s3 create <bucket-name>
381
+ ```
382
+
383
+ Or use the shortcut:
384
+
385
+ ```bash
386
+ timet s3 create timet-data
387
+ ```
388
+
389
+
298
390
  ### Security Considerations
299
391
 
300
- - Keep your `.env` file private and never commit it to version control
392
+ - Keep your `.env` file private and never commit it to version control (`.env` should be in your `.gitignore`)
301
393
  - Use strong, unique access keys
302
394
  - Regularly rotate your S3 access credentials
303
395
  - Implement appropriate IAM policies to restrict bucket access
396
+ - For production use, consider using a dedicated service role with minimum required permissions
397
+
398
+ ### Verification
399
+
400
+ After configuration, verify the connection:
401
+
402
+ ```bash
403
+ # List objects in your bucket (if you have list permissions)
404
+ timet s3 list-buckets
405
+
406
+ # Or simply try a sync operation to upload your data
407
+ timet sync
408
+ ```
409
+
410
+ All S3 operations are logged to `~/.timet/s3_supabase.log`.
304
411
 
305
412
  ## Development
306
413
 
data/lib/timet/version.rb CHANGED
@@ -6,6 +6,6 @@ module Timet
6
6
  # @return [String] The version number in the format 'major.minor.patch'.
7
7
  #
8
8
  # @example Get the version of the Timet application
9
- # Timet::VERSION # => '1.6.4'
10
- VERSION = '1.6.4'
9
+ # Timet::VERSION # => '1.6.5'
10
+ VERSION = '1.6.5'
11
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.4
4
+ version: 1.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Vielma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-27 00:00:00.000000000 Z
11
+ date: 2026-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor