refactor: remove package manager state files

This commit is contained in:
Smartsheet-JB-Brown 2025-04-16 16:31:24 -07:00
parent a4a4532922
commit 9c28626f24
5 changed files with 1 additions and 296 deletions

62
.roo/package-lock.json generated
View file

@ -1,62 +0,0 @@
{
"name": "roo-prepare",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "roo-prepare",
"version": "1.0.0",
"dependencies": {
"commander": "^11.1.0"
},
"bin": {
"prepare": "dist/prepare-cli.js"
},
"devDependencies": {
"@types/node": "^20.11.0",
"typescript": "^5.3.3"
}
},
"node_modules/@types/node": {
"version": "20.17.30",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz",
"integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.2"
}
},
"node_modules/commander": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true,
"license": "MIT"
}
}
}

View file

@ -1,21 +0,0 @@
{
"name": "roo-iterate",
"version": "1.0.0",
"description": "Iteration task management system",
"private": true,
"bin": {
"iterate": "./dist/iterate-cli.js"
},
"scripts": {
"build": "tsc",
"prepare": "npm run build",
"start": "node ./dist/iterate-cli.js"
},
"dependencies": {
"commander": "^11.1.0"
},
"devDependencies": {
"@types/node": "^20.11.0",
"typescript": "^5.3.3"
}
}

View file

@ -1,113 +0,0 @@
import { ComponentMetadata, PackageManagerItem } from "@/types/package-manager"
interface Filters {
type: string
search: string
tags: string[]
}
type Subcomponent = {
type: string
path: string
metadata?: ComponentMetadata
lastUpdated?: string
}
export class PackageManagerViewStateManager {
private items: PackageManagerItem[] = []
private sortBy: "name" | "lastUpdated" = "name"
private sortOrder: "asc" | "desc" = "asc"
private filters: Filters = { type: "", search: "", tags: [] }
setItems(items: PackageManagerItem[]) {
this.items = items
}
setSortBy(sortBy: "name" | "lastUpdated") {
this.sortBy = sortBy
}
setSortOrder(sortOrder: "asc" | "desc") {
this.sortOrder = sortOrder
}
setFilters(filters: Partial<Filters>) {
this.filters = { ...this.filters, ...filters }
}
private isParentItem(item: PackageManagerItem | Subcomponent): item is PackageManagerItem {
return "name" in item && "description" in item
}
private isSubcomponent(item: PackageManagerItem | Subcomponent): item is Subcomponent {
return "metadata" in item
}
private itemMatchesFilters(item: PackageManagerItem | Subcomponent): boolean {
// Helper function to check if text matches search term
const matchesSearch = (text: string) => {
if (!this.filters.search) return true
return text.toLowerCase().includes(this.filters.search.toLowerCase())
}
// Helper function to check if tags match
const matchesTags = (tags?: string[]) => {
if (!this.filters.tags.length) return true
return tags?.some((tag) => this.filters.tags.includes(tag)) ?? false
}
// Helper function to check if type matches
const matchesType = (type: string) => {
if (!this.filters.type) return true
return type === this.filters.type
}
// For parent items
if (this.isParentItem(item)) {
// For packages, check if any subcomponent matches the type filter
if (this.filters.type && item.type === "package" && item.items?.length) {
const hasMatchingSubcomponent = item.items.some((subItem) => subItem.type === this.filters.type)
if (hasMatchingSubcomponent) {
// If a subcomponent matches the type, only check other filters on the parent
return (
(!this.filters.search || matchesSearch(item.name) || matchesSearch(item.description)) &&
(!this.filters.tags.length || matchesTags(item.tags))
)
}
}
// For non-packages or if no subcomponent matches, check all filters
return (
matchesType(item.type) &&
(!this.filters.search || matchesSearch(item.name) || matchesSearch(item.description)) &&
(!this.filters.tags.length || matchesTags(item.tags))
)
}
// For subcomponents
if (this.isSubcomponent(item)) {
if (!item.metadata) return false
return (
matchesType(item.type) &&
(!this.filters.search ||
matchesSearch(item.metadata.name) ||
matchesSearch(item.metadata.description)) &&
(!this.filters.tags.length || matchesTags(item.metadata.tags))
)
}
return false
}
getFilteredAndSortedItems(): PackageManagerItem[] {
return [...this.items]
.filter((item) => this.itemMatchesFilters(item))
.sort((a, b) => {
const aValue = this.sortBy === "name" ? a.name : a.lastUpdated || ""
const bValue = this.sortBy === "name" ? b.name : b.lastUpdated || ""
const comparison = aValue.localeCompare(bValue)
return this.sortOrder === "asc" ? comparison : -comparison
})
}
}

