Skip to content

Commit 6e299c7

Browse files
update documentation
1 parent 9a24ed4 commit 6e299c7

File tree

6 files changed

+536
-57
lines changed

6 files changed

+536
-57
lines changed

cline_docs/package-manager/implementation/01-architecture.md

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ graph TD
1313
User[User] -->|Interacts with| UI[Package Manager UI]
1414
UI -->|Sends messages| MH[Message Handler]
1515
MH -->|Processes requests| PM[PackageManagerManager]
16+
PM -->|Validates sources| PSV[PackageManagerSourceValidation]
1617
PM -->|Fetches repos| GF[GitFetcher]
1718
GF -->|Scans metadata| MS[MetadataScanner]
1819
MS -->|Reads| FS[File System / Git Repositories]
@@ -171,6 +172,16 @@ classDiagram
171172
+sortItems(sortBy, order): PackageManagerItem[]
172173
+refreshRepository(url): void
173174
-queueOperation(operation): void
175+
-validateSources(sources): ValidationError[]
176+
}
177+
178+
class PackageManagerSourceValidation {
179+
+validateSourceUrl(url): ValidationError[]
180+
+validateSourceName(name): ValidationError[]
181+
+validateSourceDuplicates(sources): ValidationError[]
182+
+validateSource(source): ValidationError[]
183+
+validateSources(sources): ValidationError[]
184+
-isValidGitRepositoryUrl(url): boolean
174185
}
175186
176187
class GitFetcher {
@@ -190,16 +201,25 @@ classDiagram
190201
}
191202
192203
class PackageManagerViewStateManager {
193-
-items: PackageManagerItem[]
194-
-filters: Filters
195-
-sortBy: string
196-
-sortOrder: string
197-
+setFilters(filters): void
198-
+getFilteredAndSortedItems(): PackageManagerItem[]
199-
-itemMatchesFilters(item): boolean
204+
-state: ViewState
205+
-stateChangeHandlers: Set
206+
-fetchTimeoutId: NodeJS.Timeout
207+
-sourcesModified: boolean
208+
+initialize(): void
209+
+onStateChange(handler): () => void
210+
+cleanup(): void
211+
+getState(): ViewState
212+
+transition(transition): Promise<void>
213+
-notifyStateChange(): void
214+
-clearFetchTimeout(): void
215+
-isFilterActive(): boolean
216+
-filterItems(items): PackageManagerItem[]
217+
-sortItems(items): PackageManagerItem[]
218+
+handleMessage(message): Promise<void>
200219
}
201220
202221
PackageManagerManager --> GitFetcher: uses
222+
PackageManagerManager --> PackageManagerSourceValidation: uses
203223
GitFetcher --> MetadataScanner: uses
204224
PackageManagerManager --> PackageManagerViewStateManager: updates
205225
```
@@ -239,26 +259,37 @@ classDiagram
239259

240260
1. **PackageManagerViewStateManager**
241261

242-
- Manages view-level state
243-
- Handles filtering and sorting
244-
- Maintains UI preferences
262+
- Manages frontend state and backend synchronization
263+
- Handles state transitions and message processing
264+
- Manages filtering, sorting, and view preferences
245265
- Coordinates with backend state
266+
- Handles timeout protection for operations
267+
- Manages source modification tracking
268+
- Provides state change subscriptions
269+
270+
2. **PackageManagerSourceValidation**
271+
272+
- Validates Git repository URLs for any domain
273+
- Validates source names and configurations
274+
- Detects duplicate sources (case-insensitive)
275+
- Provides structured validation errors
276+
- Supports multiple Git protocols (HTTPS, SSH, Git)
246277

247-
2. **PackageManagerItemCard**
278+
3. **PackageManagerItemCard**
248279

249280
- Displays package information
250281
- Handles tag interactions
251282
- Manages expandable sections
252283
- Shows match highlights
253284

254-
3. **ExpandableSection**
285+
4. **ExpandableSection**
255286

256287
- Provides collapsible sections
257288
- Manages expand/collapse state
258289
- Handles animations
259290
- Shows section metadata
260291

261-
4. **TypeGroup**
292+
5. **TypeGroup**
262293
- Groups items by type
263294
- Formats item lists
264295
- Highlights search matches

cline_docs/package-manager/implementation/02-core-components.md

Lines changed: 110 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -234,37 +234,129 @@ The filtering system provides rich functionality:
234234
- Support highlighting
235235
- Maintain match context
236236

237+
## PackageManagerSourceValidation
238+
239+
The PackageManagerSourceValidation component handles validation of package manager sources and their configurations.
240+
241+
### Responsibilities
242+
243+
- Validating Git repository URLs for any domain
244+
- Validating source names and configurations
245+
- Detecting duplicate sources
246+
- Providing structured validation errors
247+
- Supporting multiple Git protocols
248+
249+
### Implementation Details
250+
251+
```typescript
252+
export class PackageManagerSourceValidation {
253+
/**
254+
* Validates a package manager source URL
255+
*/
256+
public static validateSourceUrl(url: string): ValidationError[] {
257+
// Implementation details
258+
}
259+
260+
/**
261+
* Validates a package manager source name
262+
*/
263+
public static validateSourceName(name?: string): ValidationError[] {
264+
// Implementation details
265+
}
266+
267+
/**
268+
* Validates sources for duplicates
269+
*/
270+
public static validateSourceDuplicates(
271+
sources: PackageManagerSource[],
272+
newSource?: PackageManagerSource,
273+
): ValidationError[] {
274+
// Implementation details
275+
}
276+
277+
/**
278+
* Checks if a URL is a valid Git repository URL
279+
*/
280+
private static isValidGitRepositoryUrl(url: string): boolean {
281+
// Implementation details
282+
}
283+
}
284+
```
285+
286+
### Key Algorithms
287+
288+
#### URL Validation
289+
290+
The URL validation system supports:
291+
292+
1. **Protocol Validation**:
293+
294+
- HTTPS URLs
295+
- SSH URLs
296+
- Git protocol URLs
297+
- Custom domains and ports
298+
299+
2. **Domain Validation**:
300+
301+
- Any valid domain name
302+
- IP addresses
303+
- Localhost for testing
304+
- Internal company domains
305+
306+
3. **Path Validation**:
307+
- Username/organization
308+
- Repository name
309+
- Optional .git suffix
310+
- Subpath support
311+
237312
## PackageManagerViewStateManager
238313

239-
The PackageManagerViewStateManager handles UI state and view-level operations.
314+
The PackageManagerViewStateManager manages frontend state and synchronization with the backend.
240315

241316
### Responsibilities
242317

243-
- Managing view-level state
244-
- Handling UI filters
245-
- Coordinating sorting
246-
- Managing item visibility
318+
- Managing frontend state transitions
319+
- Handling message processing
320+
- Managing timeouts and retries
321+
- Coordinating with backend state
322+
- Providing state change subscriptions
323+
- Managing source modification tracking
324+
- Handling filtering and sorting
247325

248326
### Implementation Details
249327

250328
```typescript
251329
class PackageManagerViewStateManager {
252-
private items: PackageManagerItem[] = []
253-
private sortBy: "name" | "lastUpdated" = "name"
254-
private sortOrder: "asc" | "desc" = "asc"
255-
private filters: Filters = { type: "", search: "", tags: [] }
330+
private state: ViewState
331+
private stateChangeHandlers: Set<StateChangeHandler>
332+
private fetchTimeoutId?: NodeJS.Timeout
333+
private sourcesModified: boolean
334+
335+
/**
336+
* Initialize state manager
337+
*/
338+
public initialize(): void {
339+
// Implementation details
340+
}
341+
342+
/**
343+
* Subscribe to state changes
344+
*/
345+
public onStateChange(handler: StateChangeHandler): () => void {
346+
// Implementation details
347+
}
256348

257349
/**
258-
* Get filtered and sorted items
350+
* Process state transitions
259351
*/
260-
public getFilteredAndSortedItems(): PackageManagerItem[] {
352+
public async transition(transition: ViewStateTransition): Promise<void> {
261353
// Implementation details
262354
}
263355

264356
/**
265-
* Check if item matches current filters
357+
* Handle incoming messages
266358
*/
267-
private itemMatchesFilters(item: PackageManagerItem | Subcomponent): boolean {
359+
public async handleMessage(message: any): Promise<void> {
268360
// Implementation details
269361
}
270362
}
@@ -278,6 +370,7 @@ The components work together through well-defined interfaces:
278370

279371
1. **Repository Operations**:
280372

373+
- PackageManagerManager validates sources with PackageManagerSourceValidation
281374
- PackageManagerManager coordinates with GitFetcher
282375
- GitFetcher manages repository state
283376
- MetadataScanner processes repository content
@@ -286,9 +379,11 @@ The components work together through well-defined interfaces:
286379
2. **State Management**:
287380

288381
- PackageManagerManager maintains backend state
289-
- ViewStateManager handles UI state
290-
- State changes trigger UI updates
382+
- ViewStateManager handles UI state transitions
383+
- ViewStateManager processes messages
384+
- State changes notify subscribers
291385
- Components react to state changes
386+
- Timeout protection ensures responsiveness
292387

293388
3. **User Interactions**:
294389
- UI events trigger state updates

cline_docs/package-manager/implementation/03-data-structures.md

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,25 +109,88 @@ Enhanced match tracking:
109109

110110
## State Management Structures
111111

112+
### ValidationError
113+
114+
```typescript
115+
/**
116+
* Error type for package manager source validation
117+
*/
118+
export interface ValidationError {
119+
field: string
120+
message: string
121+
}
122+
```
123+
124+
Used for structured validation errors:
125+
126+
- **field**: The field that failed validation (e.g., "url", "name")
127+
- **message**: Human-readable error message
128+
112129
### ViewState
113130

114131
```typescript
115132
/**
116133
* View-level state management
117134
*/
118135
interface ViewState {
119-
items: PackageManagerItem[]
120-
sortBy: "name" | "lastUpdated"
121-
sortOrder: "asc" | "desc"
136+
allItems: PackageManagerItem[]
137+
displayItems?: PackageManagerItem[]
138+
isFetching: boolean
139+
activeTab: "browse" | "sources"
140+
refreshingUrls: string[]
141+
sources: PackageManagerSource[]
122142
filters: Filters
143+
sortConfig: {
144+
by: "name" | "author" | "lastUpdated"
145+
order: "asc" | "desc"
146+
}
123147
}
124148
```
125149

126150
Manages UI state:
127151

128-
- Current items
129-
- Sort configuration
130-
- Filter state
152+
- **allItems**: All available items
153+
- **displayItems**: Currently filtered/displayed items
154+
- **isFetching**: Loading state indicator
155+
- **activeTab**: Current view tab
156+
- **refreshingUrls**: Sources being refreshed
157+
- **sources**: Package manager sources
158+
- **filters**: Active filters
159+
- **sortConfig**: Sort configuration
160+
161+
### ViewStateTransition
162+
163+
```typescript
164+
/**
165+
* State transition types and payloads
166+
*/
167+
type ViewStateTransition = {
168+
type:
169+
| "FETCH_ITEMS"
170+
| "FETCH_COMPLETE"
171+
| "FETCH_ERROR"
172+
| "SET_ACTIVE_TAB"
173+
| "UPDATE_FILTERS"
174+
| "UPDATE_SORT"
175+
| "REFRESH_SOURCE"
176+
| "REFRESH_SOURCE_COMPLETE"
177+
| "UPDATE_SOURCES"
178+
payload?: {
179+
items?: PackageManagerItem[]
180+
tab?: "browse" | "sources"
181+
filters?: Partial<Filters>
182+
sortConfig?: Partial<SortConfig>
183+
url?: string
184+
sources?: PackageManagerSource[]
185+
}
186+
}
187+
```
188+
189+
Defines state transitions:
190+
191+
- Operation types
192+
- Optional payloads
193+
- Type-safe transitions
131194
132195
### Filters
133196
@@ -364,14 +427,28 @@ function validateMetadata(metadata: unknown): metadata is ComponentMetadata {
364427
/**
365428
* Validate Git repository URL
366429
*/
367-
function isValidGitUrl(url: string): boolean {
368-
if (!url) return false
430+
function isValidGitRepositoryUrl(url: string): boolean {
431+
// HTTPS pattern (any domain)
432+
const httpsPattern =
433+
/^https?:\/\/[a-zA-Z0-9_.-]+(\.[a-zA-Z0-9_.-]+)*\/[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+(\/.+)*(\.git)?$/
434+
435+
// SSH pattern (any domain)
436+
const sshPattern = /^git@[a-zA-Z0-9_.-]+(\.[a-zA-Z0-9_.-]+)*:([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+)(\.git)?$/
369437

370-
// Support common Git URL formats
371-
return /^(https?:\/\/|git@)/.test(url) && /\.git$/.test(url)
438+
// Git protocol pattern (any domain)
439+
const gitProtocolPattern = /^git:\/\/[a-zA-Z0-9_.-]+(\.[a-zA-Z0-9_.-]+)*\/[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+(\.git)?$/
440+
441+
return httpsPattern.test(url) || sshPattern.test(url) || gitProtocolPattern.test(url)
372442
}
373443
```
374444

445+
Supports:
446+
447+
- Any valid domain name
448+
- Multiple Git protocols
449+
- Optional .git suffix
450+
- Subpath components
451+
375452
## Data Flow
376453

377454
The Package Manager transforms data through several stages:

0 commit comments

Comments
 (0)