Skip to content

feat(task): add scheduled starts, drag reorder, and preemptive queue cap - #123

Closed
YueMiyuki wants to merge 1 commit into
masterfrom
next-dev
Closed

feat(task): add scheduled starts, drag reorder, and preemptive queue cap#123
YueMiyuki wants to merge 1 commit into
masterfrom
next-dev

Conversation

@YueMiyuki

@YueMiyuki YueMiyuki commented Jul 4, 2026

Copy link
Copy Markdown
Owner

Summary by cubic

Adds scheduled starts, drag-and-drop reordering with a handle, and a strict priority queue that preempts lower-priority downloads to honor the max concurrent cap. The release workflow now preserves Tauri updater signatures, publishes .sig, and builds a cross-platform latest.json for in-app updates.

  • New Features

    • Scheduling: set a start time when adding a task or via “Schedule…”. New Scheduled status/tab; “Start now” clears the schedule; missed schedules are detected on startup and can be started at once.
    • Queue: strict priority across non-torrent tasks; excess Active tasks are preempted to Waiting and auto-resume when back in top-N.
    • Reorder: drag selected tasks via a handle to drop before/after another; order persists and syncs via reorder_tasks.
    • Engine/UI: added reorder_tasks, set_task_schedule, start_task_now, tell_scheduled; DateTimePicker input; task model fields scheduled, startAt, scheduleMissed.
  • Refactors

    • Release: serve Tauri’s signed artifacts unchanged, upload asset .sig and .sha256, and aggregate updater fragments to generate latest.json using scripts/build-updater-manifest.mjs (with tests).
    • Removed “Move Up/Down” actions and menu items; updated links to https://risuko.app; centralized DownloadStart emission and updated counts for Scheduled.

Written for commit b1b670c. Summary will update on new commits.

Review in cubic

@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Adds scheduled-download support across the engine and UI, replaces the old move-up/down ordering flow with drag-and-drop reordering, updates the release workflow to publish updater signatures and latest.json, and changes several app and documentation links to risuko.app.

Changes

Scheduled downloads and drag reorder

Layer / File(s) Summary
Task status and schedule fields
src-tauri/risuko-engine/src/engine/task.rs, src/shared/constants.ts, src/shared/types/task.ts
Adds Scheduled, schedule metadata, RPC serialization, TASK_STATUS.SCHEDULED, and DownloadTask.scheduleMissed.
Engine scheduling and task reconciliation
src-tauri/risuko-engine/src/engine/manager.rs
Adds enqueue-time scheduling, scheduled promotion, active-set reconciliation, tell_scheduled, and updated task counts.
Tauri commands for scheduling and reorder
src-tauri/src/commands/engine_cmds.rs, src-tauri/src/lib.rs
Removes the old sync-order command and adds reorder, schedule, start-now, and scheduled-list command wiring.
Frontend APIs and task store support
src/renderer/api/Api.ts, src/renderer/store/task.ts, src/renderer/store/app.ts
Adds scheduling/reorder APIs, scheduled-task fetching/counting, and missed-schedule app state.
Scheduling dialogs and task views
src/renderer/components/ui/date-time-picker/*, src/renderer/components/Task/ScheduleDialog.vue, src/renderer/components/Task/MissedScheduleDialog.vue, src/renderer/components/Task/*, src/renderer/components/Sidebar/Index.vue, src/renderer/components/TaskDetail/TaskGeneral.vue, src/renderer/utils/task.ts, src/shared/locales/*/task.ts
Adds scheduling dialogs, date-time picking, scheduled task views, sidebar entries, countdown UI, task form scheduling, and localized strings.
Drag-and-drop reorder and move-up/down removal
src/renderer/components/Task/TaskItem.vue, src/renderer/components/Task/TaskList.vue, src/renderer/components/Task/TaskActions.vue, src/renderer/pages/index/commands.ts, src/renderer/pages/index/main.ts, src-tauri/src/managers/menu.rs, src/renderer/styles/components/task.css
Adds drag-handle reorder behavior and removes the old move-up/down actions and menu entries.
Export visibility cleanups
src/renderer/store/batchQueue.ts, src/shared/syncCategories.ts, src/shared/utils/index.ts, src-tauri/src/managers/clip_prompt.rs
Removes a few unrelated exports and a redundant cast.

Release updater signing pipeline

Layer / File(s) Summary
Updater manifest script and tests
scripts/build-updater-manifest.mjs, scripts/build-updater-manifest.test.mjs
Adds buildManifest, a CLI entrypoint, and test coverage for fragment validation and output generation.
Release workflow signing and manifest upload
.github/workflows/release.yml
Packages signed updater artifacts, emits manifest fragments, uploads .sig sidecars, and publishes latest.json from a new tagged-release job.

Branding URL updates

Layer / File(s) Summary
Website link updates
README.md, README-CN.md, src-tauri/src/managers/menu.rs, src/renderer/components/About/Copyright.vue, src/renderer/components/Native/EngineClient.vue
Changes risuko.vercel.app links to risuko.app.

Estimated code review effort: 4 (Complex) | ~75 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ScheduleDialog
  participant taskStore
  participant engine_cmds
  participant TaskManager

  ScheduleDialog->>taskStore: setSchedule(gid, startAt)
  taskStore->>engine_cmds: set_task_schedule(gid, startAt)
  engine_cmds->>TaskManager: set_task_schedule()
  TaskManager->>TaskManager: check_scheduled_tasks()
  TaskManager->>TaskManager: reconcile_active_set()
  TaskManager-->>taskStore: refetch task list
Loading
sequenceDiagram
  participant release job
  participant updater fragments
  participant updater-manifest job
  participant build-updater-manifest.mjs
  participant GitHub Release

  release job->>updater fragments: upload fragments/<key>.json
  release job->>GitHub Release: upload asset + .sig + .sha256
  updater-manifest job->>updater fragments: download updater-fragment-*
  updater-manifest job->>build-updater-manifest.mjs: generate latest.json
  build-updater-manifest.mjs-->>updater-manifest job: latest.json
  updater-manifest job->>GitHub Release: upload latest.json
Loading

Possibly related PRs

  • YueMiyuki/Risuko#122: This PR’s release workflow consumes updater .sig artifacts produced by the linked PR’s updater-artifact generation work.

Suggested labels: next

Poem

Hop-hop, I traced the queue by moonlight bright,
Scheduled carrots bloom at just the right time.
Drag, drop, and the burrow lines up neat,
Signed updater crumbs make the release feel complete.
risuko.app now glows in the night,
And this rabbit hops off, satisfied and light. 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the main changes: scheduled starts, drag reordering, and queue cap preemption.
Description check ✅ Passed The description is directly related to the changeset and accurately summarizes the implemented features and refactors.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot added the next The "next" steps label Jul 4, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

12 issues found across 42 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/renderer/components/TaskDetail/TaskGeneral.vue">

<violation number="1" location="src/renderer/components/TaskDetail/TaskGeneral.vue:257">
P2: Task detail now re-renders every second even for non-scheduled tasks because the timer is started unconditionally in `mounted`. Gating interval startup to valid future scheduled tasks avoids unnecessary UI churn and background work.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/renderer/components/Task/MissedScheduleDialog.vue
Comment thread src/renderer/components/Task/MissedScheduleDialog.vue
Comment thread scripts/build-updater-manifest.test.mjs
Comment thread src/renderer/components/Task/TaskList.vue
Comment thread src/renderer/store/task.ts
Comment thread scripts/build-updater-manifest.mjs
Comment thread .github/workflows/release.yml
Comment thread scripts/build-updater-manifest.test.mjs
Comment thread src/renderer/components/Task/Index.vue
Comment thread src/renderer/components/Task/ScheduleDialog.vue

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
scripts/build-updater-manifest.test.mjs (1)

1-45: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extend test coverage to the other guard clauses.

Only the missing-version error is asserted. buildManifest also throws for missing repo, incomplete fragments (missing key/asset/signature), and an empty fragments directory — none of these are covered here.

✅ Suggested additional assertions
 assert.throws(() => buildManifest(dir, { repo: "x/y" }), /version required/);
