From 764bd28d08ceaef03cd4050f9568a62d77bbcfca Mon Sep 17 00:00:00 2001 From: soryu Date: Thu, 15 Jan 2026 03:37:44 +0000 Subject: Add repository history feature to store and suggest previously used repositories (#18) - Add repository_history table migration with repo_type, repo_path, use_count, last_used_at - Add RepositoryHistoryEntry model and CRUD database functions - Create API endpoints: GET/POST/DELETE /api/v1/repository-history, GET /api/v1/repository-history/suggestions - Update add_remote_repository and add_local_repository handlers to automatically track history - Update frontend API with repository history types and functions - Add Repository History section to Settings page with list of entries and delete functionality - Add suggestions dropdown to RepositoryPanel when entering new repository URL/path - Suggestions filter by repo type (remote vs local) and match on user input Test plan: - Add a remote repository to a contract - verify it appears in Settings history - Add a local repository to a contract - verify it appears in Settings history - Add same repository again - verify use_count increments, not duplicate - When adding new repository, verify suggestions appear based on history - Delete a history entry from Settings - verify it's removed - Verify suggestions only show matching type (remote for remote, local for local) Co-authored-by: Claude Opus 4.5 --- makima/frontend/src/lib/api.ts | 74 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'makima/frontend/src/lib/api.ts') diff --git a/makima/frontend/src/lib/api.ts b/makima/frontend/src/lib/api.ts index 2ea1128..100a85a 100644 --- a/makima/frontend/src/lib/api.ts +++ b/makima/frontend/src/lib/api.ts @@ -1973,3 +1973,77 @@ export async function answerQuestion( } return res.json(); } + +// ============================================================================= +// Repository History Types and API +// ============================================================================= + +export interface RepositoryHistoryEntry { + id: string; + ownerId: string; + name: string; + repositoryUrl: string | null; + localPath: string | null; + sourceType: "remote" | "local"; + useCount: number; + lastUsedAt: string; + createdAt: string; +} + +export interface RepositoryHistoryListResponse { + entries: RepositoryHistoryEntry[]; + total: number; +} + +/** + * List all repository history entries. + * Returns entries ordered by use_count DESC, last_used_at DESC. + */ +export async function listRepositoryHistory(): Promise { + const res = await authFetch(`${API_BASE}/api/v1/settings/repository-history`); + if (!res.ok) { + throw new Error(`Failed to list repository history: ${res.statusText}`); + } + return res.json(); +} + +/** + * Get repository suggestions based on history. + * Optionally filter by source type and search query. + */ +export async function getRepositorySuggestions( + sourceType?: "remote" | "local", + query?: string, + limit?: number +): Promise { + const params = new URLSearchParams(); + if (sourceType) params.append("source_type", sourceType); + if (query) params.append("query", query); + if (limit) params.append("limit", limit.toString()); + + const queryString = params.toString(); + const url = `${API_BASE}/api/v1/settings/repository-history/suggestions${ + queryString ? `?${queryString}` : "" + }`; + + const res = await authFetch(url); + if (!res.ok) { + throw new Error(`Failed to get repository suggestions: ${res.statusText}`); + } + return res.json(); +} + +/** + * Delete a repository history entry. + */ +export async function deleteRepositoryHistory(id: string): Promise { + const res = await authFetch( + `${API_BASE}/api/v1/settings/repository-history/${id}`, + { + method: "DELETE", + } + ); + if (!res.ok) { + throw new Error(`Failed to delete repository history: ${res.statusText}`); + } +} -- cgit v1.2.3