View file

@ -1,98 +0,0 @@
import { PackageManagerViewStateManager } from "../PackageManagerViewStateManager"
import { PackageManagerItem } from "@/types/package-manager"
describe("PackageManagerViewStateManager", () => {
let stateManager: PackageManagerViewStateManager
const mockItems: PackageManagerItem[] = [
{
name: "B Component",
description: "Second component",
type: "mcp server",
version: "1.0.0",
lastUpdated: "2025-04-13T09:00:00-07:00",
url: "https://example.com/b",
repoUrl: "https://example.com",
path: "b",
items: [],
},
{
name: "A Component",
description: "First component",
type: "mcp server",
version: "1.0.0",
lastUpdated: "2025-04-14T09:00:00-07:00",
url: "https://example.com/a",
repoUrl: "https://example.com",
path: "a",
items: [],
},
]
beforeEach(() => {
stateManager = new PackageManagerViewStateManager()
stateManager.setItems(mockItems)
})
describe("sorting", () => {
it("should sort items by name in ascending order", () => {
stateManager.setSortBy("name")
stateManager.setSortOrder("asc")
const sortedItems = stateManager.getFilteredAndSortedItems()
expect(sortedItems[0].name).toBe("A Component")
expect(sortedItems[1].name).toBe("B Component")
})
it("should sort items by name in descending order", () => {
stateManager.setSortBy("name")
stateManager.setSortOrder("desc")
const sortedItems = stateManager.getFilteredAndSortedItems()
expect(sortedItems[0].name).toBe("B Component")
expect(sortedItems[1].name).toBe("A Component")
})
it("should sort items by lastUpdated in ascending order", () => {
stateManager.setSortBy("lastUpdated")
stateManager.setSortOrder("asc")
const sortedItems = stateManager.getFilteredAndSortedItems()
expect(sortedItems[0].lastUpdated).toBe("2025-04-13T09:00:00-07:00")
expect(sortedItems[1].lastUpdated).toBe("2025-04-14T09:00:00-07:00")
})
it("should sort items by lastUpdated in descending order", () => {
stateManager.setSortBy("lastUpdated")
stateManager.setSortOrder("desc")
const sortedItems = stateManager.getFilteredAndSortedItems()
expect(sortedItems[0].lastUpdated).toBe("2025-04-14T09:00:00-07:00")
expect(sortedItems[1].lastUpdated).toBe("2025-04-13T09:00:00-07:00")
})
it("should maintain sort order when items are updated", () => {
stateManager.setSortBy("name")
stateManager.setSortOrder("asc")
const newItem: PackageManagerItem = {
name: "C Component",
description: "Third component",
type: "mcp server",
version: "1.0.0",
lastUpdated: "2025-04-15T09:00:00-07:00",
url: "https://example.com/c",
repoUrl: "https://example.com",
path: "c",
items: [],
}
stateManager.setItems([...mockItems, newItem])
const sortedItems = stateManager.getFilteredAndSortedItems()
expect(sortedItems[0].name).toBe("A Component")
expect(sortedItems[1].name).toBe("B Component")
expect(sortedItems[2].name).toBe("C Component")
})
})
})

View file

@ -210,8 +210,7 @@ export const SelectDropdown = React.memo(
<div className="flex flex-col w-full">
{/* Search input */}
<div className="relative p-2 border-b border-vscode-dropdown-border">
<input
aria-label="Search"
<input aria-label="Search"
ref={searchInputRef}
value={searchValue}
onChange={(e) => setSearchValue(e.target.value)}