+assert.throws(() => buildManifest(dir, { version: "1.0.0" }), /repo .* required/);
+
+const emptyDir = mkdtempSync(join(tmpdir(), "frag-empty-"));
+assert.throws(
+  () => buildManifest(emptyDir, { version: "1.0.0", repo: "x/y" }),
+  /no fragments/,
+);
+rmSync(emptyDir, { recursive: true, force: true });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/build-updater-manifest.test.mjs` around lines 1 - 45, Extend the
coverage in buildManifest tests so every guard clause is exercised, not just the
missing-version path. Add assertions for the missing-repo case in buildManifest,
plus failures when a fragment is incomplete (missing key, asset, or signature)
and when the fragments directory is empty, using the existing buildManifest
helper and the temporary fragment setup in this test file. Keep the current
successful manifest assertions, but add focused throws checks that reference
buildManifest and the fragment JSON shape so regressions in these validation
paths are caught.
.github/workflows/release.yml (1)

264-293: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Linux updater asset extension is wrong
Lines 271-278: *.AppImage) never matches the Linux updater bundle (*.AppImage.tar.gz / .sig), so the fallback sets ext="gz". That names tagged Linux releases Risuko_<version>_<os>_<arch>.gz and breaks the updater URL. Match the full *.AppImage.tar.gz suffix here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 264 - 293, The Linux
tagged-release asset naming in the release workflow is using the wrong suffix,
causing updater bundles to be published with a .gz name. Update the extension
handling in the bundle selection logic around the asset creation in the release
job so the basename check in the tag branch matches the full .AppImage.tar.gz
updater artifact, then keep copying the signed asset and its .sig with the
corrected asset name.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 354-360: The new Upload updater fragment step uses an unpinned
actions/upload-artifact@v4 reference, so update the release workflow to pin this
action to a specific commit SHA like the existing Swatinem/rust-cache usage.
Keep the step name and artifact settings in place, and only replace the action
reference in the upload-artifact step to match the repo’s supply-chain hardening
practice.
- Line 265: The release workflow still interpolates github.ref and matrix.target
directly inside run scripts, which static analysis flags as template-injection
risk. Update the affected shell/PowerShell steps to pass these values through
env in the job/step definition and then reference the environment variables
inside the scripts instead of using inline ${{ }} expressions. Apply this
pattern consistently in the release job call sites around the tag check and the
matrix-based commands so the existing workflow logic in release.yml remains
unchanged while reducing injection surface.
- Around line 506-542: The new updater-manifest job in release.yml uses several
third-party actions that are still referenced by version tags, so update the
actions used in the updater-manifest steps (checkout, setup-node,
download-artifact, and action-gh-release) to commit SHAs to match the project’s
pinned-action precedent. Also review the Setup Node.js step to confirm no
unintended caching is enabled by actions/setup-node, and only add an explicit
cache setting if it is intentionally required.
- Around line 333-352: The "Emit updater manifest fragment" step in the release
workflow builds JSON by manually printf’ing interpolated values for key, asset,
and signature, which is fragile if any value contains characters that need
escaping. Update this step to generate the fragment with a JSON-encoding tool or
method instead of hand-assembling the string, and keep the same inputs from the
matrix target, APP_ASSET, and UPDATER_SIG_FILE while preserving the existing
fragment file naming and output behavior.

In `@scripts/build-updater-manifest.mjs`:
- Line 27: The CLI entry-point check in the top-level `import.meta.url`
comparison is using a string path form that is not cross-platform. Update the
`build-updater-manifest.mjs` CLI detection to compare against
`pathToFileURL(process.argv[1]).href` instead of manually interpolating
`process.argv[1]`, so the entry-point check works correctly on Windows and other
platforms.

In `@src-tauri/risuko-engine/src/engine/manager.rs`:
- Around line 2621-2657: `set_task_schedule` has a race because it cancels the
active download before the task status is updated, which can let the
cancellation handler overwrite the intended `Scheduled` state. Update
`set_task_schedule` in `manager.rs` to follow the same ordering as `preempt()`:
first validate the task and set `task.status = TaskStatus::Scheduled` (and
related fields) under the write lock, then cancel any active download token
afterward. Keep the cancellation scoped to only the successful scheduling path
so it does not run before `kind`/`status` checks.

In `@src/renderer/components/Native/EngineClient.vue`:
- Around line 1048-1060: The checkMissedSchedules async path is swallowing fetch
errors, unlike the other handlers in EngineClient.vue that log failures. Update
the catch in checkMissedSchedules to record the rejection with logger.warn using
a clear message and the error object, while keeping the existing missed-task
handling logic unchanged; use the checkMissedSchedules, fetchScheduledTaskList,
and logger.warn symbols to locate the fix.

In `@src/renderer/components/Task/AddTask.vue`:
- Around line 207-215: The torrent submission flow is still inheriting the
shared form.startAt value, so update the AddTask.vue submission logic to clear
or omit the schedule field whenever type is torrent. Check the form handling
around the DateTimePicker and the payload builder for the task submission path,
and ensure the torrent case never includes risuko-start-at even when mixed tasks
were previously scheduled.

In `@src/renderer/components/Task/MissedScheduleDialog.vue`:
- Around line 101-122: The startNow/startAll flow in MissedScheduleDialog.vue is
swallowing start failures and then removing items from missedScheduledTasks
anyway. Update the startNow and startAll methods to handle errors like
ScheduleDialog.vue confirm() does by surfacing a message via
this.$msg?.error?.(...) and only removing a task from the missed list or closing
the dialog after a successful useTaskStore().startNow call; keep the
remaining-task refresh logic in startNow and the loop in startAll consistent
with that behavior.
- Around line 114-122: The startAll method in MissedScheduleDialog.vue is
dispatching missed tasks sequentially by awaiting each
useTaskStore().startNow(t.gid) call inside the loop, which makes N tasks incur N
round-trips. Update startAll to trigger all startNow calls concurrently, ideally
using Promise.allSettled over the pending list, and keep the close() call after
all dispatches complete; preserve or improve error handling so failures are not
silently swallowed.

In `@src/renderer/components/Task/ScheduleDialog.vue`:
- Around line 59-62: The ScheduleDialog task prop is loosely typed as a generic
Object, which drops the DownloadTask shape used by getTaskName, task.gid, and
task?.startAt. Update the props definition in ScheduleDialog.vue to use a
PropType for DownloadTask | null (with the same null default) so the component
stays type-safe and aligned with the rest of the task usage.

In `@src/renderer/components/Task/TaskItem.vue`:
- Around line 5-20: The TaskItem drag handle is pointer-only, so keyboard users
currently have no way to reorder tasks after the move actions were removed.
Update the TaskItem component to expose a keyboard-accessible reorder path on
the task row or drag handle by making it focusable and handling key events to
trigger the same reorder flow used by reorderTasks, or restore an equivalent
menu/shortcut action tied to the existing task actions. Use the TaskItem.vue
template and the reorderTasks/task action wiring as the main reference points
when adding the accessibility path.

In `@src/renderer/components/Task/TaskList.vue`:
- Around line 159-167: The drag cleanup in TaskList is incomplete:
`beforeUnmount` removes the pointer listeners but leaves
`document.body.classList` stuck with `task-dragging`, and there is no
`pointercancel` handling for interrupted drags. Update the drag lifecycle in the
TaskList component by ensuring the same cleanup used by `onDragUp` also runs
during unmount and on pointer cancellation, and wire a `pointercancel` listener
alongside `pointermove`/`pointerup` so the drag state is always cleared even
when the browser aborts the gesture.
- Around line 11-21: Restore a keyboard-accessible reorder path in TaskList and
TaskActions: the current drag-only flow via handle-down on task-item and the
non-focusable drag handle leaves keyboard and screen-reader users unable to move
tasks. Add an accessible reorder mechanism such as focusable move up/down
controls or equivalent keyboard handlers in TaskActions, and ensure TaskList
continues to support reordering through these controls alongside the existing
pointer drag behavior.
- Around line 254-322: The drag lifecycle in TaskList.vue leaves global drag
state behind if the component unmounts or the pointer is canceled, because the
cleanup in onDragUp() is not always reached. Update the drag cleanup path used
by onHandleDown(), onDragUp(), and beforeUnmount() so the same teardown runs in
every exit path: remove the pointermove/pointerup handlers, clear
draggingKeys/dropTargetKey/dropAfter, and always remove the "task-dragging" body
class. Also add pointercancel handling alongside pointerup so canceled drags
fully reset state.

In `@src/renderer/components/TaskDetail/TaskGeneral.vue`:
- Around line 256-265: The countdown timer in TaskGeneral.vue is started
unconditionally in mounted(), so non-scheduled tasks still get a per-second
update loop. Update the mounted()/beforeUnmount() flow to only create and clear
_nowTimer when the current task is scheduled (use isScheduled or the logic that
drives startingAfterText), and avoid setting nowMs for unscheduled tasks. This
should be implemented in the TaskGeneral component’s timer setup so the interval
only runs while needed.

In `@src/renderer/components/ui/date-time-picker/DateTimePicker.vue`:
- Around line 25-29: The DateTimePicker flow can commit a past timestamp when
“today” is selected because defaultTime() may initialize to an already-past 2:00
AM and the hourField/minuteField setters do not validate against Date.now().
Update the DateTimePicker.vue logic around defaultTime and the
hourField/minuteField commit path to prevent selecting a time-of-day earlier
than the current time for the chosen day, either by clamping to the next valid
time or blocking the commit with a clear state update. If a `startAt` is already
in the past at creation time, align this component’s behavior with the engine’s
expected handling and make that handling explicit in the selection/commit logic.

In `@src/renderer/store/task.ts`:
- Around line 820-849: The reorderTasks flow in task store is preserving a stale
optimistic order after api.reorderTasks fails, which causes
fetchList/applyTaskOrder to reapply and persist the wrong order. In
reorderTasks, clear the currentList entry in taskOrderMap before calling
fetchList() inside the catch block so the refetched data is not re-sorted by the
failed optimistic state; keep the existing success path unchanged and make sure
updateTaskOrder is only fed the confirmed order after a successful reorder.

---

Outside diff comments:
In @.github/workflows/release.yml:
- Around line 264-293: The Linux tagged-release asset naming in the release
workflow is using the wrong suffix, causing updater bundles to be published with
a .gz name. Update the extension handling in the bundle selection logic around
the asset creation in the release job so the basename check in the tag branch
matches the full .AppImage.tar.gz updater artifact, then keep copying the signed
asset and its .sig with the corrected asset name.

In `@scripts/build-updater-manifest.test.mjs`:
- Around line 1-45: Extend the coverage in buildManifest tests so every guard
clause is exercised, not just the missing-version path. Add assertions for the
missing-repo case in buildManifest, plus failures when a fragment is incomplete
(missing key, asset, or signature) and when the fragments directory is empty,
using the existing buildManifest helper and the temporary fragment setup in this
test file. Keep the current successful manifest assertions, but add focused
throws checks that reference buildManifest and the fragment JSON shape so
regressions in these validation paths are caught.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: bdcac178-4d5a-474f-afdd-b398fe7cd498

📥 Commits

Reviewing files that changed from the base of the PR and between c144682 and b1b670c.

📒 Files selected for processing (42)
  • .github/workflows/release.yml
  • README-CN.md
  • README.md
  • scripts/build-updater-manifest.mjs
  • scripts/build-updater-manifest.test.mjs
  • src-tauri/risuko-engine/src/engine/manager.rs
  • src-tauri/risuko-engine/src/engine/task.rs
  • src-tauri/src/commands/engine_cmds.rs
  • src-tauri/src/lib.rs
  • src-tauri/src/managers/clip_prompt.rs
  • src-tauri/src/managers/menu.rs
  • src/renderer/api/Api.ts
  • src/renderer/components/About/Copyright.vue
  • src/renderer/components/Main.vue
  • src/renderer/components/Native/EngineClient.vue
  • src/renderer/components/Sidebar/Index.vue
  • src/renderer/components/Task/AddTask.vue
  • src/renderer/components/Task/Index.vue
  • src/renderer/components/Task/MissedScheduleDialog.vue
  • src/renderer/components/Task/ScheduleDialog.vue
  • src/renderer/components/Task/TaskActions.vue
  • src/renderer/components/Task/TaskItem.vue
  • src/renderer/components/Task/TaskItemActions.vue
  • src/renderer/components/Task/TaskList.vue
  • src/renderer/components/Task/TaskStatus.vue
  • src/renderer/components/TaskDetail/TaskGeneral.vue
  • src/renderer/components/ui/date-time-picker/DateTimePicker.vue
  • src/renderer/components/ui/date-time-picker/index.ts
  • src/renderer/pages/index/commands.ts
  • src/renderer/pages/index/main.ts
  • src/renderer/store/app.ts
  • src/renderer/store/batchQueue.ts
  • src/renderer/store/task.ts
  • src/renderer/styles/components/task.css
  • src/renderer/utils/task.ts
  • src/shared/constants.ts
  • src/shared/locales/en-US/task.ts
  • src/shared/locales/zh-CN/task.ts
  • src/shared/locales/zh-TW/task.ts
  • src/shared/syncCategories.ts
  • src/shared/types/task.ts
  • src/shared/utils/index.ts
💤 Files with no reviewable changes (3)
  • src/renderer/components/Task/TaskActions.vue
  • src/renderer/pages/index/main.ts
  • src/renderer/pages/index/commands.ts

Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml
Comment thread scripts/build-updater-manifest.mjs
Comment thread src/renderer/components/Task/TaskList.vue
Comment thread src/renderer/components/Task/TaskList.vue
Comment on lines +256 to +265
mounted() {
this._nowTimer = setInterval(() => {
this.nowMs = Date.now();
}, 1000);
},
beforeUnmount() {
if (this._nowTimer) {
clearInterval(this._nowTimer);
}
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Countdown timer runs unconditionally for every task, scheduled or not.

_nowTimer is started in mounted() regardless of whether the currently displayed task isScheduled, ticking every second and recomputing startingAfterText/triggering re-renders for the (much more common) non-scheduled case too.

♻️ Suggested fix: only tick while scheduled
 	mounted() {
-		this._nowTimer = setInterval(() => {
-			this.nowMs = Date.now();
-		}, 1000);
+		this._nowTimer = setInterval(() => {
+			if (this.isScheduled) {
+				this.nowMs = Date.now();
+			}
+		}, 1000);
 	},
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
mounted() {
this._nowTimer = setInterval(() => {
this.nowMs = Date.now();
}, 1000);
},
beforeUnmount() {
if (this._nowTimer) {
clearInterval(this._nowTimer);
}
},
mounted() {
this._nowTimer = setInterval(() => {
if (this.isScheduled) {
this.nowMs = Date.now();
}
}, 1000);
},
beforeUnmount() {
if (this._nowTimer) {
clearInterval(this._nowTimer);
}
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/components/TaskDetail/TaskGeneral.vue` around lines 256 - 265,
The countdown timer in TaskGeneral.vue is started unconditionally in mounted(),
so non-scheduled tasks still get a per-second update loop. Update the
mounted()/beforeUnmount() flow to only create and clear _nowTimer when the
current task is scheduled (use isScheduled or the logic that drives
startingAfterText), and avoid setting nowMs for unscheduled tasks. This should
be implemented in the TaskGeneral component’s timer setup so the interval only
runs while needed.

