From 56ccfe63b63b84b99e81c0f496bdb7a25185ced4 Mon Sep 17 00:00:00 2001 From: Paolo Donadeo Date: Sat, 18 Apr 2026 00:00:45 +0200 Subject: [PATCH] docs/refactor: add AI disclosure and clean up code style --- README.md | 7 +++++++ lua/jasper/api.lua | 31 ++++++++++++++++++++----------- lua/jasper/auth.lua | 9 ++++++--- lua/jasper/init.lua | 11 +++-------- lua/jasper/timer.lua | 23 ++++++++++++++--------- 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index b741235..11986e6 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,10 @@ Place a `.jasper_config.json` file at the root of the project (next to `.git`): 4. The timer is **started**. A libuv countdown is armed; after `inactivity_timeout` minutes of silence the timer is **paused**. 5. Any cursor movement or keystroke resets the countdown (and resumes the timer if it was paused). 6. On `VimLeave` the timer is **stopped**. + +$ +## AI Disclosure + +This project was written entirely with the assistance of +[GitHub Copilot](https://github.com/features/copilot) using the +**Claude Sonnet 4.6** model. diff --git a/lua/jasper/api.lua b/lua/jasper/api.lua index e2872da..93ac3e7 100644 --- a/lua/jasper/api.lua +++ b/lua/jasper/api.lua @@ -12,9 +12,6 @@ local JASPER_URL = "https://jasper.4sigma.it" --- @return string|nil error message local function curl(args) -- Append -w to get the HTTP status on a separate last line - local full_args = vim.list_extend(vim.list_slice(args, 1), { "-s", "-w", "\n%{http_code}" }) - -- args already contains the URL; rebuild properly: - -- Actually we receive the full arg list already. Add -w trick. table.insert(args, "-w") table.insert(args, "\n%{http_code}") @@ -41,7 +38,8 @@ end local function get(path, token) return curl({ "curl", - "-H", "Authorization: Token " .. token, + "-H", + "Authorization: Token " .. token, JASPER_URL .. path, }) end @@ -52,8 +50,11 @@ end --- @return table|nil, number, string|nil local function post(path, token, form) local args = { - "curl", "-X", "POST", - "-H", "Authorization: Token " .. token, + "curl", + "-X", + "POST", + "-H", + "Authorization: Token " .. token, } if form then for k, v in pairs(form) do @@ -84,6 +85,9 @@ function M.get_timers(token) if status ~= 200 then return nil, "unexpected HTTP status " .. status end + if not data then + return nil, "empty response" + end local timers_dict = data.data and data.data.timers if type(timers_dict) ~= "table" then return nil, "unexpected response shape" @@ -108,6 +112,9 @@ function M.start_timer(token, timer_id) if status ~= 200 then return false, "HTTP " .. status end + if not data then + return true, nil + end if data.error ~= nil and data.error ~= vim.NIL then return false, tostring(data.error) end @@ -127,6 +134,9 @@ function M.stop_timer(token, timer_id) if status ~= 200 then return false, "HTTP " .. status end + if not data then + return true, nil + end if data.error ~= nil and data.error ~= vim.NIL then return false, tostring(data.error) end @@ -140,17 +150,16 @@ end --- @return boolean ok --- @return string|nil error function M.create_timer(token, timer_id, attivita_id) - local data, status, err = post( - "/api/v1/timer/" .. timer_id .. "/attivita/", - token, - { attivita_id = attivita_id } - ) + local data, status, err = post("/api/v1/timer/" .. timer_id .. "/attivita/", token, { attivita_id = attivita_id }) if err then return false, err end if status ~= 200 then return false, "HTTP " .. status end + if not data then + return true, nil + end if data.error ~= nil and data.error ~= vim.NIL then return false, tostring(data.error) end diff --git a/lua/jasper/auth.lua b/lua/jasper/auth.lua index 1250edc..6bb08cb 100644 --- a/lua/jasper/auth.lua +++ b/lua/jasper/auth.lua @@ -47,9 +47,12 @@ end --- @return string|nil error message function M.login(username, password) local result = vim.system({ - "curl", "-s", - "--data-urlencode", "username=" .. username, - "--data-urlencode", "password=" .. password, + "curl", + "-s", + "--data-urlencode", + "username=" .. username, + "--data-urlencode", + "password=" .. password, JASPER_URL .. "/api/v1/token/login/", }, { text = true }):wait() diff --git a/lua/jasper/init.lua b/lua/jasper/init.lua index a63d6b1..e6ff592 100644 --- a/lua/jasper/init.lua +++ b/lua/jasper/init.lua @@ -4,7 +4,7 @@ local M = {} local config = require("jasper.config") -local timer = require("jasper.timer") +local timer = require("jasper.timer") --- Setup the plugin. --- @@ -36,19 +36,14 @@ function M.setup(opts) end if not project_cfg.attivita_id then - vim.notify( - "[Jasper] .jasper_config.json found but 'attivita_id' is missing", - vim.log.levels.WARN - ) + vim.notify("[Jasper] .jasper_config.json found but 'attivita_id' is missing", vim.log.levels.WARN) return end -- Merge: project file values < global setup() opts (global opts take priority) local effective_opts = { attivita_id = project_cfg.attivita_id, - inactivity_timeout = opts.inactivity_timeout - or project_cfg.inactivity_timeout - or 10, + inactivity_timeout = opts.inactivity_timeout or project_cfg.inactivity_timeout or 10, } timer.setup(effective_opts) diff --git a/lua/jasper/timer.lua b/lua/jasper/timer.lua index 0ed94f1..95cff76 100644 --- a/lua/jasper/timer.lua +++ b/lua/jasper/timer.lua @@ -3,19 +3,19 @@ local M = {} -local api = require("jasper.api") +local api = require("jasper.api") local auth = require("jasper.auth") --- Internal state (one instance per Neovim session). local state = { - token = nil, ---@type string|nil - timer_id = nil, ---@type number|nil - attivita_id = nil, ---@type number|nil - running = false, + token = nil, ---@type string|nil + timer_id = nil, ---@type number|nil + attivita_id = nil, ---@type number|nil + running = false, -- inactivity_ms: milliseconds of silence before the timer is auto-paused inactivity_ms = 10 * 60 * 1000, - uv_timer = nil, ---@type uv_timer_t|nil - augroup = nil, ---@type number|nil + uv_timer = nil, ---@type uv.uv_timer_t|nil + augroup = nil, ---@type number|nil } -- --------------------------------------------------------------------------- @@ -128,7 +128,7 @@ end --- @param token string --- @param timer_id number local function begin_tracking(token, timer_id) - state.token = token + state.token = token state.timer_id = timer_id -- Create the libuv timer used for inactivity detection @@ -170,6 +170,11 @@ local function on_token_ready(token) return end + if not timers then + notify("Cannot fetch timers: empty response", vim.log.levels.ERROR) + return + end + local timer_id, terr = find_or_create_timer(token, state.attivita_id, timers) if not timer_id then notify(terr or "Cannot get timer", vim.log.levels.ERROR) @@ -182,7 +187,7 @@ end --- Entry point called on VimEnter. --- @param opts table { attivita_id, inactivity_timeout } function M.setup(opts) - state.attivita_id = opts.attivita_id + state.attivita_id = opts.attivita_id state.inactivity_ms = (opts.inactivity_timeout or 10) * 60 * 1000 local token = auth.get_token()