Phase 14: reinjectNow loose fallback for --skill paths — B-002 now command

resolveReinjectSkillNames includes tracked skills on disk when requireRegistered is false so /skill-reinject now works without resourceLoader entry.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-17 17:35:19 +07:00
parent ebc169c91f
commit 459b8775f4
2 changed files with 87 additions and 2 deletions
+26 -2
View File
@@ -252,6 +252,31 @@ export function sendImmediateReinjectAllFollowUp(
}
}
/** Names eligible for re-inject: registered, or on disk when requireRegistered is false (Phase 14 / B-002). */
export function resolveReinjectSkillNames(
state: ExtensionState,
settings: SkillReinjectSettings,
registeredSkills: readonly Pick<Skill, "name">[],
ctx?: ExtensionContext,
): string[] {
const registered = registeredSkillNames(registeredSkills);
const names: string[] = [];
for (const tracked of state.skills) {
if (registered.has(tracked.name)) {
names.push(tracked.name);
continue;
}
if (settings.requireRegistered) {
continue;
}
if (existsSync(tracked.filePath)) {
notifyInfo(ctx, `skill-reinject: re-injected "${tracked.name}" from disk`);
names.push(tracked.name);
}
}
return names;
}
/** Force re-inject all tracked registered skills for /skill-reinject now (SPEC §7.1). */
export function reinjectNow(
pi: ExtensionAPI,
@@ -260,8 +285,7 @@ export function reinjectNow(
ctx: ExtensionContext,
registeredSkills: readonly Pick<Skill, "name" | "filePath" | "baseDir">[],
): void {
const registered = registeredSkillNames(registeredSkills);
const skillNames = state.skills.map((skill) => skill.name).filter((name) => registered.has(name));
const skillNames = resolveReinjectSkillNames(state, settings, registeredSkills, ctx);
if (skillNames.length === 0) {
if (ctx.hasUI) {
ctx.ui.notify("skill-reinject: no tracked skills to re-inject", "info");