Comment thread src/renderer/components/ui/date-time-picker/DateTimePicker.vue
Comment thread src/renderer/store/task.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/renderer/components/Native/EngineClient.vue (1)

1048-1057: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Paginate the startup missed-schedule check

checkMissedSchedules() calls fetchScheduledTaskList() with default paging (num: TASK_LIST_FETCH_SIZE = 5000), so any scheduled tasks beyond the first page are skipped on startup.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/components/Native/EngineClient.vue` around lines 1048 - 1057,
The startup missed-schedule scan in checkMissedSchedules() only reads the first
page from fetchScheduledTaskList(), so tasks beyond the default
TASK_LIST_FETCH_SIZE can be missed. Update the logic to page through all
scheduled tasks before filtering for scheduleMissed, using the existing
api.fetchScheduledTaskList flow and keeping the
useAppStore().showMissedScheduled call on the full accumulated result.
src/renderer/components/Task/ScheduleDialog.vue (1)

106-111: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add task.schedule-task-fail to the missing locale bundles. It exists in en-US, zh-TW, and zh-CN, but not in ru, th, or tr, so those locales won’t get a localized failure message.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/components/Task/ScheduleDialog.vue` around lines 106 - 111, The
ScheduleDialog.vue error path already falls back to task.schedule-task-fail via
this.$t in the catch block, but that key is missing from some locale bundles.
Add the task.schedule-task-fail translation to the ru, th, and tr locale files
so useTaskStore().setSchedule failures show a localized message consistently
across all supported languages.
src/renderer/components/Task/Index.vue (1)

676-686: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Inconsistent error handling in handleStartTaskNow.

Every other handler here (handleResumeTask, handlePauseTask, etc.) gates the localized error message behind err.code === 1 and always shows a translated string. handleStartTaskNow instead prefers (err as Error)?.message, which can surface a raw/internal error string (e.g., from the Tauri/engine layer) directly to the user instead of a localized message.

