From ebc169c91f21a9d13eb768934b64c162b66aef65 Mon Sep 17 00:00:00 2001 From: GRayHook Date: Wed, 17 Jun 2026 17:34:43 +0700 Subject: [PATCH] =?UTF-8?q?Phase=2014:=20build=20reinject=20blocks=20from?= =?UTF-8?q?=20tracked=20paths=20=E2=80=94=20loose=20skill=20disk=20fallbac?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit buildReinjectBlocks uses tracked filePath/baseDir when resourceLoader has no entry and requireRegistered is false, completing defer-path B-002 injection. Co-authored-by: Cursor --- src/reinject.ts | 19 +++++++++++++------ test/reinject-deferred-consume.test.ts | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/reinject.ts b/src/reinject.ts index d17eba8..33f0c15 100644 --- a/src/reinject.ts +++ b/src/reinject.ts @@ -179,11 +179,18 @@ export function buildReinjectBlocks( continue; } const registered = registeredByName.get(name); + const filePath = registered?.filePath ?? tracked.filePath; + const baseDir = registered?.baseDir ?? tracked.baseDir; if (!registered) { - notifySkippedSkill(ctx, name, "no longer registered"); - continue; - } - if (!existsSync(registered.filePath)) { + if (settings.requireRegistered) { + notifySkippedSkill(ctx, name, "no longer registered"); + continue; + } + if (!existsSync(tracked.filePath)) { + notifySkippedSkill(ctx, name, "SKILL.md not found on disk"); + continue; + } + } else if (!existsSync(filePath)) { notifySkippedSkill(ctx, name, "SKILL.md not found on disk"); continue; } @@ -192,8 +199,8 @@ export function buildReinjectBlocks( expandSkill( { name: tracked.name, - filePath: registered.filePath, - baseDir: registered.baseDir, + filePath, + baseDir, }, settings.suffix, ), diff --git a/test/reinject-deferred-consume.test.ts b/test/reinject-deferred-consume.test.ts index 4f62949..4ee0cad 100644 --- a/test/reinject-deferred-consume.test.ts +++ b/test/reinject-deferred-consume.test.ts @@ -2,7 +2,7 @@ import { existsSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from "fs"; import { tmpdir } from "os"; import { join } from "path"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { filterPendingReinjectForConsume } from "../src/reinject"; +import { filterPendingReinjectForConsume, tryConsumeDeferredReinject } from "../src/reinject"; import { createDefaultSettings } from "../src/settings"; import { createInitialState, trackSkill } from "../src/state"; @@ -94,3 +94,18 @@ describe("filterPendingReinjectForConsume", () => { ); }); }); + +describe("tryConsumeDeferredReinject loose path", () => { + it("injects skill block from tracked filePath when not registered", () => { + const { filePath, baseDir } = tempSkillDir("loose"); + const state = createInitialState(); + trackSkill(state, { name: "loose", filePath, baseDir, source: "slash" }); + state.pendingReinject = ["loose"]; + + const result = tryConsumeDeferredReinject(state, createDefaultSettings(), [], undefined); + + expect(result?.message?.content).toContain('