Merge pull request #4299 from aliou/fix/resource-location-in-config-tui
fix(coding-agent): preserve .agents provenance in skill metadata
This commit is contained in:
@@ -2182,6 +2182,7 @@ export class DefaultPackageManager implements PackageManager {
|
||||
}
|
||||
};
|
||||
|
||||
// Project extensions from .pi/
|
||||
addResources(
|
||||
"extensions",
|
||||
collectAutoExtensionEntries(projectDirs.extensions),
|
||||
@@ -2189,16 +2190,32 @@ export class DefaultPackageManager implements PackageManager {
|
||||
projectOverrides.extensions,
|
||||
projectBaseDir,
|
||||
);
|
||||
|
||||
// Project skills from .pi/
|
||||
addResources(
|
||||
"skills",
|
||||
[
|
||||
...collectAutoSkillEntries(projectDirs.skills, "pi"),
|
||||
...projectAgentsSkillDirs.flatMap((dir) => collectAutoSkillEntries(dir, "agents")),
|
||||
],
|
||||
collectAutoSkillEntries(projectDirs.skills, "pi"),
|
||||
projectMetadata,
|
||||
projectOverrides.skills,
|
||||
projectBaseDir,
|
||||
);
|
||||
|
||||
// Project skills from .agents/ (each with its own baseDir)
|
||||
for (const agentsSkillsDir of projectAgentsSkillDirs) {
|
||||
const agentsBaseDir = dirname(agentsSkillsDir); // the .agents directory
|
||||
const agentsMetadata: PathMetadata = {
|
||||
...projectMetadata,
|
||||
baseDir: agentsBaseDir,
|
||||
};
|
||||
addResources(
|
||||
"skills",
|
||||
collectAutoSkillEntries(agentsSkillsDir, "agents"),
|
||||
agentsMetadata,
|
||||
projectOverrides.skills,
|
||||
agentsBaseDir,
|
||||
);
|
||||
}
|
||||
|
||||
addResources(
|
||||
"prompts",
|
||||
collectAutoPromptEntries(projectDirs.prompts),
|
||||
@@ -2214,6 +2231,7 @@ export class DefaultPackageManager implements PackageManager {
|
||||
projectBaseDir,
|
||||
);
|
||||
|
||||
// User extensions from ~/.pi/agent/
|
||||
addResources(
|
||||
"extensions",
|
||||
collectAutoExtensionEntries(userDirs.extensions),
|
||||
@@ -2221,13 +2239,30 @@ export class DefaultPackageManager implements PackageManager {
|
||||
userOverrides.extensions,
|
||||
globalBaseDir,
|
||||
);
|
||||
|
||||
// User skills from ~/.pi/agent/
|
||||
addResources(
|
||||
"skills",
|
||||
[...collectAutoSkillEntries(userDirs.skills, "pi"), ...collectAutoSkillEntries(userAgentsSkillsDir, "agents")],
|
||||
collectAutoSkillEntries(userDirs.skills, "pi"),
|
||||
userMetadata,
|
||||
userOverrides.skills,
|
||||
globalBaseDir,
|
||||
);
|
||||
|
||||
// User skills from ~/.agents/ (with its own baseDir)
|
||||
const userAgentsBaseDir = dirname(userAgentsSkillsDir);
|
||||
const userAgentsMetadata: PathMetadata = {
|
||||
...userMetadata,
|
||||
baseDir: userAgentsBaseDir,
|
||||
};
|
||||
addResources(
|
||||
"skills",
|
||||
collectAutoSkillEntries(userAgentsSkillsDir, "agents"),
|
||||
userAgentsMetadata,
|
||||
userOverrides.skills,
|
||||
userAgentsBaseDir,
|
||||
);
|
||||
|
||||
addResources(
|
||||
"prompts",
|
||||
collectAutoPromptEntries(userDirs.prompts),
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
* TUI component for managing package resources (enable/disable)
|
||||
*/
|
||||
|
||||
import { homedir } from "node:os";
|
||||
import { basename, dirname, join, relative } from "node:path";
|
||||
import {
|
||||
type Component,
|
||||
@@ -55,12 +56,34 @@ interface ResourceGroup {
|
||||
subgroups: ResourceSubgroup[];
|
||||
}
|
||||
|
||||
function formatBaseDir(baseDir: string): string {
|
||||
const homeDir = homedir();
|
||||
let displayPath: string;
|
||||
|
||||
if (baseDir === homeDir) {
|
||||
displayPath = "~";
|
||||
} else if (baseDir.startsWith(homeDir)) {
|
||||
// Replace home prefix with ~, normalize separators for display
|
||||
const rest = baseDir.slice(homeDir.length);
|
||||
displayPath = `~${rest.replace(/\\/g, "/")}`;
|
||||
} else {
|
||||
displayPath = baseDir.replace(/\\/g, "/");
|
||||
}
|
||||
|
||||
return displayPath.endsWith("/") ? displayPath : `${displayPath}/`;
|
||||
}
|
||||
|
||||
function getGroupLabel(metadata: PathMetadata): string {
|
||||
if (metadata.origin === "package") {
|
||||
return `${metadata.source} (${metadata.scope})`;
|
||||
}
|
||||
// Top-level resources
|
||||
if (metadata.source === "auto") {
|
||||
if (metadata.baseDir) {
|
||||
return metadata.scope === "user"
|
||||
? `User (${formatBaseDir(metadata.baseDir)})`
|
||||
: `Project (${formatBaseDir(metadata.baseDir)})`;
|
||||
}
|
||||
return metadata.scope === "user" ? "User (~/.pi/agent/)" : "Project (.pi/)";
|
||||
}
|
||||
return metadata.scope === "user" ? "User settings" : "Project settings";
|
||||
@@ -72,7 +95,7 @@ function buildGroups(resolved: ResolvedPaths): ResourceGroup[] {
|
||||
const addToGroup = (resources: ResolvedResource[], resourceType: ResourceType) => {
|
||||
for (const res of resources) {
|
||||
const { path, enabled, metadata } = res;
|
||||
const groupKey = `${metadata.origin}:${metadata.scope}:${metadata.source}`;
|
||||
const groupKey = `${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir ?? ""}`;
|
||||
|
||||
if (!groupMap.has(groupKey)) {
|
||||
groupMap.set(groupKey, {
|
||||
|
||||
Reference in New Issue
Block a user