Proposed fix to align with sibling handlers
 		handleStartTaskNow(payload) {
 			const { task, taskName } = payload;
 			useTaskStore()
 				.startNow(task.gid)
-				.catch((err: unknown) => {
-					this.$msg.error(
-						(err as Error)?.message ||
-							this.$t("task.start-now-task-fail", { taskName }),
-					);
-				});
+				.catch(({ code }) => {
+					if (code === 1) {
+						this.$msg.error(
+							this.$t("task.start-now-task-fail", { taskName }),
+						);
+					}
+				});
 		},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/components/Task/Index.vue` around lines 676 - 686,
`handleStartTaskNow` is handling errors differently from the sibling task
actions and can leak raw engine/Tauri messages to users. Update the
`useTaskStore().startNow(task.gid).catch(...)` block in `Index.vue` to match
`handleResumeTask`/`handlePauseTask` by checking `err.code === 1` and otherwise
always falling back to the translated `task.start-now-task-fail` message using
`taskName`. Keep the error handling pattern consistent with the other handlers
and avoid using `(err as Error)?.message` as the primary user-facing message.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Line 241: The release workflow is referencing an undefined matrix property, so
the linker env var is always empty and triggers lint errors. Update the workflow
around the existing CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER entry to
either remove the dead matrix.linker reference or add a real linker field to the
matrix/include definitions if armv7 support is intended. Make the same
correction anywhere else the same matrix.linker reference appears so the
workflow only uses defined matrix keys.

In `@src/shared/locales/ar/task.ts`:
- Around line 70-71: The new task locale entries in the ar task translation file
are still in English, so replace `start-now-fail`, `start-now-task-fail`, and
`reorder-task` with proper Arabic translations to match the rest of the locale
module. Also remove or retire the unused `move-task-up` and `move-task-down`
entries from the same task locale object since the related actions were removed,
and apply the same translation cleanup pattern in the other touched locale files
(for example the corresponding task locale definitions).

In `@src/shared/locales/de/task.ts`:
- Around line 71-72: The German locale entries in task.ts still contain English
placeholder text for start-now-fail, start-now-task-fail, and reorder-task.
Update the affected string values in the task translation object to proper
German equivalents, and make sure the same fix is applied to the related
reordered entry referenced by the comment. Use the existing locale key names to
locate and replace only the untranslated strings.
- Around line 71-72: Add the missing German scheduling entries in the task
locale object in task.ts so the scheduling UI no longer falls back to English.
Update the translation map alongside the existing task keys to include the
missing symbols such as scheduled, schedule-task, reschedule-task,
schedule-dialog-title, schedule-dialog-hint, schedule-pick-time,
schedule-confirm, schedule-start-at, schedule-start-at-placeholder,
starting-after, and the missed-schedule-* variants, keeping the naming and
interpolation style consistent with the existing task translations.

In `@src/shared/locales/el/task.ts`:
- Around line 72-73: The Greek locale entries still contain English strings for
the task-related keys. Update the translations in the el task locale object for
start-now-fail, start-now-task-fail, and reorder-task so they are fully
translated into Greek, keeping the existing placeholder symbol taskName intact.
Use the task.ts locale entries to locate and replace the untranslated values.
- Around line 72-73: The Greek locale in task.ts is missing the new scheduling
and missed-schedule translation keys, so add the same `scheduled`, `schedule-*`,
and `missed-schedule-*` entries that exist in the other locales. Update the
`el/task.ts` message map alongside the existing `start-now-*` keys, keeping the
key names consistent with the shared task locale structure so the Schedule and
Missed-Schedule dialogs can resolve Greek strings.

In `@src/shared/locales/es/task.ts`:
- Around line 72-73: The Spanish locale in task.ts still contains untranslated
English entries, so update the affected keys to proper Spanish. Edit the task
translation object and replace the values for start-now-fail,
start-now-task-fail, and reorder-task with Spanish text, keeping the existing
placeholders like {{taskName}} intact and ensuring the surrounding locale
entries remain consistent.
- Around line 72-73: The Spanish task locale is missing the full scheduling
block, so add the new scheduled-task strings to task.ts alongside the existing
start-now entries. Update the es locale object to include the scheduling-related
keys referenced by the UI, including scheduled, schedule-task, reschedule-task,
schedule-dialog-title, schedule-dialog-hint, schedule-pick-time,
schedule-confirm, schedule-start-at, schedule-start-at-placeholder,
starting-after, and the missed-schedule-* messages, keeping the translations
consistent with the existing Task locale structure.

In `@src/shared/locales/fa/task.ts`:
- Around line 70-71: The locale entries in task.ts still contain English strings
for the Persian bundle, specifically the keys start-now-fail,
start-now-task-fail, and reorder-task. Update these translations in the fa
locale object so they are fully localized to Persian while preserving any
placeholders such as {{taskName}}. Use the existing task translation keys in the
same export to locate and replace the untranslated values.
- Around line 70-71: The Persian task locale in task.ts is missing the
scheduling-related translation keys, so add the full scheduled, schedule-*, and
missed-schedule-* set there, including schedule-task-fail, alongside the
existing start-now entries. Use the existing task translation object structure
in src/shared/locales/fa/task.ts to insert the missing keys so the scheduling UI
resolves Persian strings instead of falling back to English.

In `@src/shared/locales/zh-CN/task.ts`:
- Around line 159-160: The newly added scheduling locale entries in task.ts
still contain English text, so translate the affected keys to Chinese to match
the rest of this locale file. Update the string values for start-now-fail,
start-now-task-fail, schedule-task-fail, and reorder-task in the zh-CN task
dictionary, keeping the existing placeholders like {{taskName}} intact.

In `@src/shared/locales/zh-TW/task.ts`:
- Around line 159-160: The zh-TW task locale still has untranslated scheduling
keys mixed in with translated content. Update the string values for
schedule-task-fail, start-now-fail, start-now-task-fail, and reorder-task in the
task locale object so they are in Traditional Chinese, matching the surrounding
entries. Use the existing locale keys in task.ts to locate and replace the
English placeholders without changing the key names or interpolation tokens like
"{{taskName}}".

---

Outside diff comments:
In `@src/renderer/components/Native/EngineClient.vue`:
- Around line 1048-1057: The startup missed-schedule scan in
checkMissedSchedules() only reads the first page from fetchScheduledTaskList(),
so tasks beyond the default TASK_LIST_FETCH_SIZE can be missed. Update the logic
to page through all scheduled tasks before filtering for scheduleMissed, using
the existing api.fetchScheduledTaskList flow and keeping the
useAppStore().showMissedScheduled call on the full accumulated result.

In `@src/renderer/components/Task/Index.vue`:
- Around line 676-686: `handleStartTaskNow` is handling errors differently from
the sibling task actions and can leak raw engine/Tauri messages to users. Update
the `useTaskStore().startNow(task.gid).catch(...)` block in `Index.vue` to match
`handleResumeTask`/`handlePauseTask` by checking `err.code === 1` and otherwise
always falling back to the translated `task.start-now-task-fail` message using
`taskName`. Keep the error handling pattern consistent with the other handlers
and avoid using `(err as Error)?.message` as the primary user-facing message.

In `@src/renderer/components/Task/ScheduleDialog.vue`:
- Around line 106-111: The ScheduleDialog.vue error path already falls back to
task.schedule-task-fail via this.$t in the catch block, but that key is missing
from some locale bundles. Add the task.schedule-task-fail translation to the ru,
th, and tr locale files so useTaskStore().setSchedule failures show a localized
message consistently across all supported languages.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4dc45a6e-4f98-49e0-9e09-7f91e13b7aee

📥 Commits

Reviewing files that changed from the base of the PR and between b1b670c and 2d80de4.

📒 Files selected for processing (40)
  • .github/workflows/release.yml
  • scripts/build-updater-manifest.mjs
  • scripts/build-updater-manifest.test.mjs
  • src-tauri/risuko-engine/src/engine/manager.rs
  • src-tauri/src/commands/engine_cmds.rs
  • src/renderer/components/Native/EngineClient.vue
  • src/renderer/components/Task/Index.vue
  • src/renderer/components/Task/MissedScheduleDialog.vue
  • src/renderer/components/Task/ScheduleDialog.vue
  • src/renderer/components/Task/TaskItem.vue
  • src/renderer/components/Task/TaskList.vue
  • src/renderer/components/ui/date-time-picker/DateTimePicker.vue
  • src/renderer/store/task.ts
  • src/renderer/utils/task.ts
  • src/shared/locales/ar/task.ts
  • src/shared/locales/bg/task.ts
  • src/shared/locales/ca/task.ts
  • src/shared/locales/de/task.ts
  • src/shared/locales/el/task.ts
  • src/shared/locales/en-US/task.ts
  • src/shared/locales/es/task.ts
  • src/shared/locales/fa/task.ts
  • src/shared/locales/fr/task.ts
  • src/shared/locales/hu/task.ts
  • src/shared/locales/id/task.ts
  • src/shared/locales/it/task.ts
  • src/shared/locales/ja/task.ts
  • src/shared/locales/ko/task.ts
  • src/shared/locales/nb/task.ts
  • src/shared/locales/nl/task.ts
  • src/shared/locales/pl/task.ts
  • src/shared/locales/pt-BR/task.ts
  • src/shared/locales/ro/task.ts
  • src/shared/locales/ru/task.ts
  • src/shared/locales/th/task.ts
  • src/shared/locales/tr/task.ts
  • src/shared/locales/uk/task.ts
  • src/shared/locales/vi/task.ts
  • src/shared/locales/zh-CN/task.ts
  • src/shared/locales/zh-TW/task.ts

env:
MATRIX_TARGET: ${{ matrix.target }}
TAURI_ARGS: ${{ matrix.tauri_args }}
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

matrix.linker is undefined — this env var always resolves to empty.

None of the matrix.include entries define a linker key (only os, platform, target, tauri_args), and there is no armv7 target in the matrix, so CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER is set to an empty string and actionlint errors on the undefined property. Either drop this dead env entry or add the missing linker matrix field if it was intended. The same reference also exists at Line 228.

♻️ Suggested change
         env:
           MATRIX_TARGET: ${{ matrix.target }}
           TAURI_ARGS: ${{ matrix.tauri_args }}
-          CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }}
🧰 Tools
🪛 actionlint (1.7.12)

[error] 241-241: property "linker" is not defined in object type {os: string; platform: string; target: string; tauri_args: string}

(expression)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml at line 241, The release workflow is
referencing an undefined matrix property, so the linker env var is always empty
and triggers lint errors. Update the workflow around the existing
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER entry to either remove the
dead matrix.linker reference or add a real linker field to the matrix/include
definitions if armv7 support is intended. Make the same correction anywhere else
the same matrix.linker reference appears so the workflow only uses defined
matrix keys.

Source: Linters/SAST tools

Comment thread src/shared/locales/ar/task.ts Outdated
Comment on lines +70 to +71
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

New locale strings left untranslated.

start-now-fail, start-now-task-fail, and reorder-task are added with plain English text instead of Arabic translations, unlike every other entry in this file. This same pattern repeats across the other locale files in this batch (bg, ca, uk, vi) and likely the rest of the ~25 locale files touched by this PR.

Also note move-task-up/move-task-down (lines 85-86) remain defined even though the Move Up/Down actions are removed in this PR (per the "Drag-and-drop reorder and move-up/down removal" layer) — these are now likely dead locale entries.

Also applies to: 84-84

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/ar/task.ts` around lines 70 - 71, The new task locale
entries in the ar task translation file are still in English, so replace
`start-now-fail`, `start-now-task-fail`, and `reorder-task` with proper Arabic
translations to match the rest of the locale module. Also remove or retire the
unused `move-task-up` and `move-task-down` entries from the same task locale
object since the related actions were removed, and apply the same translation
cleanup pattern in the other touched locale files (for example the corresponding
task locale definitions).

Comment thread src/shared/locales/de/task.ts Outdated
Comment on lines +71 to +72
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task are left in English rather than German.

