fix(coding-agent): display path of sibling dependent extensions (#6964)
fixes: #6619
This commit is contained in:
@@ -1077,8 +1077,16 @@ export class InteractiveMode {
|
|||||||
* Get a short path relative to the package root for display.
|
* Get a short path relative to the package root for display.
|
||||||
*/
|
*/
|
||||||
private getShortPath(fullPath: string, sourceInfo?: SourceInfo): string {
|
private getShortPath(fullPath: string, sourceInfo?: SourceInfo): string {
|
||||||
|
const normalizedFullPath = fullPath.replace(/\\/g, "/");
|
||||||
const baseDir = sourceInfo?.baseDir;
|
const baseDir = sourceInfo?.baseDir;
|
||||||
if (baseDir && this.isPackageSource(sourceInfo)) {
|
if (baseDir && this.isPackageSource(sourceInfo)) {
|
||||||
|
const normalizedBaseDir = baseDir.replace(/\\/g, "/");
|
||||||
|
const npmRootMatch = normalizedBaseDir.match(/^(.*\/node_modules)\/(@?[^/]+(?:\/[^/]+)?)$/);
|
||||||
|
// If fullPath is under the same node_modules root as baseDir, preserve that relative topology.
|
||||||
|
if (npmRootMatch?.[1] && normalizedFullPath.startsWith(`${npmRootMatch[1]}/`)) {
|
||||||
|
return path.posix.relative(normalizedBaseDir, normalizedFullPath);
|
||||||
|
}
|
||||||
|
|
||||||
const relativePath = path.relative(path.resolve(baseDir), path.resolve(fullPath));
|
const relativePath = path.relative(path.resolve(baseDir), path.resolve(fullPath));
|
||||||
if (
|
if (
|
||||||
relativePath &&
|
relativePath &&
|
||||||
@@ -1092,12 +1100,12 @@ export class InteractiveMode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const source = sourceInfo?.source ?? "";
|
const source = sourceInfo?.source ?? "";
|
||||||
const npmMatch = fullPath.match(/node_modules\/(@?[^/]+(?:\/[^/]+)?)\/(.*)/);
|
const npmMatch = normalizedFullPath.match(/node_modules\/(@?[^/]+(?:\/[^/]+)?)\/(.*)/);
|
||||||
if (npmMatch && source.startsWith("npm:")) {
|
if (npmMatch && source.startsWith("npm:")) {
|
||||||
return npmMatch[2];
|
return npmMatch[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
const gitMatch = fullPath.match(/git\/[^/]+\/[^/]+\/(.*)/);
|
const gitMatch = normalizedFullPath.match(/git\/[^/]+\/[^/]+\/(.*)/);
|
||||||
if (gitMatch && source.startsWith("git:")) {
|
if (gitMatch && source.startsWith("git:")) {
|
||||||
return gitMatch[1];
|
return gitMatch[1];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1019,6 +1019,84 @@ describe("InteractiveMode.showLoadedResources", () => {
|
|||||||
"[Extensions]
|
"[Extensions]
|
||||||
pi-markdown-preview"`);
|
pi-markdown-preview"`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("labels npm sibling extensions relative to the declaring package", () => {
|
||||||
|
const extensions: ExtensionFixture[] = [
|
||||||
|
{
|
||||||
|
path: "/tmp/project/.pi/npm/node_modules/primary-package/index.ts",
|
||||||
|
sourceInfo: createSourceInfo("/tmp/project/.pi/npm/node_modules/primary-package/index.ts", {
|
||||||
|
source: "npm:primary-package",
|
||||||
|
scope: "project",
|
||||||
|
origin: "package",
|
||||||
|
baseDir: "/tmp/project/.pi/npm/node_modules/primary-package",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/tmp/project/.pi/npm/node_modules/sibling-package/index.ts",
|
||||||
|
sourceInfo: createSourceInfo("/tmp/project/.pi/npm/node_modules/sibling-package/index.ts", {
|
||||||
|
source: "npm:primary-package",
|
||||||
|
scope: "project",
|
||||||
|
origin: "package",
|
||||||
|
baseDir: "/tmp/project/.pi/npm/node_modules/primary-package",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const fakeThis = createShowLoadedResourcesThis({
|
||||||
|
quietStartup: false,
|
||||||
|
extensions,
|
||||||
|
useRealScopeGroups: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
(InteractiveMode as any).prototype.showLoadedResources.call(fakeThis, {
|
||||||
|
force: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(normalizeRenderedOutput(fakeThis.loadedResourcesContainer)).toMatchInlineSnapshot(`
|
||||||
|
"[Extensions]
|
||||||
|
primary-package, primary-package:../sibling-package"`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("labels Windows npm sibling extensions relative to the declaring package", () => {
|
||||||
|
const primaryPath = "C:\\Users\\me\\.pi\\agent\\npm\\node_modules\\primary-package\\index.ts";
|
||||||
|
const siblingPath = "C:\\Users\\me\\.pi\\agent\\npm\\node_modules\\sibling-package\\index.ts";
|
||||||
|
const baseDir = "C:\\Users\\me\\.pi\\agent\\npm\\node_modules\\primary-package";
|
||||||
|
const extensions: ExtensionFixture[] = [
|
||||||
|
{
|
||||||
|
path: primaryPath,
|
||||||
|
sourceInfo: createSourceInfo(primaryPath, {
|
||||||
|
source: "npm:primary-package",
|
||||||
|
scope: "user",
|
||||||
|
origin: "package",
|
||||||
|
baseDir,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: siblingPath,
|
||||||
|
sourceInfo: createSourceInfo(siblingPath, {
|
||||||
|
source: "npm:primary-package",
|
||||||
|
scope: "user",
|
||||||
|
origin: "package",
|
||||||
|
baseDir,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const fakeThis = createShowLoadedResourcesThis({
|
||||||
|
quietStartup: false,
|
||||||
|
extensions,
|
||||||
|
useRealScopeGroups: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
(InteractiveMode as any).prototype.showLoadedResources.call(fakeThis, {
|
||||||
|
force: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(normalizeRenderedOutput(fakeThis.loadedResourcesContainer)).toMatchInlineSnapshot(`
|
||||||
|
"[Extensions]
|
||||||
|
primary-package, primary-package:../sibling-package"`);
|
||||||
|
});
|
||||||
|
|
||||||
test("captures mixed extension layouts in expanded output", () => {
|
test("captures mixed extension layouts in expanded output", () => {
|
||||||
const fakeThis = createShowLoadedResourcesThis({
|
const fakeThis = createShowLoadedResourcesThis({
|
||||||
quietStartup: false,
|
quietStartup: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user