mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-27 18:22:41 -08:00
refactor: extract global shortcuts runtime wiring
This commit is contained in:
@@ -6,7 +6,7 @@ Read first. Keep concise.
|
|||||||
| ------------ | -------------- | ---------------------------------------------------- | --------- | ------------------------------------- | ---------------------- |
|
| ------------ | -------------- | ---------------------------------------------------- | --------- | ------------------------------------- | ---------------------- |
|
||||||
| `codex-generate-minecard-image-20260220T112900Z-vsxr` | `codex-generate-minecard-image` | `Generate media fallbacks (GIF) from assets/minecard.webm and wire README/docs fallback markup` | `done` | `docs/subagents/agents/codex-generate-minecard-image-20260220T112900Z-vsxr.md` | `2026-02-20T11:35:30Z` |
|
| `codex-generate-minecard-image-20260220T112900Z-vsxr` | `codex-generate-minecard-image` | `Generate media fallbacks (GIF) from assets/minecard.webm and wire README/docs fallback markup` | `done` | `docs/subagents/agents/codex-generate-minecard-image-20260220T112900Z-vsxr.md` | `2026-02-20T11:35:30Z` |
|
||||||
| `codex-main` | `planner-exec` | `Fix frequency/N+1 regression in plugin --start flow` | `in_progress` | `docs/subagents/agents/codex-main.md` | `2026-02-19T19:36:46Z` |
|
| `codex-main` | `planner-exec` | `Fix frequency/N+1 regression in plugin --start flow` | `in_progress` | `docs/subagents/agents/codex-main.md` | `2026-02-19T19:36:46Z` |
|
||||||
| `codex-task85-20260219T233711Z-46hc` | `codex-task85` | `Resume TASK-85 maintainability refactor from latest handoff point` | `in_progress` | `docs/subagents/agents/codex-task85-20260219T233711Z-46hc.md` | `2026-02-20T11:15:54Z` |
|
| `codex-task85-20260219T233711Z-46hc` | `codex-task85` | `Resume TASK-85 maintainability refactor from latest handoff point` | `in_progress` | `docs/subagents/agents/codex-task85-20260219T233711Z-46hc.md` | `2026-02-20T11:18:02Z` |
|
||||||
| `codex-config-validation-20260219T172015Z-iiyf` | `codex-config-validation` | `Find root cause of config validation error for ~/.config/SubMiner/config.jsonc` | `completed` | `docs/subagents/agents/codex-config-validation-20260219T172015Z-iiyf.md` | `2026-02-19T17:26:17Z` |
|
| `codex-config-validation-20260219T172015Z-iiyf` | `codex-config-validation` | `Find root cause of config validation error for ~/.config/SubMiner/config.jsonc` | `completed` | `docs/subagents/agents/codex-config-validation-20260219T172015Z-iiyf.md` | `2026-02-19T17:26:17Z` |
|
||||||
| `codex-task85-20260219T233711Z-46hc` | `codex-task85` | `Resume TASK-85 maintainability refactor from latest handoff point` | `in_progress` | `docs/subagents/agents/codex-task85-20260219T233711Z-46hc.md` | `2026-02-20T02:56:34Z` |
|
| `codex-task85-20260219T233711Z-46hc` | `codex-task85` | `Resume TASK-85 maintainability refactor from latest handoff point` | `in_progress` | `docs/subagents/agents/codex-task85-20260219T233711Z-46hc.md` | `2026-02-20T02:56:34Z` |
|
||||||
| `codex-anilist-deeplink-20260219T233926Z` | `anilist-deeplink` | `Fix external subminer:// AniList callback handling from browser` | `done` | `docs/subagents/agents/codex-anilist-deeplink-20260219T233926Z.md` | `2026-02-19T23:59:21Z` |
|
| `codex-anilist-deeplink-20260219T233926Z` | `anilist-deeplink` | `Fix external subminer:// AniList callback handling from browser` | `done` | `docs/subagents/agents/codex-anilist-deeplink-20260219T233926Z.md` | `2026-02-19T23:59:21Z` |
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
|
|
||||||
## Current Work (newest first)
|
## Current Work (newest first)
|
||||||
|
|
||||||
|
- [2026-02-20T11:18:02Z] progress: extracted global shortcuts composition from `src/main.ts` into `src/main/runtime/global-shortcuts-runtime-handlers.ts`; `main.ts` now obtains `getConfiguredShortcuts`/`registerGlobalShortcuts`/`refreshGlobalAndOverlayShortcuts` from one runtime factory.
|
||||||
|
- [2026-02-20T11:18:02Z] progress: added parity coverage in `src/main/runtime/global-shortcuts-runtime-handlers.test.ts` for get/register/refresh wiring.
|
||||||
|
- [2026-02-20T11:18:02Z] test: `bun run build` pass (expected macOS helper Swift cache fallback) + focused suites pass for `global-shortcuts-runtime-handlers*`, `global-shortcuts*`, `global-shortcuts-main-deps*`, `cli-command-runtime-handler*`, and `startup-runtime-handlers*` (9/9).
|
||||||
|
- [2026-02-20T11:18:02Z] scope: staging `src/main.ts`, new global-shortcuts runtime handlers module/test, and subagent bookkeeping only.
|
||||||
- [2026-02-20T11:15:54Z] progress: extracted CLI command composition from `src/main.ts` into `src/main/runtime/cli-command-runtime-handler.ts`; `main.ts` now creates `handleCliCommand` via one runtime factory (precheck + context + runtime dispatch wiring).
|
- [2026-02-20T11:15:54Z] progress: extracted CLI command composition from `src/main.ts` into `src/main/runtime/cli-command-runtime-handler.ts`; `main.ts` now creates `handleCliCommand` via one runtime factory (precheck + context + runtime dispatch wiring).
|
||||||
- [2026-02-20T11:15:54Z] progress: added `src/main/runtime/cli-command-runtime-handler.test.ts` to lock composed behavior around texthooker precheck, context creation, and `'initial'` source forwarding.
|
- [2026-02-20T11:15:54Z] progress: added `src/main/runtime/cli-command-runtime-handler.test.ts` to lock composed behavior around texthooker precheck, context creation, and `'initial'` source forwarding.
|
||||||
- [2026-02-20T11:15:54Z] test: `bun run build` pass (expected macOS helper Swift cache fallback) + focused suites pass for `cli-command-runtime-handler*`, `cli-command-prechecks*`, `cli-command-context-factory*`, `initial-args-runtime-handler*`, and `startup-runtime-handlers*` (7/7).
|
- [2026-02-20T11:15:54Z] test: `bun run build` pass (expected macOS helper Swift cache fallback) + focused suites pass for `cli-command-runtime-handler*`, `cli-command-prechecks*`, `cli-command-context-factory*`, `initial-args-runtime-handler*`, and `startup-runtime-handlers*` (7/7).
|
||||||
|
|||||||
62
src/main.ts
62
src/main.ts
@@ -287,16 +287,7 @@ import {
|
|||||||
createBuildUpdateVisibleOverlayBoundsMainDepsHandler,
|
createBuildUpdateVisibleOverlayBoundsMainDepsHandler,
|
||||||
} from './main/runtime/overlay-window-layout-main-deps';
|
} from './main/runtime/overlay-window-layout-main-deps';
|
||||||
import { buildTrayMenuTemplateRuntime, resolveTrayIconPathRuntime } from './main/runtime/tray-runtime';
|
import { buildTrayMenuTemplateRuntime, resolveTrayIconPathRuntime } from './main/runtime/tray-runtime';
|
||||||
import {
|
import { createGlobalShortcutsRuntimeHandlers } from './main/runtime/global-shortcuts-runtime-handlers';
|
||||||
createGetConfiguredShortcutsHandler,
|
|
||||||
createRefreshGlobalAndOverlayShortcutsHandler,
|
|
||||||
createRegisterGlobalShortcutsHandler,
|
|
||||||
} from './main/runtime/global-shortcuts';
|
|
||||||
import {
|
|
||||||
createBuildGetConfiguredShortcutsMainDepsHandler,
|
|
||||||
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler,
|
|
||||||
createBuildRegisterGlobalShortcutsMainDepsHandler,
|
|
||||||
} from './main/runtime/global-shortcuts-main-deps';
|
|
||||||
import { createAppendToMpvLogHandler, createShowMpvOsdHandler } from './main/runtime/mpv-osd-log';
|
import { createAppendToMpvLogHandler, createShowMpvOsdHandler } from './main/runtime/mpv-osd-log';
|
||||||
import {
|
import {
|
||||||
createBuildAppendToMpvLogMainDepsHandler,
|
createBuildAppendToMpvLogMainDepsHandler,
|
||||||
@@ -2505,56 +2496,31 @@ function openYomitanSettings(): void {
|
|||||||
openYomitanSettingsHandler();
|
openYomitanSettingsHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
const buildGetConfiguredShortcutsMainDepsHandler = createBuildGetConfiguredShortcutsMainDepsHandler(
|
const {
|
||||||
{
|
getConfiguredShortcuts,
|
||||||
|
registerGlobalShortcuts,
|
||||||
|
refreshGlobalAndOverlayShortcuts,
|
||||||
|
} = createGlobalShortcutsRuntimeHandlers({
|
||||||
|
getConfiguredShortcutsMainDeps: {
|
||||||
getResolvedConfig: () => getResolvedConfig(),
|
getResolvedConfig: () => getResolvedConfig(),
|
||||||
defaultConfig: DEFAULT_CONFIG,
|
defaultConfig: DEFAULT_CONFIG,
|
||||||
resolveConfiguredShortcuts,
|
resolveConfiguredShortcuts,
|
||||||
},
|
},
|
||||||
);
|
buildRegisterGlobalShortcutsMainDeps: (getConfiguredShortcutsHandler) => ({
|
||||||
const getConfiguredShortcutsMainDeps = buildGetConfiguredShortcutsMainDepsHandler();
|
getConfiguredShortcuts: () => getConfiguredShortcutsHandler(),
|
||||||
const getConfiguredShortcutsHandler = createGetConfiguredShortcutsHandler(
|
|
||||||
getConfiguredShortcutsMainDeps,
|
|
||||||
);
|
|
||||||
|
|
||||||
const buildRegisterGlobalShortcutsMainDepsHandler =
|
|
||||||
createBuildRegisterGlobalShortcutsMainDepsHandler({
|
|
||||||
getConfiguredShortcuts: () => getConfiguredShortcuts(),
|
|
||||||
registerGlobalShortcutsCore,
|
registerGlobalShortcutsCore,
|
||||||
toggleVisibleOverlay: () => toggleVisibleOverlay(),
|
toggleVisibleOverlay: () => toggleVisibleOverlay(),
|
||||||
toggleInvisibleOverlay: () => toggleInvisibleOverlay(),
|
toggleInvisibleOverlay: () => toggleInvisibleOverlay(),
|
||||||
openYomitanSettings: () => openYomitanSettings(),
|
openYomitanSettings: () => openYomitanSettings(),
|
||||||
isDev,
|
isDev,
|
||||||
getMainWindow: () => overlayManager.getMainWindow(),
|
getMainWindow: () => overlayManager.getMainWindow(),
|
||||||
});
|
}),
|
||||||
const registerGlobalShortcutsMainDeps = buildRegisterGlobalShortcutsMainDepsHandler();
|
buildRefreshGlobalAndOverlayShortcutsMainDeps: (registerGlobalShortcutsHandler) => ({
|
||||||
const registerGlobalShortcutsHandler = createRegisterGlobalShortcutsHandler(
|
|
||||||
registerGlobalShortcutsMainDeps,
|
|
||||||
);
|
|
||||||
|
|
||||||
const buildRefreshGlobalAndOverlayShortcutsMainDepsHandler =
|
|
||||||
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler({
|
|
||||||
unregisterAllGlobalShortcuts: () => globalShortcut.unregisterAll(),
|
unregisterAllGlobalShortcuts: () => globalShortcut.unregisterAll(),
|
||||||
registerGlobalShortcuts: () => registerGlobalShortcuts(),
|
registerGlobalShortcuts: () => registerGlobalShortcutsHandler(),
|
||||||
syncOverlayShortcuts: () => syncOverlayShortcuts(),
|
syncOverlayShortcuts: () => syncOverlayShortcuts(),
|
||||||
});
|
}),
|
||||||
const refreshGlobalAndOverlayShortcutsMainDeps =
|
});
|
||||||
buildRefreshGlobalAndOverlayShortcutsMainDepsHandler();
|
|
||||||
const refreshGlobalAndOverlayShortcutsHandler = createRefreshGlobalAndOverlayShortcutsHandler(
|
|
||||||
refreshGlobalAndOverlayShortcutsMainDeps,
|
|
||||||
);
|
|
||||||
|
|
||||||
function registerGlobalShortcuts(): void {
|
|
||||||
registerGlobalShortcutsHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshGlobalAndOverlayShortcuts(): void {
|
|
||||||
refreshGlobalAndOverlayShortcutsHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConfiguredShortcuts() {
|
|
||||||
return getConfiguredShortcutsHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
const buildCycleSecondarySubModeMainDepsHandler = createBuildCycleSecondarySubModeMainDepsHandler(
|
const buildCycleSecondarySubModeMainDepsHandler = createBuildCycleSecondarySubModeMainDepsHandler(
|
||||||
{
|
{
|
||||||
|
|||||||
57
src/main/runtime/global-shortcuts-runtime-handlers.test.ts
Normal file
57
src/main/runtime/global-shortcuts-runtime-handlers.test.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import type { ConfiguredShortcuts } from '../../core/utils/shortcut-config';
|
||||||
|
import { createGlobalShortcutsRuntimeHandlers } from './global-shortcuts-runtime-handlers';
|
||||||
|
|
||||||
|
function createShortcuts(): ConfiguredShortcuts {
|
||||||
|
return {
|
||||||
|
toggleVisibleOverlayGlobal: 'CommandOrControl+Shift+O',
|
||||||
|
toggleInvisibleOverlayGlobal: 'CommandOrControl+Shift+I',
|
||||||
|
copySubtitle: 's',
|
||||||
|
copySubtitleMultiple: 'CommandOrControl+s',
|
||||||
|
updateLastCardFromClipboard: 'c',
|
||||||
|
triggerFieldGrouping: null,
|
||||||
|
triggerSubsync: null,
|
||||||
|
mineSentence: 'q',
|
||||||
|
mineSentenceMultiple: 'w',
|
||||||
|
multiCopyTimeoutMs: 5000,
|
||||||
|
toggleSecondarySub: null,
|
||||||
|
markAudioCard: null,
|
||||||
|
openRuntimeOptions: null,
|
||||||
|
openJimaku: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
test('global shortcuts runtime handlers compose get/register/refresh flow', () => {
|
||||||
|
const calls: string[] = [];
|
||||||
|
const shortcuts = createShortcuts();
|
||||||
|
const runtime = createGlobalShortcutsRuntimeHandlers({
|
||||||
|
getConfiguredShortcutsMainDeps: {
|
||||||
|
getResolvedConfig: () => ({}) as never,
|
||||||
|
defaultConfig: {} as never,
|
||||||
|
resolveConfiguredShortcuts: () => shortcuts,
|
||||||
|
},
|
||||||
|
buildRegisterGlobalShortcutsMainDeps: (getConfiguredShortcuts) => ({
|
||||||
|
getConfiguredShortcuts,
|
||||||
|
registerGlobalShortcutsCore: (options) => {
|
||||||
|
calls.push('register');
|
||||||
|
assert.equal(options.shortcuts, shortcuts);
|
||||||
|
},
|
||||||
|
toggleVisibleOverlay: () => calls.push('toggle-visible'),
|
||||||
|
toggleInvisibleOverlay: () => calls.push('toggle-invisible'),
|
||||||
|
openYomitanSettings: () => calls.push('open-yomitan'),
|
||||||
|
isDev: false,
|
||||||
|
getMainWindow: () => null,
|
||||||
|
}),
|
||||||
|
buildRefreshGlobalAndOverlayShortcutsMainDeps: (registerGlobalShortcuts) => ({
|
||||||
|
unregisterAllGlobalShortcuts: () => calls.push('unregister'),
|
||||||
|
registerGlobalShortcuts: () => registerGlobalShortcuts(),
|
||||||
|
syncOverlayShortcuts: () => calls.push('sync-overlay'),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(runtime.getConfiguredShortcuts(), shortcuts);
|
||||||
|
runtime.registerGlobalShortcuts();
|
||||||
|
runtime.refreshGlobalAndOverlayShortcuts();
|
||||||
|
assert.deepEqual(calls, ['register', 'unregister', 'register', 'sync-overlay']);
|
||||||
|
});
|
||||||
60
src/main/runtime/global-shortcuts-runtime-handlers.ts
Normal file
60
src/main/runtime/global-shortcuts-runtime-handlers.ts
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import type { ConfiguredShortcuts } from '../../core/utils/shortcut-config';
|
||||||
|
import {
|
||||||
|
createGetConfiguredShortcutsHandler,
|
||||||
|
createRefreshGlobalAndOverlayShortcutsHandler,
|
||||||
|
createRegisterGlobalShortcutsHandler,
|
||||||
|
} from './global-shortcuts';
|
||||||
|
import {
|
||||||
|
createBuildGetConfiguredShortcutsMainDepsHandler,
|
||||||
|
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler,
|
||||||
|
createBuildRegisterGlobalShortcutsMainDepsHandler,
|
||||||
|
} from './global-shortcuts-main-deps';
|
||||||
|
|
||||||
|
type GetConfiguredShortcutsMainDeps = Parameters<
|
||||||
|
typeof createBuildGetConfiguredShortcutsMainDepsHandler
|
||||||
|
>[0];
|
||||||
|
type RegisterGlobalShortcutsMainDeps = Parameters<
|
||||||
|
typeof createBuildRegisterGlobalShortcutsMainDepsHandler
|
||||||
|
>[0];
|
||||||
|
type RefreshGlobalAndOverlayShortcutsMainDeps = Parameters<
|
||||||
|
typeof createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler
|
||||||
|
>[0];
|
||||||
|
|
||||||
|
export function createGlobalShortcutsRuntimeHandlers(deps: {
|
||||||
|
getConfiguredShortcutsMainDeps: GetConfiguredShortcutsMainDeps;
|
||||||
|
buildRegisterGlobalShortcutsMainDeps: (
|
||||||
|
getConfiguredShortcuts: () => ConfiguredShortcuts,
|
||||||
|
) => RegisterGlobalShortcutsMainDeps;
|
||||||
|
buildRefreshGlobalAndOverlayShortcutsMainDeps: (
|
||||||
|
registerGlobalShortcuts: () => void,
|
||||||
|
) => RefreshGlobalAndOverlayShortcutsMainDeps;
|
||||||
|
}) {
|
||||||
|
const getConfiguredShortcutsMainDeps = createBuildGetConfiguredShortcutsMainDepsHandler(
|
||||||
|
deps.getConfiguredShortcutsMainDeps,
|
||||||
|
)();
|
||||||
|
const getConfiguredShortcutsHandler =
|
||||||
|
createGetConfiguredShortcutsHandler(getConfiguredShortcutsMainDeps);
|
||||||
|
const getConfiguredShortcuts = () => getConfiguredShortcutsHandler();
|
||||||
|
|
||||||
|
const registerGlobalShortcutsMainDeps = createBuildRegisterGlobalShortcutsMainDepsHandler(
|
||||||
|
deps.buildRegisterGlobalShortcutsMainDeps(getConfiguredShortcuts),
|
||||||
|
)();
|
||||||
|
const registerGlobalShortcutsHandler =
|
||||||
|
createRegisterGlobalShortcutsHandler(registerGlobalShortcutsMainDeps);
|
||||||
|
const registerGlobalShortcuts = () => registerGlobalShortcutsHandler();
|
||||||
|
|
||||||
|
const refreshGlobalAndOverlayShortcutsMainDeps =
|
||||||
|
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler(
|
||||||
|
deps.buildRefreshGlobalAndOverlayShortcutsMainDeps(registerGlobalShortcuts),
|
||||||
|
)();
|
||||||
|
const refreshGlobalAndOverlayShortcutsHandler = createRefreshGlobalAndOverlayShortcutsHandler(
|
||||||
|
refreshGlobalAndOverlayShortcutsMainDeps,
|
||||||
|
);
|
||||||
|
const refreshGlobalAndOverlayShortcuts = () => refreshGlobalAndOverlayShortcutsHandler();
|
||||||
|
|
||||||
|
return {
|
||||||
|
getConfiguredShortcuts,
|
||||||
|
registerGlobalShortcuts,
|
||||||
|
refreshGlobalAndOverlayShortcuts,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user