Also applies to: 87-87

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/de/task.ts` around lines 71 - 72, The German locale
entries in task.ts still contain English placeholder text for start-now-fail,
start-now-task-fail, and reorder-task. Update the affected string values in the
task translation object to proper German equivalents, and make sure the same fix
is applied to the related reordered entry referenced by the comment. Use the
existing locale key names to locate and replace only the untranslated strings.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Identify locale files and relevant component references.
git ls-files 'src/shared/locales/*/task.ts' 'src/**/ScheduleDialog.vue' 'src/**/MissedScheduleDialog.vue'

echo '--- key search ---'
rg -n '"scheduled"|"schedule-task"|"reschedule-task"|"schedule-dialog-title"|"schedule-dialog-hint"|"schedule-pick-time"|"schedule-confirm"|"schedule-start-at"|"starting-after"|"missed-schedule-' \
  src/shared/locales src -g '!**/node_modules/**'

echo '--- de task locale ---'
cat -n src/shared/locales/de/task.ts | sed -n '1,220p'

echo '--- en-US task locale ---'
cat -n src/shared/locales/en-US/task.ts | sed -n '1,260p'

echo '--- zh-CN task locale ---'
cat -n src/shared/locales/zh-CN/task.ts | sed -n '1,260p'

echo '--- zh-TW task locale ---'
cat -n src/shared/locales/zh-TW/task.ts | sed -n '1,260p'

echo '--- component references ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
  src -g '*.vue' -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx'

Repository: YueMiyuki/Risuko

Length of output: 50372


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Focus on the scheduling dialog components to map exact i18n key usage.
ast-grep outline src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue' --view expanded

echo '--- ScheduleDialog.vue references ---'
rg -n 't\(|\$t\(|i18n|schedule-|missed-schedule-' src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue'

Repository: YueMiyuki/Risuko

Length of output: 320


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Compare task locale keys and component i18n usage.
python3 - <<'PY'
from pathlib import Path
import re, json

files = [
    Path('src/shared/locales/de/task.ts'),
    Path('src/shared/locales/en-US/task.ts'),
    Path('src/shared/locales/zh-CN/task.ts'),
    Path('src/shared/locales/zh-TW/task.ts'),
]
keys = {}
for p in files:
    text = p.read_text(encoding='utf-8')
    found = re.findall(r'^\s*["\']([^"\']+)["\']\s*:\s*', text, flags=re.M)
    keys[p.as_posix()] = found
    print(f'## {p}')
    print('\n'.join(found))
    print()

base = set(keys[files[0].as_posix()])
for p in files[1:]:
    missing = [k for k in keys[p.as_posix()] if k not in base]
    extra = [k for k in base if k not in keys[p.as_posix()]]
    print(f'## diff de vs {p}')
    print('missing in de:', missing)
    print('extra in de:', extra)
    print()
PY

echo '--- component key usages ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
  src -g '*.vue' -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx'

Repository: YueMiyuki/Risuko

Length of output: 41988


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect locale loading / fallback behavior for task locales.
rg -n 'locales/.*/task|task\.ts|fallbackLocale|messages|merge.*locale|deep.*merge|Object\.assign|spread.*task' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue'

echo '--- locale index files ---'
git ls-files 'src/shared/locales/**/index.*' 'src/shared/locales/**/task.ts' 'src/shared/i18n.*' 'src/**/i18n.*'

Repository: YueMiyuki/Risuko

Length of output: 2160


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

def keys(path):
    text = Path(path).read_text(encoding='utf-8')
    return [m.group(1) for m in re.finditer(r'^\s*["\']([^"\']+)["\']\s*:\s*', text, re.M)]

paths = [
    'src/shared/locales/de/task.ts',
    'src/shared/locales/en-US/task.ts',
    'src/shared/locales/zh-CN/task.ts',
    'src/shared/locales/zh-TW/task.ts',
]

all_keys = {p: keys(p) for p in paths}
for p, ks in all_keys.items():
    print(f'{p}: {len(ks)} keys')
    print(', '.join(ks))
    print()

de = set(all_keys[paths[0]])
for p in paths[1:]:
    other = set(all_keys[p])
    print(f'Missing from de vs {p}:')
    print(', '.join(sorted(other - de)))
    print()
PY

echo '--- references in scheduling components ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
  src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue' -g '*.ts' -g '*.vue'

Repository: YueMiyuki/Risuko

Length of output: 41963


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect i18n initialization and locale fallback behavior.
git ls-files 'src/**/i18n.*' 'src/**/locale*' 'src/**/locales/**/index.ts' 'src/**/locales/**/task.ts'

echo '--- i18n-related files ---'
rg -n 'createI18n|fallbackLocale|missing|fallback|locale' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue' | sed -n '1,220p'

echo '--- possible locale entrypoints ---'
for f in src/shared/locales/*/index.ts src/shared/locales/en-US/index.ts src/renderer/*i18n* src/shared/*i18n*; do
  [ -e "$f" ] && echo "$f"
done

Repository: YueMiyuki/Risuko

Length of output: 27551


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Narrowly inspect the i18n setup files for fallback locale semantics.
fd -a 'i18n' src || true
fd -a 'locale' src/shared src/renderer || true

echo '--- createI18n / fallbackLocale hits ---'
rg -n 'createI18n|fallbackLocale|missing|localeMessages|messages\s*:' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue' | sed -n '1,220p'

Repository: YueMiyuki/Risuko

Length of output: 3023


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read the likely i18n bootstrapping files if present.
for f in \
  src/shared/i18n.ts \
  src/shared/i18n.js \
  src/renderer/i18n.ts \
  src/renderer/i18n.js \
  src/main/i18n.ts \
  src/main/i18n.js \
  src/shared/locales/en-US/index.ts \
  src/shared/locales/de/index.ts
do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    cat -n "$f" | sed -n '1,220p'
  fi
done

Repository: YueMiyuki/Risuko

Length of output: 1567


🏁 Script executed:

#!/bin/bash
set -euo pipefail

cat -n src/shared/locales/LocaleManager.ts | sed -n '1,220p'
echo '---'
cat -n src/shared/locales/loader.ts | sed -n '1,220p'

Repository: YueMiyuki/Risuko

Length of output: 3965


Add the missing scheduling translations to src/shared/locales/de/task.ts. German users will get English fallback text in the scheduling UI until keys like scheduled, schedule-task, reschedule-task, schedule-dialog-title, schedule-dialog-hint, schedule-pick-time, schedule-confirm, schedule-start-at, schedule-start-at-placeholder, starting-after, and missed-schedule-* are added.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/de/task.ts` around lines 71 - 72, Add the missing German
scheduling entries in the task locale object in task.ts so the scheduling UI no
longer falls back to English. Update the translation map alongside the existing
task keys to include the missing symbols such as scheduled, schedule-task,
reschedule-task, schedule-dialog-title, schedule-dialog-hint,
schedule-pick-time, schedule-confirm, schedule-start-at,
schedule-start-at-placeholder, starting-after, and the missed-schedule-*
variants, keeping the naming and interpolation style consistent with the
existing task translations.

Comment thread src/shared/locales/el/task.ts Outdated
Comment on lines +72 to +73
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task remain in English instead of Greek.

Also applies to: 88-88

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/el/task.ts` around lines 72 - 73, The Greek locale entries
still contain English strings for the task-related keys. Update the translations
in the el task locale object for start-now-fail, start-now-task-fail, and
reorder-task so they are fully translated into Greek, keeping the existing
placeholder symbol taskName intact. Use the task.ts locale entries to locate and
replace the untranslated values.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the locale files involved in the review comment.
git ls-files 'src/shared/locales/**/task.ts' | sort

printf '\n--- grep for schedule-related keys in Greek and other locales ---\n'
for f in \
  src/shared/locales/el/task.ts \
  src/shared/locales/en-US/task.ts \
  src/shared/locales/zh-CN/task.ts \
  src/shared/locales/zh-TW/task.ts
do
  if [ -f "$f" ]; then
    printf '\n### %s ###\n' "$f"
    rg -n '"(scheduled|schedule-task|reschedule-task|schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|schedule-start-at-placeholder|starting-after|missed-schedule-)' "$f" || true
  fi
done

printf '\n--- show surrounding lines around the Greek scheduling area ---\n'
if [ -f src/shared/locales/el/task.ts ]; then
  rg -n -A 40 -B 20 '"start-now-fail"|"start-now-task-fail"|scheduled|schedule' src/shared/locales/el/task.ts
fi

Repository: YueMiyuki/Risuko

Length of output: 6524


Add the missing scheduling locale keys to src/shared/locales/el/task.ts.
The Greek locale still lacks the new scheduled/schedule-*/missed-schedule-* entries that exist in en-US, zh-CN, and zh-TW, so the Schedule and Missed-Schedule dialogs will fall back to defaults for Greek users.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/el/task.ts` around lines 72 - 73, The Greek locale in
task.ts is missing the new scheduling and missed-schedule translation keys, so
add the same `scheduled`, `schedule-*`, and `missed-schedule-*` entries that
exist in the other locales. Update the `el/task.ts` message map alongside the
existing `start-now-*` keys, keeping the key names consistent with the shared
task locale structure so the Schedule and Missed-Schedule dialogs can resolve
Greek strings.

Comment thread src/shared/locales/es/task.ts Outdated
Comment on lines +72 to +73
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task are left in English rather than Spanish.

