diff --git a/package-manager-template/README.md b/package-manager-template/README.md
index 8ee7d217c7..314b4e5430 100644
--- a/package-manager-template/README.md
+++ b/package-manager-template/README.md
@@ -52,6 +52,7 @@ author: "Author Name"
version: "1.0.0"
lastUpdated: "2025-04-08"
tags: ["tag1", "tag2"]
+sourceUrl: "https://github.com/username/repo" # Optional URL for the "view source" button
```
## Testing
diff --git a/package-manager-template/mcp-servers/file-analyzer/metadata.yml b/package-manager-template/mcp-servers/file-analyzer/metadata.yml
index fb841de24a..a0af98a760 100644
--- a/package-manager-template/mcp-servers/file-analyzer/metadata.yml
+++ b/package-manager-template/mcp-servers/file-analyzer/metadata.yml
@@ -4,4 +4,5 @@ type: "mcp-server"
author: "Roo Team"
version: "1.0.0"
lastUpdated: "2025-04-08"
-tags: ["file-analyzer", "code-quality", "security", "performance"]
\ No newline at end of file
+tags: ["file-analyzer", "code-quality", "security", "performance"]
+sourceUrl: "https://github.com/roo-team/file-analyzer-server"
\ No newline at end of file
diff --git a/package-manager-template/roles/developer-role/metadata.yml b/package-manager-template/roles/developer-role/metadata.yml
index 4f79230eae..c9c0627502 100644
--- a/package-manager-template/roles/developer-role/metadata.yml
+++ b/package-manager-template/roles/developer-role/metadata.yml
@@ -4,4 +4,5 @@ type: "role"
author: "Roo Team"
version: "1.0.0"
lastUpdated: "2025-04-08"
-tags: ["developer", "full-stack", "web", "database", "api"]
\ No newline at end of file
+tags: ["developer", "full-stack", "web", "database", "api"]
+sourceUrl: "https://github.com/roo-team/developer-resources"
\ No newline at end of file
diff --git a/package-manager-template/storage-systems/github-storage/metadata.yml b/package-manager-template/storage-systems/github-storage/metadata.yml
index 404e7052b4..b943653865 100644
--- a/package-manager-template/storage-systems/github-storage/metadata.yml
+++ b/package-manager-template/storage-systems/github-storage/metadata.yml
@@ -4,4 +4,5 @@ type: "storage"
author: "Roo Team"
version: "1.0.0"
lastUpdated: "2025-04-08"
-tags: ["storage", "github", "git", "repository"]
\ No newline at end of file
+tags: ["storage", "github", "git", "repository"]
+sourceUrl: "https://github.com/roo-team/github-storage-system"
\ No newline at end of file
diff --git a/src/services/package-manager/GitFetcher.ts b/src/services/package-manager/GitFetcher.ts
index 7430f71a5a..a694c1de32 100644
--- a/src/services/package-manager/GitFetcher.ts
+++ b/src/services/package-manager/GitFetcher.ts
@@ -276,6 +276,7 @@ export class GitFetcher {
const type = metadataContent.match(/type:\s*["']?([^"'\n]+)["']?/)?.[1] || dirType.type;
const author = metadataContent.match(/author:\s*["']?([^"'\n]+)["']?/)?.[1];
const version = metadataContent.match(/version:\s*["']?([^"'\n]+)["']?/)?.[1];
+ const sourceUrl = metadataContent.match(/sourceUrl:\s*["']?([^"'\n]+)["']?/)?.[1];
// Parse tags if present
const tagsMatch = metadataContent.match(/tags:\s*\[(.*?)\]/);
@@ -291,7 +292,8 @@ export class GitFetcher {
repoUrl,
author,
tags,
- version
+ version,
+ sourceUrl
};
items.push(item);
diff --git a/src/services/package-manager/types.ts b/src/services/package-manager/types.ts
index c9280f28c0..e0bfa6cb14 100644
--- a/src/services/package-manager/types.ts
+++ b/src/services/package-manager/types.ts
@@ -13,6 +13,7 @@ export interface PackageManagerItem {
lastUpdated?: string;
stars?: number;
downloads?: number;
+ sourceUrl?: string; // Optional URL to use for the "view source" button
}
/**
diff --git a/webview-ui/src/components/package-manager/PackageManagerView.tsx b/webview-ui/src/components/package-manager/PackageManagerView.tsx
index 7e873bfc1f..0dafd5f2f4 100644
--- a/webview-ui/src/components/package-manager/PackageManagerView.tsx
+++ b/webview-ui/src/components/package-manager/PackageManagerView.tsx
@@ -38,9 +38,13 @@ const PackageManagerView = ({ onDone }: PackageManagerViewProps) => {
// Track if we're currently fetching items to prevent duplicate requests
const [isFetching, setIsFetching] = useState(false);
+ // Track if the fetch was manually triggered by a refresh button
+ const isManualRefresh = useRef(false);
// Use a ref to track if we've already fetched items
const hasInitialFetch = useRef(false);
+ // Track the last sources we fetched to avoid duplicate fetches
+ const lastSourcesKey = useRef No package manager items found