Phase 14: build reinject blocks from tracked paths — loose skill disk fallback
buildReinjectBlocks uses tracked filePath/baseDir when resourceLoader has no entry and requireRegistered is false, completing defer-path B-002 injection. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+13
-6
@@ -179,11 +179,18 @@ export function buildReinjectBlocks(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const registered = registeredByName.get(name);
|
const registered = registeredByName.get(name);
|
||||||
|
const filePath = registered?.filePath ?? tracked.filePath;
|
||||||
|
const baseDir = registered?.baseDir ?? tracked.baseDir;
|
||||||
if (!registered) {
|
if (!registered) {
|
||||||
notifySkippedSkill(ctx, name, "no longer registered");
|
if (settings.requireRegistered) {
|
||||||
continue;
|
notifySkippedSkill(ctx, name, "no longer registered");
|
||||||
}
|
continue;
|
||||||
if (!existsSync(registered.filePath)) {
|
}
|
||||||
|
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");
|
notifySkippedSkill(ctx, name, "SKILL.md not found on disk");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -192,8 +199,8 @@ export function buildReinjectBlocks(
|
|||||||
expandSkill(
|
expandSkill(
|
||||||
{
|
{
|
||||||
name: tracked.name,
|
name: tracked.name,
|
||||||
filePath: registered.filePath,
|
filePath,
|
||||||
baseDir: registered.baseDir,
|
baseDir,
|
||||||
},
|
},
|
||||||
settings.suffix,
|
settings.suffix,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { existsSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
|||||||
import { tmpdir } from "os";
|
import { tmpdir } from "os";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
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 { createDefaultSettings } from "../src/settings";
|
||||||
import { createInitialState, trackSkill } from "../src/state";
|
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('<skill name="loose"');
|
||||||
|
expect(result?.message?.content).toContain("[skill-reinject] Re-applied after compaction.");
|
||||||
|
expect(state.pendingReinject).toEqual([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user