Also applies to: 88-88

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/es/task.ts` around lines 72 - 73, The Spanish locale in
task.ts still contains untranslated English entries, so update the affected keys
to proper Spanish. Edit the task translation object and replace the values for
start-now-fail, start-now-task-fail, and reorder-task with Spanish text, keeping
the existing placeholders like {{taskName}} intact and ensuring the surrounding
locale entries remain consistent.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show the relevant locale files and locate scheduling-related keys.
git ls-files 'src/shared/locales/**/task.ts' | sort

printf '\n--- Spanish task.ts keys around scheduling ---\n'
python3 - <<'PY'
from pathlib import Path
p = Path('src/shared/locales/es/task.ts')
text = p.read_text()
for i, line in enumerate(text.splitlines(), 1):
    if any(k in line for k in ['scheduled', 'schedule-', 'reschedule', 'starting-after', 'missed-schedule', 'start-now']):
        print(f"{i}: {line}")
PY

printf '\n--- Compare key presence across locales ---\n'
python3 - <<'PY'
from pathlib import Path
import re

locales = ['en-US', 'zh-CN', 'zh-TW', 'de', 'el', 'fa', 'es']
keys = {}
for loc in locales:
    p = Path(f'src/shared/locales/{loc}/task.ts')
    if not p.exists():
        continue
    text = p.read_text()
    found = set(re.findall(r'^\s*["\']([^"\']+)["\']\s*:', text, re.M))
    keys[loc] = found

interesting = [
    'scheduled',
    'schedule-task',
    'reschedule-task',
    'schedule-dialog-title',
    'schedule-dialog-hint',
    'schedule-pick-time',
    'schedule-confirm',
    'schedule-start-at',
    'schedule-start-at-placeholder',
    'starting-after',
    'missed-schedule-title',
    'missed-schedule-text',
    'missed-schedule-confirm',
]
for key in interesting:
    present = [loc for loc, ks in keys.items() if key in ks]
    print(f"{key}: {present}")
PY

printf '\n--- Relevant excerpt from English locale ---\n'
python3 - <<'PY'
from pathlib import Path
p = Path('src/shared/locales/en-US/task.ts')
lines = p.read_text().splitlines()
for i, line in enumerate(lines, 1):
    if any(k in line for k in ['scheduled', 'schedule-', 'reschedule', 'starting-after', 'missed-schedule', 'start-now']):
        print(f"{i}: {line}")
PY

Repository: YueMiyuki/Risuko

Length of output: 2698


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the structure around the Spanish locale file if scheduling keys are missing.
sed -n '1,220p' src/shared/locales/es/task.ts

Repository: YueMiyuki/Risuko

Length of output: 7050


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Focus on the Spanish locale and the full scheduling block in the English source.
python3 - <<'PY'
from pathlib import Path
import re

for loc in ['en-US', 'es', 'de', 'el', 'fa', 'zh-CN', 'zh-TW']:
    p = Path(f'src/shared/locales/{loc}/task.ts')
    if not p.exists():
        continue
    print(f"\n### {loc}")
    txt = p.read_text()
    # Print all keys once, in file order, so the scheduling block placement is obvious.
    for i, line in enumerate(txt.splitlines(), 1):
        m = re.match(r'^\s*["\']([^"\']+)["\']\s*:', line)
        if m:
            k = m.group(1)
            if any(prefix in k for prefix in ['schedule', 'reschedule', 'starting-after', 'missed-schedule']) or k.startswith('start-now') or k == 'scheduled':
                print(f"{i}: {line}")
PY

Repository: YueMiyuki/Risuko

Length of output: 2910


Add the missing scheduling locale block to Spanish. src/shared/locales/es/task.ts still only has the start-now-* strings; the new scheduling UI will fall back to English/missing keys for Spanish users until scheduled, schedule-task, reschedule-task, schedule-dialog-title/hint, schedule-pick-time, schedule-confirm, schedule-start-at(-placeholder), starting-after, and missed-schedule-* are added.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/es/task.ts` around lines 72 - 73, The Spanish task locale
is missing the full scheduling block, so add the new scheduled-task strings to
task.ts alongside the existing start-now entries. Update the es locale object to
include the scheduling-related keys referenced by the UI, including scheduled,
schedule-task, reschedule-task, schedule-dialog-title, schedule-dialog-hint,
schedule-pick-time, schedule-confirm, schedule-start-at,
schedule-start-at-placeholder, starting-after, and the missed-schedule-*
messages, keeping the translations consistent with the existing Task locale
structure.

Comment thread src/shared/locales/fa/task.ts Outdated
Comment on lines +70 to +71
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task remain in English instead of Persian.

Also applies to: 85-85

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/fa/task.ts` around lines 70 - 71, The locale entries in
task.ts still contain English strings for the Persian bundle, specifically the
keys start-now-fail, start-now-task-fail, and reorder-task. Update these
translations in the fa locale object so they are fully localized to Persian
while preserving any placeholders such as {{taskName}}. Use the existing task
translation keys in the same export to locate and replace the untranslated
values.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find relevant locale files
git ls-files 'src/shared/locales/**/task.ts' | sort

echo '--- fa/task.ts keys ---'
sed -n '1,220p' src/shared/locales/fa/task.ts

echo '--- en-US/task.ts keys ---'
sed -n '1,260p' src/shared/locales/en-US/task.ts

echo '--- zh-CN/task.ts keys ---'
sed -n '1,260p' src/shared/locales/zh-CN/task.ts

echo '--- zh-TW/task.ts keys ---'
sed -n '1,260p' src/shared/locales/zh-TW/task.ts

echo '--- other locales with schedule-ish keys ---'
rg -n '"scheduled"|"schedule-task"|"reschedule-task"|"schedule-dialog-title"|"schedule-pick-time"|"schedule-confirm"|"schedule-start-at"|"starting-after"|"missed-schedule-' src/shared/locales -g 'task.ts'

Repository: YueMiyuki/Risuko

Length of output: 42280


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect i18n fallback behavior and whether fa is listed as a supported locale.
rg -n "fallback|missingKey|locale|locales" src -g '!**/dist/**' -g '!**/build/**' -g '!**/node_modules/**'

echo '--- likely i18n config files ---'
git ls-files | rg 'i18n|locale|locales|translation'

echo '--- search for Persian locale registration ---'
rg -n '"fa"|fa/' src -g '!**/dist/**' -g '!**/build/**' -g '!**/node_modules/**'

Repository: YueMiyuki/Risuko

Length of output: 24114


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
import re
from pathlib import Path

def extract_keys(path):
    text = Path(path).read_text(encoding='utf-8')
    # grab "key": or key: entries inside the exported object
    keys = []
    for m in re.finditer(r'^\s*(?:"([^"]+)"|([A-Za-z0-9_-]+))\s*:', text, re.M):
        keys.append(m.group(1) or m.group(2))
    return keys

fa = set(extract_keys('src/shared/locales/fa/task.ts'))
en = set(extract_keys('src/shared/locales/en-US/task.ts'))

schedule_keys = [
    'scheduled',
    'schedule-task',
    'schedule-task-fail',
    'reschedule-task',
    'schedule-dialog-title',
    'schedule-dialog-hint',
    'schedule-pick-time',
    'schedule-confirm',
    'schedule-start-at',
    'schedule-start-at-placeholder',
    'starting-after',
    'missed-schedule-title',
    'missed-schedule-hint',
    'missed-schedule-dismiss',
    'missed-schedule-start-all',
]
print('Missing in fa:', [k for k in schedule_keys if k not in fa])
print('Present in fa:', [k for k in schedule_keys if k in fa])
print('fa total keys:', len(fa), 'en total keys:', len(en))
PY

Repository: YueMiyuki/Risuko

Length of output: 565


Missing scheduling translations in src/shared/locales/fa/task.ts. Add the scheduled/schedule-*/missed-schedule-* keys (including schedule-task-fail) so the scheduling UI doesn’t fall back to English for Persian users.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/fa/task.ts` around lines 70 - 71, The Persian task locale
in task.ts is missing the scheduling-related translation keys, so add the full
scheduled, schedule-*, and missed-schedule-* set there, including
schedule-task-fail, alongside the existing start-now entries. Use the existing
task translation object structure in src/shared/locales/fa/task.ts to insert the
missing keys so the scheduling UI resolves Persian strings instead of falling
back to English.

Comment thread src/shared/locales/zh-CN/task.ts Outdated
Comment on lines +159 to +160
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task (and schedule-task-fail at line 9) remain in English rather than Chinese, unlike the rest of the newly added scheduling strings in this file which are translated.

Also applies to: 171-171

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/zh-CN/task.ts` around lines 159 - 160, The newly added
scheduling locale entries in task.ts still contain English text, so translate
the affected keys to Chinese to match the rest of this locale file. Update the
string values for start-now-fail, start-now-task-fail, schedule-task-fail, and
reorder-task in the zh-CN task dictionary, keeping the existing placeholders
like {{taskName}} intact.

Comment thread src/shared/locales/zh-TW/task.ts Outdated
Comment on lines +159 to +160
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Untranslated placeholder strings.

start-now-fail, start-now-task-fail, and reorder-task (and schedule-task-fail at line 9) remain in English rather than Traditional Chinese, unlike the rest of the newly added scheduling strings in this file which are translated.

Also applies to: 171-171

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/locales/zh-TW/task.ts` around lines 159 - 160, The zh-TW task
locale still has untranslated scheduling keys mixed in with translated content.
Update the string values for schedule-task-fail, start-now-fail,
start-now-task-fail, and reorder-task in the task locale object so they are in
Traditional Chinese, matching the surrounding entries. Use the existing locale
keys in task.ts to locate and replace the English placeholders without changing
the key names or interpolation tokens like "{{taskName}}".

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

38 issues found across 40 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/shared/locales/tr/task.ts">

