Summary
Extract the generic parts of src/cron/hooks.ts into a shared src/hooks/lifecycle.ts module so all future workflow hook PRs (delivery, agent, subagent, tool) import from a common foundation instead of the cron module.
Problem
runCronHooks, CronHookEntry, and CronHookRunResult in src/cron/hooks.ts are 100% workflow-agnostic but have cron-specific names. Building delivery (#6), agent (#7), subagent (#8), and tool (#9) hooks on top of the cron module creates a naming smell and a wrong dependency direction.
Acceptance criteria
Implementation plan
- Add
LifecycleHookEntry and LifecycleHookRunResult to src/config/types.hooks.ts
- Create
src/hooks/lifecycle.ts with runLifecycleHooks, loadHookModule, isValidJobHookPath, createTimeout (moved verbatim from src/cron/hooks.ts)
- Update
src/cron/hooks.ts to import from src/hooks/lifecycle.ts and re-export CronHookEntry = LifecycleHookEntry and runCronHooks = runLifecycleHooks
- Run
pnpm build && pnpm check && pnpm test -- src/cron/hooks.test.ts
Files affected
src/config/types.hooks.ts (add LifecycleHookEntry, LifecycleHookRunResult)
src/hooks/lifecycle.ts (new)
src/cron/hooks.ts (import from shared module, re-export aliases)
Additional notes
Summary
Extract the generic parts of
src/cron/hooks.tsinto a sharedsrc/hooks/lifecycle.tsmodule so all future workflow hook PRs (delivery, agent, subagent, tool) import from a common foundation instead of the cron module.Problem
runCronHooks,CronHookEntry, andCronHookRunResultinsrc/cron/hooks.tsare 100% workflow-agnostic but have cron-specific names. Building delivery (#6), agent (#7), subagent (#8), and tool (#9) hooks on top of the cron module creates a naming smell and a wrong dependency direction.Acceptance criteria
src/hooks/lifecycle.tsexportsrunLifecycleHooks,LifecycleHookRunResult,loadHookModule,isValidJobHookPathLifecycleHookEntrytype lives insrc/config/types.hooks.tssrc/cron/hooks.tsre-exportsCronHookEntry(alias forLifecycleHookEntry) andrunCronHooks(alias forrunLifecycleHooks) for back-compat with upstream PR cron: add lifecycle hooks for job execution openclaw/openclaw#45465pnpm buildandpnpm checkpass cleanImplementation plan
LifecycleHookEntryandLifecycleHookRunResulttosrc/config/types.hooks.tssrc/hooks/lifecycle.tswithrunLifecycleHooks,loadHookModule,isValidJobHookPath,createTimeout(moved verbatim fromsrc/cron/hooks.ts)src/cron/hooks.tsto import fromsrc/hooks/lifecycle.tsand re-exportCronHookEntry = LifecycleHookEntryandrunCronHooks = runLifecycleHookspnpm build && pnpm check && pnpm test -- src/cron/hooks.test.tsFiles affected
src/config/types.hooks.ts(add LifecycleHookEntry, LifecycleHookRunResult)src/hooks/lifecycle.ts(new)src/cron/hooks.ts(import from shared module, re-export aliases)Additional notes
src/cron/hooks.tskeep upstream PR 45465 mergeable without changes