bmad-method-mcp
Version:
Breakthrough Method of Agile AI-driven Development with Enhanced MCP Integration
104 lines (95 loc) • 5.28 kB
text/typescript
import axios from 'axios'
import type { Task, Epic, Document, Sprint, ProjectProgress } from '@/types'
const api = axios.create({
baseURL: '/api',
headers: {
'Content-Type': 'application/json',
},
})
// Sprint API
export const sprintApi = {
getCurrent: () => api.get<Sprint | null>('/sprints/current'),
getAll: () => api.get<Sprint[]>('/sprints'),
create: (data: Omit<Sprint, 'id' | 'created_at' | 'updated_at'>) =>
api.post<{ id: number; message: string }>('/sprints', data),
}
// Task API
export const taskApi = {
getAll: (params?: { epic_num?: number; status?: string; sprint_id?: string; current_sprint_only?: boolean }) =>
api.get<Task[]>('/tasks', { params }),
getCurrentSprint: () =>
api.get<Task[]>('/tasks', { params: { current_sprint_only: true } }),
create: (data: Omit<Task, 'id' | 'created_at' | 'updated_at'>) =>
api.post<{ id: string; message: string }>('/tasks', data),
update: (id: string, data: Partial<Task>) =>
api.put<{ message: string; changes: number }>(`/tasks/${id}`, data),
delete: (id: string) =>
api.delete<{ message: string; changes: number }>(`/tasks/${id}`),
updateStatus: (id: string, status: Task['status']) =>
api.put<{ message: string; changes: number }>(`/tasks/${id}/status`, { status }),
approve: (id: string) =>
api.post<{ message: string; changes: number }>(`/tasks/${id}/approve`),
}
// Epic API
export const epicApi = {
getAll: () => api.get<Epic[]>('/epics'),
create: (data: Omit<Epic, 'id' | 'created_at' | 'updated_at'>) =>
api.post<{ id: number; message: string }>('/epics', data),
update: (id: number, data: Partial<Epic>) =>
api.put<{ message: string; changes: number }>(`/epics/${id}`, data),
delete: (id: number) =>
api.delete<{ message: string; changes: number }>(`/epics/${id}`),
}
// Document API
export const documentApi = {
getAll: () => api.get<Document[]>('/documents'),
getById: (id: number) => api.get<Document>(`/documents/${id}`),
create: (data: Omit<Document, 'id' | 'created_at' | 'updated_at'>) =>
api.post<{ id: number; message: string }>('/documents', data),
update: (id: number, data: Partial<Document> & { create_version?: boolean }) =>
api.put<{ message: string; changes: number }>(`/documents/${id}`, data),
delete: (id: number) =>
api.delete<{ message: string; changes: number }>(`/documents/${id}`),
approve: (id: number) =>
api.post<{ message: string; changes: number }>(`/documents/${id}/approve`),
getSections: (id: number) =>
api.get<any[]>(`/documents/${id}/sections`),
getBySection: (id: number, sectionId: string) =>
api.get<any>(`/documents/${id}/sections/${sectionId}`),
getLinkedEntities: (id: number, section?: string) =>
api.get<any>(`/documents/${id}/linked-entities`, { params: { section } }),
}
// Progress API
export const progressApi = {
get: () => api.get<ProjectProgress>('/progress'),
}
// Entity linking API
export const linkingApi = {
linkEntity: (data: { entity_type: string; entity_id: string; document_id: string; document_section?: string; link_purpose?: string }) =>
api.post<{ message: string; link_id: string; changes: number }>('/link-entity', data),
unlinkEntity: (data: { entity_type: string; entity_id: string; document_id: string; document_section?: string }) =>
api.delete<{ message: string; changes: number }>('/unlink-entity', { data }),
getEntityLinks: (entity_type: string, entity_id: string) =>
api.get<{ entity_type: string; entity_id: string; links: any[]; link_count: number; message: string }>(`/entities/${entity_type}/${entity_id}/document-links`),
}
// Convenience API object for components
export const clientApi = {
getProjectProgress: () => progressApi.get().then(res => res.data),
getTasks: (params?: { epic_num?: number; status?: string; sprint_id?: string; current_sprint_only?: boolean }) => taskApi.getAll(params).then(res => res.data),
getCurrentSprintTasks: () => taskApi.getCurrentSprint().then(res => res.data),
getCurrentSprint: () => sprintApi.getCurrent().then(res => res.data),
getSprints: () => sprintApi.getAll().then(res => res.data),
getEpics: () => epicApi.getAll().then(res => res.data),
getDocuments: () => documentApi.getAll().then(res => res.data),
getDocument: (id: number) => documentApi.getById(id).then(res => res.data),
updateDocument: (id: number, data: any) => documentApi.update(id, data).then(res => res.data),
updateTaskStatus: (id: string, status: string) => taskApi.updateStatus(id, status).then(res => res.data),
getDocumentSections: (id: number) => documentApi.getSections(id).then(res => res.data),
getDocumentBySection: (id: number, sectionId: string) => documentApi.getBySection(id, sectionId).then(res => res.data),
getDocumentLinkedEntities: (id: number, section?: string) => documentApi.getLinkedEntities(id, section).then(res => res.data),
linkEntityToDocument: (data: any) => linkingApi.linkEntity(data).then(res => res.data),
unlinkEntityFromDocument: (data: any) => linkingApi.unlinkEntity(data).then(res => res.data),
getEntityDocumentLinks: (entity_type: string, entity_id: string) => linkingApi.getEntityLinks(entity_type, entity_id).then(res => res.data),
}
// For backward compatibility
export { clientApi as api }