<violation number="1" location="src/shared/locales/tr/task.ts:71">
P2: Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.</violation>
</file>

<file name="src/shared/locales/ru/task.ts">

<violation number="1" location="src/shared/locales/ru/task.ts:72">
P2: New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.</violation>
</file>

<file name="src/shared/locales/ar/task.ts">

<violation number="1" location="src/shared/locales/ar/task.ts:70">
P2: These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.</violation>
</file>

<file name="src/shared/locales/hu/task.ts">

<violation number="1" location="src/shared/locales/hu/task.ts:70">
P3: These three new locale strings are in English but should be in Hungarian to match the rest of the hu locale file. Consider translating: "start-now-fail" (e.g., "A feladat indítása sikertelen"), "start-now-task-fail" (e.g., 'A(z) "{{taskName}}" feladat indítása sikertelen'), and "reorder-task" (e.g., "Feladat átrendezése. Mozgatás a Fel/Le billentyűkkel").</violation>
</file>

<file name="src/shared/locales/pt-BR/task.ts">

<violation number="1" location="src/shared/locales/pt-BR/task.ts:72">
P3: These three new pt-BR locale keys have English values instead of Portuguese translations. All other keys in this file are properly translated.</violation>

<violation number="2" location="src/shared/locales/pt-BR/task.ts:88">
P3: These three new pt-BR locale keys have English values instead of Portuguese translations.</violation>
</file>

<file name="src/shared/locales/ro/task.ts">

<violation number="1" location="src/shared/locales/ro/task.ts:71">
P1: The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.</violation>

<violation number="2" location="src/shared/locales/ro/task.ts:87">
P2: Same issue — "reorder-task" uses English text instead of Romanian.</violation>
</file>

<file name="src/shared/locales/fr/task.ts">

<violation number="1" location="src/shared/locales/fr/task.ts:71">
P3: Localization gap: this is the French locale file but the translation is left as English. Add a French translation, e.g. "Échec du démarrage de la tâche planifiée".</violation>

<violation number="2" location="src/shared/locales/fr/task.ts:86">
P3: Localization gap: this French locale entry is still in English. Add a French translation, e.g. "Réorganiser la tâche. Appuyez sur Haut ou Bas pour déplacer".</violation>
</file>

<file name="src/shared/locales/zh-CN/task.ts">

<violation number="1" location="src/shared/locales/zh-CN/task.ts:9">
P2: New localization value is in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>

<violation number="2" location="src/shared/locales/zh-CN/task.ts:159">
P2: New localization values are in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>

<violation number="3" location="src/shared/locales/zh-CN/task.ts:171">
P2: New localization value is in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>
</file>

<file name="src/renderer/store/task.ts">

<violation number="1" location="src/renderer/store/task.ts:850">
P2: Drag reorder failures can now surface as unhandled promise rejections in UI event handlers. This comes from rethrowing in `reorderTasks` after local rollback/fetch, while current callers do not catch the rejection; keeping the error handled locally (or adding caller catches) avoids noisy runtime errors.</violation>
</file>

<file name="src/shared/locales/ca/task.ts">

<violation number="1" location="src/shared/locales/ca/task.ts:73">
P2: These three new localization values are in English but the file is the Catalan locale (ca). All surrounding entries are translated to Catalan. Translate these to match the locale.</violation>

<violation number="2" location="src/shared/locales/ca/task.ts:90">
P3: Same issue - English string in Catalan locale.</violation>
</file>

<file name="src/shared/locales/vi/task.ts">

<violation number="1" location="src/shared/locales/vi/task.ts:70">
P3: New locale keys are in English rather than Vietnamese. The surrounding error messages (pause-task-fail, resume-task-fail, move-task-up, move-task-down) all have proper Vietnamese translations. Consider translating these to match the rest of the file so users see consistent Vietnamese text.</violation>
</file>

<file name="src/shared/locales/el/task.ts">

<violation number="1" location="src/shared/locales/el/task.ts:72">
P2: These three new translation keys have English values instead of Greek translations. The rest of the file is fully translated — users will see English text for scheduled-task failures and reorder instructions. Please replace with Greek translations to match the rest of the locale.</violation>
</file>

<file name="src/shared/locales/es/task.ts">

<violation number="1" location="src/shared/locales/es/task.ts:72">
P2: Spanish locale entry is in English instead of Spanish. Translate to follow existing error message patterns (e.g., 'Hubo un fallo al' for fail messages, 'programada' for scheduled).</violation>

<violation number="2" location="src/shared/locales/es/task.ts:88">
P2: Spanish locale entry is in English instead of Spanish. Translate to follow existing key conventions.</violation>
</file>

<file name="src/shared/locales/ja/task.ts">

<violation number="1" location="src/shared/locales/ja/task.ts:72">
P3: The three newly added string keys "start-now-fail", "start-now-task-fail", and "reorder-task" use English values in the Japanese locale file. Japanese users will see English text for these messages. Add Japanese translations for each.</violation>
</file>

<file name="src/shared/locales/bg/task.ts">

<violation number="1" location="src/shared/locales/bg/task.ts:71">
P2: Missing Bulgarian translation for `"start-now-fail"`. The value is in English, but this is the Bulgarian locale file. Follow the pattern from similar error keys like `"pause-task-fail"` (грешка при спиране) and `"resume-task-fail"` (грешка при възобновяване) for consistency.</violation>

<violation number="2" location="src/shared/locales/bg/task.ts:72">
P2: Missing Bulgarian translation for `"start-now-task-fail"`. Follow the established Bulgarian pattern from `"pause-task-fail"` (грешка при спиране на задачата) and `"resume-task-fail"` (грешка при възобновяване на задачата).</violation>

<violation number="3" location="src/shared/locales/bg/task.ts:87">
P2: Missing Bulgarian translation for `"reorder-task"`. Nearby accessibility keys like `"move-task-up"` (Преместване на задача нагоре) and `"move-task-down"` (Преместване на задача надолу) show the expected locale pattern.</violation>
</file>

<file name="src/shared/locales/ko/task.ts">

<violation number="1" location="src/shared/locales/ko/task.ts:70">
P2: Korean locale entries for start-now-fail, start-now-task-fail, and reorder-task contain English text. The surrounding keys are translated to Korean — these should be translated for consistency so Korean users see localized error and accessibility messages.</violation>
</file>

<file name="src/shared/locales/nb/task.ts">

<violation number="1" location="src/shared/locales/nb/task.ts:70">
P2: These three new locale entries are in English instead of Norwegian Bokmål. They will display as English prompts in the Norwegian UI. Translate them for consistency with the rest of the file.</violation>

<violation number="2" location="src/shared/locales/nb/task.ts:86">
P2: Same untranslated issue — "Reorder task. Press Up or Down to move" shows English text in the Norwegian locale. Translate to Norwegian.</violation>
</file>

<file name="src/renderer/components/Task/TaskItem.vue">

<violation number="1" location="src/renderer/components/Task/TaskItem.vue:17">
P2: When the drag handle has focus, all key presses are swallowed, so list-level shortcuts stop working from that state. Using `.stop` only for handled keys (or removing it here) preserves global shortcuts while keeping ArrowUp/ArrowDown reorder behavior.</violation>
</file>

<file name="src/renderer/components/ui/date-time-picker/DateTimePicker.vue">

<violation number="1" location="src/renderer/components/ui/date-time-picker/DateTimePicker.vue:26">
P2: The new future clamp can still allow near-immediate scheduling because rounding seconds to `00` moves the minimum backward within the minute. Computing the minimum as a minute-ceil timestamp after adding 60s would keep the guard consistently at least one minute ahead.</violation>
</file>

<file name="src/shared/locales/zh-TW/task.ts">

<violation number="1" location="src/shared/locales/zh-TW/task.ts:9">
P3: Add Traditional Chinese translation for the new `schedule-task-fail` locale key. Users will see English text instead of Chinese in the UI.</violation>

<violation number="2" location="src/shared/locales/zh-TW/task.ts:159">
P3: Add Traditional Chinese translation for `start-now-fail`. The English fallback will be shown to zh-TW users.</violation>

<violation number="3" location="src/shared/locales/zh-TW/task.ts:160">
P3: Add Traditional Chinese translation for `start-now-task-fail`. This error message will appear in Chinese UI context but remains in English.</violation>

<violation number="4" location="src/shared/locales/zh-TW/task.ts:171">
P3: Add Traditional Chinese translation for the `reorder-task` accessibility hint. This is shown as an aria label for drag-reorder interactions.</violation>
</file>

<file name="src/renderer/components/Task/MissedScheduleDialog.vue">

<violation number="1" location="src/renderer/components/Task/MissedScheduleDialog.vue:120">
P2: Bulk start now fires every `startNow` in parallel, which multiplies `fetchList`/`saveSession` side effects and can cause avoidable request bursts and state thrash for larger missed lists. Keeping failure tracking but processing sequentially avoids the concurrency spike while preserving the new partial-failure behavior.</violation>
</file>

<file name="src/renderer/components/Task/TaskList.vue">

<violation number="1" location="src/renderer/components/Task/TaskList.vue:336">
P2: When a user tabs to a non-selected task's drag handle and presses ArrowUp/Down while other tasks are selected, `moveSelection` moves the unrelated selected tasks instead of the focused task. The `fallbackKey` path only activates when no items are selected (`moving.length === 0`), so a non-selected focused task is ignored when the selection has other items. Consider checking whether the fallback task is in the selection before falling back to the full selection, so that the keyboard interaction targets the task the user is actually focused on.</violation>

