From d637722ea5f6f7ff3b2b526c1f5f45cefa257cdd Mon Sep 17 00:00:00 2001 From: GRayHook Date: Wed, 17 Jun 2026 11:59:24 +0700 Subject: [PATCH] =?UTF-8?q?Phase=207:=20add=20reinjectNow=20=E2=80=94=20fo?= =?UTF-8?q?rce=20immediate=20re-inject=20of=20all=20tracked=20skills=20for?= =?UTF-8?q?=20debug.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uses idle vs followUp delivery based on ctx.isIdle(); skips unregistered skills via existing buildReinjectBlocks warnings. Co-authored-by: Cursor --- src/reinject.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/reinject.ts b/src/reinject.ts index 16a7988..b7adb78 100644 --- a/src/reinject.ts +++ b/src/reinject.ts @@ -150,6 +150,29 @@ export function sendImmediateReinjectAllFollowUp( } } +/** Force re-inject all tracked registered skills for /skill-reinject now (SPEC §7.1). */ +export function reinjectNow( + pi: ExtensionAPI, + state: ExtensionState, + settings: SkillReinjectSettings, + ctx: ExtensionContext, + registeredSkills: readonly Pick[], +): void { + const registered = registeredSkillNames(registeredSkills); + const skillNames = state.skills.map((skill) => skill.name).filter((name) => registered.has(name)); + if (skillNames.length === 0) { + if (ctx.hasUI) { + ctx.ui.notify("skill-reinject: no tracked skills to re-inject", "info"); + } + return; + } + if (ctx.isIdle()) { + sendImmediateReinjectIdle(pi, skillNames, state, settings, registeredSkills, ctx); + return; + } + sendImmediateReinjectAllFollowUp(pi, skillNames, state, settings, registeredSkills, ctx); +} + /** * Defer path on before_agent_start: inject one combined message, then clear queue (SPEC §6.5.1). * Returns undefined when pendingReinject is empty.