<violation number="2" location="src/renderer/components/Task/TaskList.vue:343">
P2: `moveSelection` calls `reorderTasks` without `await` or `.catch()`, producing an unhandled promise rejection on failure. The store's `reorderTasks` now re-throws errors after rollback (`throw err`), so any backend save failure triggers an unhandled rejection even though the local state was already restored via `fetchList`. Add `.catch(() => {})` to suppress the rejection (the rollback already ran) or `await` the call if the caller should handle it.</violation>
</file>

<file name="src/shared/locales/en-US/task.ts">

<violation number="1" location="src/shared/locales/en-US/task.ts:9">
P3: `schedule-task-fail` is added to only en-US, zh-CN, and zh-TW, while the other three new keys (`start-now-fail`, `start-now-task-fail`, `reorder-task`) are added to all 26 locale files. Since i18next's `fallbackLng: "en-US"` covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding `schedule-task-fail` with English placeholder text to the remaining 23 locale files as well.</violation>

<violation number="2" location="src/shared/locales/en-US/task.ts:9">
P3: This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/shared/locales/ro/task.ts Outdated
"pause-task-fail": 'Nu s-a putut întrerupe sarcina "{{taskName}}"',
"resume-task": "Reluați sarcina",
"resume-task-success": 'Sarcina "{{taskName}}" a fost reluata cu succes',
"start-now-fail": "Failed to start scheduled task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ro/task.ts, line 71:

<comment>The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.</comment>

<file context>
@@ -68,6 +68,8 @@ export default {
 	"pause-task-fail": 'Nu s-a putut întrerupe sarcina "{{taskName}}"',
 	"resume-task": "Reluați sarcina",
 	"resume-task-success": 'Sarcina "{{taskName}}" a fost reluata cu succes',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": 'Nu s-a putut relua sarcina "{{taskName}}"',
</file context>

Comment thread src/shared/locales/tr/task.ts Outdated
"pause-task-fail": '"{{taskName}}" görevi durdurulamadı',
"resume-task": "Görevi sürdür",
"resume-task-success": '"{{taskName}}" devam ettirildi',
"start-now-fail": "Failed to start scheduled task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/tr/task.ts, line 71:

<comment>Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.</comment>

<file context>
@@ -68,6 +68,8 @@ export default {
 	"pause-task-fail": '"{{taskName}}" görevi durdurulamadı',
 	"resume-task": "Görevi sürdür",
 	"resume-task-success": '"{{taskName}}" devam ettirildi',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": '"{{taskName}}" devam ettirilemedi',
</file context>

Comment thread src/shared/locales/ru/task.ts Outdated
"pause-task-fail": 'Ошибка во время остановки задания "{{taskName}}"',
"resume-task": "Возобновить задание",
"resume-task-success": 'Успешно возобновлено задание "{{taskName}}"',
"start-now-fail": "Failed to start scheduled task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ru/task.ts, line 72:

<comment>New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.</comment>

<file context>
@@ -69,6 +69,8 @@ export default {
 	"pause-task-fail": 'Ошибка во время остановки задания "{{taskName}}"',
 	"resume-task": "Возобновить задание",
 	"resume-task-success": 'Успешно возобновлено задание "{{taskName}}"',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": 'Ошибка во время возобновления задания "{{taskName}}"',
</file context>

Comment thread src/shared/locales/ar/task.ts Outdated
"pause-task-fail": ' فشل في ايقاف التحميل "{{taskName}}"',
"resume-task": "إستئناف التحميل",
"resume-task-success": 'تم بنجاح إستئناف التحميل "{{taskName}}"',
"start-now-fail": "Failed to start scheduled task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ar/task.ts, line 70:

<comment>These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.</comment>

<file context>
@@ -67,6 +67,8 @@ export default {
 	"pause-task-fail": ' فشل في ايقاف التحميل "{{taskName}}"',
 	"resume-task": "إستئناف التحميل",
 	"resume-task-success": 'تم بنجاح إستئناف التحميل "{{taskName}}"',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": 'فشل في إستئناف التحميل "{{taskName}}"',
</file context>

Comment thread src/shared/locales/ro/task.ts Outdated
"Nu s-au putut șterge fișierele sarcinii, ștergeți-le manual",
"remove-task-config-file-fail":
"Ștergerea fișierului de configurare a sarcinii nu a reușit, ștergeți-l manual",
"reorder-task": "Reorder task. Press Up or Down to move",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Same issue — "reorder-task" uses English text instead of Romanian.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ro/task.ts, line 87:

<comment>Same issue — "reorder-task" uses English text instead of Romanian.</comment>

<file context>
@@ -82,6 +84,7 @@ export default {
 		"Nu s-au putut șterge fișierele sarcinii, ștergeți-le manual",
 	"remove-task-config-file-fail":
 		"Ștergerea fișierului de configurare a sarcinii nu a reușit, ștergeți-l manual",
+	"reorder-task": "Reorder task. Press Up or Down to move",
 	"move-task-up": "Muta sarcina în sus",
 	"move-task-down": "Muta sarcina în jos",
</file context>

Comment thread src/shared/locales/zh-TW/task.ts Outdated
"open-task": "開啟檔案",
"resume-task-success": '繼續任務 "{{taskName}}" 成功',
"start-now-fail": "Failed to start scheduled task",
"start-now-task-fail": 'Failed to start task "{{taskName}}"',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Add Traditional Chinese translation for start-now-task-fail. This error message will appear in Chinese UI context but remains in English.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 160:

<comment>Add Traditional Chinese translation for `start-now-task-fail`. This error message will appear in Chinese UI context but remains in English.</comment>

<file context>
@@ -155,6 +156,8 @@ export default {
 	"open-task": "開啟檔案",
 	"resume-task-success": '繼續任務 "{{taskName}}" 成功',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": '繼續任務 "{{taskName}}" 失敗',
 	"delete-task": "移除任務",
</file context>

Comment thread src/shared/locales/zh-TW/task.ts Outdated
"stop-seeding": "停止做種",
"open-task": "開啟檔案",
"resume-task-success": '繼續任務 "{{taskName}}" 成功',
"start-now-fail": "Failed to start scheduled task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Add Traditional Chinese translation for start-now-fail. The English fallback will be shown to zh-TW users.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 159:

<comment>Add Traditional Chinese translation for `start-now-fail`. The English fallback will be shown to zh-TW users.</comment>

<file context>
@@ -155,6 +156,8 @@ export default {
 	"stop-seeding": "停止做種",
 	"open-task": "開啟檔案",
 	"resume-task-success": '繼續任務 "{{taskName}}" 成功',
+	"start-now-fail": "Failed to start scheduled task",
+	"start-now-task-fail": 'Failed to start task "{{taskName}}"',
 	"resume-task-fail": '繼續任務 "{{taskName}}" 失敗',
</file context>

Comment thread src/shared/locales/zh-TW/task.ts Outdated
stopped: "已停止",
completed: "已完成",
"start-now": "立即開始",
"schedule-task-fail": "Failed to schedule task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Add Traditional Chinese translation for the new schedule-task-fail locale key. Users will see English text instead of Chinese in the UI.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 9:

<comment>Add Traditional Chinese translation for the new `schedule-task-fail` locale key. Users will see English text instead of Chinese in the UI.</comment>

<file context>
@@ -6,6 +6,7 @@ export default {
 	stopped: "已停止",
 	completed: "已完成",
 	"start-now": "立即開始",
+	"schedule-task-fail": "Failed to schedule task",
 	"schedule-task": "排程開始…",
 	"reschedule-task": "重新排程…",
</file context>

Comment thread src/shared/locales/en-US/task.ts Outdated
stopped: "Stopped",
completed: "Completed",
"start-now": "Start Now",
"schedule-task-fail": "Failed to schedule task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: schedule-task-fail is added to only en-US, zh-CN, and zh-TW, while the other three new keys (start-now-fail, start-now-task-fail, reorder-task) are added to all 26 locale files. Since i18next's fallbackLng: "en-US" covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding schedule-task-fail with English placeholder text to the remaining 23 locale files as well.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/en-US/task.ts, line 9:

<comment>`schedule-task-fail` is added to only en-US, zh-CN, and zh-TW, while the other three new keys (`start-now-fail`, `start-now-task-fail`, `reorder-task`) are added to all 26 locale files. Since i18next's `fallbackLng: "en-US"` covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding `schedule-task-fail` with English placeholder text to the remaining 23 locale files as well.</comment>

<file context>
@@ -6,6 +6,7 @@ export default {
 	stopped: "Stopped",
 	completed: "Completed",
 	"start-now": "Start Now",
+	"schedule-task-fail": "Failed to schedule task",
 	"schedule-task": "Schedule…",
 	"reschedule-task": "Reschedule…",
</file context>

Comment thread src/shared/locales/en-US/task.ts Outdated
stopped: "Stopped",
completed: "Completed",
"start-now": "Start Now",
"schedule-task-fail": "Failed to schedule task",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/en-US/task.ts, line 9:

<comment>This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.</comment>

<file context>
@@ -6,6 +6,7 @@ export default {
 	stopped: "Stopped",
 	completed: "Completed",
 	"start-now": "Start Now",
+	"schedule-task-fail": "Failed to schedule task",
 	"schedule-task": "Schedule…",
 	"reschedule-task": "Reschedule…",
</file context>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

next The "next" steps

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant