Showing preview only (4,975K chars total). Download the full file or copy to clipboard to get everything.
Repository: coleam00/Archon
Branch: main
Commit: ecaece460c19
Files: 674
Total size: 4.6 MB
Directory structure:
gitextract_rpa0i55w/
├── .claude/
│ ├── agents/
│ │ ├── codebase-analyst.md
│ │ └── library-researcher.md
│ └── commands/
│ ├── agent-work-orders/
│ │ ├── commit.md
│ │ ├── execute.md
│ │ ├── noqa.md
│ │ ├── planning.md
│ │ ├── prime.md
│ │ ├── prp-review.md
│ │ └── start-server.md
│ ├── archon/
│ │ ├── archon-alpha-review.md
│ │ ├── archon-coderabbit-helper.md
│ │ ├── archon-onboarding.md
│ │ ├── archon-prime-simple.md
│ │ ├── archon-prime.md
│ │ ├── archon-rca.md
│ │ └── archon-ui-consistency-review.md
│ ├── prp-any-agent/
│ │ ├── prp-any-cli-create.md
│ │ └── prp-any-cli-execute.md
│ └── prp-claude-code/
│ ├── prp-claude-code-create.md
│ ├── prp-claude-code-execute.md
│ ├── prp-story-task-create.md
│ └── prp-story-task-execute.md
├── .dockerignore
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── auto_bug_report.md
│ │ └── bug_report.yml
│ ├── RELEASE_NOTES_SETUP.md
│ ├── pull_request_template.md
│ ├── test-release-notes.sh
│ └── workflows/
│ ├── ci.yml
│ ├── claude-fix.yml
│ ├── claude-review.yml
│ └── release-notes.yml
├── .gitignore
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── PRPs/
│ ├── ai_docs/
│ │ ├── AGENT_WORK_ORDERS_SSE_AND_ZUSTAND.md
│ │ ├── API_NAMING_CONVENTIONS.md
│ │ ├── ARCHITECTURE.md
│ │ ├── DATA_FETCHING_ARCHITECTURE.md
│ │ ├── ETAG_IMPLEMENTATION.md
│ │ ├── QUERY_PATTERNS.md
│ │ ├── UI_STANDARDS.md
│ │ ├── ZUSTAND_STATE_MANAGEMENT.md
│ │ ├── cc_cli_ref.md
│ │ └── optimistic_updates.md
│ └── templates/
│ ├── prp_base.md
│ └── prp_story_task.md
├── README.md
├── archon-example-workflow/
│ ├── .claude/
│ │ ├── agents/
│ │ │ ├── codebase-analyst.md
│ │ │ └── validator.md
│ │ └── commands/
│ │ ├── create-plan.md
│ │ ├── execute-plan.md
│ │ └── primer.md
│ ├── CLAUDE.md
│ └── README.md
├── archon-ui-main/
│ ├── .dockerignore
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── Dockerfile
│ ├── README.md
│ ├── biome.json
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.js
│ ├── src/
│ │ ├── App.tsx
│ │ ├── components/
│ │ │ ├── BackendStartupError.tsx
│ │ │ ├── DisconnectScreenOverlay.tsx
│ │ │ ├── agent-chat/
│ │ │ │ └── ArchonChatPanel.tsx
│ │ │ ├── animations/
│ │ │ │ ├── Animations.tsx
│ │ │ │ └── DisconnectScreenAnimations.tsx
│ │ │ ├── bug-report/
│ │ │ │ ├── BugReportButton.tsx
│ │ │ │ ├── BugReportModal.tsx
│ │ │ │ └── ErrorBoundaryWithBugReport.tsx
│ │ │ ├── code/
│ │ │ │ └── CodeViewerModal.tsx
│ │ │ ├── common/
│ │ │ │ └── DeleteConfirmModal.tsx
│ │ │ ├── layout/
│ │ │ │ ├── MainLayout.tsx
│ │ │ │ ├── Navigation.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ └── useBackendHealth.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── onboarding/
│ │ │ │ └── ProviderStep.tsx
│ │ │ ├── settings/
│ │ │ │ ├── APIKeysSection.tsx
│ │ │ │ ├── ButtonPlayground.tsx
│ │ │ │ ├── CodeExtractionSettings.tsx
│ │ │ │ ├── FeaturesSection.tsx
│ │ │ │ ├── IDEGlobalRules.tsx
│ │ │ │ ├── OllamaConfigurationPanel.tsx
│ │ │ │ ├── OllamaInstanceHealthIndicator.tsx
│ │ │ │ ├── OllamaModelDiscoveryModal.tsx
│ │ │ │ ├── OllamaModelSelectionModal.tsx
│ │ │ │ ├── RAGSettings.tsx
│ │ │ │ └── types/
│ │ │ │ └── OllamaTypes.ts
│ │ │ └── ui/
│ │ │ ├── Badge.tsx
│ │ │ ├── Button.tsx
│ │ │ ├── Card.tsx
│ │ │ ├── Checkbox.tsx
│ │ │ ├── CollapsibleSettingsCard.tsx
│ │ │ ├── CoverageVisualization.tsx
│ │ │ ├── GlassCrawlDepthSelector.tsx
│ │ │ ├── Input.tsx
│ │ │ ├── MigrationBanner.tsx
│ │ │ ├── NeonButton.tsx
│ │ │ ├── PowerButton.tsx
│ │ │ ├── Select.tsx
│ │ │ ├── ThemeToggle.tsx
│ │ │ └── Toggle.tsx
│ │ ├── config/
│ │ │ └── api.ts
│ │ ├── contexts/
│ │ │ ├── SettingsContext.tsx
│ │ │ └── ThemeContext.tsx
│ │ ├── env.d.ts
│ │ ├── features/
│ │ │ ├── agent-work-orders/
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddRepositoryModal.tsx
│ │ │ │ │ ├── CreateWorkOrderModal.tsx
│ │ │ │ │ ├── EditRepositoryModal.tsx
│ │ │ │ │ ├── ExecutionLogs.tsx
│ │ │ │ │ ├── RealTimeStats.tsx
│ │ │ │ │ ├── RepositoryCard.tsx
│ │ │ │ │ ├── SidebarRepositoryCard.tsx
│ │ │ │ │ ├── StepHistoryCard.tsx
│ │ │ │ │ ├── WorkOrderRow.tsx
│ │ │ │ │ ├── WorkOrderTable.tsx
│ │ │ │ │ ├── WorkflowStepButton.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ ├── CreateWorkOrderModal.test.tsx
│ │ │ │ │ └── RepositoryCard.test.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── useAgentWorkOrderQueries.test.tsx
│ │ │ │ │ │ └── useRepositoryQueries.test.tsx
│ │ │ │ │ ├── useAgentWorkOrderQueries.ts
│ │ │ │ │ └── useRepositoryQueries.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── agentWorkOrdersService.test.ts
│ │ │ │ │ │ └── repositoryService.test.ts
│ │ │ │ │ ├── agentWorkOrdersService.ts
│ │ │ │ │ └── repositoryService.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── agentWorkOrdersStore.test.ts
│ │ │ │ │ │ └── sseIntegration.test.ts
│ │ │ │ │ ├── agentWorkOrdersStore.ts
│ │ │ │ │ └── slices/
│ │ │ │ │ ├── filtersSlice.ts
│ │ │ │ │ ├── modalsSlice.ts
│ │ │ │ │ ├── sseSlice.ts
│ │ │ │ │ └── uiPreferencesSlice.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── repository.ts
│ │ │ │ └── views/
│ │ │ │ ├── AgentWorkOrderDetailView.tsx
│ │ │ │ └── AgentWorkOrdersView.tsx
│ │ │ ├── knowledge/
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddKnowledgeDialog.tsx
│ │ │ │ │ ├── KnowledgeCard.tsx
│ │ │ │ │ ├── KnowledgeCardActions.tsx
│ │ │ │ │ ├── KnowledgeCardTags.tsx
│ │ │ │ │ ├── KnowledgeCardTitle.tsx
│ │ │ │ │ ├── KnowledgeCardType.tsx
│ │ │ │ │ ├── KnowledgeHeader.tsx
│ │ │ │ │ ├── KnowledgeList.tsx
│ │ │ │ │ ├── KnowledgeTable.tsx
│ │ │ │ │ ├── KnowledgeTypeSelector.tsx
│ │ │ │ │ ├── LevelSelector.tsx
│ │ │ │ │ ├── TagInput.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useKnowledgeQueries.test.ts
│ │ │ │ │ └── useKnowledgeQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── inspector/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── ContentViewer.tsx
│ │ │ │ │ │ ├── InspectorHeader.tsx
│ │ │ │ │ │ ├── InspectorSidebar.tsx
│ │ │ │ │ │ ├── KnowledgeInspector.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useInspectorData.ts
│ │ │ │ │ │ ├── useInspectorPagination.ts
│ │ │ │ │ │ └── usePaginatedInspectorData.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── knowledgeService.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── knowledge.ts
│ │ │ │ ├── utils/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── knowledge-utils.ts
│ │ │ │ │ ├── providerErrorHandler.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── providerErrorHandler.test.ts
│ │ │ │ └── views/
│ │ │ │ ├── KnowledgeView.tsx
│ │ │ │ ├── KnowledgeViewWithBoundary.tsx
│ │ │ │ └── index.ts
│ │ │ ├── mcp/
│ │ │ │ ├── components/
│ │ │ │ │ ├── McpClientList.tsx
│ │ │ │ │ ├── McpConfigSection.tsx
│ │ │ │ │ ├── McpStatusBar.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useMcpQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── mcpApi.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── mcp.ts
│ │ │ │ └── views/
│ │ │ │ ├── McpView.tsx
│ │ │ │ └── McpViewWithBoundary.tsx
│ │ │ ├── progress/
│ │ │ │ ├── components/
│ │ │ │ │ ├── CrawlingProgress.tsx
│ │ │ │ │ ├── KnowledgeCardProgress.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useProgressQueries.test.ts
│ │ │ │ │ └── useProgressQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── progressService.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── progress.ts
│ │ │ │ └── utils/
│ │ │ │ └── urlValidation.ts
│ │ │ ├── projects/
│ │ │ │ ├── components/
│ │ │ │ │ ├── NewProjectModal.tsx
│ │ │ │ │ ├── ProjectCard.tsx
│ │ │ │ │ ├── ProjectCardActions.tsx
│ │ │ │ │ ├── ProjectHeader.tsx
│ │ │ │ │ ├── ProjectList.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── ProjectCard.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ ├── DocsTab.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── AddDocumentModal.tsx
│ │ │ │ │ │ ├── DocumentCard.tsx
│ │ │ │ │ │ ├── DocumentViewer.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useDocumentQueries.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ └── documentService.ts
│ │ │ │ │ └── types/
│ │ │ │ │ ├── document.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useProjectQueries.test.ts
│ │ │ │ │ └── useProjectQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── schemas/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── projectService.ts
│ │ │ │ ├── shared/
│ │ │ │ │ └── api.ts
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── TasksTab.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── EditableTableCell.tsx
│ │ │ │ │ │ ├── FeatureSelect.tsx
│ │ │ │ │ │ ├── KanbanColumn.tsx
│ │ │ │ │ │ ├── TaskAssignee.tsx
│ │ │ │ │ │ ├── TaskCard.tsx
│ │ │ │ │ │ ├── TaskCardActions.tsx
│ │ │ │ │ │ ├── TaskEditModal.tsx
│ │ │ │ │ │ ├── TaskPriorityComponent.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── tests/
│ │ │ │ │ │ │ └── useTaskQueries.test.ts
│ │ │ │ │ │ ├── useTaskActions.ts
│ │ │ │ │ │ ├── useTaskEditor.ts
│ │ │ │ │ │ └── useTaskQueries.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── schemas/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── taskService.ts
│ │ │ │ │ │ └── tests/
│ │ │ │ │ │ └── taskService.test.ts
│ │ │ │ │ ├── types/
│ │ │ │ │ │ ├── hooks.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── priority.ts
│ │ │ │ │ │ └── task.ts
│ │ │ │ │ ├── utils/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── task-ordering.ts
│ │ │ │ │ │ └── task-styles.tsx
│ │ │ │ │ └── views/
│ │ │ │ │ ├── BoardView.tsx
│ │ │ │ │ ├── TableView.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── project.ts
│ │ │ │ ├── utils/
│ │ │ │ │ └── index.ts
│ │ │ │ └── views/
│ │ │ │ ├── ProjectsView.tsx
│ │ │ │ └── ProjectsViewWithBoundary.tsx
│ │ │ ├── settings/
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── MigrationStatusCard.tsx
│ │ │ │ │ │ └── PendingMigrationsModal.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ └── useMigrationQueries.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ └── migrationService.ts
│ │ │ │ │ └── types/
│ │ │ │ │ └── index.ts
│ │ │ │ └── version/
│ │ │ │ ├── components/
│ │ │ │ │ ├── UpdateBanner.tsx
│ │ │ │ │ └── VersionStatusCard.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ └── useVersionQueries.ts
│ │ │ │ ├── services/
│ │ │ │ │ └── versionService.ts
│ │ │ │ └── types/
│ │ │ │ └── index.ts
│ │ │ ├── shared/
│ │ │ │ ├── api/
│ │ │ │ │ ├── apiClient.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── apiClient.test.ts
│ │ │ │ ├── config/
│ │ │ │ │ ├── queryClient.ts
│ │ │ │ │ └── queryPatterns.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useSmartPolling.test.ts
│ │ │ │ │ ├── useSmartPolling.ts
│ │ │ │ │ ├── useThemeAware.ts
│ │ │ │ │ └── useToast.ts
│ │ │ │ ├── types/
│ │ │ │ │ └── errors.ts
│ │ │ │ └── utils/
│ │ │ │ ├── clipboard.ts
│ │ │ │ ├── optimistic.ts
│ │ │ │ └── tests/
│ │ │ │ └── optimistic.test.ts
│ │ │ ├── style-guide/
│ │ │ │ ├── components/
│ │ │ │ │ └── StyleGuideView.tsx
│ │ │ │ ├── components.json
│ │ │ │ ├── index.ts
│ │ │ │ ├── layouts/
│ │ │ │ │ ├── AgentWorkOrderExample.tsx
│ │ │ │ │ ├── AgentWorkOrderLayoutExample.tsx
│ │ │ │ │ ├── DocumentBrowserExample.tsx
│ │ │ │ │ ├── KnowledgeLayoutExample.tsx
│ │ │ │ │ ├── NavigationExplanation.tsx
│ │ │ │ │ ├── ProjectsLayoutExample.tsx
│ │ │ │ │ ├── SettingsLayoutExample.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── ExecutionLogsExample.tsx
│ │ │ │ │ ├── RealTimeStatsExample.tsx
│ │ │ │ │ ├── StepHistoryCard.tsx
│ │ │ │ │ └── WorkflowStepButton.tsx
│ │ │ │ ├── shared/
│ │ │ │ │ └── SideNavigation.tsx
│ │ │ │ ├── showcases/
│ │ │ │ │ ├── StaticButtons.tsx
│ │ │ │ │ ├── StaticCards.tsx
│ │ │ │ │ ├── StaticColors.tsx
│ │ │ │ │ ├── StaticEffects.tsx
│ │ │ │ │ ├── StaticForms.tsx
│ │ │ │ │ ├── StaticSpacing.tsx
│ │ │ │ │ ├── StaticTables.tsx
│ │ │ │ │ ├── StaticToggles.tsx
│ │ │ │ │ └── StaticTypography.tsx
│ │ │ │ ├── standards/
│ │ │ │ │ └── modalStandards.ts
│ │ │ │ ├── tabs/
│ │ │ │ │ ├── LayoutsTab.tsx
│ │ │ │ │ └── StyleGuideTab.tsx
│ │ │ │ └── types/
│ │ │ │ └── index.ts
│ │ │ ├── testing/
│ │ │ │ └── test-utils.tsx
│ │ │ └── ui/
│ │ │ ├── components/
│ │ │ │ ├── DeleteConfirmModal.tsx
│ │ │ │ ├── FeatureErrorBoundary.tsx
│ │ │ │ ├── ToastProvider.tsx
│ │ │ │ └── index.ts
│ │ │ └── primitives/
│ │ │ ├── OptimisticIndicator.tsx
│ │ │ ├── alert-dialog.tsx
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── checkbox.tsx
│ │ │ ├── combobox.tsx
│ │ │ ├── data-card.tsx
│ │ │ ├── dialog.tsx
│ │ │ ├── draggable-card.tsx
│ │ │ ├── dropdown-menu.tsx
│ │ │ ├── grouped-card.tsx
│ │ │ ├── index.ts
│ │ │ ├── input.tsx
│ │ │ ├── inspector-dialog.tsx
│ │ │ ├── label.tsx
│ │ │ ├── pill-navigation.tsx
│ │ │ ├── pill.tsx
│ │ │ ├── radio-group.tsx
│ │ │ ├── select.tsx
│ │ │ ├── selectable-card.tsx
│ │ │ ├── styles.ts
│ │ │ ├── switch.tsx
│ │ │ ├── tabs.tsx
│ │ │ ├── toast.tsx
│ │ │ ├── toggle-group.tsx
│ │ │ └── tooltip.tsx
│ │ ├── hooks/
│ │ │ ├── useBugReport.ts
│ │ │ ├── useMigrationStatus.ts
│ │ │ └── useStaggeredEntrance.ts
│ │ ├── index.css
│ │ ├── index.tsx
│ │ ├── lib/
│ │ │ └── utils.ts
│ │ ├── pages/
│ │ │ ├── AgentWorkOrderDetailPage.tsx
│ │ │ ├── AgentWorkOrdersPage.tsx
│ │ │ ├── KnowledgeBasePage.tsx
│ │ │ ├── MCPPage.tsx
│ │ │ ├── OnboardingPage.tsx
│ │ │ ├── ProjectPage.tsx
│ │ │ ├── SettingsPage.tsx
│ │ │ └── StyleGuidePage.tsx
│ │ ├── services/
│ │ │ ├── agentChatService.ts
│ │ │ ├── bugReportService.ts
│ │ │ ├── credentialsService.ts
│ │ │ ├── ollamaService.ts
│ │ │ ├── openrouterService.ts
│ │ │ └── serverHealthService.ts
│ │ ├── styles/
│ │ │ ├── card-animations.css
│ │ │ ├── luminous-button.css
│ │ │ └── toggle.css
│ │ └── utils/
│ │ └── onboarding.ts
│ ├── tailwind.config.js
│ ├── tests/
│ │ ├── README.md
│ │ ├── integration/
│ │ │ ├── knowledge/
│ │ │ │ ├── knowledge-api.test.ts
│ │ │ │ └── progress-api.test.ts
│ │ │ └── setup.ts
│ │ ├── manual/
│ │ │ └── test-knowledge-api.ts
│ │ └── setup.ts
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── tsconfig.prod.json
│ ├── vite.config.ts
│ ├── vitest.config.ts
│ └── vitest.integration.config.ts
├── check-env.js
├── docker-compose.yml
├── migration/
│ ├── 0.1.0/
│ │ ├── 001_add_source_url_display_name.sql
│ │ ├── 002_add_hybrid_search_tsvector.sql
│ │ ├── 003_ollama_add_columns.sql
│ │ ├── 004_ollama_migrate_data.sql
│ │ ├── 005_ollama_create_functions.sql
│ │ ├── 006_ollama_create_indexes_optional.sql
│ │ ├── 007_add_priority_column_to_tasks.sql
│ │ ├── 008_add_migration_tracking.sql
│ │ ├── 009_add_cascade_delete_constraints.sql
│ │ ├── 010_add_provider_placeholders.sql
│ │ ├── 011_add_page_metadata_table.sql
│ │ └── DB_UPGRADE_INSTRUCTIONS.md
│ ├── AGENT_WORK_ORDERS.md
│ ├── RESET_DB.sql
│ ├── agent_work_orders_repositories.sql
│ ├── agent_work_orders_state.sql
│ ├── backup_database.sql
│ └── complete_setup.sql
└── python/
├── .claude/
│ └── commands/
│ └── agent-work-orders/
│ ├── commit.md
│ ├── create-branch.md
│ ├── create-pr.md
│ ├── execute.md
│ ├── noqa.md
│ ├── planning.md
│ ├── prime.md
│ ├── prp-review.md
│ └── start-server.md
├── .dockerignore
├── .gitignore
├── Dockerfile.agent-work-orders
├── Dockerfile.agents
├── Dockerfile.mcp
├── Dockerfile.server
├── pyproject.toml
├── pyrightconfig.json
├── pytest.ini
├── src/
│ ├── __init__.py
│ ├── agent_work_orders/
│ │ ├── CLAUDE.md
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent_executor/
│ │ │ ├── __init__.py
│ │ │ └── agent_cli_executor.py
│ │ ├── api/
│ │ │ ├── __init__.py
│ │ │ ├── routes.py
│ │ │ └── sse_streams.py
│ │ ├── command_loader/
│ │ │ ├── __init__.py
│ │ │ └── claude_command_loader.py
│ │ ├── config.py
│ │ ├── database/
│ │ │ ├── __init__.py
│ │ │ └── client.py
│ │ ├── github_integration/
│ │ │ ├── __init__.py
│ │ │ └── github_client.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── sandbox_manager/
│ │ │ ├── __init__.py
│ │ │ ├── git_branch_sandbox.py
│ │ │ ├── git_worktree_sandbox.py
│ │ │ ├── sandbox_factory.py
│ │ │ └── sandbox_protocol.py
│ │ ├── server.py
│ │ ├── state_manager/
│ │ │ ├── __init__.py
│ │ │ ├── file_state_repository.py
│ │ │ ├── repository_config_repository.py
│ │ │ ├── repository_factory.py
│ │ │ ├── supabase_repository.py
│ │ │ └── work_order_repository.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── git_operations.py
│ │ │ ├── id_generator.py
│ │ │ ├── log_buffer.py
│ │ │ ├── port_allocation.py
│ │ │ ├── state_reconciliation.py
│ │ │ ├── structured_logger.py
│ │ │ └── worktree_operations.py
│ │ └── workflow_engine/
│ │ ├── __init__.py
│ │ ├── agent_names.py
│ │ ├── workflow_operations.py
│ │ └── workflow_orchestrator.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── base_agent.py
│ │ ├── document_agent.py
│ │ ├── mcp_client.py
│ │ ├── rag_agent.py
│ │ └── server.py
│ ├── mcp_server/
│ │ ├── __init__.py
│ │ ├── features/
│ │ │ ├── documents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── document_tools.py
│ │ │ │ └── version_tools.py
│ │ │ ├── feature_tools.py
│ │ │ ├── projects/
│ │ │ │ ├── __init__.py
│ │ │ │ └── project_tools.py
│ │ │ ├── rag/
│ │ │ │ ├── __init__.py
│ │ │ │ └── rag_tools.py
│ │ │ └── tasks/
│ │ │ ├── __init__.py
│ │ │ └── task_tools.py
│ │ ├── mcp_server.py
│ │ ├── models.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── error_handling.py
│ │ ├── http_client.py
│ │ └── timeout_config.py
│ └── server/
│ ├── __init__.py
│ ├── api_routes/
│ │ ├── __init__.py
│ │ ├── agent_chat_api.py
│ │ ├── agent_work_orders_proxy.py
│ │ ├── bug_report_api.py
│ │ ├── internal_api.py
│ │ ├── knowledge_api.py
│ │ ├── mcp_api.py
│ │ ├── migration_api.py
│ │ ├── ollama_api.py
│ │ ├── openrouter_api.py
│ │ ├── pages_api.py
│ │ ├── progress_api.py
│ │ ├── projects_api.py
│ │ ├── providers_api.py
│ │ ├── settings_api.py
│ │ └── version_api.py
│ ├── config/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── logfire_config.py
│ │ ├── service_discovery.py
│ │ └── version.py
│ ├── main.py
│ ├── middleware/
│ │ └── logging_middleware.py
│ ├── models/
│ │ └── progress_models.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── client_manager.py
│ │ ├── crawler_manager.py
│ │ ├── crawling/
│ │ │ ├── __init__.py
│ │ │ ├── code_extraction_service.py
│ │ │ ├── crawling_service.py
│ │ │ ├── discovery_service.py
│ │ │ ├── document_storage_operations.py
│ │ │ ├── helpers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── llms_full_parser.py
│ │ │ │ ├── site_config.py
│ │ │ │ └── url_handler.py
│ │ │ ├── page_storage_operations.py
│ │ │ ├── progress_mapper.py
│ │ │ └── strategies/
│ │ │ ├── __init__.py
│ │ │ ├── batch.py
│ │ │ ├── recursive.py
│ │ │ ├── single_page.py
│ │ │ └── sitemap.py
│ │ ├── credential_service.py
│ │ ├── embeddings/
│ │ │ ├── __init__.py
│ │ │ ├── contextual_embedding_service.py
│ │ │ ├── embedding_exceptions.py
│ │ │ ├── embedding_service.py
│ │ │ ├── multi_dimensional_embedding_service.py
│ │ │ └── provider_error_adapters.py
│ │ ├── knowledge/
│ │ │ ├── __init__.py
│ │ │ ├── database_metrics_service.py
│ │ │ ├── knowledge_item_service.py
│ │ │ └── knowledge_summary_service.py
│ │ ├── llm_provider_service.py
│ │ ├── mcp_service_client.py
│ │ ├── mcp_session_manager.py
│ │ ├── migration_service.py
│ │ ├── ollama/
│ │ │ ├── __init__.py
│ │ │ ├── embedding_router.py
│ │ │ └── model_discovery_service.py
│ │ ├── openrouter_discovery_service.py
│ │ ├── projects/
│ │ │ ├── __init__.py
│ │ │ ├── document_service.py
│ │ │ ├── project_creation_service.py
│ │ │ ├── project_service.py
│ │ │ ├── source_linking_service.py
│ │ │ ├── task_service.py
│ │ │ └── versioning_service.py
│ │ ├── prompt_service.py
│ │ ├── provider_discovery_service.py
│ │ ├── search/
│ │ │ ├── __init__.py
│ │ │ ├── agentic_rag_strategy.py
│ │ │ ├── base_search_strategy.py
│ │ │ ├── hybrid_search_strategy.py
│ │ │ ├── keyword_extractor.py
│ │ │ ├── rag_service.py
│ │ │ └── reranking_strategy.py
│ │ ├── source_management_service.py
│ │ ├── storage/
│ │ │ ├── __init__.py
│ │ │ ├── base_storage_service.py
│ │ │ ├── code_storage_service.py
│ │ │ ├── document_storage_service.py
│ │ │ └── storage_services.py
│ │ ├── threading_service.py
│ │ └── version_service.py
│ └── utils/
│ ├── __init__.py
│ ├── document_processing.py
│ ├── etag_utils.py
│ ├── progress/
│ │ ├── __init__.py
│ │ └── progress_tracker.py
│ └── semantic_version.py
└── tests/
├── __init__.py
├── agent_work_orders/
│ ├── conftest.py
│ ├── pytest.ini
│ ├── test_agent_executor.py
│ ├── test_api.py
│ ├── test_command_loader.py
│ ├── test_config.py
│ ├── test_github_integration.py
│ ├── test_id_generator.py
│ ├── test_log_buffer.py
│ ├── test_models.py
│ ├── test_port_allocation.py
│ ├── test_repository_config_repository.py
│ ├── test_sandbox_manager.py
│ ├── test_server.py
│ ├── test_sse_streams.py
│ ├── test_state_manager.py
│ ├── test_workflow_operations.py
│ └── test_workflow_orchestrator.py
├── conftest.py
├── mcp_server/
│ ├── __init__.py
│ ├── features/
│ │ ├── __init__.py
│ │ ├── documents/
│ │ │ ├── __init__.py
│ │ │ ├── test_document_tools.py
│ │ │ └── test_version_tools.py
│ │ ├── projects/
│ │ │ ├── __init__.py
│ │ │ └── test_project_tools.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ └── test_task_tools.py
│ │ └── test_feature_tools.py
│ └── utils/
│ ├── __init__.py
│ ├── test_error_handling.py
│ └── test_timeout_config.py
├── progress_tracking/
│ ├── __init__.py
│ ├── integration/
│ │ ├── __init__.py
│ │ ├── test_crawl_orchestration_progress.py
│ │ └── test_document_storage_progress.py
│ ├── test_batch_progress_bug.py
│ ├── test_progress_api.py
│ ├── test_progress_mapper.py
│ ├── test_progress_models.py
│ ├── test_progress_tracker.py
│ └── utils/
│ ├── __init__.py
│ └── test_helpers.py
├── server/
│ ├── __init__.py
│ ├── api_routes/
│ │ ├── __init__.py
│ │ ├── test_bug_report_api.py
│ │ ├── test_mcp_api.py
│ │ ├── test_migration_api.py
│ │ ├── test_projects_api_polling.py
│ │ └── test_version_api.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── projects/
│ │ │ └── __init__.py
│ │ ├── test_llms_full_parser.py
│ │ ├── test_migration_service.py
│ │ └── test_version_service.py
│ └── utils/
│ ├── __init__.py
│ └── test_etag_utils.py
├── test_api_essentials.py
├── test_async_credential_service.py
├── test_async_embedding_service.py
├── test_async_llm_provider_service.py
├── test_async_source_summary.py
├── test_business_logic.py
├── test_code_extraction_source_id.py
├── test_crawl_orchestration_isolated.py
├── test_crawling_service_subdomain.py
├── test_discovery_service.py
├── test_document_storage_metrics.py
├── test_embedding_service_no_zeros.py
├── test_keyword_extraction.py
├── test_knowledge_api_integration.py
├── test_knowledge_api_pagination.py
├── test_llms_txt_link_following.py
├── test_openrouter_discovery.py
├── test_port_configuration.py
├── test_progress_api.py
├── test_rag_simple.py
├── test_rag_strategies.py
├── test_service_integration.py
├── test_settings_api.py
├── test_source_id_refactor.py
├── test_source_race_condition.py
├── test_source_url_shadowing.py
├── test_supabase_validation.py
├── test_task_counts.py
├── test_token_optimization.py
├── test_token_optimization_integration.py
├── test_url_canonicalization.py
└── test_url_handler.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .claude/agents/codebase-analyst.md
================================================
---
name: "codebase-analyst"
description: "Use proactively to find codebase patterns, coding style and team standards. Specialized agent for deep codebase pattern analysis and convention discovery"
model: "sonnet"
---
You are a specialized codebase analysis agent focused on discovering patterns, conventions, and implementation approaches.
## Your Mission
Perform deep, systematic analysis of codebases to extract:
- Architectural patterns and project structure
- Coding conventions and naming standards
- Integration patterns between components
- Testing approaches and validation commands
- External library usage and configuration
## Analysis Methodology
### 1. Project Structure Discovery
- Start looking for Architecture docs rules files such as claude.md, agents.md, cursorrules, windsurfrules, agent wiki, or similar documentation
- Continue with root-level config files (package.json, pyproject.toml, go.mod, etc.)
- Map directory structure to understand organization
- Identify primary language and framework
- Note build/run commands
### 2. Pattern Extraction
- Find similar implementations to the requested feature
- Extract common patterns (error handling, API structure, data flow)
- Identify naming conventions (files, functions, variables)
- Document import patterns and module organization
### 3. Integration Analysis
- How are new features typically added?
- Where do routes/endpoints get registered?
- How are services/components wired together?
- What's the typical file creation pattern?
### 4. Testing Patterns
- What test framework is used?
- How are tests structured?
- What are common test patterns?
- Extract validation command examples
### 5. Documentation Discovery
- Check for README files
- Find API documentation
- Look for inline code comments with patterns
- Check PRPs/ai_docs/ for curated documentation
## Output Format
Provide findings in structured format:
```yaml
project:
language: [detected language]
framework: [main framework]
structure: [brief description]
patterns:
naming:
files: [pattern description]
functions: [pattern description]
classes: [pattern description]
architecture:
services: [how services are structured]
models: [data model patterns]
api: [API patterns]
testing:
framework: [test framework]
structure: [test file organization]
commands: [common test commands]
similar_implementations:
- file: [path]
relevance: [why relevant]
pattern: [what to learn from it]
libraries:
- name: [library]
usage: [how it's used]
patterns: [integration patterns]
validation_commands:
syntax: [linting/formatting commands]
test: [test commands]
run: [run/serve commands]
```
## Key Principles
- Be specific - point to exact files and line numbers
- Extract executable commands, not abstract descriptions
- Focus on patterns that repeat across the codebase
- Note both good patterns to follow and anti-patterns to avoid
- Prioritize relevance to the requested feature/story
## Search Strategy
1. Start broad (project structure) then narrow (specific patterns)
2. Use parallel searches when investigating multiple aspects
3. Follow references - if a file imports something, investigate it
4. Look for "similar" not "same" - patterns often repeat with variations
Remember: Your analysis directly determines implementation success. Be thorough, specific, and actionable.
================================================
FILE: .claude/agents/library-researcher.md
================================================
---
name: "library-researcher"
description: "Use proactively to research external libraries and fetch implementation-critical documentation"
model: "sonnet"
---
You are a specialized library research agent focused on gathering implementation-critical documentation.
## Your Mission
Research external libraries and APIs to provide:
- Specific implementation examples
- API method signatures and patterns
- Common pitfalls and best practices
- Version-specific considerations
## Research Strategy
### 1. Official Documentation
- Start with Archon MCP tools and check if we have relevant docs in the database
- Use the RAG tools to search for relevant documentation, use specific keywords and context in your queries
- Use websearch and webfetch to search official docs (check package registry for links)
- Find quickstart guides and API references
- Identify code examples specific to the use case
- Note version-specific features or breaking changes
### 2. Implementation Examples
- Search GitHub for real-world usage
- Find Stack Overflow solutions for common patterns
- Look for blog posts with practical examples
- Check the library's test files for usage patterns
### 3. Integration Patterns
- How do others integrate this library?
- What are common configuration patterns?
- What helper utilities are typically created?
- What are typical error handling patterns?
### 4. Known Issues
- Check library's GitHub issues for gotchas
- Look for migration guides indicating breaking changes
- Find performance considerations
- Note security best practices
## Output Format
Structure findings for immediate use:
```yaml
library: [library name]
version: [version in use]
documentation:
quickstart: [URL with section anchor]
api_reference: [specific method docs URL]
examples: [example code URL]
key_patterns:
initialization: |
[code example]
common_usage: |
[code example]
error_handling: |
[code example]
gotchas:
- issue: [description]
solution: [how to handle]
best_practices:
- [specific recommendation]
save_to_ai_docs: [yes/no - if complex enough to warrant local documentation]
```
## Documentation Curation
When documentation is complex or critical:
1. Create condensed version in PRPs/ai_docs/{library}\_patterns.md
2. Focus on implementation-relevant sections
3. Include working code examples
4. Add project-specific integration notes
## Search Queries
Effective search patterns:
- "{library} {feature} example"
- "{library} TypeError site:stackoverflow.com"
- "{library} best practices {language}"
- "github {library} {feature} language:{language}"
## Key Principles
- Prefer official docs but verify with real implementations
- Focus on the specific features needed for the story
- Provide executable code examples, not abstract descriptions
- Note version differences if relevant
- Save complex findings to ai_docs for future reference
Remember: Good library research prevents implementation blockers and reduces debugging time.
================================================
FILE: .claude/commands/agent-work-orders/commit.md
================================================
# Create Git Commit
Create an atomic git commit with a properly formatted commit message following best practices for the uncommited changes or these specific files if specified.
Specific files (skip if not specified):
- File 1: $1
- File 2: $2
- File 3: $3
- File 4: $4
- File 5: $5
## Instructions
**Commit Message Format:**
- Use conventional commits: `<type>: <description>`
- Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
- Present tense (e.g., "add", "fix", "update", not "added", "fixed", "updated")
- 50 characters or less for the subject line
- Lowercase subject line
- No period at the end
- Be specific and descriptive
**Examples:**
- `feat: add web search tool with structured logging`
- `fix: resolve type errors in middleware`
- `test: add unit tests for config module`
- `docs: update CLAUDE.md with testing guidelines`
- `refactor: simplify logging configuration`
- `chore: update dependencies`
**Atomic Commits:**
- One logical change per commit
- If you've made multiple unrelated changes, consider splitting into separate commits
- Commit should be self-contained and not break the build
**IMPORTANT**
- NEVER mention claude code, anthropic, co authored by or anything similar in the commit messages
## Run
1. Review changes: `git diff HEAD`
2. Check status: `git status`
3. Stage changes: `git add -A`
4. Create commit: `git commit -m "<type>: <description>"`
## Report
- Output the commit message used
- Confirm commit was successful with commit hash
- List files that were committed
================================================
FILE: .claude/commands/agent-work-orders/execute.md
================================================
# Execute PRP Plan
Implement a feature plan from the PRPs directory by following its Step by Step Tasks section.
## Variables
Plan file: $ARGUMENTS
## Instructions
- Read the entire plan file carefully
- Execute **every step** in the "Step by Step Tasks" section in order, top to bottom
- Follow the "Testing Strategy" to create proper unit and integration tests
- Complete all "Validation Commands" at the end
- Ensure all linters pass and all tests pass before finishing
- Follow CLAUDE.md guidelines for type safety, logging, and docstrings
## When done
- Move the PRP file to the completed directory in PRPs/features/completed
## Report
- Summarize completed work in a concise bullet point list
- Show files and lines changed: `git diff --stat`
- Confirm all validation commands passed
- Note any deviations from the plan (if any)
================================================
FILE: .claude/commands/agent-work-orders/noqa.md
================================================
# NOQA Analysis and Resolution
Find all noqa/type:ignore comments in the codebase, investigate why they exist, and provide recommendations for resolution or justification.
## Instructions
**Step 1: Find all NOQA comments**
- Use Grep tool to find all noqa comments: pattern `noqa|type:\s*ignore`
- Use output_mode "content" with line numbers (-n flag)
- Search across all Python files (type: "py")
- Document total count of noqa comments found
**Step 2: For EACH noqa comment (repeat this process):**
- Read the file containing the noqa comment with sufficient context (at least 10 lines before and after)
- Identify the specific linting rule or type error being suppressed
- Understand the code's purpose and why the suppression was added
- Investigate if the suppression is still necessary or can be resolved
**Step 3: Investigation checklist for each noqa:**
- What specific error/warning is being suppressed? (e.g., `type: ignore[arg-type]`, `noqa: F401`)
- Why was the suppression necessary? (legacy code, false positive, legitimate limitation, technical debt)
- Can the underlying issue be fixed? (refactor code, update types, improve imports)
- What would it take to remove the suppression? (effort estimate, breaking changes, architectural changes)
- Is the suppression justified long-term? (external library limitation, Python limitation, intentional design)
**Step 4: Research solutions:**
- Check if newer versions of tools (mypy, ruff) handle the case better
- Look for alternative code patterns that avoid the suppression
- Consider if type stubs or Protocol definitions could help
- Evaluate if refactoring would be worthwhile
## Report Format
Create a markdown report file (create the reports directory if not created yet): `PRPs/reports/noqa-analysis-{YYYY-MM-DD}.md`
Use this structure for the report:
````markdown
# NOQA Analysis Report
**Generated:** {date}
**Total NOQA comments found:** {count}
---
## Summary
- Total suppressions: {count}
- Can be removed: {count}
- Should remain: {count}
- Requires investigation: {count}
---
## Detailed Analysis
### 1. {File path}:{line number}
**Location:** `{file_path}:{line_number}`
**Suppression:** `{noqa comment or type: ignore}`
**Code context:**
```python
{relevant code snippet}
```
````
**Why it exists:**
{explanation of why the suppression was added}
**Options to resolve:**
1. {Option 1: description}
- Effort: {Low/Medium/High}
- Breaking: {Yes/No}
- Impact: {description}
2. {Option 2: description}
- Effort: {Low/Medium/High}
- Breaking: {Yes/No}
- Impact: {description}
**Tradeoffs:**
- {Tradeoff 1}
- {Tradeoff 2}
**Recommendation:** {Remove | Keep | Refactor}
{Justification for recommendation}
---
{Repeat for each noqa comment}
````
## Example Analysis Entry
```markdown
### 1. src/shared/config.py:45
**Location:** `src/shared/config.py:45`
**Suppression:** `# type: ignore[assignment]`
**Code context:**
```python
@property
def openai_api_key(self) -> str:
key = os.getenv("OPENAI_API_KEY")
if not key:
raise ValueError("OPENAI_API_KEY not set")
return key # type: ignore[assignment]
````
**Why it exists:**
MyPy cannot infer that the ValueError prevents None from being returned, so it thinks the return type could be `str | None`.
**Options to resolve:**
1. Use assert to help mypy narrow the type
- Effort: Low
- Breaking: No
- Impact: Cleaner code, removes suppression
2. Add explicit cast with typing.cast()
- Effort: Low
- Breaking: No
- Impact: More verbose but type-safe
3. Refactor to use separate validation method
- Effort: Medium
- Breaking: No
- Impact: Better separation of concerns
**Tradeoffs:**
- Option 1 (assert) is cleanest but asserts can be disabled with -O flag
- Option 2 (cast) is most explicit but adds import and verbosity
- Option 3 is most robust but requires more refactoring
**Recommendation:** Remove (use Option 1)
Replace the type:ignore with an assert statement after the if check. This helps mypy understand the control flow while maintaining runtime safety. The assert will never fail in practice since the ValueError is raised first.
**Implementation:**
```python
@property
def openai_api_key(self) -> str:
key = os.getenv("OPENAI_API_KEY")
if not key:
raise ValueError("OPENAI_API_KEY not set")
assert key is not None # Help mypy understand control flow
return key
```
```
## Report
After completing the analysis:
- Output the path to the generated report file
- Summarize findings:
- Total suppressions found
- How many can be removed immediately (low effort)
- How many should remain (justified)
- How many need deeper investigation or refactoring
- Highlight any quick wins (suppressions that can be removed with minimal effort)
```
================================================
FILE: .claude/commands/agent-work-orders/planning.md
================================================
# Feature Planning
Create a new plan to implement the `PRP` using the exact specified markdown `PRP Format`. Follow the `Instructions` to create the plan use the `Relevant Files` to focus on the right files.
## Variables
FEATURE $1 $2
## Instructions
- IMPORTANT: You're writing a plan to implement a net new feature based on the `Feature` that will add value to the application.
- IMPORTANT: The `Feature` describes the feature that will be implemented but remember we're not implementing a new feature, we're creating the plan that will be used to implement the feature based on the `PRP Format` below.
- Create the plan in the `PRPs/features/` directory with filename: `{descriptive-name}.md`
- Replace `{descriptive-name}` with a short, descriptive name based on the feature (e.g., "add-auth-system", "implement-search", "create-dashboard")
- Use the `PRP Format` below to create the plan.
- Deeply research the codebase to understand existing patterns, architecture, and conventions before planning the feature.
- If no patterns are established or are unclear ask the user for clarifications while providing best recommendations and options
- IMPORTANT: Replace every <placeholder> in the `PRP Format` with the requested value. Add as much detail as needed to implement the feature successfully.
- Use your reasoning model: THINK HARD about the feature requirements, design, and implementation approach.
- Follow existing patterns and conventions in the codebase. Don't reinvent the wheel.
- Design for extensibility and maintainability.
- Deeply do web research to understand the latest trends and technologies in the field.
- Figure out latest best practices and library documentation.
- Include links to relevant resources and documentation with anchor tags for easy navigation.
- If you need a new library, use `uv add <package>` and report it in the `Notes` section.
- Read `CLAUDE.md` for project principles, logging rules, testing requirements, and docstring style.
- All code MUST have type annotations (strict mypy enforcement).
- Use Google-style docstrings for all functions, classes, and modules.
- Every new file in `src/` MUST have a corresponding test file in `tests/`.
- Respect requested files in the `Relevant Files` section.
## Relevant Files
Focus on the following files and vertical slice structure:
**Core Files:**
- `CLAUDE.md` - Project instructions, logging rules, testing requirements, docstring style
app/backend core files
app/frontend core files
## PRP Format
```md
# Feature: <feature name>
## Feature Description
<describe the feature in detail, including its purpose and value to users>
## User Story
As a <type of user>
I want to <action/goal>
So that <benefit/value>
## Problem Statement
<clearly define the specific problem or opportunity this feature addresses>
## Solution Statement
<describe the proposed solution approach and how it solves the problem>
## Relevant Files
Use these files to implement the feature:
<find and list the files that are relevant to the feature describe why they are relevant in bullet points. If there are new files that need to be created to implement the feature, list them in an h3 'New Files' section. inlcude line numbers for the relevant sections>
## Relevant research docstring
Use these documentation files and links to help with understanding the technology to use:
- [Documentation Link 1](https://example.com/doc1)
- [Anchor tag]
- [Short summary]
- [Documentation Link 2](https://example.com/doc2)
- [Anchor tag]
- [Short summary]
## Implementation Plan
### Phase 1: Foundation
<describe the foundational work needed before implementing the main feature>
### Phase 2: Core Implementation
<describe the main implementation work for the feature>
### Phase 3: Integration
<describe how the feature will integrate with existing functionality>
## Step by Step Tasks
IMPORTANT: Execute every step in order, top to bottom.
<list step by step tasks as h3 headers plus bullet points. use as many h3 headers as needed to implement the feature. Order matters:
1. Start with foundational shared changes (schemas, types)
2. Implement core functionality with proper logging
3. Create corresponding test files (unit tests mirror src/ structure)
4. Add integration tests if feature interacts with multiple components
5. Verify linters pass: `uv run ruff check src/ && uv run mypy src/`
6. Ensure all tests pass: `uv run pytest tests/`
7. Your last step should be running the `Validation Commands`>
<For tool implementations:
- Define Pydantic schemas in `schemas.py`
- Implement tool with structured logging and type hints
- Register tool with Pydantic AI agent
- Create unit tests in `tests/tools/<name>/test_<module>.py`
- Add integration test in `tests/integration/` if needed>
## Testing Strategy
See `CLAUDE.md` for complete testing requirements. Every file in `src/` must have a corresponding test file in `tests/`.
### Unit Tests
<describe unit tests needed for the feature. Mark with @pytest.mark.unit. Test individual components in isolation.>
### Integration Tests
<if the feature interacts with multiple components, describe integration tests needed. Mark with @pytest.mark.integration. Place in tests/integration/ when testing full application stack.>
### Edge Cases
<list edge cases that need to be tested>
## Acceptance Criteria
<list specific, measurable criteria that must be met for the feature to be considered complete>
## Validation Commands
Execute every command to validate the feature works correctly with zero regressions.
<list commands you'll use to validate with 100% confidence the feature is implemented correctly with zero regressions. Include (example for BE Biome and TS checks are used for FE):
- Linting: `uv run ruff check src/`
- Type checking: `uv run mypy src/`
- Unit tests: `uv run pytest tests/ -m unit -v`
- Integration tests: `uv run pytest tests/ -m integration -v` (if applicable)
- Full test suite: `uv run pytest tests/ -v`
- Manual API testing if needed (curl commands, test requests)>
**Required validation commands:**
- `uv run ruff check src/` - Lint check must pass
- `uv run mypy src/` - Type check must pass
- `uv run pytest tests/ -v` - All tests must pass with zero regressions
**Run server and test core endpoints:**
- Start server: @.claude/start-server
- Test endpoints with curl (at minimum: health check, main functionality)
- Verify structured logs show proper correlation IDs and context
- Stop server after validation
## Notes
<optionally list any additional notes, future considerations, or context that are relevant to the feature that will be helpful to the developer>
```
## Feature
Extract the feature details from the `issue_json` variable (parse the JSON and use the title and body fields).
## Report
- Summarize the work you've just done in a concise bullet point list.
- Include the full path to the plan file you created (e.g., `PRPs/features/add-auth-system.md`)
================================================
FILE: .claude/commands/agent-work-orders/prime.md
================================================
# Prime
Execute the following sections to understand the codebase before starting new work, then summarize your understanding.
## Run
- List all tracked files: `git ls-files`
- Show project structure: `tree -I '.venv|__pycache__|*.pyc|.pytest_cache|.mypy_cache|.ruff_cache' -L 3`
## Read
- `CLAUDE.md` - Core project instructions, principles, logging rules, testing requirements
- `python/src/agent_work_orders` - Project overview and setup (if exists)
- Identify core files in the agent work orders directory to understand what we are woerking on and its intent
## Report
Provide a concise summary of:
1. **Project Purpose**: What this application does
2. **Architecture**: Key patterns (vertical slice, FastAPI + Pydantic AI)
3. **Core Principles**: TYPE SAFETY, KISS, YAGNI
4. **Tech Stack**: Main dependencies and tools
5. **Key Requirements**: Logging, testing, type annotations
6. **Current State**: What's implemented
Keep the summary brief (5-10 bullet points) and focused on what you need to know to contribute effectively.
================================================
FILE: .claude/commands/agent-work-orders/prp-review.md
================================================
# Code Review
Review implemented work against a PRP specification to ensure code quality, correctness, and adherence to project standards.
## Variables
Plan file: $ARGUMENTS (e.g., `PRPs/features/add-web-search.md`)
## Instructions
**Understand the Changes:**
- Check current branch: `git branch`
- Review changes: `git diff origin/main` (or `git diff HEAD` if not on a branch)
- Read the PRP plan file to understand requirements
**Code Quality Review:**
- **Type Safety**: Verify all functions have type annotations, mypy passes
- **Logging**: Check structured logging is used correctly (event names, context, exception handling)
- **Docstrings**: Ensure Google-style docstrings on all functions/classes
- **Testing**: Verify unit tests exist for all new files, integration tests if needed
- **Architecture**: Confirm vertical slice structure is followed
- **CLAUDE.md Compliance**: Check adherence to core principles (KISS, YAGNI, TYPE SAFETY)
**Validation Ruff for BE and Biome for FE:**
- Run linters: `uv run ruff check src/ && uv run mypy src/`
- Run tests: `uv run pytest tests/ -v`
- Start server and test endpoints with curl (if applicable)
- Verify structured logs show proper correlation IDs and context
**Issue Severity:**
- `blocker` - Must fix before merge (breaks build, missing tests, type errors, security issues)
- `major` - Should fix (missing logging, incomplete docstrings, poor patterns)
- `minor` - Nice to have (style improvements, optimization opportunities)
## Report
Return ONLY valid JSON (no markdown, no explanations) save to [report-#.json] in prps/reports directory create the directory if it doesn't exist. Output will be parsed with JSON.parse().
### Output Structure
```json
{
"success": "boolean - true if NO BLOCKER issues, false if BLOCKER issues exist",
"review_summary": "string - 2-4 sentences: what was built, does it match spec, quality assessment",
"review_issues": [
{
"issue_number": "number - issue index",
"file_path": "string - file with the issue (if applicable)",
"issue_description": "string - what's wrong",
"issue_resolution": "string - how to fix it",
"severity": "string - blocker|major|minor"
}
],
"validation_results": {
"linting_passed": "boolean",
"type_checking_passed": "boolean",
"tests_passed": "boolean",
"api_endpoints_tested": "boolean - true if endpoints were tested with curl"
}
}
```
## Example Success Review
```json
{
"success": true,
"review_summary": "The web search tool has been implemented with proper type annotations, structured logging, and comprehensive tests. The implementation follows the vertical slice architecture and matches all spec requirements. Code quality is high with proper error handling and documentation.",
"review_issues": [
{
"issue_number": 1,
"file_path": "src/tools/web_search/tool.py",
"issue_description": "Missing debug log for API response",
"issue_resolution": "Add logger.debug with response metadata",
"severity": "minor"
}
],
"validation_results": {
"linting_passed": true,
"type_checking_passed": true,
"tests_passed": true,
"api_endpoints_tested": true
}
}
```
================================================
FILE: .claude/commands/agent-work-orders/start-server.md
================================================
# Start Servers
Start both the FastAPI backend and React frontend development servers with hot reload.
## Run
### Run in the background with bash tool
- Ensure you are in the right PWD
- Use the Bash tool to run the servers in the background so you can read the shell outputs
- IMPORTANT: run `git ls-files` first so you know where directories are located before you start
### Backend Server (FastAPI)
- Navigate to backend: `cd app/backend`
- Start server in background: `uv sync && uv run python run_api.py`
- Wait 2-3 seconds for startup
- Test health endpoint: `curl http://localhost:8000/health`
- Test products endpoint: `curl http://localhost:8000/api/products`
### Frontend Server (Bun + React)
- Navigate to frontend: `cd ../app/frontend`
- Start server in background: `bun install && bun dev`
- Wait 2-3 seconds for startup
- Frontend should be accessible at `http://localhost:3000`
## Report
- Confirm backend is running on `http://localhost:8000`
- Confirm frontend is running on `http://localhost:3000`
- Show the health check response from backend
- Mention: "Backend logs will show structured JSON logging for all requests"
================================================
FILE: .claude/commands/archon/archon-alpha-review.md
================================================
---
description: Perform comprehensive code review for Archon V2 Beta, this command will save a report to `code-review.md`.
argument-hint: <PR number, branch name, file path, or leave empty for staged changes>
allowed-tools: Bash(*), Read, Grep, LS, Write
thinking: auto
---
# Code Review for Archon V2 Beta
**Review scope**: $ARGUMENTS
I'll perform a comprehensive code review and generate a report saved to the root of this directory as `code-review[n].md`. check if other reviews exist before you create the file and increment n as needed.
## Context
You're reviewing code for Archon V2 Beta, which uses:
- **Frontend**: React + TypeScript + Vite + TailwindCSS
- **Backend**: Python 3.12+ with FastAPI, PydanticAI, Supabase
- **Testing**: Vitest for frontend, pytest for backend
- **Code Quality**: ruff, mypy, ESLint
## What to Review
Determine what needs reviewing:
- If no arguments: Review staged changes (`git diff --staged`)
- If PR number: Review pull request (`gh pr view`)
- If branch name: Compare with main (`git diff main...branch`)
- If file path: Review specific files
- If directory: Review all changes in that area
## Review Focus
### CRITICAL: Beta Error Handling Philosophy
**Following CLAUDE.md principles - We want DETAILED ERRORS, not graceful failures!**
#### Where Errors MUST Bubble Up (Fail Fast & Loud):
- **Service initialization** - If credentials, database, or MCP fails to start, CRASH
- **Configuration errors** - Missing env vars, invalid settings should STOP the system
- **Database connection failures** - Don't hide connection issues, expose them
- **Authentication failures** - Security errors must be visible
- **Data corruption** - Never silently accept bad data
- **Type validation errors** - Pydantic should raise, not coerce
#### Where to Complete but Log Clearly:
- **Background tasks** (crawling, embeddings) - Complete the job, log failures per item
- **Batch operations** - Process what you can, report what failed with details
- **WebSocket events** - Don't crash on single event failure, log and continue
- **Optional features** - If projects/tasks disabled, log and skip
- **External API calls** - Retry with exponential backoff, then fail with clear message
### Python Code Quality
Look for:
- **Type hints** on all functions and proper use of Python 3.12+ features
- **Pydantic v2 patterns** (ConfigDict, model_dump, field_validator)
- **Error handling following beta principles**:
```python
# BAD - Silent failure
try:
result = risky_operation()
except Exception:
return None
# GOOD - Detailed error with context
try:
result = risky_operation()
except SpecificError as e:
logger.error(f"Operation failed at step X: {e}", exc_info=True)
raise # Let it bubble up!
```
- **No print statements** - should use logging instead
- **Detailed error messages** with context about what was being attempted
- **Stack traces preserved** with `exc_info=True` in logging
- **Async/await** used correctly with proper exception propagation
### TypeScript/React Quality
Look for:
- **TypeScript types** properly defined, avoid `any`
- **React error boundaries** for component failures
- **API error handling** that shows actual error messages:
```typescript
// BAD - Generic error
catch (error) {
setError("Something went wrong");
}
// GOOD - Specific error with details
catch (error) {
console.error("API call failed:", error);
setError(`Failed to load data: ${error.message}`);
}
```
- **Component structure** following existing patterns
- **Console.error** for debugging, not hidden errors
### Security Considerations
Check for:
- Input validation that FAILS LOUDLY on bad input
- SQL injection vulnerabilities
- No hardcoded secrets or API keys
- Authentication that clearly reports why it failed
- CORS configuration with explicit error messages
### Architecture & Patterns
Ensure:
- Services fail fast on initialization errors
- Routes return detailed error responses with status codes
- Database operations include transaction details in errors
- Socket.IO disconnections are logged with reasons
- Service dependencies checked at startup, not runtime
### Testing
Verify:
- Tests check for specific error messages, not just "throws"
- Error paths are tested with expected error details
- No catch-all exception handlers hiding issues
- Mock failures test error propagation
## Review Process
1. **Understand the changes** - What problem is being solved?
2. **Check functionality** - Does it do what it's supposed to?
3. **Review code quality** - Is it maintainable and follows standards?
4. **Consider performance** - Any N+1 queries or inefficient algorithms?
5. **Verify tests** - Are changes properly tested?
6. **Check documentation** - Are complex parts documented?
## Key Areas to Check
**Backend Python files:**
- `python/src/server/` - Service layer patterns
- `python/src/mcp/` - MCP tool definitions
- `python/src/agents/` - AI agent implementations
**Frontend TypeScript files:**
- `archon-ui-main/src/components/` - React components
- `archon-ui-main/src/services/` - API integration
- `archon-ui-main/src/hooks/` - Custom hooks
**Configuration:**
- `docker-compose.yml` - Service configuration
- `.env` changes - Security implications
- `package.json` / `pyproject.toml` - Dependency changes
## Report Format
Generate a `code-review.md` with:
```markdown
# Code Review
**Date**: [Today's date]
**Scope**: [What was reviewed]
**Overall Assessment**: [Pass/Needs Work/Critical Issues]
## Summary
[Brief overview of changes and general quality]
## Issues Found
### 🔴 Critical (Must Fix)
- [Issue description with file:line reference and suggested fix]
### 🟡 Important (Should Fix)
- [Issue description with file:line reference]
### 🟢 Suggestions (Consider)
- [Minor improvements or style issues]
## What Works Well
- [Positive aspects of the code]
## Security Review
[Any security concerns or confirmations]
## Performance Considerations
[Any performance impacts]
## Test Coverage
- Current coverage: [if available]
- Missing tests for: [list areas]
## Recommendations
[Specific actionable next steps]
```
## Helpful Commands
```bash
# Check what changed
git diff --staged
git diff main...HEAD
gh pr view $PR_NUMBER --json files
# Run quality checks
cd python && ruff check --fix
cd python && mypy src/
cd archon-ui-main && npm run lint
# Run tests
cd python && uv run pytest
cd archon-ui-main && npm test
```
Remember: Focus on impact and maintainability. Good code review helps the team ship better code, not just find problems. Be constructive and specific with feedback.
================================================
FILE: .claude/commands/archon/archon-coderabbit-helper.md
================================================
---
name: Archon CodeRabbit Helper
description: Analyze CodeRabbit suggestions, assess validity, and provide actionable options with tradeoffs
argument-hint: Paste the CodeRabbit suggestion here
---
# CodeRabbit Review Analysis
**Review:** $ARGUMENTS
## Instructions
Analyze this CodeRabbit suggestion following these steps:
### 1. Deep Analysis
- Understand the technical issue being raised
- Check if it's a real problem or false positive
- Search the codebase for related patterns and context
- Consider project phase (early beta) and architecture
### 2. Context Assessment
- We're in early beta - prioritize simplicity over perfection
- Follow KISS principles and existing codebase patterns
- Avoid premature optimization or over-engineering
- Consider if this affects user experience or is internal only
### 3. Generate Options
Think harder about the problem and potential solutions.
Provide 2-5 practical options with clear tradeoffs
## Response Format
### 📋 Issue Summary
_[One sentence describing what CodeRabbit found]_
### ✅ Is this valid?
_[YES/NO with brief explanation]_
### 🎯 Priority for this PR
_[HIGH/MEDIUM/LOW/SKIP with reasoning]_
### 🔧 Options & Tradeoffs
**Option 1: [Name]**
- What: _[Brief description]_
- Pros: _[Benefits]_
- Cons: _[Drawbacks]_
- Effort: _[Low/Medium/High]_
**Option 2: [Name]**
- What: _[Brief description]_
- Pros: _[Benefits]_
- Cons: _[Drawbacks]_
- Effort: _[Low/Medium/High]_
### 💡 Recommendation
_[Your recommended option with 1-2 sentence justification]_
## User feedback
- When you have presented the review to the user you must ask for their feedback on the suggested changes.
- Ask the user if they wish to discuss any of the options further
- If the user wishes for you to explore further, provide additional options or tradeoffs.
- If the user is ready to implement the recommended option right away
================================================
FILE: .claude/commands/archon/archon-onboarding.md
================================================
---
name: archon-onboarding
description: |
Onboard new developers to the Archon codebase with a comprehensive overview and first contribution guidance.
Usage: /archon-onboarding
argument-hint: none
---
You are helping a new developer get up and running with the Archon V2 Beta project! Your goal is to provide them with a personalized onboarding experience.
## What is Archon?
Archon is a centralized knowledge base for AI coding assistants. It enables Claude Code, Cursor, Windsurf, and other AI tools to access your documentation, perform smart searches, and manage tasks - all through a unified interface.
Its powered by a **Model Context Protocol (MCP) server**
And you can crawl and store knowledge that you can use multiple rag strategies to improve your AI coders performance.
## Quick Architecture Overview
This is a **true microservices architecture** with 4 independent services:
1. **Frontend** (port 3737) - React UI for managing knowledge and projects
2. **Server** (port 8181) - Core API handling all business logic
3. **MCP Server** (port 8051) - Lightweight MCP protocol interface
4. **Agents** (port 8052) - AI operations with PydanticAI
All services communicate via HTTP only - no shared code, true separation of concerns.
## Getting Started - Your First 30 Minutes
### Prerequisites Check
You'll need:
- Docker Desktop (running)
- Supabase account (free tier works)
- OpenAI API key (or Gemini/Ollama)
- Git and basic command line knowledge
### Setup
First, read the README.md file to understand the setup process, then guide the user through these steps:
1. Clone the repository and set up environment variables
2. Configure Supabase database with migration scripts
3. Start Docker services
4. Configure API keys in the UI
5. Verify everything is working by testing a simple crawl
## Understanding the Codebase
### Decision Time
Ask the user to choose their focus area. Present these options clearly and wait for their response:
"Which area of the Archon codebase would you like to explore first?"
1. **Frontend (React/TypeScript)** - If you enjoy UI/UX work
2. **Backend API (Python/FastAPI)** - If you like building robust APIs
3. **MCP Tools (Python)** - If you're interested in AI tool protocols
4. **RAG/Search (Python)** - If you enjoy search and ML engineering
5. **Web Crawling (Python)** - If you like data extraction challenges
### Your Onboarding Analysis
Based on the user's choice, perform a deep analysis of that area following the instructions below for their specific choice. Then provide them with a structured report.
## Report Structure
Your report to the user should include:
1. **Area Overview**: Architecture explanation and how it connects to other services
2. **Key Files Walkthrough**: Purpose of main files and their relationships
3. **Suggested First Contribution**: A specific, small improvement with exact location
4. **Implementation Guide**: Step-by-step instructions to make the change
5. **Testing Instructions**: How to verify their change works correctly
**If the user chose Frontend:**
- Start with `archon-ui-main/src/pages/KnowledgeBasePage.tsx`
- Look at how it uses `services/knowledgeBaseService.ts`
- Take a deep dive into the frontend architecture and UI components
- Identify a potential issue that the user can easily fix and suggest a solution
- Give the user a overview of the frontend and architecture following the report format above
**If the user chose Backend API:**
- Start with `python/src/server/api_routes/knowledge_api.py`
- See how it calls `services/knowledge/knowledge_item_service.py`
- Take a deep dive into the FastAPI service architecture and patterns
- Identify a potential API improvement that the user can implement
- Give the user an overview of the backend architecture and suggest a contribution
**If the user chose MCP Tools:**
- Start with `python/src/mcp/mcp_server.py`
- Look at `modules/rag_module.py` for tool patterns
- Take a deep dive into the MCP protocol implementation and available tools
- Identify a missing tool or enhancement that would be valuable
- Give the user an overview of the MCP architecture and how to add new tools
**If the user chose RAG/Search:**
- Start with `python/src/server/services/search/vector_search_service.py`
- Understand the hybrid search approach
- Take a deep dive into the RAG pipeline and search strategies
- Identify a search improvement or ranking enhancement opportunity
- Give the user an overview of the RAG system and suggest optimizations
**If the user chose Web Crawling:**
- Start with `python/src/server/services/rag/crawling_service.py`
- Look at sitemap detection and parsing logic
- Take a deep dive into the crawling architecture and content extraction
- Identify a crawling enhancement or new content type support to add
- Give the user an overview of the crawling system and parsing strategies
## How to Find Contribution Opportunities
When analyzing the user's chosen area, look for:
- TODO or FIXME comments in the code
- Missing error handling or validation
- UI components that could be more user-friendly
- API endpoints missing useful filters or data
- Areas with minimal or no test coverage
- Hardcoded values that should be configurable
## What to Include in Your Report
After analyzing their chosen area, provide the user with:
1. Key development patterns they should know:
- Beta mindset (break things to improve them)
- Error philosophy (fail fast with detailed errors)
- Service boundaries (no cross-service imports)
- Real-time updates via Socket.IO
- Testing approach for their chosen area
2. Specific contribution suggestion with:
- Exact file and line numbers to modify
- Current behavior vs improved behavior
- Step-by-step implementation guide
- Testing instructions
3. Common gotchas for their area:
- Service-specific pitfalls
- Testing requirements
- Local vs Docker differences
Remember to encourage the user to start small and iterate. This is beta software designed for rapid experimentation.
================================================
FILE: .claude/commands/archon/archon-prime-simple.md
================================================
---
name: prime-simple
description: Quick context priming for Archon development - reads essential files and provides project overview
argument-hint: none
---
## Prime Context for Archon Development
You need to quickly understand the Archon V2 Beta codebase. Follow these steps:
### 1. Read Project Documentation
- Read `CLAUDE.md` for development guidelines and patterns
- Read `README.md` for project overview and setup
### 2. Understand Project Structure
Use `tree -L 2` or explore the directory structure to understand the layout:
- `archon-ui-main/` - Frontend React application
- `python/` - Backend services (server, MCP, agents)
- `docker-compose.yml` - Service orchestration
- `migration/` - Database setup scripts
### 3. Read Key Frontend Files
Read these essential files in `archon-ui-main/`:
- `src/App.tsx` - Main application entry and routing
- Make your own decision of how deep to go into other files
### 4. Read Key Backend Files
Read these essential files in `python/`:
- `src/server/main.py` - FastAPI application setup
- Make your own decision of how deep to go into other files
### 5. Review Configuration
- `.env.example` - Required environment variables
- `docker-compose.yml` - Service definitions and ports
- Make your own decision of how deep to go into other files
### 6. Provide Summary
After reading these files, explain to the user:
1. **Project Purpose**: One sentence about what Archon does and why it exists
2. **Architecture**: One sentence about the architecture
3. **Key Patterns**: One sentence about key patterns
4. **Tech Stack**: One sentence about tech stack
Remember: This is beta software focused on rapid iteration. Prioritize understanding the core functionality
================================================
FILE: .claude/commands/archon/archon-prime.md
================================================
---
name: prime
description: |
Prime Claude Code with deep context for a specific part of the Archon codebase.
Usage: /prime "<service>" "<special focus>"
Examples:
/prime "frontend" "Focus on UI components and React"
/prime "server" "Focus on FastAPI and backend services"
/prime "knowledge" "Focus on RAG and knowledge management"
argument-hint: <service> <Specific focus>
---
You're about to work on the Archon V2 Beta codebase. This is a microservices-based knowledge management system with MCP integration. Here's what you need to know:
## Today's Focus area
Today we are focusing on: $ARGUMENTS
And pay special attention to: $ARGUMENTS
## Decision
Think hard and make an intelligent decision about which key files you need to read and create a todo list.
If you discover something you need to look deeper at or imports from files you need context from, append it to the todo list during the priming process. The goal is to get key understandings of the codebase so you are ready to make code changes to that part of the codebase.
## Architecture Overview
### Frontend (port 3737) - React + TypeScript + Vite
```
archon-ui-main/
├── src/
│ ├── App.tsx # Main app component with routing and providers
│ ├── index.tsx # React entry point with theme and settings
│ ├── components/
│ │ ├── layouts/ # Layout components (MainLayout, SideNavigation)
│ │ ├── knowledge-base/ # Knowledge management UI (crawling, items, search)
│ │ ├── project-tasks/ # Project and task management components
│ │ ├── prp/ # Product Requirements Prompt viewer components
│ │ ├── mcp/ # MCP client management and testing UI
│ │ ├── settings/ # Settings panels (API keys, features, RAG config)
│ │ └── ui/ # Reusable UI components (buttons, cards, inputs)
│ ├── services/ # API client services for backend communication
│ │ ├── knowledgeBaseService.ts # Knowledge item CRUD and search operations
│ │ ├── projectService.ts # Project and task management API calls
│ │ ├── mcpService.ts # MCP server communication and tool execution
│ │ └── socketIOService.ts # Real-time WebSocket event handling
│ ├── hooks/ # Custom React hooks for state and effects
│ ├── contexts/ # React contexts (Settings, Theme, Toast)
│ └── pages/ # Main page components for routing
```
### Backend Server (port 8181) - FastAPI + Socket.IO
```
python/src/server/
├── main.py # FastAPI app initialization and routing setup
├── socketio_app.py # Socket.IO server configuration and namespaces
├── config/
│ ├── config.py # Environment variables and app configuration
│ └── service_discovery.py # Service URL resolution for Docker/local
├── fastapi/ # API route handlers (thin wrappers)
│ ├── knowledge_api.py # Knowledge base endpoints (crawl, upload, search)
│ ├── projects_api.py # Project and task management endpoints
│ ├── mcp_api.py # MCP tool execution and health checks
│ └── socketio_handlers.py # Socket.IO event handlers and broadcasts
├── services/ # Business logic layer
│ ├── knowledge/
│ │ ├── crawl_orchestration_service.py # Website crawling coordination
│ │ ├── knowledge_item_service.py # Knowledge item CRUD operations
│ │ └── code_extraction_service.py # Extract code examples from docs
│ ├── projects/
│ │ ├── project_service.py # Project management logic
│ │ ├── task_service.py # Task lifecycle and status management
│ │ └── versioning_service.py # Document version control
│ ├── rag/
│ │ └── crawling_service.py # Web crawling implementation
│ ├── search/
│ │ └── vector_search_service.py # Semantic search with pgvector
│ ├── embeddings/
│ │ └── embedding_service.py # OpenAI embeddings generation
│ └── storage/
│ └── document_storage_service.py # Document chunking and storage
```
### MCP Server (port 8051) - Model Context Protocol
```
python/src/mcp/
├── mcp_server.py # FastAPI MCP server with SSE support
└── modules/
├── project_module.py # Project and task MCP tools
└── rag_module.py # RAG query and search MCP tools
```
### Agents Service (port 8052) - PydanticAI
```
python/src/agents/
├── server.py # FastAPI server for agent endpoints
├── base_agent.py # Base agent class with streaming support
├── document_agent.py # Document processing and chunking agent
├── rag_agent.py # RAG search and reranking agent
└── mcp_client.py # Client for calling MCP tools
```
## Key Files to Read for Context
### When working on Frontend
Key files to consider:
- `archon-ui-main/src/App.tsx` - Main app structure and routing
- `archon-ui-main/src/services/knowledgeBaseService.ts` - API call patterns
- `archon-ui-main/src/services/socketIOService.ts` - Real-time events
### When working on Backend
Key files to consider:
- `python/src/server/main.py` - FastAPI app setup
- `python/src/server/services/knowledge/knowledge_item_service.py` - Service pattern example
- `python/src/server/api_routes/knowledge_api.py` - API endpoint pattern
### When working on MCP
Key files to consider:
- `python/src/mcp/mcp_server.py` - MCP server implementation
- `python/src/mcp/modules/rag_module.py` - Tool implementations
### When working on RAG
Key files to consider:
- `python/src/server/services/search/vector_search_service.py` - Vector search logic
- `python/src/server/services/embeddings/embedding_service.py` - Embedding generation
- `python/src/agents/rag_agent.py` - RAG reranking
### When working on Crawling
Key files to consider:
- `python/src/server/services/rag/crawling_service.py` - Core crawling logic
- `python/src/server/services/knowledge/crawl_orchestration_service.py` - Crawl coordination
- `python/src/server/services/storage/document_storage_service.py` - Document storage
### When working on Projects/Tasks
Key files to consider:
- `python/src/server/services/projects/task_service.py` - Task management
- `archon-ui-main/src/components/project-tasks/TaskBoardView.tsx` - Kanban UI
### When working on Agents
Key files to consider:
- `python/src/agents/base_agent.py` - Agent base class
- `python/src/agents/rag_agent.py` - RAG agent implementation
## Critical Rules for This Codebase
Follow the guidelines in CLAUDE.md
## Current Focus Areas
- The projects feature is optional (toggle in Settings UI)
- All services communicate via HTTP, not gRPC
- Socket.IO handles all real-time updates
- Frontend uses Vite proxy for API calls in development
- Python backend uses `uv` for dependency management
Remember: This is beta software. Prioritize functionality over production patterns. Make it work, make it right, then make it fast.
================================================
FILE: .claude/commands/archon/archon-rca.md
================================================
---
description: Generate Root Cause Analysis report for Archon V2 Beta issues
argument-hint: <issue description or error message>
allowed-tools: Bash(*), Read, Grep, LS, Write
thinking: auto
---
# Root Cause Analysis for Archon V2 Beta
**Issue to investigate**: $ARGUMENTS
investigate this issue systematically and generate an RCA report saved to `RCA.md` in the project root.
## Context About Archon
You're working with Archon V2 Beta, a microservices-based AI knowledge management system:
- **Frontend**: React + TypeScript on port 3737
- **Main Server**: FastAPI + Socket.IO on port 8181
- **MCP Server**: Lightweight HTTP protocol server on port 8051
- **Agents Service**: PydanticAI agents on port 8052
- **Database**: Supabase (PostgreSQL + pgvector)
All services run in Docker containers managed by docker-compose.
## Investigation Approach
### 1. Initial Assessment
First, understand what's broken:
- What exactly is the symptom?
- Which service(s) are affected?
- When did it start happening?
- Is it reproducible?
### 2. System Health Check
Check if all services are running properly:
- Docker container status (`docker-compose ps`)
- Service health endpoints (ports 8181, 8051, 8052, 3737)
- Recent error logs from affected services
- Database connectivity
### 3. Error Handling Analysis
**Remember: In Beta, we want DETAILED ERRORS that help us fix issues fast!**
Look for these error patterns:
**Good errors (what we want):**
- Stack traces with full context
- Specific error messages saying what failed
- Service initialization failures that stop the system
- Validation errors that show what was invalid
**Bad patterns (what causes problems):**
- Silent failures returning None/null
- Generic "Something went wrong" messages
- Catch-all exception handlers hiding the real issue
- Services continuing with broken dependencies
### 4. Targeted Investigation
Based on the issue type, investigate specific areas:
**For API/Backend issues**: Check FastAPI routes, service layer, database queries
**For Frontend issues**: Check React components, API calls, build process
**For MCP issues**: Check tool definitions, session management, HTTP calls
**For Real-time issues**: Check Socket.IO connections, event handling
**For Database issues**: Check Supabase connection, migrations, RLS policies
### 5. Root Cause Identification
- Follow error stack traces to the source
- Check if errors are being swallowed somewhere
- Look for missing error handling where it should fail fast
- Check recent code changes (`git log`)
- Identify any dependency or initialization order problems
### 6. Impact Analysis
Determine the scope:
- Which features are affected?
- Is this a startup failure or runtime issue?
- Is there data loss or corruption?
- Are errors propagating correctly or being hidden?
## Key Places to Look
Think hard about where to look, there is some guidance below that you can follow
**Configuration files:**
- `.env` - Environment variables
- `docker-compose.yml` - Service configuration
- `python/src/server/config.py` - Server settings
**Service entry points:**
- `python/src/server/main.py` - Main server
- `python/src/mcp/server.py` - MCP server
- `archon-ui-main/src/main.tsx` - Frontend
**Common problem areas:**
- `python/src/server/services/credentials_service.py` - Must initialize first
- `python/src/server/services/supabase_service.py` - Database connections
- `python/src/server/socketio_manager.py` - Real-time events
- `archon-ui-main/src/services/` - Frontend API calls
## Report Structure
Generate an RCA.md report with:
```markdown
# Root Cause Analysis
**Date**: [Today's date]
**Issue**: [Brief description]
**Severity**: [Critical/High/Medium/Low]
## Summary
[One paragraph overview of the issue and its root cause]
## Investigation
### Symptoms
- [What was observed]
### Diagnostics Performed
- [Health checks run]
- [Logs examined]
- [Code reviewed]
### Root Cause
[Detailed explanation of why this happened]
## Impact
- **Services Affected**: [List]
- **User Impact**: [Description]
- **Duration**: [Time period]
## Resolution
### Immediate Fix
[What needs to be done right now]
### Long-term Prevention
[How to prevent this in the future]
## Evidence
[Key logs, error messages, or code snippets that led to the diagnosis]
## Lessons Learned
[What we learned from this incident]
```
## Helpful Commands
```bash
# Check all services
docker-compose ps
# View recent errors
docker-compose logs --tail=50 [service-name] | grep -E "ERROR|Exception"
# Health checks
curl http://localhost:8181/health
curl http://localhost:8051/health
# Database test
docker-compose exec archon-server python -c "from src.server.services.supabase_service import SupabaseService; print(SupabaseService.health_check())"
# Resource usage
docker stats --no-stream
```
Remember: Focus on understanding the root cause, not just symptoms. The goal is to create a clear, actionable report that helps prevent similar issues in the future.
================================================
FILE: .claude/commands/archon/archon-ui-consistency-review.md
================================================
---
description: Analyze UI components for reusability, Radix usage, primitives, and styling consistency
argument-hint: <feature path, component path, or directory>
allowed-tools: Read, Grep, Glob, Write, Bash
thinking: auto
---
# UI Consistency Review for Archon
**Review scope**: $ARGUMENTS
## Process
### Step 1: Load Standards
Read `PRPs/ai_docs/UI_STANDARDS.md` - This is the single source of truth for all rules, patterns, and scans.
### Step 2: Find Files
Glob all `.tsx` files in the provided path.
### Step 3: Run Automated Scans
Execute ALL scans from **UI_STANDARDS.md - AUTOMATED SCAN REFERENCE** section:
- Critical scans (dynamic classes, non-responsive grids, native HTML, unconstrained scroll)
- High priority scans (keyboard support, dark mode, hardcoded patterns, min-w-0)
- Medium priority scans (TypeScript, color mismatches, props validation)
### Step 4: Deep Analysis
For each file, check against ALL rules from **UI_STANDARDS.md sections 1-8**:
1. TAILWIND V4 - Static classes, tokens
2. LAYOUT & RESPONSIVE - Grids, scroll, truncation
3. THEMING - Dark mode variants
4. RADIX UI - Primitives usage
5. PRIMITIVES LIBRARY - Card, PillNavigation, styles.ts
6. ACCESSIBILITY - Keyboard, ARIA, focus
7. TYPESCRIPT & API CONTRACTS - Types, props, consistency
8. FUNCTIONAL LOGIC - UI actually works
**For primitives** (files in `/features/ui/primitives/`):
- Verify all props affect rendering
- Check color variant objects have: checked, glow, focusRing, hover
- Validate prop implementations match interface
### Step 5: Generate Report
Save to `PRPs/reviews/ui-consistency-review-[feature].md` with:
- Overall scores (use **UI_STANDARDS.md - SCORING VIOLATIONS**)
- Component-by-component analysis
- Violations with file:line, current code, required fix
- Prioritized action items
### Step 6: Create PRP
Use `/prp-claude-code:prp-claude-code-create ui-consistency-fixes-[feature]` if violations found.
**PRP should reference:**
- The review report
- Specific UI_STANDARDS.md sections violated
- Automated scan commands to re-run for validation
---
**Note**: Do NOT duplicate rules/patterns from UI_STANDARDS.md. Just reference section numbers.
================================================
FILE: .claude/commands/prp-any-agent/prp-any-cli-create.md
================================================
# Create PRP
## Feature file: $ARGUMENTS
Generate a complete PRP for general feature implementation with thorough research. Ensure context is passed to the AI agent to enable self-validation and iterative refinement. Read the feature file first to understand what needs to be created, how the examples provided help, and any other considerations.
The AI agent only gets the context you are appending to the PRP and training data. Assuma the AI agent has access to the codebase and the same knowledge cutoff as you, so its important that your research findings are included or referenced in the PRP. The Agent has Websearch capabilities, so pass urls to documentation and examples.
## Research Process
1. **Codebase Analysis**
- Search for similar features/patterns in the codebase
- Identify files to reference in PRP
- Note existing conventions to follow
- Check test patterns for validation approach
2. **External Research**
- Search for similar features/patterns online
- Library documentation (include specific URLs)
- Implementation examples (GitHub/StackOverflow/blogs)
- Best practices and common pitfalls
3. **User Clarification** (if needed)
- Specific patterns to mirror and where to find them?
- Integration requirements and where to find them?
## PRP Generation
Using PRPs/templates/prp_base.md as template:
### Critical Context to Include and pass to the AI agent as part of the PRP
- **Documentation**: URLs with specific sections
- **Code Examples**: Real snippets from codebase
- **Gotchas**: Library quirks, version issues
- **Patterns**: Existing approaches to follow
### Implementation Blueprint
- Start with pseudocode showing approach
- Reference real files for patterns
- Include error handling strategy
- list tasks to be completed to fullfill the PRP in the order they should be completed
### Validation Gates (Must be Executable) eg for python
```bash
# Syntax/Style
ruff check --fix && mypy .
# Unit Tests
uv run pytest tests/ -v
```
**_ CRITICAL AFTER YOU ARE DONE RESEARCHING AND EXPLORING THE CODEBASE BEFORE YOU START WRITING THE PRP _**
**_ ULTRATHINK ABOUT THE PRP AND PLAN YOUR APPROACH THEN START WRITING THE PRP _**
## Output
Save as: `PRPs/{feature-name}.md`
## Quality Checklist
- [ ] All necessary context included
- [ ] Validation gates are executable by AI
- [ ] References existing patterns
- [ ] Clear implementation path
- [ ] Error handling documented
Score the PRP on a scale of 1-10 (confidence level to succeed in one-pass implementation using claude codes)
Remember: The goal is one-pass implementation success through comprehensive context.
================================================
FILE: .claude/commands/prp-any-agent/prp-any-cli-execute.md
================================================
# Execute BASE PRP
Implement a feature using using the PRP file.
## PRP File: $ARGUMENTS
## Execution Process
1. **Load PRP**
- Read the specified PRP file
- Understand all context and requirements
- Follow all instructions in the PRP and extend the research if needed
- Ensure you have all needed context to implement the PRP fully
- Do more web searches and codebase exploration as needed
2. **ULTRATHINK**
- Think hard before you execute the plan. Create a comprehensive plan addressing all requirements.
- Break down complex tasks into smaller, manageable steps using your todos tools.
- Use the TodoWrite tool to create and track your implementation plan.
- Identify implementation patterns from existing code to follow.
3. **Execute the plan**
- Execute the PRP
- Implement all the code
4. **Validate**
- Run each validation command
- Fix any failures
- Re-run until all pass
5. **Complete**
- Ensure all checklist items done
- Run final validation suite
- Report completion status
- Read the PRP again to ensure you have implemented everything
6. **Reference the PRP**
- You can always reference the PRP again if needed
Note: If validation fails, use error patterns in PRP to fix and retry.
================================================
FILE: .claude/commands/prp-claude-code/prp-claude-code-create.md
================================================
# Create BASE PRP
## Feature: $ARGUMENTS
## PRP Creation Mission
Create a comprehensive PRP that enables **one-pass implementation success** through systematic research and context curation.
**Critical Understanding**: The executing AI agent only receives:
- The PRP content you create
- Its training data knowledge
- Access to codebase files (but needs guidance on which ones)
**Therefore**: Your research and context curation directly determines implementation success. Incomplete context = implementation failure.
## Research Process
> During the research process, create clear tasks and spawn as many agents and subagents as needed using the batch tools. The deeper research we do here the better the PRP will be. we optminize for chance of success and not for speed.
1. **Codebase Analysis in depth**
- Create clear todos and spawn subagents to search the codebase for similar features/patterns Think hard and plan your approach
- Identify all the necessary files to reference in the PRP
- Note all existing conventions to follow
- Check existing test patterns for validation approach
- Use the batch tools to spawn subagents to search the codebase for similar features/patterns
2. **External Research at scale**
- Create clear todos and spawn with instructions subagents to do deep research for similar features/patterns online and include urls to documentation and examples
- Library documentation (include specific URLs)
- For critical pieces of documentation add a .md file to PRPs/ai_docs and reference it in the PRP with clear reasoning and instructions
- Implementation examples (GitHub/StackOverflow/blogs)
- Best practices and common pitfalls found during research
- Use the batch tools to spawn subagents to search for similar features/patterns online and include urls to documentation and examples
3. **User Clarification**
- Ask for clarification if you need it
## PRP Generation Process
### Step 1: Choose Template
Use `PRPs/templates/prp_base.md` as your template structure - it contains all necessary sections and formatting.
### Step 2: Context Completeness Validation
Before writing, apply the **"No Prior Knowledge" test** from the template:
_"If someone knew nothing about this codebase, would they have everything needed to implement this successfully?"_
### Step 3: Research Integration
Transform your research findings into the template sections:
**Goal Section**: Use research to define specific, measurable Feature Goal and concrete Deliverable
**Context Section**: Populate YAML structure with your research findings - specific URLs, file patterns, gotchas
**Implementation Tasks**: Create dependency-ordered tasks using information-dense keywords from codebase analysis
**Validation Gates**: Use project-specific validation commands that you've verified work in this codebase
### Step 4: Information Density Standards
Ensure every reference is **specific and actionable**:
- URLs include section anchors, not just domain names
- File references include specific patterns to follow, not generic mentions
- Task specifications include exact naming conventions and placement
- Validation commands are project-specific and executable
### Step 5: ULTRATHINK Before Writing
After research completion, create comprehensive PRP writing plan using TodoWrite tool:
- Plan how to structure each template section with your research findings
- Identify gaps that need additional research
- Create systematic approach to filling template with actionable context
## Output
Save as: `PRPs/{feature-name}.md`
## PRP Quality Gates
### Context Completeness Check
- [ ] Passes "No Prior Knowledge" test from template
- [ ] All YAML references are specific and accessible
- [ ] Implementation tasks include exact naming and placement guidance
- [ ] Validation commands are project-specific and verified working
### Template Structure Compliance
- [ ] All required template sections completed
- [ ] Goal section has specific Feature Goal, Deliverable, Success Definition
- [ ] Implementation Tasks follow dependency ordering
- [ ] Final Validation Checklist is comprehensive
### Information Density Standards
- [ ] No generic references - all are specific and actionable
- [ ] File patterns point at specific examples to follow
- [ ] URLs include section anchors for exact guidance
- [ ] Task specifications use information-dense keywords from codebase
## Success Metrics
**Confidence Score**: Rate 1-10 for one-pass implementation success likelihood
**Validation**: The completed PRP should enable an AI agent unfamiliar with the codebase to implement the feature successfully using only the PRP content and codebase access.
================================================
FILE: .claude/commands/prp-claude-code/prp-claude-code-execute.md
================================================
# Execute BASE PRP
## PRP File: $ARGUMENTS
## Mission: One-Pass Implementation Success
PRPs enable working code on the first attempt through:
- **Context Completeness**: Everything needed, nothing guessed
- **Progressive Validation**: 4-level gates catch errors early
- **Pattern Consistency**: Follow existing codebase approaches
**Your Goal**: Transform the PRP into working code that passes all validation gates.
## Execution Process
1. **Load PRP**
- Read the specified PRP file completely
- Absorb all context, patterns, requirements and gather codebase intelligence
- Use the provided documentation references and file patterns, consume the right documentation before the appropriate todo/task
- Trust the PRP's context and guidance - it's designed for one-pass success
- If needed do additional codebase exploration and research as needed
2. **ULTRATHINK & Plan**
- Create comprehensive implementation plan following the PRP's task order
- Break down into clear todos using TodoWrite tool
- Use subagents for parallel work when beneficial (always create prp inspired prompts for subagents when used)
- Follow the patterns referenced in the PRP
- Use specific file paths, class names, and method signatures from PRP context
- Never guess - always verify the codebase patterns and examples referenced in the PRP yourself
3. **Execute Implementation**
- Follow the PRP's Implementation Tasks sequence, add more detail as needed, especially when using subagents
- Use the patterns and examples referenced in the PRP
- Create files in locations specified by the desired codebase tree
- Apply naming conventions from the task specifications and CLAUDE.md
4. **Progressive Validation**
**Execute the level validation system from the PRP:**
- **Level 1**: Run syntax & style validation commands from PRP
- **Level 2**: Execute unit test validation from PRP
- **Level 3**: Run integration testing commands from PRP
- **Level 4**: Execute specified validation from PRP
**Each level must pass before proceeding to the next.**
5. **Completion Verification**
- Work through the Final Validation Checklist in the PRP
- Verify all Success Criteria from the "What" section are met
- Confirm all Anti-Patterns were avoided
- Implementation is ready and working
**Failure Protocol**: When validation fails, use the patterns and gotchas from the PRP to fix issues, then re-run validation until passing.
================================================
FILE: .claude/commands/prp-claude-code/prp-story-task-create.md
================================================
---
description: "Convert user story/task into executable PRP with deep codebase analysis"
---
# Create Story PRP from User Story/Task
## Story/Task: $ARGUMENTS
## Mission
Transform a user story or task into a **tactical implementation PRP** through systematic codebase analysis and task decomposition.
We do not write any code in this step, the goal is to create a detailed context engineered implementation plan for the implementation agent.
**Key Principle**: We must first gather the context about the story/task before proceeding with the analysis.
When we understand the story/task, we can proceed with the codebase analysis. We systematically dig deep into the codebase to gather intelligence and identify patterns and implementation points. We then use this information to create a PRP that can be executed by a coding agent.
The contents of the created PRP should encapsulate all the information the agent needs to complete the story/task in one pass.
Remember that subagents will only receive details from you; the user cannot interact with them directly. Therefore, include all relevant context in the subagent prompt and TODO.
Create detailed TODOs and spawn parallel subagents to analyze (use specialized subagents when appropriate).
## Analysis Process
### Phase 1: Story Decomposition
Analyze the story to determine:
- **Story/Task Type**: Feature/Bug/Enhancement/Refactor
- **Complexity**: Low, Medium, High
- **Affected Systems**: Which components/services need changes
Get a deep understanding about the story/task before proceeding so that you can effectively guide the rest of the process.
### Phase 2: Codebase Intelligence Gathering
**1. Project Structure Analysis**
- Detect primary language(s) and frameworks
- Map directory structure and conventions to identify integration points for the story/task
- Identify service/component boundaries
- Find configuration files and environment setup
**2. Pattern Recognition**
- Search for similar implementations in codebase
- Identify coding conventions (naming, structure, error handling) start in CLAUDE.md AGENTS.md or relevant rules files such as .cursorrules
- Extract common patterns for the story's domain that should be added to the PRP as context for the implementation agent.
- Note anti-patterns to avoid
**3. Dependency Analysis**
- Catalog external libraries used if relevant to the story/task (check package.json, pyproject.toml, go.mod, etc.)
- Understand how libraries are integrated
- Find relevant documentation in PRPs/ai_docs/ if shared, ai_docs directory is used by the user to paste in relevant additional context that may be relevant to our story/task
**4. Testing Patterns**
- Identify test framework and structure
- Find similar test examples and test setup
- Suggest test cases and scenarios
**5. Integration Points**
- Identify files that will need updates
- Identify if new files needs to be created and where to create them
- Find router/API registration patterns
- Understand database/model patterns if relevant
### Phase 3: Think harder about the story and its components.
Really think hard about everything you just learned during the research phases.
### Phase 4: PRP Task Generation
Transform analysis into concrete tasks:
Read and understand the template @PRPs/templates/prp_story_task.md
**Task Rules**:
1. Each task is atomic and independently testable
2. Tasks are ordered by dependency
3. Use action verbs that are information dense: CREATE, UPDATE, ADD, REMOVE, REFACTOR, MIRROR
4. Include specific implementation details from codebase analysis
5. Every task has an executable validation command
**Task Action Types**:
We use the concept of information dense keywords to describe the action to be taken, below is a guidance.
But you can use your own words to describe the action to be taken as long as you follow this same principle.
Examples:
- **CREATE**: New files/components
- **UPDATE**: Modify existing files
- **ADD**: Insert new functionality into existing code
- **REMOVE**: Delete deprecated code
- **REFACTOR**: Restructure without changing behavior
- **MIRROR**: Mirror existing pattern or functionality that exists elsewhere in the codebase
### Phase 5: Validation Design
For each task, design validation that:
- Can run immediately after task completion
- Provides clear pass/fail feedback
- Uses project-specific commands discovered in analysis
## Quality Criteria
### Task Clarity
- [ ] The PRP is clear and concise and follows KISS principle
- [ ] Each task has clear action and target
- [ ] Implementation details reference specific patterns
- [ ] Validation commands are executable
### Context Completeness
- [ ] All necessary patterns identified
- [ ] External library usage documented
- [ ] Integration points mapped
- [ ] External context references populated
### Story Coverage
- [ ] All acceptance criteria addressed
- [ ] Edge cases considered
- [ ] Error handling included where needed
## Output
Save as: `PRPs/story_{kebab-case-summary}.md`
## Success Metrics
**Implementation Ready**: Another developer could execute these tasks without additional context
**Validation Complete**: Every task has at least one working validation command
**Pattern Consistent**: Tasks follow existing codebase conventions
================================================
FILE: .claude/commands/prp-claude-code/prp-story-task-execute.md
================================================
---
description: "Execute a Story PRP with focused task implementation"
---
# Execute Story PRP
## PRP File: $ARGUMENTS
## Mission
Execute a story/task PRP through **sequential task completion** with immediate validation.
**Execution Philosophy**: Complete one task, validate it, then move to the next. No task left behind.
## Execution Process
### 1. Load Story PRP
- Read the specified story PRP file
- Understand the original story intent
- Review all context references
- Note validation commands for each task
### 2. Pre-Implementation Check
- Ultrathink about the story intent and task requirements
- Verify all referenced files exist
- Check that patterns mentioned are accessible
- Ensure development environment is ready
- Run any pre-requisite setup commands
### 3. Task-by-Task Implementation
For each task in the PRP:
**a) Understand Task**
- Read task requirements completely
- Review referenced patterns
- Check gotchas and constraints
**b) Implement Task**
- Follow the specified pattern
- Use the indicated naming conventions
- Apply the documented approach
- Handle edge cases mentioned
**c) Validate Immediately**
- Run the task's validation command
- If validation fails, fix and re-validate
- Don't proceed until current task passes
**d) Mark Complete**
- Update todo list to track progress
- Document any deviations if necessary
### 4. Full Validation
After all tasks complete:
- Run the validation gates from PRP
- Execute comprehensive test suite
- Verify all acceptance criteria met
### 5. Completion
- Work through completion checklist
- Ensure story requirements satisfied
- Move completed PRP to PRPs/completed/ create the folder if it does not exist
## Execution Rules
**Validation Gates**: Each task must pass validation, iterate until passed
**Pattern Adherence**: Follow existing patterns, don't create new ones
**No Shortcuts**: Complete all validation steps
## Failure Handling
When a task fails validation:
1. Read the error message carefully
2. Check the pattern reference again
3. Validate it by investigating the codebase
4. Fix and re-validate
5. If stuck, check similar implementations
## Success Criteria
- Every validation command passes
- Full test suite green
- Story acceptance criteria met
- Code follows project conventions
================================================
FILE: .dockerignore
================================================
crawl4ai_mcp.egg-info
__pycache__
.venv
.env
================================================
FILE: .github/ISSUE_TEMPLATE/auto_bug_report.md
================================================
---
name: Auto Bug Report
about: Automated bug report from Archon
title: ''
labels: bug, auto-report
assignees: ''
---
<!-- This template is used for automated bug reports submitted through the Archon UI -->
<!-- The form data below is automatically filled by the bug reporter -->
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐛 Bug Report
description: Report a bug to help us improve Archon Beta
title: "🐛 [Bug]: "
labels: ["bug", "needs-triage"]
assignees: []
body:
- type: markdown
attributes:
value: |
# 🐛 Bug Report for Archon Beta
Thank you for taking the time to report a bug! This helps us improve Archon for everyone.
- type: input
id: archon-version
attributes:
label: Archon Version
description: What version of Archon are you running?
placeholder: "v0.1.0 or check package.json"
validations:
required: true
- type: dropdown
id: branch
attributes:
label: Branch
description: Which branch are you using?
options:
- "stable"
- "main"
default: 0
validations:
required: true
- type: dropdown
id: severity
attributes:
label: Bug Severity
description: How severe is this bug?
options:
- "🟢 Low - Minor inconvenience"
- "🟡 Medium - Affects functionality"
- "🟠 High - Blocks important features"
- "🔴 Critical - App unusable"
validations:
required: true
- type: textarea
id: description
attributes:
label: Bug Description
description: What were you trying to do when this bug occurred?
placeholder: "I was trying to crawl a documentation site when..."
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: Steps to Reproduce
description: Detailed steps to reproduce the bug
placeholder: |
1. Go to Knowledge Base page
2. Click "Add Knowledge"
3. Enter URL: https://example.com
4. Click "Add Source"
5. Error occurs...
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
description: What should have happened?
placeholder: "The site should have been crawled successfully and added to my knowledge base..."
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: Actual Behavior
description: What actually happened?
placeholder: "Instead, I got an error message and the crawling failed..."
validations:
required: true
- type: textarea
id: error-details
attributes:
label: Error Details (if any)
description: Copy and paste any error messages, stack traces, or console errors
placeholder: |
Error: Failed to crawl URL
at CrawlingService.crawlUrl (/app/src/services/crawling.js:123:15)
at async POST /api/knowledge/crawl
render: text
- type: dropdown
id: component
attributes:
label: Affected Component
description: Which part of Archon is affected?
options:
- "🔍 Knowledge Base / RAG"
- "🔗 MCP Integration"
- "📋 Projects & Tasks (if enabled)"
- "⚙️ Settings & Configuration"
- "🖥️ User Interface"
- "🐳 Docker / Infrastructure"
- "❓ Not Sure"
validations:
required: true
- type: input
id: browser-os
attributes:
label: Browser & OS
description: What browser and operating system are you using?
placeholder: "Chrome 122 on macOS 14.1"
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Any other context about the problem (screenshots, logs, etc.)
placeholder: "Add any other context here..."
- type: checkboxes
id: service-status
attributes:
label: Service Status (check all that are working)
description: Which Archon services were running when the bug occurred?
options:
- label: "🖥️ Frontend UI (http://localhost:3737)"
- label: "⚙️ Main Server (http://localhost:8181)"
- label: "🔗 MCP Service (localhost:8051)"
- label: "🤖 Agents Service (http://localhost:8052)"
- label: "💾 Supabase Database (connected)"
================================================
FILE: .github/RELEASE_NOTES_SETUP.md
================================================
# AI-Generated Release Notes Setup
This repository uses Claude AI to automatically generate comprehensive release notes when you create a new release.
## How It Works
The workflow triggers when:
- You push a new tag (e.g., `v1.0.0`)
- You create a GitHub release
- You manually trigger it via workflow dispatch
Claude AI analyzes:
- Commit messages since the last release
- Merged pull requests
- File changes by component (frontend, backend, docs)
- Contributors
Then generates structured release notes with:
- Overview and key changes
- Feature additions, improvements, and bug fixes
- Technical changes by component
- Statistics and contributor acknowledgments
- Breaking changes (important for beta!)
## Testing Locally First (Recommended!)
Before setting up the GitHub Action, you can test the release notes generation locally:
### Prerequisites
```bash
# Install required tools (if not already installed)
sudo apt install jq curl # Linux
# or
brew install jq curl # macOS
# Install GitHub CLI (optional, for PR detection)
# See: https://github.com/cli/cli#installation
```
### Run Local Test
```bash
# 1. Export your Anthropic API key
export ANTHROPIC_API_KEY="sk-ant-api03-..."
# 2. Run the test script
# Compare origin/stable vs main branches (default - shows unreleased changes)
./.github/test-release-notes.sh
# Or specify branches explicitly (automatically handles remote branches)
./.github/test-release-notes.sh stable main # Will use origin/stable if no local stable
./.github/test-release-notes.sh origin/stable main # Explicit remote branch
# Or use range syntax
./.github/test-release-notes.sh stable..main
# Or compare tags for a release
./.github/test-release-notes.sh v1.0.0 v2.0.0
# Or test a single tag (compares with previous tag)
./.github/test-release-notes.sh v0.1.0
```
### What the Local Test Does
1. **Gathers git data**: Commits, file changes, and PRs (if gh CLI available)
2. **Calls Claude API**: Generates release notes using the same prompt as the workflow
3. **Saves output**: Creates `release-notes-<tag>.md` in current directory
4. **Shows preview**: Displays the generated notes in your terminal
### Example Output
```bash
$ ./.github/test-release-notes.sh v0.2.0
🤖 Local Release Notes Generator Test
==========================================
Current tag: v0.2.0
Previous tag: v0.1.0
📝 Gathering commits...
Found 42 commits
📊 Analyzing file changes...
Files summary: 28 files changed, 1547 insertions(+), 423 deletions(-)
🔀 Looking for merged PRs...
Found 8 merged PRs
🤖 Generating release notes with Claude...
✅ Release notes generated successfully!
📄 Output saved to: release-notes-v0.2.0.md
==========================================
Preview:
==========================================
[Generated release notes appear here]
==========================================
✅ Done!
```
### Testing Different Scenarios
```bash
# 🔥 MOST COMMON: See what's new in main vs stable (unreleased changes)
./.github/test-release-notes.sh
# Output: release-notes-origin-stable..main.md
# Or with explicit arguments
./.github/test-release-notes.sh stable main
# Output: release-notes-origin-stable..main.md (auto-resolves to origin/stable)
# Test your first release (compares with initial commit)
./.github/test-release-notes.sh v0.1.0
# Test a release between two specific tags
./.github/test-release-notes.sh v1.0.0 v2.0.0
# Test what would be in next release (current branch vs stable)
git checkout main
./.github/test-release-notes.sh stable main
```
### Typical Workflow: Stable vs Main
For projects with separate `stable` (production) and `main` (development) branches:
```bash
# 1. See what's ready to release (compare branches)
export ANTHROPIC_API_KEY="sk-ant-..."
./.github/test-release-notes.sh stable main
# Or explicitly use remote branch: ./.github/test-release-notes.sh origin/stable main
# 2. Review the generated notes
cat release-notes-origin-stable..main.md
# 3. When ready to release, fetch latest and merge main to stable
git fetch origin
git checkout -b stable origin/stable # Create local tracking branch if needed
git merge main
git push origin stable
# 4. Create a release tag
git tag v1.0.0
git push origin v1.0.0
# 5. The GitHub Action will automatically generate release notes
# (You can also manually create the release with the generated notes)
gh release create v1.0.0 --title "Release v1.0.0" --notes-file release-notes-origin-stable..main.md
```
## Setup Instructions
### 1. Get Claude Code OAuth Token
The GitHub Action uses Claude Code OAuth token (same as the `claude-review` workflow):
1. Go to [Claude Code OAuth Setup](https://docs.anthropic.com/claude-code/oauth)
2. Follow the instructions to get your OAuth token
3. Copy the token
### 2. Add GitHub Secret
1. Go to your repository's Settings
2. Navigate to **Secrets and variables** → **Actions**
3. Click **New repository secret**
4. Name: `CLAUDE_CODE_OAUTH_TOKEN`
5. Value: Paste your Claude Code OAuth token
6. Click **Add secret**
> **Note:** If you already have `CLAUDE_CODE_OAUTH_TOKEN` set up for `claude-review` workflow, you're all set! The same token is used for both workflows.
### 3. (Optional) Get Anthropic API Key for Local Testing
For local testing, you'll need an API key:
1. Go to [Anthropic Console](https://console.anthropic.com/)
2. Create a new API key
3. Copy the key (starts with `sk-ant-...`)
4. Export it: `export ANTHROPIC_API_KEY="sk-ant-..."`
> **Note:** The GitHub Action uses OAuth token, but local testing uses API key for simplicity.
### 4. Test the Workflow
#### Option A: Create a Release via GitHub UI
1. Go to **Releases** in your repository
2. Click **Draft a new release**
3. Choose or create a tag (e.g., `v0.1.0`)
4. Click **Publish release**
5. The workflow will automatically run and update the release notes
#### Option B: Push a Tag via Git
```bash
# Create and push a new tag
git tag v0.1.0
git push origin v0.1.0
# The workflow will automatically create a release with AI-generated notes
```
#### Option C: Manual Trigger
1. Go to **Actions** tab
2. Select "AI-Generated Release Notes" workflow
3. Click **Run workflow**
4. Enter the tag name (e.g., `v0.1.0`)
5. Click **Run workflow**
## Usage Examples
### Creating Your First Release
```bash
# Tag your current state
git tag v0.1.0-beta
# Push the tag
git push origin v0.1.0-beta
# Check Actions tab - release notes will be generated automatically
```
### Creating Subsequent Releases
```bash
# Make your changes and commits
git add .
git commit -m "feat: Add AI-powered search feature"
git push
# When ready to release
git tag v0.2.0-beta
git push origin v0.2.0-beta
# Release notes will compare v0.2.0-beta with v0.1.0-beta
```
## What Gets Generated
The AI generates release notes in this structure:
```markdown
# 🚀 Release v0.2.0
## 📝 Overview
[Summary of the release]
## ✨ What's New
### Major Features
- [New features]
### Improvements
- [Enhancements]
### Bug Fixes
- [Fixes]
## 🔧 Technical Changes
### Backend (Python/FastAPI)
- [Backend changes]
### Frontend (React/TypeScript)
- [Frontend changes]
### Infrastructure
- [Infrastructure updates]
## 📊 Statistics
- Commits: X
- Pull Requests: Y
- Files Changed: Z
- Contributors: N
## 🙏 Contributors
[List of contributors]
## ⚠️ Breaking Changes
[Any breaking changes]
## 🔗 Links
- Full Changelog: [link]
```
## Customization
### Modify the Prompt
Edit `.github/workflows/release-notes.yml` and change the prompt in the "Generate release notes with Claude" step to adjust:
- Tone and style
- Structure
- Focus areas
- Level of detail
### Change Claude Model
In the workflow file, you can change the model:
```yaml
"model": "claude-sonnet-4-20250514" # Latest Sonnet
# or
"model": "claude-3-7-sonnet-20250219" # Sonnet 3.7
# or
"model": "claude-opus-4-20250514" # Opus 4 (more detailed)
```
### Adjust Token Limit
Increase `max_tokens` for longer release notes:
```yaml
"max_tokens": 4096 # Default
# or
"max_tokens": 8192 # For more detailed notes
```
## Troubleshooting
### Workflow Fails with "ANTHROPIC_API_KEY not found"
- Ensure you've added the secret in repository settings
- Secret name must be exactly `ANTHROPIC_API_KEY`
- Secret must be a valid Anthropic API key
### Empty or Incomplete Release Notes
- Check if commits exist between tags
- Verify git history is complete (workflow uses `fetch-depth: 0`)
- Check Actions logs for API errors
### API Rate Limits
- Anthropic has generous rate limits for API keys
- For very frequent releases, consider caching or batching
## Authentication: GitHub Action vs Local Testing
### GitHub Action (Claude Code OAuth)
- Uses `CLAUDE_CODE_OAUTH_TOKEN` secret
- Same authentication as `claude-review` workflow
- Integrated with GitHub through Claude Code Action
- No direct API costs (usage included with Claude Code)
### Local Testing (API Key)
- Uses `ANTHROPIC_API_KEY` environment variable
- Direct API calls to Claude
- Simpler for local testing and debugging
- Cost: ~$0.003 per release (less than a penny)
### Why Two Methods?
- **GitHub Action**: Uses Claude Code Action for better GitHub integration and consistency with other workflows
- **Local Testing**: Uses direct API for simplicity and faster iteration during development
## Cost Estimation
### Local Testing (API Key)
Claude API pricing (as of 2025):
- Sonnet 4: ~$0.003 per release (assuming ~4K tokens)
- Each release generation costs less than a penny
- For a project with monthly releases: ~$0.036/year
### GitHub Action (OAuth Token)
- No additional costs beyond your Claude Code subscription
- Usage included in Claude Code plan
## Best Practices
### Write Good Commit Messages
The AI works better with clear commits:
```bash
# ✅ Good
git commit -m "feat: Add vector search with pgvector"
git commit -m "fix: Resolve race condition in crawling service"
git commit -m "docs: Update API documentation"
# ❌ Less helpful
git commit -m "updates"
git commit -m "fix stuff"
git commit -m "wip"
```
### Use Conventional Commits
The workflow benefits from conventional commit format:
- `feat:` - New features
- `fix:` - Bug fixes
- `docs:` - Documentation
- `refactor:` - Code refactoring
- `test:` - Tests
- `chore:` - Maintenance
### Tag Semantically
Use semantic versioning:
- `v1.0.0` - Major release
- `v1.1.0` - Minor release (new features)
- `v1.1.1` - Patch release (bug fixes)
- `v0.1.0-beta` - Beta releases
## Manual Editing
You can always edit the generated release notes:
1. Go to the release page
2. Click **Edit release**
3. Modify the notes as needed
4. Click **Update release**
## Workflow Outputs
The workflow provides:
- Updated GitHub release with AI-generated notes
- Artifact with release notes (kept for 90 days)
- Comments on related PRs linking to the release
- Summary in Actions tab
## Advanced: Using with Pre-releases
```bash
# Create a pre-release
git tag v0.2.0-rc.1
git push origin v0.2.0-rc.1
# Mark as pre-release in GitHub UI or via gh CLI
gh release create v0.2.0-rc.1 --prerelease
```
## Integration with Other Tools
### Notify Slack/Discord
Add a notification step after release creation:
```yaml
- name: Notify team
run: |
curl -X POST YOUR_WEBHOOK_URL \
-H 'Content-Type: application/json' \
-d '{"text":"Release ${{ steps.get_tag.outputs.tag }} published!"}'
```
### Update Changelog File
Append to CHANGELOG.md:
```yaml
- name: Update changelog
run: |
cat release_notes.md >> CHANGELOG.md
git add CHANGELOG.md
git commit -m "docs: Update changelog for ${{ steps.get_tag.outputs.tag }}"
git push
```
## Support
If you encounter issues:
1. Check the workflow logs in Actions tab
2. Verify your API key is valid
3. Ensure git history is available
4. Open an issue with workflow logs attached
================================================
FILE: .github/pull_request_template.md
================================================
# Pull Request
## Summary
<!-- Provide a brief description of what this PR accomplishes -->
## Changes Made
<!-- List the main changes in this PR -->
-
-
-
## Type of Change
<!-- Mark the relevant option with an "x" -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring
## Affected Services
<!-- Mark all that apply with an "x" -->
- [ ] Frontend (React UI)
- [ ] Server (FastAPI backend)
- [ ] MCP Server (Model Context Protocol)
- [ ] Agents (PydanticAI service)
- [ ] Database (migrations/schema)
- [ ] Docker/Infrastructure
- [ ] Documentation site
## Testing
<!-- Describe how you tested your changes -->
- [ ] All existing tests pass
- [ ] Added new tests for new functionality
- [ ] Manually tested affected user flows
- [ ] Docker builds succeed for all services
### Test Evidence
<!-- Provide specific test commands run and their results -->
```bash
# Example: python -m pytest tests/
# Example: cd archon-ui-main && npm run test
```
## Checklist
<!-- Mark completed items with an "x" -->
- [ ] My code follows the service architecture patterns
- [ ] If using an AI coding assistant, I used the CLAUDE.md rules
- [ ] I have added tests that prove my fix/feature works
- [ ] All new and existing tests pass locally
- [ ] My changes generate no new warnings
- [ ] I have updated relevant documentation
- [ ] I have verified no regressions in existing features
## Breaking Changes
<!-- If this PR introduces breaking changes, describe them here -->
<!-- Include migration steps if applicable -->
## Additional Notes
<!-- Any additional information that reviewers should know -->
<!-- Screenshots, performance metrics, dependencies added, etc. -->
================================================
FILE: .github/test-release-notes.sh
================================================
#!/bin/bash
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}🤖 Local Release Notes Generator Test${NC}"
echo "=========================================="
echo
# Check for required tools
command -v jq >/dev/null 2>&1 || { echo -e "${RED}❌ jq is required but not installed. Install with: apt install jq${NC}" >&2; exit 1; }
command -v curl >/dev/null 2>&1 || { echo -e "${RED}❌ curl is required but not installed.${NC}" >&2; exit 1; }
# Check for API key
if [ -z "$ANTHROPIC_API_KEY" ]; then
echo -e "${RED}❌ ANTHROPIC_API_KEY environment variable not set${NC}"
echo -e "${YELLOW}Export your key first: export ANTHROPIC_API_KEY=sk-ant-...${NC}"
exit 1
fi
# Parse arguments for branch/tag comparison
if [ -n "$2" ]; then
# Two arguments: compare from $1 to $2
PREVIOUS_TAG="$1"
CURRENT_TAG="$2"
echo -e "${GREEN}Comparing: $PREVIOUS_TAG → $CURRENT_TAG${NC}"
IS_FIRST_RELEASE="false"
elif [ -n "$1" ]; then
# One argument - could be a tag or a range
if [[ "$1" == *".."* ]]; then
# Range format: stable..main
PREVIOUS_TAG="${1%%..*}"
CURRENT_TAG="${1##*..}"
echo -e "${GREEN}Comparing range: $PREVIOUS_TAG → $CURRENT_TAG${NC}"
else
# Single tag/branch - compare with previous tag or initial commit
CURRENT_TAG="$1"
PREVIOUS_TAG=$(git tag --sort=-v:refname | grep -A1 "^${CURRENT_TAG}$" | tail -1)
if [ -z "$PREVIOUS_TAG" ] || [ "$PREVIOUS_TAG" == "$CURRENT_TAG" ]; then
PREVIOUS_TAG=$(git rev-list --max-parents=0 HEAD)
IS_FIRST_RELEASE="true"
echo -e "${YELLOW}First release - comparing against initial commit${NC}"
else
IS_FIRST_RELEASE="false"
echo -e "${GREEN}Current: $CURRENT_TAG, Previous: $PREVIOUS_TAG${NC}"
fi
fi
IS_FIRST_RELEASE="false"
else
# No arguments - default to origin/stable..main comparison
PREVIOUS_TAG="origin/stable"
CURRENT_TAG="main"
echo -e "${BLUE}No arguments provided - comparing branches: origin/stable → main${NC}"
echo -e "${YELLOW}Usage:${NC}"
echo -e "${YELLOW} $0 # Compare origin/stable..main (default)${NC}"
echo -e "${YELLOW} $0 origin/stable main # Compare two branches${NC}"
echo -e "${YELLOW} $0 origin/stable..main # Range syntax${NC}"
echo -e "${YELLOW} $0 v1.0.0 # Compare with previous tag${NC}"
echo -e "${YELLOW} $0 v1.0.0 v2.0.0 # Compare two tags${NC}"
echo
IS_FIRST_RELEASE="false"
fi
# Normalize branch/tag references (handle remote branches)
# If a branch name doesn't exist locally, try origin/<branch>
normalize_ref() {
local ref="$1"
# If it already has origin/ prefix or is a commit hash, use as-is
if [[ "$ref" == origin/* ]] || git rev-parse -q --verify "$ref" >/dev/null 2>&1; then
echo "$ref"
return
fi
# Try local branch first
if git rev-parse -q --verify "$ref" >/dev/null 2>&1; then
echo "$ref"
return
fi
# Try as remote branch
if git rev-parse -q --verify "origin/$ref" >/dev/null 2>&1; then
echo "origin/$ref"
return
fi
# Return original if nothing works (will fail later with clear error)
echo "$ref"
}
PREVIOUS_TAG=$(normalize_ref "$PREVIOUS_TAG")
CURRENT_TAG=$(normalize_ref "$CURRENT_TAG")
echo -e "${GREEN}Comparing: ${PREVIOUS_TAG} → ${CURRENT_TAG}${NC}"
echo
# Get commit messages
echo -e "${BLUE}📝 Gathering commits...${NC}"
COMMITS=$(git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:"- %s (%h) by %an" --no-merges)
COMMIT_COUNT=$(echo "$COMMITS" | wc -l)
echo -e "${GREEN}Found $COMMIT_COUNT commits${NC}"
# Get file changes
echo -e "${BLUE}📊 Analyzing file changes...${NC}"
FILES_CHANGED=$(git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat | tail -1)
# Detailed changes by component
CHANGES_FRONTEND=$(git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat -- archon-ui-main/ | head -20)
CHANGES_BACKEND=$(git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat -- python/ | head -20)
FILE_CHANGES="### File Changes by Component
**Frontend:**
$CHANGES_FRONTEND
**Backend:**
$CHANGES_BACKEND"
echo -e "${GREEN}Files summary: $FILES_CHANGED${NC}"
# Get merged PRs (using gh CLI if available)
echo -e "${BLUE}🔀 Looking for merged PRs...${NC}"
if command -v gh >/dev/null 2>&1; then
PREV_DATE=$(git log -1 --format=%ai ${PREVIOUS_TAG})
PRS=$(gh pr list \
--state merged \
--limit 100 \
--json number,title,mergedAt,author,url \
--jq --arg date "$PREV_DATE" \
'.[] | select(.mergedAt >= $date) | "- #\(.number): \(.title) by @\(.author.login) - \(.url)"' \
2>/dev/null || echo "No PRs found or unable to fetch")
PR_COUNT=$(echo "$PRS" | grep -c '^-' || echo "0")
echo -e "${GREEN}Found $PR_COUNT merged PRs${NC}"
else
PRS="No PRs fetched (gh CLI not available)"
echo -e "${YELLOW}gh CLI not available - skipping PR detection${NC}"
fi
echo
# Get repository info
REPO_FULL=$(git config --get remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\1/')
REPO_OWNER=$(echo "$REPO_FULL" | cut -d'/' -f1)
REPO_NAME=$(echo "$REPO_FULL" | cut -d'/' -f2)
# Create prompt for Claude
echo -e "${BLUE}🤖 Generating release notes with Claude...${NC}"
# Build the prompt content
PROMPT_CONTENT="You are writing release notes for Archon V2 Beta, a local-first AI knowledge management system.
## Release Information
**Version:** ${CURRENT_TAG}
**Previous Version:** ${PREVIOUS_TAG}
**Commits:** ${COMMIT_COUNT}
**Is First Release:** ${IS_FIRST_RELEASE}
## Commits
\`\`\`
${COMMITS}
\`\`\`
## Pull Requests Merged
\`\`\`
${PRS}
\`\`\`
## File Changes
\`\`\`
${FILE_CHANGES}
\`\`\`
## Instructions
Generate comprehensive release notes following this structure:
# 🚀 Release ${CURRENT_TAG}
## 📝 Overview
[2-3 sentence summary of this release]
## ✨ What's New
### Major Features
- [List major new features with brief descriptions]
### Improvements
- [List improvements and enhancements]
### Bug Fixes
- [List bug fixes]
## 🔧 Technical Changes
### Backend (Python/FastAPI)
- [Notable backend changes]
### Frontend (React/TypeScript)
- [Notable frontend changes]
### Infrastructure
- [Docker, CI/CD, deployment changes]
## 📊 Statistics
- **Commits:** ${COMMIT_COUNT}
- **Pull Requests:** [Count from PRs list]
- **Files Changed:** [From file stats]
- **Contributors:** [Unique authors from commits]
## 🙏 Contributors
Thanks to everyone who contributed to this release:
[List unique contributors with @ mentions]
## ⚠️ Breaking Changes
[List any breaking changes - this is beta software, so breaking changes are expected]
## 🔗 Links
- **Full Changelog:** https://github.com/${REPO_FULL}/compare/${PREVIOUS_TAG}...${CURRENT_TAG}
- **Installation Guide:** [Link to docs]
---
**Note:** This is a beta release. Features may change rapidly. Report issues at: https://github.com/${REPO_FULL}/issues
---
Write in a professional yet enthusiastic tone. Focus on user-facing changes. Be specific but concise."
# Create the request using jq to properly escape JSON
jq -n \
--arg model "claude-sonnet-4-20250514" \
--arg content "$PROMPT_CONTENT" \
'{
model: $model,
max_tokens: 4096,
temperature: 0.7,
messages: [
{
role: "user",
content: $content
}
]
}' > /tmp/claude_request.json
# Call Claude API
RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d @/tmp/claude_request.json)
# Check for errors
if echo "$RESPONSE" | jq -e '.error' >/dev/null 2>&1; then
echo -e "${RED}❌ API Error:${NC}"
echo "$RESPONSE" | jq '.error'
exit 1
fi
# Extract release notes
RELEASE_NOTES=$(echo "$RESPONSE" | jq -r '.content[0].text')
if [ -z "$RELEASE_NOTES" ] || [ "$RELEASE_NOTES" == "null" ]; then
echo -e "${RED}❌ Failed to extract release notes from response${NC}"
echo "Response:"
echo "$RESPONSE" | jq .
exit 1
fi
# Save to file
# Create safe filename from branch/tag names
SAFE_FROM=$(echo "$PREVIOUS_TAG" | tr '/' '-')
SAFE_TO=$(echo "$CURRENT_TAG" | tr '/' '-')
OUTPUT_FILE="release-notes-${SAFE_FROM}..${SAFE_TO}.md"
echo "$RELEASE_NOTES" > "$OUTPUT_FILE"
echo -e "${GREEN}✅ Release notes generated successfully!${NC}"
echo
echo -e "${BLUE}📄 Output saved to: ${OUTPUT_FILE}${NC}"
echo
echo "=========================================="
echo -e "${YELLOW}Preview:${NC}"
echo "=========================================="
cat "$OUTPUT_FILE"
echo
echo "=========================================="
echo -e "${GREEN}✅ Done!${NC}"
echo
echo "To create a GitHub release with these notes:"
echo -e "${YELLOW}gh release create ${CURRENT_TAG} --title 'Release ${CURRENT_TAG}' --notes-file ${OUTPUT_FILE}${NC}"
================================================
FILE: .github/workflows/ci.yml
================================================
name: Continuous Integration
on:
push:
branches: [ main, unit-testing-ci ]
pull_request:
branches: [ main ]
workflow_dispatch: # Allow manual triggering
env:
# Test database credentials (using properly formatted fake values for CI)
# These are fake but properly formatted values that will pass validation
SUPABASE_URL: ${{ secrets.SUPABASE_URL || 'https://xyzcompanytest.supabase.co' }}
SUPABASE_SERVICE_KEY: ${{ secrets.SUPABASE_SERVICE_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU' }}
NODE_VERSION: '18'
PYTHON_VERSION: '3.12'
jobs:
# Job 1: Frontend Testing (React/TypeScript/Vitest)
# Will enable this after overhaul of frontend for linting
frontend-tests:
name: Frontend Tests (React + Vitest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./archon-ui-main
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
cache-dependency-path: archon-ui-main/package-lock.json
- name: Install dependencies
run: npm ci
# - name: Run ESLint
# run: npm run lint
#
# - name: Run TypeScript type check
# run: npx tsc --noEmit
#
# - name: Run Vitest tests with coverage
# run: npm run test:coverage:run
#
# - name: Generate test summary
# if: always()
# run: npm run test:coverage:summary
#
# - name: Upload frontend test results
# if: always()
# uses: actions/upload-artifact@v4
# with:
# name: frontend-test-results
# path: |
# archon-ui-main/coverage/test-results.json
# archon-ui-main/public/test-results/
# retention-days: 30
#
# - name: Upload frontend coverage to Codecov
# if: always()
# uses: codecov/codecov-action@v4
# with:
# files: ./archon-ui-main/public/test-results/coverage/lcov.info
# flags: frontend
# name: frontend-coverage
# token: ${{ secrets.CODECOV_TOKEN }}
# Job 2: Backend Testing (Python/pytest)
backend-tests:
name: Backend Tests (Python + pytest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./python
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
- name: Set up Python
run: uv python install ${{ env.PYTHON_VERSION }}
- name: Install dependencies
run: |
uv sync --group all --group dev
uv add pytest-cov
- name: Run linting with ruff (if available)
continue-on-error: true
run: |
if uv run which ruff > /dev/null 2>&1; then
echo "Running ruff linting..."
uv run ruff check src/ tests/ || true
else
echo "Ruff not found, skipping linting"
fi
- name: Run type checking with mypy (if available)
continue-on-error: true
run: |
if uv run which mypy > /dev/null 2>&1; then
echo "Running mypy type checking..."
uv run mypy src/ || true
else
echo "MyPy not found, skipping type checking"
fi
- name: Run all tests
run: |
echo "Running all unit tests..."
uv run pytest tests/ --verbose --tb=short \
--cov=src --cov-report=xml --cov-report=html \
--cov-report=term-missing \
--junitxml=test-results.xml
- name: Upload backend test results
if: always()
uses: actions/upload-artifact@v4
with:
name: backend-test-results
path: |
python/test-results.xml
python/htmlcov/
python/coverage.xml
retention-days: 30
- name: Upload backend coverage to Codecov
if: always()
uses: codecov/codecov-action@v4
with:
files: ./python/coverage.xml
flags: backend
name: backend-coverage
token: ${{ secrets.CODECOV_TOKEN }}
# Job 3: Docker Build Test
docker-build-test:
name: Docker Build Tests
runs-on: ubuntu-latest
strategy:
matrix:
service: [server, mcp, agents, frontend]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build server service
if: matrix.service == 'server'
run: |
docker build \
--file python/Dockerfile.server \
--tag archon-server:test \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg ARCHON_SERVER_PORT=8181 \
python/
- name: Build MCP service
if: matrix.service == 'mcp'
run: |
docker build \
--file python/Dockerfile.mcp \
--tag archon-mcp:test \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg ARCHON_MCP_PORT=8051 \
python/
- name: Build agents service
if: matrix.service == 'agents'
run: |
docker build \
--file python/Dockerfile.agents \
--tag archon-agents:test \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg ARCHON_AGENTS_PORT=8052 \
python/
- name: Build frontend service
if: matrix.service == 'frontend'
run: |
docker build \
--tag archon-frontend:test \
archon-ui-main/
- name: Test container health check (for the containers that can run without proper env vars)
if: matrix.service != 'frontend' && matrix.service != 'server'
run: |
# Only test MCP and agents services (they don't require real Supabase connection)
# Skip server and frontend as they need real database
case "${{ matrix.service }}" in
"mcp")
docker run -d --name test-${{ matrix.service }} \
-e SUPABASE_URL=${{ env.SUPABASE_URL }} \
-e SUPABASE_SERVICE_KEY=${{ env.SUPABASE_SERVICE_KEY }} \
-e ARCHON_MCP_PORT=8051 \
-e API_SERVICE_URL=http://localhost:8181 \
-e AGENTS_SERVICE_URL=http://localhost:8052 \
-p 8051:8051 \
archon-${{ matrix.service }}:test
;;
"agents")
docker run -d --name test-${{ matrix.service }} \
-e SUPABASE_URL=${{ env.SUPABASE_URL }} \
-e SUPABASE_SERVICE_KEY=${{ env.SUPABASE_SERVICE_KEY }} \
-e ARCHON_AGENTS_PORT=8052 \
-p 8052:8052 \
archon-${{ matrix.service }}:test
;;
esac
# Wait for container to start
sleep 30
# Check if container is still running
if docker ps | grep -q test-${{ matrix.service }}; then
echo "✅ Container test-${{ matrix.service }} is running"
else
echo "❌ Container test-${{ matrix.service }} failed to start"
docker logs test-${{ matrix.service }}
exit 1
fi
- name: Cleanup test containers
if: always()
run: |
docker stop test-${{ matrix.service }} || true
docker rm test-${{ matrix.service }} || true
# Job 4: Test Results Summary
test-summary:
name: Test Results Summary
runs-on: ubuntu-latest
needs: [frontend-tests, backend-tests, docker-build-test]
if: always()
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Create test summary
run: |
echo "# 🧪 Archon V2 Beta - CI Test Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Frontend Results
echo "## 🎨 Frontend Tests (React + Vitest)" >> $GITHUB_STEP_SUMMARY
if [ -f "frontend-test-results/coverage/test-results.json" ]; then
echo "✅ Frontend tests completed" >> $GITHUB_STEP_SUMMARY
else
echo "❌ Frontend tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
# Backend Results
echo "## 🐍 Backend Tests (Python + pytest)" >> $GITHUB_STEP_SUMMARY
if [ -d "backend-test-results-unit" ]; then
echo "✅ Unit tests completed" >> $GITHUB_STEP_SUMMARY
else
echo "❌ Unit tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
fi
if [ -d "backend-test-results-integration" ]; then
echo "✅ Integration tests completed" >> $GITHUB_STEP_SUMMARY
else
echo "❌ Integration tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
# Docker Build Results
echo "## 🐳 Docker Build Tests" >> $GITHUB_STEP_SUMMARY
echo "Docker build tests completed - check individual job results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Coverage Information
echo "## 📊 Coverage Reports" >> $GITHUB_STEP_SUMMARY
echo "Coverage reports have been uploaded to Codecov and are available as artifacts." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Architecture Context
echo "## 🏗️ Architecture Tested" >> $GITHUB_STEP_SUMMARY
echo "- **Frontend**: React + TypeScript + Vite (Port 3737)" >> $GITHUB_STEP_SUMMARY
echo "- **Server**: FastAPI + Socket.IO + Python (Port 8181)" >> $GITHUB_STEP_SUMMARY
echo "- **MCP Service**: MCP protocol server (Port 8051)" >> $GITHUB_STEP_SUMMARY
echo "- **Agents Service**: PydanticAI agents (Port 8052)" >> $GITHUB_STEP_SUMMARY
echo "- **Database**: Supabase (PostgreSQL + pgvector)" >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/workflows/claude-fix.yml
================================================
name: Claude Code Fix (Write Access)
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude-fix:
# Only trigger on @claude-fix command from authorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-fix') &&
contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
contents: write # Allow creating branches and editing files
pull-requests: write # Allow creating and updating pull requests
issues: write # Allow commenting on and updating issues
id-token: write # Required for OIDC authentication
actions: read # Read CI results
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for better context
- name: Run Claude Code Fix
id: claude
uses: anthropics/claude-code-action@beta
timeout-minutes: 30
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Custom trigger phrase for fix workflow
trigger_phrase: "@claude-fix"
# Fix-specific instructions
custom_instructions: |
You are authorized to IMPLEMENT FIXES and CREATE PULL REQUESTS.
## Your Role
You are fixing issues in Archon V2 Beta. Follow CLAUDE.md for project principles and commands.
## Architecture Context
- Frontend: React + TypeScript + Vite (port 3737)
- Backend: FastAPI + Socket.IO + Python (port 8181)
- MCP Service: MCP protocol server (port 8051)
- Agents Service: PydanticAI agents (port 8052)
- Database: Supabase (PostgreSQL + pgvector)
## Fix Workflow - MINIMAL CHANGES ONLY
### 1. ROOT CAUSE ANALYSIS (RCA)
- **Reproduce**: Can you reproduce the issue? If not, state why
- **Identify**: Use ripgrep to search for error messages, function names, patterns
- **Trace**: Follow the execution path using git blame and code navigation
- **Root Cause**: What is the ACTUAL cause vs symptoms?
- Is it a typo/syntax error?
- Is it a logic error?
- Is it a missing dependency?
- Is it a type mismatch?
- Is it an async/timing issue?
- Is it a state management issue?
### 2. MINIMAL FIX STRATEGY
- **Scope**: Fix ONLY the root cause, nothing else
- **Pattern Match**: Look for similar code in the codebase - follow existing patterns
- **Side Effects**: Will this break anything else? Check usages with ripgrep
- **Alternative**: If fix seems too invasive, document alternative approaches
### 3. IMPLEMENTATION
- Create branch: `fix/issue-{number}` or `fix/pr-{number}-{description}` or `fix/{brief-description}`
- Make the minimal change that fixes the root cause
- If existing tests break, understand why before changing them
- Add test to prevent regression (especially for bug fixes)
### 4. VERIFICATION LOOP
- Run tests according to CLAUDE.md commands
- If tests fail:
- Analyze why they failed
- Is it your fix or unrelated?
- Fix and retry until all green
- If fix breaks something else:
- Do another RCA on the new issue
- Consider alternative approach
- Document tradeoffs in PR
### 5. PULL REQUEST
Use the template in .github/pull_request_template.md:
- Fill all sections accurately
- Mark type as "Bug fix"
- Show test evidence with actual command outputs
- If can't fix completely, document what's blocking in Additional Notes
## Decision Points
- **Don't fix if**: Needs product decision, requires major refactoring, or changes core architecture
- **Document blockers**: If something prevents a complete fix, explain in PR
- **Ask for guidance**: Use PR description to ask questions if uncertain
## Remember
- The person triggering this workflow wants a fix - deliver one or explain why you can't
- Follow CLAUDE.md for all commands and project principles
- Prefer ripgrep over grep for searching
- Keep changes minimal - resist urge to refactor
- Beta project: Quick fixes over perfect solutions
# Commented out - using default tools
# allowed_tools: "Edit(*),MultiEdit(*),Write(*),Read(*),Grep(*),LS(*),Glob(*),TodoWrite(*),NotebookEdit(*),Bash(git *),Bash(npm *),Bash(uv *),Bash(python *),Bash(pip *),Bash(cd *),Bash(pwd),Bash(ls *),Bash(cat *),Bash(head *),Bash(tail *),Bash(wc *),Bash(find *),Bash(grep *),Bash(rg *),Bash(sed *),Bash(awk *),Bash(curl *),Bash(wget *),Bash(echo *),Bash(mkdir *),Bash(rm -rf node_modules),Bash(rm -rf __pycache__),Bash(rm -rf .pytest_cache),WebSearch(*),WebFetch(*)"
unauthorized-message:
# Post message for unauthorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-fix') &&
!contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Post unauthorized message
uses: actions/github-script@v7
with:
script: |
const comment = {
owner: context.repo.owner,
repo: context.repo.repo,
body: `❌ @${context.actor} - You are not authorized to trigger Claude fixes.\n\nOnly maintainers can trigger Claude: Please ask a maintainer to run the fix command.`
};
if (context.eventName === 'issue_comment') {
await github.rest.issues.createComment({
...comment,
issue_number: context.issue.number
});
} else if (context.eventName === 'pull_request_review_comment') {
await github.rest.pulls.createReplyForReviewComment({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
comment_id: context.payload.comment.id,
body: comment.body
});
}
================================================
FILE: .github/workflows/claude-review.yml
================================================
name: Claude Code Review (Read-Only)
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude-review:
# Only trigger on @claude-review command from authorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-review') &&
contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
contents: read # Read-only access
pull-requests: write # Allow comments on PRs
issues: write # Allow comments on issues
actions: read # Read CI results
id-token: write # Required for OIDC authentication
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for better context
- name: Run Claude Code Review
id: claude
uses: anthropics/claude-code-action@beta
timeout-minutes: 15
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Custom trigger phrase for review workflow
trigger_phrase: "@claude-review"
# Review-specific instructions
custom_instructions: |
You are performing a CODE REVIEW ONLY. You cannot make any changes to files.
## Your Role
You are reviewing code for Archon V2 Beta, a local-first AI knowledge management system in early beta stage.
## Architecture Context
- Frontend: React + TypeScript + Vite (port 3737)
- Backend: FastAPI + Socket.IO + Python (port 8181)
- MCP Service: MCP protocol server (port 8051)
- Agents Service: PydanticAI agents (port 8052)
- Database: Supabase (PostgreSQL + pgvector)
## Review Process
1. **Understand Changes**
- For PR reviews: Check what files were changed and understand the context
- For issue comments: Review the specific files or changes mentioned
- Analyze the impact across all services (frontend, backend, MCP, agents)
- Consider interactions between components
## Review Focus Areas
### 1. Code Quality - Backend (Python)
- Type hints on all functions and classes
- Pydantic v2 models for data validation (ConfigDict not class Config, model_dump() not dict())
- No print() statements (use logging instead)
- Proper error handling with detailed error messages
- Following PEP 8
- Google style docstrings where appropriate
### 2. Code Quality - Frontend (React/TypeScript)
- Proper TypeScript types (avoid 'any')
- React hooks used correctly
- Component composition and reusability
- Proper error boundaries
- Following existing component patterns
### 3. Structure & Architecture
- Each feature self-contained with its own models, service, and tools
- Shared components only for things used by multiple features
- Proper separation of concerns across services
- API endpoints follow RESTful conventions
### 4. Testing
- Unit tests co-located with code in tests/ folders
- Edge cases covered
- Mocking external dependencies
- Frontend: Vitest tests for components
- Backend: Pytest tests for services
### 5. Beta Project Principles (from CLAUDE.md)
- No backwards compatibility needed - can break things
- Fail fast with detailed errors (not graceful failures)
- Remove dead code immediately
- Focus on functionality over production patterns
## Required Output Format
## Summary
[2-3 sentence overview of what the changes do and their impact]
## Previous Review Comments
- [If this is a follow-up review, summarize unaddressed comments]
- [If first review, state: "First review - no previous comments"]
## Issues Found
Total: [X critical, Y important, Z minor]
### 🔴 Critical (Must Fix)
[Issues that will break functionality or cause data loss]
- **[Issue Title]** - `path/to/file.py:123`
Problem: [What's wrong]
Fix: [Specific solution]
### 🟡 Important (Should Fix)
[Issues that impact user experience or code maintainability]
- **[Issue Title]** - `path/to/file.tsx:45`
Problem: [What's wrong]
Fix: [Specific solution]
### 🟢 Minor (Consider)
[Nice-to-have improvements]
- **[Suggestion]** - `path/to/file.py:67`
[Brief description and why it would help]
## Security Assessment
Note: This is an early beta project without authentication. Security focus should be on:
- Input validation to prevent crashes
- SQL injection prevention
- No hardcoded secrets or API keys
- Proper CORS configuration
[List any security issues found or state "No security issues found"]
## Performance Considerations
- Database query efficiency (no N+1 queries)
- Frontend bundle size impacts
- Async/await usage in Python
- React re-render optimization
[List any performance issues or state "No performance concerns"]
## Good Practices Observed
- [Highlight what was done well]
- [Patterns that should be replicated]
## Questionable Practices
- [Design decisions that might need reconsideration]
- [Architectural concerns for discussion]
## Test Coverage
**Current Coverage:** [Estimate based on what you see]
**Missing Tests:**
1. **[Component/Function Name]**
- What to test: [Specific functionality]
- Why important: [Impact if it fails]
- Suggested test: [One sentence description]
2. **[Component/Function Name]**
- What to test: [Specific functionality]
- Why important: [Impact if it fails]
- Suggested test: [One sentence description]
## Recommendations
**Merge Decision:**
- [ ] Ready to merge as-is
- [ ] Requires fixes before merging
**Priority Actions:**
1. [Most important fix needed, if any]
2. [Second priority, if applicable]
3. ...
**Rationale:**
[Brief explanation rationale for above recommendations, considering this is an beta project focused on rapid iteration]
---
*Review based on Archon V2 Beta guidelines and CLAUDE.md principles*
# Commented out - using default tools
# allowed_tools: "Read(*),Grep(*),LS(*),Glob(*),Bash(npm test*),Bash(npm run test*),Bash(npm run lint*),Bash(npm run type*),Bash(npm run check*),Bash(uv run pytest*),Bash(uv run ruff*),Bash(uv run mypy*),Bash(git log*),Bash(git diff*),Bash(git status*),Bash(git show*),Bash(cat *),Bash(head *),Bash(tail *),Bash(wc *),Bash(find * -type f),WebSearch(*),TodoWrite(*)"
unauthorized-message:
# Post message for unauthorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-review') &&
!contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Post unauthorized message
uses: actions/github-script@v7
with:
script: |
const comment = {
owner: context.repo.owner,
repo: context.repo.repo,
body: `❌ @${context.actor} - You are not authorized to trigger Claude reviews.\n\nOnly the maintainers can trigger Claude: Please ask a maintainer for review.`
};
if (context.eventName === 'issue_comment') {
await github.rest.issues.createComment({
...comment,
issue_number: context.issue.number
});
} else if (context.eventName === 'pull_request_review_comment') {
await github.rest.pulls.createReplyForReviewComment({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
comment_id: context.payload.comment.id,
body: comment.body
});
}
================================================
FILE: .github/workflows/release-notes.yml
================================================
name: AI-Generated Release Notes
on:
workflow_dispatch:
inputs:
tag_name:
description: 'Tag name (e.g., v1.0.0)'
required: true
type: string
jobs:
generate-release-notes:
name: Generate Release Notes with Claude
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full git history
- name: Get release tag
id: get_tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "tag=${{ inputs.tag_name }}" >> $GITHUB_OUTPUT
elif [ "${{ github.event_name }}" == "release" ]; then
echo "tag=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
else
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
fi
- name: Get previous tag
id: prev_tag
run: |
CURRENT_TAG="${{ steps.get_tag.outputs.tag }}"
PREVIOUS_TAG=$(git tag --sort=-v:refname | grep -A1 "^${CURRENT_TAG}$" | tail -1)
if [ -z "$PREVIOUS_TAG" ] || [ "$PREVIOUS_TAG" == "$CURRENT_TAG" ]; then
# First release or no previous tag - use initial commit
PREVIOUS_TAG=$(git rev-list --max-parents=0 HEAD)
echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
echo "is_first_release=true" >> $GITHUB_OUTPUT
else
echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
echo "is_first_release=false" >> $GITHUB_OUTPUT
fi
- name: Get commit messages
id: commits
run: |
CURRENT_TAG="${{ steps.get_tag.outputs.tag }}"
PREVIOUS_TAG="${{ steps.prev_tag.outputs.previous_tag }}"
# Get commit history
COMMITS=$(git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:"- %s (%h) by %an" --no-merges)
# Save to file to preserve formatting
echo "$COMMITS" > commits.txt
# Get stats
COMMIT_COUNT=$(echo "$COMMITS" | wc -l)
echo "commit_count=$COMMIT_COUNT" >> $GITHUB_OUTPUT
- name: Get changed files summary
id: files
run: |
CURRENT_TAG="${{ steps.get_tag.outputs.tag }}"
PREVIOUS_TAG="${{ steps.prev_tag.outputs.previous_tag }}"
# Get file change statistics
FILES_CHANGED=$(git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat | tail -1)
echo "files_summary=$FILES_CHANGED" >> $GITHUB_OUTPUT
# Get detailed changes by component
echo "### File Changes by Component" > changes.txt
echo "" >> changes.txt
echo "**Frontend:**" >> changes.txt
git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat -- archon-ui-main/ | head -20 >> changes.txt
echo "" >> changes.txt
echo "**Backend:**" >> changes.txt
git diff ${PREVIOUS_TAG}..${CURRENT_TAG} --stat -- python/ | head -20 >> changes.txt
echo "" >> changes.txt
- name: Get closed PRs
id: prs
env:
GH_TOKEN: ${{ github.token }}
run: |
CURRENT_TAG="${{ steps.get_tag.outputs.tag }}"
PREVIOUS_TAG="${{ steps.prev_tag.outputs.previous_tag }}"
# Get date of previous tag
PREV_DATE=$(git log -1 --format=%ai ${PREVIOUS_TAG})
# Get merged PRs since previous tag
gh pr list \
--state merged \
--limit 100 \
--json number,title,mergedAt,author,url \
--jq --arg date "$PREV_DATE" \
'.[] | select(.mergedAt >= $date) | "- #\(.number): \(.title) by @\(.author.login) - \(.url)"' \
> prs.txt || echo "No PRs found" > prs.txt
- name: Prepare release notes context
id: context
run: |
# Create a context file with all the information
cat > release-context.md <<'EOF'
# Release Notes Generation Task
You are writing release notes for Archon V2 Beta, a local-first AI knowledge management system.
## Release Information
**Version:** ${{ steps.get_tag.outputs.tag }}
**Previous Version:** ${{ steps.prev_tag.outputs.previous_tag }}
**Commits:** ${{ steps.commits.outputs.commit_count }}
**Is First Release:** ${{ steps.prev_tag.outputs.is_first_release }}
## Commits
```
EOF
cat commits.txt >> release-context.md
cat >> release-context.md <<'EOF'
```
## Pull Requests Merged
```
EOF
cat prs.txt >> release-context.md
cat >> release-context.md <<'EOF'
```
## File Changes
```
EOF
cat changes.txt >> release-context.md
cat >> release-context.md <<'EOF'
```
## Instructions
Generate comprehensive release notes following this structure:
# 🚀 Release ${{ steps.get_tag.outputs.tag }}
## 📝 Overview
[2-3 sentence summary of this release]
## ✨ What's New
### Major Features
- [List major new features with brief descriptions]
### Improvements
- [List improvements and enhancements]
### Bug Fixes
- [List bug fixes]
## 🔧 Technical Changes
### Backend (Python/FastAPI)
- [Notable backend changes]
### Frontend (React/TypeScript)
- [Notable frontend changes]
### Infrastructure
- [Docker, CI/CD, deployment changes]
## 📊 Statistics
- **Commits:** ${{ steps.commits.outputs.commit_count }}
- **Pull Requests:** [Count from PRs list]
- **Files Changed:** [From file stats]
- **Contributors:** [Unique authors from commits]
## 🙏 Contributors
Thanks to everyone who contributed to this release:
[List unique contributors with @ mentions]
## ⚠️ Breaking Changes
[List any breaking changes - this is beta software, so breaking changes are expected]
## 🔗 Links
- **Full Changelog:** https://github.com/${{ github.repository }}/compare/${{ steps.prev_tag.outputs.previous_tag }}...${{ steps.get_tag.outputs.tag }}
---
**Note:** This is a beta release. Features may change rapidly. Report issues at: https://github.com/${{ github.repository }}/issues
---
Write in a professional yet enthusiastic tone. Focus on user-facing changes. Be specific but concise.
IMPORTANT: Output ONLY the release notes in markdown format. Do not include any preamble, explanation, or commentary - just the release notes themselves starting with the header.
EOF
- name: Generate release notes with Claude Code
id: claude
uses: anthropics/claude-code-action@beta
timeout-minutes: 10
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
github_token: ${{ github.token }}
mode: agent
direct_prompt: |
Read the file release-context.md which contains all the information about this release.
Generate comprehensive release notes following the structure and instructions in that file.
Output ONLY the release notes in markdown format - no preamble, no commentary, just the release notes.
Write to a file called release_notes.md with the generated release notes.
- name: Verify release notes were generated
run: |
if [ ! -f release_notes.md ]; then
echo "❌ release_notes.md was not created"
echo "Checking for any .md files in current directory:"
ls -la *.md || echo "No .md files found"
exit 1
fi
if [ ! -s release_notes.md ]; then
echo "❌ release_notes.md is empty"
exit 1
fi
echo "✅ Release notes generated successfully"
echo ""
echo "Preview (first 50 lines):"
head -50 release_notes.md
- name: Create or update GitHub release
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="${{ steps.get_tag.outputs.tag }}"
# Check if release already exists
if gh release view "$TAG" &>/dev/null; then
echo "Release $TAG exists, updating notes..."
gh release edit "$TAG" --notes-file release_notes.md
else
echo "Creating new release $TAG..."
gh release create "$TAG" \
--title "Release $TAG" \
--notes-file release_notes.md \
--draft=false \
--latest
fi
- name: Upload release notes as artifact
uses: actions/upload-artifact@v4
with:
name: release-notes-${{ steps.get_tag.outputs.tag }}
path: release_notes.md
retention-days: 90
- name: Comment on related PRs
if: steps.prev_tag.outputs.is_first_release == 'false'
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="${{ steps.get_tag.outputs.tag }}"
# Get PR numbers from commits in this release
CURRENT_TAG="${{ steps.get_tag.outputs.tag }}"
PREVIOUS_TAG="${{ steps.prev_tag.outputs.previous_tag }}"
# Extract PR numbers from commit messages
PR_NUMBERS=$(git log ${PREVIOUS_TAG}..${CURRENT_TAG} --oneline |
grep -oP '#\K\d+' || true)
if [ -n "$PR_NUMBERS" ]; then
for PR in $PR_NUMBERS; do
echo "Adding release comment to PR #$PR"
gh pr comment "$PR" \
--body "🎉 This pull request has been included in release [$TAG](https://github.com/${{ github.repository }}/releases/tag/$TAG)!" \
|| echo "Could not comment on PR #$PR (might be closed)"
done
fi
- name: Create summary
if: always()
run: |
echo "# 🎉 Release Notes Generation Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Release Tag:** ${{ steps.get_tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
echo "**Previous Tag:** ${{ steps.prev_tag.outputs.previous_tag }}" >> $GITHUB_STEP_SUMMARY
echo "**Commits:** ${{ steps.commits.outputs.commit_count }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Generated Release Notes" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ -f release_notes.md ]; then
cat release_notes.md >> $GITHUB_STEP_SUMMARY
else
echo "⚠️ Release notes file not found" >> $GITHUB_STEP_SUMMARY
fi
================================================
FILE: .gitignore
================================================
__pycache__
.env
.serena
.claude/settings.local.json
PRPs/local
PRPs/completed/
PRPs/stories/
PRPs/examples
PRPs/features
PRPs/specs
PRPs/reviews/
/logs/
.zed
tmp/
temp/
UAT/
# Temporary validation/report markdown files
/*_RESULTS.md
/*_SUMMARY.md
/*_REPORT.md
/*_SUCCESS.md
/*_COMPLETION*.md
/ACTUAL_*.md
/VALIDATION_*.md
.DS_Store
# Local release notes testing
release-notes-*.md
================================================
FILE: AGENTS.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Beta Development Guidelines
**Local-only deployment** - each user runs their own instance.
### Core Principles
- **No backwards compatibility; we follow a fix‑forward approach** — remove deprecated code immediately
- **Detailed errors over graceful failures** - we want to identify and fix issues fast
- **Break things to improve them** - beta is for rapid iteration
- **Continuous improvement** - embrace change and learn from mistakes
- **KISS** - keep it simple
- **DRY** when appropriate
- **YAGNI** — don't implement features that are not needed
### Error Handling
**Core Principle**: In beta, we need to intelligently decide when to fail hard and fast to quickly address issues, and when to allow processes to complete in critical services despite failures. Read below carefully and make intelligent decisions on a case-by-case basis.
#### When to Fail Fast and Loud (Let it Crash!)
These errors should stop execution and bubble up immediately: (except for crawling flows)
- **Service startup failures** - If credentials, database, or any service can't initialize, the system should crash with a clear error
- **Missing configuration** - Missing environment variables or invalid settings should stop the system
- **Database connection failures** - Don't hide connection issues, expose them
- **Authentication/authorization failures** - Security errors must be visible and halt the operation
- **Data corruption or validation errors** - Never silently accept bad data, Pydantic should raise
- **Critical dependencies unavailable** - If a required service is down, fail immediately
- **Invalid data that would corrupt state** - Never store zero embeddings, null foreign keys, or malformed JSON
#### When to Complete but Log Detailed Errors
These operations should continue but track and report failures clearly:
- **Batch processing** - When crawling websites or processing documents, complete what you can and report detailed failures for each item
- **Background tasks** - Embedding generation, async jobs should finish the queue but log failures
- **WebSocket events** - Don't crash on a single event failure, log it and continue serving other clients
- **Optional features** - If projects/tasks are disabled, log and skip rather than crash
- **External API calls** - Retry with exponential backoff, then fail with a clear message about what service failed and why
#### Critical Nuance: Never Accept Corrupted Data
When a process should continue despite failures, it must **skip the failed item entirely** rather than storing corrupted data
#### Error Message Guidelines
- Include context about what was being attempted when the error occurred
- Preserve full stack traces with `exc_info=True` in Python logging
- Use specific exception types, not generic Exception catching
- Include relevant IDs, URLs, or data that helps debug the issue
- Never return None/null to indicate failure - raise an exception with details
- For batch operations, always report both success count and detailed failure list
### Code Quality
- Remove dead code immediately rather than maintaining it - no backward compatibility or legacy functions
- Avoid backward compatibility mappings or legacy function wrappers
- Fix forward
- Focus on user experience and feature completeness
- When updating code, don't reference what is changing (avoid keywords like SIMPLIFIED, ENHANCED, LEGACY, CHANGED, REMOVED), instead focus on comments that document just the functionality of the code
- When commenting on code in the codebase, only comment on the functionality and reasoning behind the code. Refrain from speaking to Archon being in "beta" or referencing anything else that comes from these global rules.
## Development Commands
### Frontend (archon-ui-main/)
```bash
npm run dev # Start development server on port 3737
npm run build # Build for production
npm run lint # Run ESLint on legacy code (excludes /features)
npm run lint:files path/to/file.tsx # Lint specific files
# Biome for /src/features directory only
npm run biome # Check features directory
npm run biome:fix # Auto-fix issues
npm run biome:format # Format code (120 char lines)
npm run biome:ai # Machine-readable JSON output for AI
npm run biome:ai-fix # Auto-fix with JSON output
# Testing
npm run test # Run all tests in watch mode
npm run test:ui # Run with Vitest UI interface
npm run test:coverage:stream # Run once with streaming output
vitest run src/features/projects # Test specific directory
# TypeScript
npx tsc --noEmit # Check all TypeScript errors
npx tsc --noEmit 2>&1 | grep "src/features" # Check features only
```
### Backend (python/)
```bash
# Using uv package manager (preferred)
uv sync --group all # Install all dependencies
uv run python -m src.server.main # Run server locally on 8181
uv run pytest # Run all tests
uv run pytest tests/test_api_essentials.py -v # Run specific test
uv run ruff check # Run linter
uv run ruff check --fix # Auto-fix linting issues
uv run mypy src/ # Type check
# Docker operations
docker compose up --build -d # Start all services
docker compose --profile backend up -d # Backend only (for hybrid dev)
docker compose logs -f archon-server # View server logs
docker compose logs -f archon-mcp # View MCP server logs
docker compose restart archon-server # Restart after code changes
docker compose down # Stop all services
docker compose down -v # Stop and remove volumes
```
### Quick Workflows
```bash
# Hybrid development (recommended) - backend in Docker, frontend local
make dev # Or manually: docker compose --profile backend up -d && cd archon-ui-main && npm run dev
# Full Docker mode
make dev-docker # Or: docker compose up --build -d
# Run linters before committing
make lint # Runs both frontend and backend linters
make lint-fe # Frontend only (ESLint + Biome)
make lint-be # Backend only (Ruff + MyPy)
# Testing
make test # Run all tests
make test-fe # Frontend tests only
make test-be # Backend tests only
```
## Architecture Overview
@PRPs/ai_docs/ARCHITECTURE.md
#### TanStack Query Implementation
For architecture and file references:
@PRPs/ai_docs/DATA_FETCHING_ARCHITECTURE.md
For code patterns and examples:
@PRPs/ai_docs/QUERY_PATTERNS.md
#### Service Layer Pattern
See implementation examples:
- API routes: `python/src/server/api_routes/projects_api.py`
- Service layer: `python/src/server/services/project_service.py`
- Pattern: API Route → Service → Database
#### Error Handling Patterns
See implementation examples:
- Custom exceptions: `python/src/server/exceptions.py`
- Exception handlers: `python/src/server/main.py` (search for @app.exception_handler)
- Service error handling: `python/src/server/services/` (various services)
## ETag Implementation
@PRPs/ai_docs/ETAG_IMPLEMENTATION.md
## Database Schema
Key tables in Supabase:
- `sources` - Crawled websites and uploaded documents
- Stores metadata, crawl status, and configuration
- `documents` - Processed document chunks with embeddings
- Text chunks with vector embeddings for semantic search
- `projects` - Project management (optional feature)
- Contains features array, documents, and metadata
- `tasks` - Task tracking linked to projects
- Status: todo, doing, review, done
- Assignee: User, Archon, AI IDE Agent
- `code_examples` - Extracted code snippets
- Language, summary, and relevance metadata
## API Naming Conventions
@PRPs/ai_docs/API_NAMING_CONVENTIONS.md
Use database values directly (no mapping in the FE typesafe from BE and up):
## Environment Variables
Required in `.env`:
```bash
SUPABASE_URL=https://your-project.supabase.co # Or http://host.docker.internal:8000 for local
SUPABASE_SERVICE_KEY=your-service-key-here # Use legacy key format for cloud Supabase
```
Optional variables and full configuration:
See `python/.env.example` for complete list
## Common Development Tasks
### Add a new API endpoint
1. Create route handler in `python/src/server/api_routes/`
2. Add service logic in `python/src/server/services/`
3. Include router in `python/src/server/main.py`
4. Update frontend service in `archon-ui-main/src/features/[feature]/services/`
### Add a new UI component in features directory
1. Use Radix UI primitives from `src/features/ui/primitives/`
2. Create component in relevant feature folder under `src/features/[feature]/components/`
3. Define types in `src/features/[feature]/types/`
4. Use TanStack Query hook from `src/features/[feature]/hooks/`
5. Apply Tron-inspired glassmorphism styling with Tailwind
### Add or modify MCP tools
1. MCP tools are in `python/src/mcp_server/features/[feature]/[feature]_tools.py`
2. Follow the pattern:
- `find_[resource]` - Handles list, search, and get single item operations
- `manage_[resource]` - Handles create, update, delete with an "action" parameter
3. Register tools in the feature's `__init__.py` file
### Debug MCP connection issues
1. Check MCP health: `curl http://localhost:8051/health`
2. View MCP logs: `docker compose logs archon-mcp`
3. Test tool execution via UI MCP page
4. Verify Supabase connection and credentials
### Fix TypeScript/Linting Issues
```bash
# TypeScript errors in features
npx tsc --noEmit 2>&1 | grep "src/features"
# Biome auto-fix for features
npm run biome:fix
# ESLint for legacy code
npm run lint:files src/components/SomeComponent.tsx
```
## Code Quality Standards
### Frontend
- **TypeScript**: Strict mode enabled, no implicit any
- **Biome** for `/src/features/`: 120 char lines, double quotes, trailing commas
- **ESLint** for legacy code: Standard React rules
- **Testing**: Vitest with React Testing Library
### Backend
- **Python 3.12** with 120 character line length
- **Ruff** for linting - checks for errors, warnings, unused imports
- **Mypy** for type checking - ensures type safety
- **Pytest** for testing with async support
## MCP Tools Available
When connected to Claude/Cursor/Windsurf, the following tools are available:
### Knowledge Base Tools
- `archon:rag_search_knowledge_base` - Search knowledge base for relevant content
- `archon:rag_search_code_examples` - Find code snippets in the knowledge base
- `archon:rag_get_available_sources` - List available knowledge sources
### Project Management
- `archon:find_projects` - Find all projects, search, or get specific project (by project_id)
- `archon:manage_project` - Manage projects with actions: "create", "update", "delete"
### Task Management
- `archon:find_tasks` - Find tasks with search, filters, or get specific task (by task_id)
- `archon:manage_task` - Manage tasks with actions: "create", "update", "delete"
### Document Management
- `archon:find_documents` - Find documents, search, or get specific document (by document_id)
- `archon:manage_document` - Manage documents with actions: "create", "update", "delete"
### Version Control
- `archon:find_versions` - Find version history or get specific version
- `archon:manage_version` - Manage versions with actions: "create", "restore"
## Important Notes
- Projects feature is optional - toggle in Settings UI
- HTTP polling handles all updates
- Frontend uses Vite proxy for API calls in development
- Python backend uses `uv` for dependency management
- Docker Compose handles service orchestration
- TanStack Query for all data fetching - NO PROP DRILLING
- Vertical slice architecture in `/features` - features own their sub-features
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Beta Development Guidelines
**Local-only deployment** - each user runs their own instance.
### Core Principles
- **No backwards compatibility; we follow a fix‑forward approach** — remove deprecated code immediately
- **Detailed errors over graceful failures** - we want to identify and fix issues fast
- **Break things to improve them** - beta is for rapid iteration
- **Continuous improvement** - embrace change and learn from mistakes
- **KISS** - keep it simple
- **DRY** when appropriate
- **YAGNI** — don't implement features that are not needed
### Error Handling
**Core Principle**: In beta, we need to intelligently decide when to fail hard and fast to quickly address issues, and when to allow processes to complete in critical services despite failures. Read below carefully and make intelligent decisions on a case-by-case basis.
#### When to Fail Fast and Loud (Let it Crash!)
These errors should stop execution and bubble up immediately: (except for crawling flows)
- **Service startup failures** - If credentials, database, or any service can't initialize, the system should crash with a clear error
- **Missing configuration** - Missing environment variables or invalid settings should stop the system
- **Database connection failures** - Don't hide connection issues, expose them
- **Authentication/authorization failures** - Security errors must be visible and halt the operation
- **Data corruption or validation errors** - Never silently accept bad data, Pydantic should raise
- **Critical dependencies unavailable** - If a required service is down, fail immediately
- **Invalid data that would corrupt state** - Never store zero embeddings, null foreign keys, or malformed JSON
#### When to Complete but Log Detailed Errors
These operations should continue but track and report failures clearly:
- **Batch processing** - When crawling websites or processing documents, complete what you can and report detailed failures for each item
- **Background tasks** - Embedding generation, async jobs should finish the queue but log failures
- **WebSocket events** - Don't crash on a single event failure, log it and continue serving other clients
- **Optional features** - If projects/tasks are disabled, log and skip rather than crash
- **External API calls** - Retry with exponential backoff, then fail with a clear message about what service failed and why
#### Critical Nuance: Never Accept Corrupted Data
When a process should continue despite failures, it must **skip the failed item entirely** rather than storing corrupted data
#### Error Message Guidelines
- Include context about what was being attempted when the error occurred
- Preserve full stack traces with `exc_info=True` in Python logging
- Use specific exception types, not generic Exception catching
- Include relevant IDs, URLs, or data that helps debug the issue
- Never return None/null to indicate failure - raise an exception with details
- For batch operations, always report both success count and detailed failure list
### Code Quality
- Remove dead code immediately rather than maintaining it - no backward compatibility or legacy functions
- Avoid backward compatibility mappings or legacy function wrappers
- Fix forward
- Focus on user experience and feature completeness
- When updating code, don't reference what is changing (avoid keywords like SIMPLIFIED, ENHANCED, LEGACY, CHANGED, REMOVED), instead focus on comments that document just the functionality of the code
- When commenting on code in the codebase, only comment on the functionality and reasoning behind the code. Refrain from speaking to Archon being in "beta" or referencing anything else that comes from these global rules.
## Development Commands
### Frontend (archon-ui-main/)
```bash
npm run dev # Start development server on port 3737
npm run build # Build for production
npm run lint # Run ESLint on legacy code (excludes /features)
npm run lint:files path/to/file.tsx # Lint specific files
# Biome for /src/features directory only
npm run biome # Check features directory
npm run biome:fix # Auto-fix issues
npm run biome:format # Format code (120 char lines)
npm run biome:ai # Machine-readable JSON output for AI
npm run biome:ai-fix # Auto-fix with JSON output
# Testing
npm run test # Run all tests in watch mode
npm run test:ui # Run with Vitest UI interface
npm run test:coverage:stream # Run once with streaming output
vitest run src/features/projects # Test specific directory
# TypeScript
npx tsc --noEmit # Check all TypeScript errors
npx tsc --noEmit 2>&1 | grep "src/features" # Check features only
```
### Backend (python/)
```bash
# Using uv package manager (preferred)
uv sync --group all # Install all dependencies
uv run python -m src.server.main # Run server locally on 8181
uv run pytest # Run all tests
uv run pytest tests/test_api_essentials.py -v # Run specific test
uv run ruff check # Run linter
uv run ruff check --fix # Auto-fix linting issues
uv run mypy src/ # Type check
# Agent Work Orders Service (independent microservice)
make agent-work-orders # Run agent work orders service locally on 8053
# Or manually:
uv run python -m uvicorn src.agent_work_orders.server:app --port 8053 --reload
# Docker operations
docker compose up --build -d # Start all services
docker compose --profile backend up -d # Backend only (for hybrid dev)
docker compose --profile work-orders up -d # Include agent work orders service
docker compose logs -f archon-server # View server logs
docker compose logs -f archon-mcp # View MCP server logs
docker compose logs -f archon-agent-work-orders # View agent work orders service logs
docker compose restart archon-server # Restart after code changes
docker compose down # Stop all services
docker compose down -v # Stop and remove volumes
```
### Quick Workflows
```bash
# Hybrid development (recommended) - backend in Docker, frontend local
make dev # Or manually: docker compose --profile backend up -d && cd archon-ui-main && npm run dev
# Hybrid with Agent Work Orders Service - backend in Docker, agent work orders local
make dev-work-orders # Starts backend in Docker, prompts to run agent service in separate terminal
# Then in separate terminal:
make agent-work-orders # Start agent work orders service locally
# Full Docker mode
make dev-docker # Or: docker compose up --build -d
docker compose --profile work-orders up -d # Include agent work orders service
# All Local (3 terminals) - for agent work orders service development
# Terminal 1: uv run python -m uvicorn src.server.main:app --port 8181 --reload
# Terminal 2: make agent-work-orders
# Terminal 3: cd archon-ui-main && npm run dev
# Run linters before committing
make lint # Runs both frontend and backend linters
make lint-fe # Frontend only (ESLint + Biome)
make lint-be # Backend only (Ruff + MyPy)
# Testing
make test # Run all tests
make test-fe # Frontend tests only
make test-be # Backend tests only
```
## Architecture Overview
@PRPs/ai_docs/ARCHITECTURE.md
#### TanStack Query Implementation
For architecture and file references:
@PRPs/ai_docs/DATA_FETCHING_ARCHITECTURE.md
For code patterns and examples:
@PRPs/ai_docs/QUERY_PATTERNS.md
#### Service Layer Pattern
See implementation examples:
- API routes: `python/src/server/api_routes/projects_api.py`
- Service layer: `python/src/server/services/project_service.py`
- Pattern: API Route → Service → Database
#### Error Handling Patterns
See implementation examples:
- Custom exceptions: `python/src/server/exceptions.py`
- Exception handlers: `python/src/server/main.py` (search for @app.exception_handler)
- Service error handling: `python/src/server/services/` (various services)
## ETag Implementation
@PRPs/ai_docs/ETAG_IMPLEMENTATION.md
## Database Schema
Key tables in Supabase:
- `sources` - Crawled websites and uploaded documents
- Stores metadata, crawl status, and configuration
- `documents` - Processed document chunks with embeddings
- Text chunks with vector embeddings for semantic search
- `projects` - Project management (optional feature)
- Contains features array, documents, and metadata
- `tasks` - Task tracking linked to projects
- Status: todo, doing, review, done
- Assignee: User, Archon, AI IDE Agent
- `code_examples` - Extracted code snippets
- Language, summary, and relevance metadata
## API Naming Conventions
@PRPs/ai_docs/API_NAMING_CONVENTIONS.md
Use database values directly (no FE mapping; type‑safe end‑to‑end from BE upward):
## Environment Variables
Required in `.env`:
```bash
SUPABASE_URL=https://your-project.supabase.co # Or http://host.docker.internal:8000 for local
SUPABASE_SERVICE_KEY=your-service-key-here # Use legacy key format for cloud Supabase
```
Optional variables and full configuration:
See `python/.env.example` for complete list
### Repository Configuration
Repository information (owner, name) is centralized in `python/src/server/config/version.py`:
- `GITHUB_REPO_OWNER` - GitHub repository owner (default: "coleam00")
- `GITHUB_REPO_NAME` - GitHub repository name (default: "Archon")
This is the single source of truth for repository configuration. All services (version checking, bug reports, etc.) should import these constants rather than hardcoding repository URLs.
Environment variable override: `GITHUB_REPO="owner/repo"` can be set to override defaults.
## Common Development Tasks
### Add a new API endpoint
1. Create route handler in `python/src/server/api_routes/`
2. Add service logic in `python/src/server/services/`
3. Include router in `python/src/server/main.py`
4. Update frontend service in `archon-ui-main/src/features/[feature]/services/`
### Add a new UI component in features directory
**IMPORTANT**: Review UI design standards in `@PRPs/ai_docs/UI_STANDARDS.md` before creating UI components.
1. Use Radix UI primitives from `src/features/ui/primitives/`
2. Create component in relevant feature folder under `src/features/[feature]/components/`
3. Define types in `src/features/[feature]/types/`
4. Use TanStack Query hook from `src/features/[feature]/hooks/`
5. Apply Tron-inspired glassmorphism styling with Tailwind
6. Follow responsive design patterns (mobile-first with breakpoints)
7. Ensure no dynamic Tailwind class construction (see UI_STANDARDS.md Section 2)
### Add or modify MCP tools
1. MCP tools are in `python/src/mcp_server/features/[feature]/[feature]_tools.py`
2. Follow the pattern:
- `find_[resource]` - Handles list, search, and get single item operations
- `manage_[resource]` - Handles create, update, delete with an "action" parameter
3. Register tools in the feature's `__init__.py` file
### Debug MCP connection issues
1. Check MCP health: `curl http://localhost:8051/health`
2. View MCP logs: `docker compose logs archon-mcp`
3. Test tool execution via UI MCP page
4. Verify Supabase connection and credentials
### Fix TypeScript/Linting Issues
```bash
# TypeScript errors in features
npx tsc --noEmit 2>&1 | grep "src/features"
# Biome auto-fix for features
npm run biome:fix
# ESLint for legacy code
npm run lint:files src/components/SomeComponent.tsx
```
## Code Quality Standards
### Frontend
- **TypeScript**: Strict mode enabled, no implicit any
- **Biome** for `/src/features/`: 120 char lines, double quotes, trailing commas
- **ESLint** for legacy code: Standard React rules
- **Testing**: Vitest with React Testing Library
### Backend
- **Python 3.12** with 120 character line length
- **Ruff** for linting - checks for errors, warnings, unused imports
- **Mypy** for type checking - ensures type safety
- **Pytest** for testing with async support
## MCP Tools Available
When connected to Claude/Cursor/Windsurf, the following tools are available:
### Knowledge Base Tools
- `archon:rag_search_knowledge_base` - Search knowledge base for relevant content
- `archon:rag_search_code_examples` - Find code snippets in the knowledge base
- `archon:rag_get_available_sources` - List available knowledge sources
- `archon:rag_list_pages_for_source` - List all pages for a given source (browse documentation structure)
- `archon:rag_read_full_page` - Retrieve full page content by page_id or URL
### Project Management
- `archon:find_projects` - Find all projects, search, or get specific project (by project_id)
- `archon:manage_project` - Manage projects with actions: "create", "update", "delete"
### Task Management
- `archon:find_tasks` - Find tasks with search, filters, or get specific task (by task_id)
- `archon:manage_task` - Manage tasks with actions: "create", "update", "delete"
### Document Management
- `archon:find_documents` - Find documents, search, or get specific document (by document_id)
- `archon:manage_document` - Manage documents with actions: "create", "update", "delete"
### Version Control
- `archon:find_versions` - Find version history or get specific version
- `archon:manage_version` - Manage versions with actions: "create", "restore"
## Important Notes
- Projects feature is optional - toggle in Settings UI
- TanStack Query handles all data fetching; smart HTTP polling is used where appropriate (no WebSockets)
- Frontend uses Vite proxy for API calls in development
- Python backend uses `uv` for dependency management
- Docker Compose handles service orchestration
- TanStack Query for all data fetching - NO PROP DRILLING
- Vertical slice architecture in `/features` - features own their sub-features
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Archon
Help us build the definitive knowledge and task management engine for AI coding assistants! This guide shows you how to contribute new features, bug fixes, and improvements to the Archon platform.
## 🎯 What is Archon?
Archon is a **microservices-based engine** that provides AI coding assistants with access to your documentation, project knowledge, and task management through the Model Context Protocol (MCP). The platform consists of four main services that work together to deliver comprehensive knowledge management and project automation.
## 🏗️ Architecture Overview
### Microservices Structure
Archon uses true microservices architecture with clear separation of concerns:
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend UI │ │ Server (API) │ │ MCP Server │ │ Agents Service │
│ │ │ │ │ │ │ │
│ React + Vite │◄──►│ FastAPI + │◄──►│ Lightweight │◄──►│ PydanticAI │
│ Port 3737 │ │ SocketIO │ │ HTTP Wrapper │ │ Port 8052 │
│ │ │ Port 8181 │ │ Port 8051 │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │ │
└────────────────────────┼────────────────────────┼────────────────────────┘
│ │
┌─────────────────┐ │
│ Database │ │
│ │ │
│ Supabase │◄──────────────┘
│ PostgreSQL │
│ PGVector │
└─────────────────┘
```
### Service Responsibilities
| Service | Location | Purpose | Key Features |
| -------------- | -------------------- | ---------------------------- | -------------------------------------------------------------------------- |
| **Frontend** | `archon-ui-main/` | Web interface and dashboard | React, TypeScript, TailwindCSS, Socket.IO client |
| **Server** | `python/src/server/` | Core business logic and APIs | FastAPI, service layer, Socket.IO broadcasts, all LLM/embedding operations |
| **MCP Server** | `python/src/mcp/` | MCP protocol interface | Lightweight HTTP wrapper, 14 MCP tools, session management |
| **Agents** | `python/src/agents/` | PydanticAI agent hosting | Document and RAG agents, streaming responses |
### Communication Patterns
- **HTTP-based**: All inter-service communication uses HTTP APIs
- **Socket.IO**: Real-time updates from Server to Frontend
- **MCP Protocol**: AI clients connect to MCP Server via SSE or stdio
- **No Direct Imports**: Services are truly independent with no shared code dependencies
## 🚀 Quick Start for Contributors
### Prerequisites
- [Docker Desktop](https://www.docker.com/products/docker-desktop/)
- [Node.js 18+](https://nodejs.org/) (for hybrid development mode)
- [Supabase](https://supabase.com/) account (free tier works)
- [OpenAI API key](https://platform.openai.com/api-keys) or alternative LLM provider
- (Optional) [Make](https://www.gnu.org/software/make/) for simplified workflows
- Basic knowledge of Python (FastAPI) and TypeScript (React)
### Initial Setup
After forking the repository, you'll need to:
1. **Environment Configuration**
```bash
cp .env.example .env
# Edit .env with your Supabase credentials
```
2. **Database Setup**
- Run `migration/complete_setup.sql` in your Supabase SQL Editor
3. **Start Development Environment**
```bash
# Using Docker Compose directly
docker compose --profile full up --build -d
# Or using Make (if installed)
make dev-docker
```
4. **Configure API Keys**
- Open http://localhost:3737
- Go to Settings → Add your OpenAI API key
## 👑 Important Standards for Contributing
There are a few very important rules that we ask you follow when contributing to Archon.
Some things like testing are covered more later in this document but there are a few
very important specifics to call out here.
**1. Check the list of PRs** to make sure you aren't about to fix or implement something that's already been done! Also be sure to check the [Archon Kanban board](https://github.com/users/coleam00/projects/1) where the maintainers are manage issues/features.
**2. Try to keep the changes to less than 2,000 lines of code.** The more granular the PR, the better! If your changes must be larger, it's very important to go into extra detail in your PR and explain why the larger changes are necessary.
**3. Keep PRs to a single feature.** Please split any that implement multiple features into multiple PRs.
**4. Even within individual features, aim for simplicity** - concise implementations are always the best!
**5. If your code changes touch the crawling functionality in any way**, please test crawling an llms-full.txt, llms.txt, a sitemap.xml, and a normal URL with recursive crawling. Here are smaller examples you can use for testing:
- llms.txt: https://docs.mem0.ai/llms.txt
- llms-full.txt: https://docs.mem0.ai/llms-full.txt
- sitemap.xml: https://mem0.ai/sitemap.xml
- Normal URL: https://docs.anthropic.com/en/docs/claude-code/overview
Make sure the crawling completes end to end, the code examples exist, and the Archon MCP can be used to successfully search through the documentation.
**6. If your code changes touch the project/task management in any way**, please test all the CRUD (Create, Read, Update, Delete) operations on both projects and tasks. Generally you will:
- Create a new project
- Create a couple of tasks
- Move the tasks around the kanban board
- Edit descriptions
Test these things using both the UI and the MCP server. This process will be similar if your code changes touch the docs part of Archon too.
**7. If your code changes touch the MCP server instructions or anything else more high level** that could affect how AI coding assistants use the Archon MCP, please retest by creating a simple project from scratch that leverages Archon for RAG, task management, etc.
## 🔄 Contribution Process
### 1. Choose Your Contribution
**Bug Fixes:**
- Check existing issues for reported bugs
- Create detailed reproduction steps
- Fix in smallest possible scope
**New Features:**
- Optional: Open an issue first to discuss the feature
- Get feedback on approach and architecture (from maintainers and/or AI coding assistants)
- Break large features into smaller PRs
**Documentation:**
- Look for gaps in current documentation
- Focus on user-facing improvements
- Update both code docs and user guides
### 2. Development Process
1. **Fork the Repository**
- Go to https://github.com/coleam00/archon
- Click the "Fork" button in the top right corner
- This creates your own copy of the repository
```bash
# Clone your fork from main branch for contributing (replace 'your-username' with your GitHub username)
git clone https://github.com/your-username/archon.git
cd archon
# Add upstream remote to sync with main repository later
git remote add upstream https://github.com/coleam00/archon.git
```
**Note:** The `main` branch is used for contributions and contains the latest development work. The `stable` branch is for users who want a more tested, stable version of Archon.
2. **🤖 AI Coding Assistant Setup**
**IMPORTANT**: If you're using AI coding assistants to help contribute to Archon, set up our global rules for optimal results.
- **Claude Code**: ✅ Already configured! The `CLAUDE.md` file is automatically used
- **Cursor**: Copy `CLAUDE.md` content to a new `.cursorrules` file in the project root
- **Windsurf**: Copy `CLAUDE.md` content to a new `.windsurfrules` file in the project root
- **Other assistants**: Copy `CLAUDE.md` content to your assistant's global rules/context file
These rules contain essential context about Archon's architecture, service patterns, MCP implementation, and development best practices. Using them will help your AI assistant follow our conventions and implement features correctly.
3. **Create Feature Branch**
**Best Practice**: Always create a feature branch from main rather than working directly on it. This keeps your main branch clean and makes it easier to sync with the upstream repository.
```bash
git checkout -b feature/your-feature-name
# or
git checkout -b fix/bug-description
```
4. **Make Your Changes**
- Follow the service architecture patterns
- Add tests for new functionality
- Update documentation as needed
5. **Verify Your Changes**
- Run full test suite
- Test manually via Docker environment
- Verify no regressions in existing features
### 3. Submit Pull Request
1. **Push to Your Fork**
```bash
# First time pushing this branch
git push -u origin feature/your-feature-name
# For subsequent pushes to the same branch
git push
```
2. **Create Pull Request via GitHub UI**
- Go to your fork on GitHub (https://github.com/your-username/archon)
- Click "Contribute" then "Open pull request"
- GitHub will automatically detect your branch and show a comparison
- The PR template will be automatically filled in the description
- Review the template and fill out the required sections
- Click "Create pull request"
3. **Testing Requirements**
**Before submitting, ensure:**
- [ ] All existing tests pass
- [ ] New tests added for new functionality
- [ ] Manual testing of affected user flows
- [ ] Docker builds succeed for all services
**Test commands:**
```bash
# Using Make (if installed)
make test # Run all tests
make test-fe # Frontend tests only
make test-be # Backend tests only
# Or manually
cd python && python -m pytest # Backend tests
cd archon-ui-main && npm run test # Frontend tests
# Full integration test
docker compose --profile full up --build -d
# Test via UI at http://localhost:3737
```
4. **Review Process**
- Automated tests will run on your PR
- Maintainers will review code and architecture
- Address feedback and iterate as needed
## 📋 Contribution Areas
### 🔧 Backend Services (Python)
**When to contribute:**
- Adding new API endpoints or business logic
- Implementing new MCP tools
- Creating new service classes or utilities
- Improving crawling, embedding, or search functionality (everything for RAG)
**Key locations:**
- **Service Layer**: `python/src/server/services/` - Core business logic organized by domain
- **API Endpoints**: `python/src/server/api_routes/` - REST API route handlers
- **MCP Tools**: `python/src/mcp/modules/` - MCP protocol implementations
- **Agents**: `python/src/agents/` - PydanticAI agent implementations
**Development patterns:**
- Services use dependency injection with `supabase_client` parameter
- Use async/await for I/O operations, sync for pure logic
- Follow service → API → MCP layer separation
### 🎨 Frontend (React/TypeScript)
**When to contribute:**
- Adding new UI components or pages
- Implementing real-time features with Socket.IO
- Creating new service integrations
- Improving user experience and accessibility
**Key locations:**
- **Components**: `archon-ui-main/src/components/` - Reusable UI components organized by feature
- **Pages**: `archon-ui-main/src/pages/` - Main application routes
- **Services**: `archon-ui-main/src/services/` - API communication and business logic
- **Contexts**: `archon-ui-main/src/contexts/` - React context providers for global state
**Development patterns:**
- Context-based state management (no Redux)
- Service layer abstraction for API calls
- Socket.IO for real-time updates
- TailwindCSS for styling with custom design system
### 🐳 Infrastructure (Docker/DevOps)
**When to contribute:**
- Optimizing container builds or sizes
- Improving service orchestration
- Adding new environment configurations
- Enhancing health checks and monitoring
**Key locations:**
- **Docker**: `python/Dockerfile.*` - Service-specific containers
- **Compose**: `docker-compose.yml` - Service orchestration
- **Config**: `.env.example` - Environment variable documentation
### 📚 Documentation
**When to contribute:**
- Adding API documentation
- Creating deployment guides
- Writing feature tutorials
- Improving architecture explanations
**Key locations:**
- **Docs Site**: `docs/docs/` - Docusaurus-based documentation
- **API Docs**: Auto-generated from FastAPI endpoints
- **README**: Main project documentation
## 🛠️ Development Workflows
### Backend Development (Python)
1. **Adding a New Service**
```bash
# Create service class in appropriate domain
python/src/server/services/your_domain/your_service.py
# Add API endpoints
python/src/server/api_routes/your_api.py
# Optional: Add MCP tools
python/src/mcp/modules/your_module.py
```
2. **Testing Your Changes**
```bash
# Using Make (if installed)
make test-be
# Or manually
cd python && python -m pytest tests/
# Run specific test categories
python -m pytest -m unit # Unit tests only
python -m pytest -m integration # Integration tests only
```
3. **Code Quality**
```bash
# Follow service patterns from existing code
# Maintain consistency with the codebase
```
### Frontend Development (React)
1. **Adding a New Component**
```bash
# Create in appropriate category
archon-ui-main/src/components/your-category/YourComponent.tsx
# Add to appropriate page or parent component
archon-ui-main/src/pages/YourPage.tsx
```
2. **UI Design Standards**
Before creating or modifying UI components, review the design standards:
- **UI Standards**: `PRPs/ai_docs/UI_STANDARDS.md` - Complete Tailwind v4, Radix, and responsive design patterns
- **Style Guide**: Enable in Settings → scroll to "Feature Flags" → Enable "Style Guide Page"
- Access at http://localhost:3737/style-guide
- View all available primitives, colors, layouts, and component patterns
- **UI Consistency Review**: Run `/archon:archon-ui-consistency-review <path>` to automatically check your components for compliance
3. **Testing Your Changes**
```bash
# Using Make (if installed)
make test-fe
# Or manually
cd archon-ui-main && npm run test
# Run with coverage
npm run test:coverage
# Run in UI mode
npm run test:ui
```
4. **Development Server**
```bash
# Using Make for hybrid mode (if installed)
make dev # Backend in Docker, frontend local
# Or manually for faster iteration
cd archon-ui-main && npm run dev
# Still connects to Docker backend services
```
## ✅ Quality Standards
### Code Requirements
1. **Backend (Python)**
- Follow existing service patterns and dependency injection
- Use type hints and proper async/await patterns
- Include unit tests for new business logic
- Update API documentation if adding endpoints
2. **Frontend (TypeScript)**
- Use TypeScript with proper typing
- Follow existing component patterns and context usage
- Include component tests for new UI features
- Ensure responsive design and accessibility
3. **Documentation**
- Update relevant docs for user-facing changes
- Include inline code documentation for complex logic
- Add migration notes for breaking changes
### Performance Considerations
- **Service Layer**: Keep business logic efficient, use async for I/O
- **API Responses**: Consider pagination for large datasets
- **Real-time Updates**: Use Socket.IO rooms appropriately
- **Database**: Consider indexes for new query patterns
## 🏛️ Architectural Guidelines
### Service Design Principles
1. **Single Responsibility**: Each service has a focused purpose
2. **HTTP Communication**: No direct imports between services
3. **Database Centralization**: Supabase as single source of truth
4. **Real-time Updates**: Socket.IO for live collaboration features
### Adding New MCP Tools
**Tool Pattern:**
```python
@mcp.tool()
async def your_new_tool(ctx: Context, param: str) -> str:
"""
Tool description for AI clients.
Args:
param: Description of parameter
Returns:
JSON string with results
"""
async with httpx.AsyncClient() as client:
response = await client.post(f"{API_URL}/api/your-endpoint",
json={"param": param})
return response.json()
```
### Adding New Service Classes
**Service Pattern:**
```python
class YourService:
def __init__(self, supabase_client=None):
self.supabase_client = supabase_client or get_supabase_client()
def your_operation(self, param: str) -> Tuple[bool, Dict[str, Any]]:
try:
# Business logic here
result = self.supabase_client.table("table").insert(data).execute()
return True, {"data": result.data}
except Exception as e:
logger.error(f"Error in operation: {e}")
return False, {"error": str(e)}
```
## 🤝 Community Standards
### Communication Guidelines
- **Be Constructive**: Focus on improving the codebase and user experience
- **Be Specific**: Provide detailed examples and reproduction steps
- **Be Collaborative**: Welcome diverse perspectives and approaches
- **Be Patient**: Allow time for review and discussion
### Code Review Process
**As a Contributor:**
- Write clear PR descriptions
- Respond promptly to review feedback
- Test your changes thoroughly
**As a Reviewer:**
- Focus on architecture, correctness, and user impact
- Provide specific, actionable feedback
- Acknowledge good practices and improvements
## 📞 Getting Help
- **GitHub Issues**: For bugs, feature requests, and questions
- **Architecture Questions**: Use the GitHub discussions
## 🎖️ Recognition
Contributors receive:
- **Attribution**: Recognition in release notes and documentation
- **Maintainer Track**: Path to maintainer role for consistent contributors
- **Community Impact**: Help improve AI development workflows for thousands of users
---
**Ready to contribute?** Start by exploring the codebase, reading the architecture documentation, and finding an area that interests you. Every contribution makes Archon better for the entire AI development community.
================================================
FILE: LICENSE
================================================
Archon Community License (ACL) v1.2
Copyright © 2025 The Archon Project Community
Maintained by the [Dynamous community](https://dynamous.ai)
Archon is **free, open, and hackable.** Run it, fork it, and share it — no strings attached — except one: **don’t sell it as‑a‑service without talking to us first.**
---
### 1 You Can
* **Run** Archon anywhere, for anything, for free.
* **Study & tweak** the code, add features, change the UI—go wild.
* **Share** your changes or forks publicly (must keep this license in place).
### 2 Please Do
* Keep this license notice and a link back to the main repo.
* Mark clearly if you’ve modified Archon.
### 3 You Can’t (Without Permission)
* Charge money for Archon itself—e.g. paid downloads, paywalled builds, or subscriptions.
* Offer Archon (original or modified) as a hosted or managed service that others can sign up for.
* Bundle Archon into another paid product.
> **Consulting/support is totally fine.** Get paid to install, customise, or teach Archon as long as your clients don’t get a hosted Archon instance run by you.
### 4 No Warranty
Archon comes **as‑is** with **no warranty** of any kind.
### 5 Limitation of Liability
We’re **not liable** for any damages resulting from using Archon.
### 6 Breaking the Rules
If you violate these terms and don’t fix it within **30 days** after we let you know, your rights under this license end.
================================================
FILE: Makefile
================================================
# Archon Makefile - Simple, Secure, Cross-Platform
SHELL := /bin/bash
.SHELLFLAGS := -ec
# Docker compose command - prefer newer 'docker compose' plugin over standalone 'docker-compose'
COMPOSE ?= $(shell docker compose version >/dev/null 2>&1 && echo "docker compose" || echo "docker-compose")
.PHONY: help dev dev-docker dev-docker-full dev-work-orders dev-hybrid-work-orders stop test test-fe test-be lint lint-fe lint-be clean install check agent-work-orders
help:
@echo "Archon Development Commands"
@echo "==========================="
@echo " make dev - Backend in Docker, frontend local (recommended)"
@echo " make dev-docker - Backend + frontend in Docker"
@echo " make dev-docker-full - Everything in Docker (server + mcp + ui + work orders)"
@echo " make dev-hybrid-work-orders - Server + MCP in Docker, UI + work orders local (2 terminals)"
@echo " make dev-work-orders - Backend in Docker, agent work orders local, frontend local"
@echo " make agent-work-orders - Run agent work orders service locally"
@echo " make stop - Stop all services"
@echo " make test - Run all tests"
@echo " make test-fe - Run frontend tests only"
@echo " make test-be - Run backend tests only"
@echo " make lint - Run all linters"
@echo " make lint-fe - Run frontend linter only"
@echo " make lint-be - Run backend linter only"
@echo " make clean - Remove containers and volumes"
@echo " make install - Install dependencies"
@echo " make check - Check environment setup"
# Install dependencies
install:
@echo "Installing dependencies..."
@cd archon-ui-main && npm install
@cd python && uv sync --group all --group dev
@echo "✓ Dependencies installed"
# Check environment
check:
@echo "Checking environment..."
@node -v >/dev/null 2>&1 || { echo "✗ Node.js not found (require Node 18+)."; exit 1; }
@node check-env.js
@echo "Checking Docker..."
@docker --version > /dev/null 2>&1 || { echo "✗ Docker not found"; exit 1; }
@$(COMPOSE) version > /dev/null 2>&1 || { echo "✗ Docker Compose not found"; exit 1; }
@echo "✓ Environment OK"
# Hybrid development (recommended)
dev: check
@echo "Starting hybrid development..."
@echo "Backend: Docker | Frontend: Local with hot reload"
@$(COMPOSE) --profile backend up -d --build
@set -a; [ -f .env ] && . ./.env; set +a; \
echo "Backend running at http://$${HOST:-localhost}:$${ARCHON_SERVER_PORT:-8181}"
@echo "Starting frontend..."
@cd archon-ui-main && \
VITE_ARCHON_SERVER_PORT=$${ARCHON_SERVER_PORT:-8181} \
VITE_ARCHON_SERVER_HOST=$${HOST:-} \
npm run dev
# Full Docker development (backend + frontend, no work orders)
dev-docker: check
@echo "Starting Docker environment (backend + frontend)..."
@$(COMPOSE) --profile full up -d --build
@echo "✓ Services running"
@echo "Frontend: http://localhost:3737"
@echo "API: http://localhost:8181"
# Full Docker with all services (server + mcp + ui + agent work orders)
dev-docker-full: check
@echo "Starting full Docker environment with agent work orders..."
@$(COMPOSE) up archon-server archon-mcp archon-frontend archon-agent-work-orders -d --build
@set -a; [ -f .env ] && . ./.env; set +a; \
echo "✓ All services running"; \
echo "Frontend: http://localhost:3737"; \
echo "API: http://$${HOST:-localhost}:$${ARCHON_SERVER_PORT:-8181}"; \
echo "MCP: http://$${HOST:-localhost}:$${ARCHON_MCP_PORT:-8051}"; \
echo "Agent Work Orders: http://$${HOST:-localhost}:$${AGENT_WORK_ORDERS_PORT:-8053}"
# Agent work orders service locally (standalone)
agent-work-orders:
@echo "Starting Agent Work Orders service locally..."
@set -a; [ -f .env ] && . ./.env; set +a; \
export SERVICE_DISCOVERY_MODE=local; \
export ARCHON_SERVER_URL=http://localhost:$${ARCHON_SERVER_PORT:-8181}; \
export ARCHON_MCP_URL=http://localhost:$${ARCHON_MCP_PORT:-8051}; \
export AGENT_WORK_ORDERS_PORT=$${AGENT_WORK_ORDERS_PORT:-8053}; \
cd python && uv run python -m uvicorn src.agent_work_orders.server:app --host 0.0.0.0 --port $${AGENT_WORK_ORDERS_PORT:-8053} --reload
# Hybrid development with agent work orders (backend in Docker, agent work orders local, frontend local)
dev-work-orders: check
@echo "Starting hybrid development with agent work orders..."
@echo "Backend: Docker | Agent Work Orders: Local | Frontend: Local"
@$(COMPOSE) up archon-server archon-mcp -d --build
@set -a; [ -f .env ] && . ./.env; set +a; \
echo "Backend running at http://$${HOST:-localhost}:$${ARCHON_SERVER_PORT:-8181}"; \
echo "Starting agent work orders service..."; \
echo "Run in separate terminal: make agent-work-orders"; \
echo "Starting frontend..."; \
cd archon-ui-main && \
VITE_ARCHON_SERVER_PORT=$${ARCHON_SERVER_PORT:-8181} \
VITE_ARCHON_SERVER_HOST=$${HOST:-} \
npm run dev
# Hybrid development: Server + MCP in Docker, UI + Work Orders local (requires 2 terminals)
dev-hybrid-work-orders: check
@echo "Starting hybrid development: Server + MCP in Docker, UI + Work Orders local"
@echo "================================================================"
@$(COMPOSE) up archon-server archon-mcp -d --build
@set -a; [ -f .env ] && . ./.env; set +a; \
echo ""; \
echo "✓ Server + MCP running in Docker"; \
echo " Server: http://$${HOST:-localhost}:$${ARCHON_SERVER_PORT:-8181}"; \
echo " MCP: http://$${HOST:-localhost}:$${ARCHON_MCP_PORT:-8051}"; \
echo ""; \
echo "Next steps:"; \
echo " 1. Terminal 1 (this one): Press Ctrl+C when done"; \
echo " 2. Terminal 2: make agent-work-orders"; \
echo " 3. Terminal 3: cd archon-ui-main && npm run dev"; \
echo ""; \
echo "Or use 'make dev-docker-full' to run everything in Docker."; \
@read -p "Press Enter to continue or Ctrl+C to stop..." _
# Stop all services
stop:
@echo "Stopping all services..."
@$(COMPOSE) --profile backend --profile frontend --profile full --profile work-orders down
@echo "✓ Services stopped"
# Run all tests
test: test-fe test-be
# Run frontend tests
test-fe:
@echo "Running frontend tests..."
@cd archon-ui-main && npm test
# Run backend tests
test-be:
@echo "Running backend tests..."
@cd python && uv run pytest
# Run all linters
lint: lint-fe lint-be
# Run frontend linter
lint-fe:
@echo "Linting frontend..."
@cd archon-ui-main && npm run lint
# Run backend linter
lint-be:
@echo "Linting backend..."
@cd python && uv run ruff check --fix
# Clean everything (with confirmation)
clean:
@echo "⚠️ This will remove all containers and volumes"
@read -p "Are you sure? (y/N) " -n 1 -r; \
echo; \
if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
$(COMPOSE) down -v --remove-orphans; \
echo "✓ Cleaned"; \
else \
echo "Cancelled"; \
fi
.DEFAULT_GOAL := help
================================================
FILE: PRPs/ai_docs/AGENT_WORK_ORDERS_SSE_AND_ZUSTAND.md
================================================
# Agent Work Orders: SSE + Zustand State Management Standards
## Purpose
This document defines the **complete architecture, patterns, and standards** for implementing Zustand state management with Server-Sent Events (SSE) in the Agent Work Orders feature. It serves as the authoritative reference for:
- State management boundaries (what goes in Zustand vs TanStack Query vs local useState)
- SSE integration patterns and connection management
- Zustand slice organization and naming conventions
- Anti-patterns to avoid
- Migration strategy and implementation plan
**This is a pilot feature** - patterns established here will be applied to other features (Knowledge Base, Projects, Settings).
---
## Current State Analysis
### Component Structure
- **Total Lines:** ~4,400 lines
- **Components:** 10 (RepositoryCard, WorkOrderTable,
gitextract_rpa0i55w/
├── .claude/
│ ├── agents/
│ │ ├── codebase-analyst.md
│ │ └── library-researcher.md
│ └── commands/
│ ├── agent-work-orders/
│ │ ├── commit.md
│ │ ├── execute.md
│ │ ├── noqa.md
│ │ ├── planning.md
│ │ ├── prime.md
│ │ ├── prp-review.md
│ │ └── start-server.md
│ ├── archon/
│ │ ├── archon-alpha-review.md
│ │ ├── archon-coderabbit-helper.md
│ │ ├── archon-onboarding.md
│ │ ├── archon-prime-simple.md
│ │ ├── archon-prime.md
│ │ ├── archon-rca.md
│ │ └── archon-ui-consistency-review.md
│ ├── prp-any-agent/
│ │ ├── prp-any-cli-create.md
│ │ └── prp-any-cli-execute.md
│ └── prp-claude-code/
│ ├── prp-claude-code-create.md
│ ├── prp-claude-code-execute.md
│ ├── prp-story-task-create.md
│ └── prp-story-task-execute.md
├── .dockerignore
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── auto_bug_report.md
│ │ └── bug_report.yml
│ ├── RELEASE_NOTES_SETUP.md
│ ├── pull_request_template.md
│ ├── test-release-notes.sh
│ └── workflows/
│ ├── ci.yml
│ ├── claude-fix.yml
│ ├── claude-review.yml
│ └── release-notes.yml
├── .gitignore
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── PRPs/
│ ├── ai_docs/
│ │ ├── AGENT_WORK_ORDERS_SSE_AND_ZUSTAND.md
│ │ ├── API_NAMING_CONVENTIONS.md
│ │ ├── ARCHITECTURE.md
│ │ ├── DATA_FETCHING_ARCHITECTURE.md
│ │ ├── ETAG_IMPLEMENTATION.md
│ │ ├── QUERY_PATTERNS.md
│ │ ├── UI_STANDARDS.md
│ │ ├── ZUSTAND_STATE_MANAGEMENT.md
│ │ ├── cc_cli_ref.md
│ │ └── optimistic_updates.md
│ └── templates/
│ ├── prp_base.md
│ └── prp_story_task.md
├── README.md
├── archon-example-workflow/
│ ├── .claude/
│ │ ├── agents/
│ │ │ ├── codebase-analyst.md
│ │ │ └── validator.md
│ │ └── commands/
│ │ ├── create-plan.md
│ │ ├── execute-plan.md
│ │ └── primer.md
│ ├── CLAUDE.md
│ └── README.md
├── archon-ui-main/
│ ├── .dockerignore
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── Dockerfile
│ ├── README.md
│ ├── biome.json
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.js
│ ├── src/
│ │ ├── App.tsx
│ │ ├── components/
│ │ │ ├── BackendStartupError.tsx
│ │ │ ├── DisconnectScreenOverlay.tsx
│ │ │ ├── agent-chat/
│ │ │ │ └── ArchonChatPanel.tsx
│ │ │ ├── animations/
│ │ │ │ ├── Animations.tsx
│ │ │ │ └── DisconnectScreenAnimations.tsx
│ │ │ ├── bug-report/
│ │ │ │ ├── BugReportButton.tsx
│ │ │ │ ├── BugReportModal.tsx
│ │ │ │ └── ErrorBoundaryWithBugReport.tsx
│ │ │ ├── code/
│ │ │ │ └── CodeViewerModal.tsx
│ │ │ ├── common/
│ │ │ │ └── DeleteConfirmModal.tsx
│ │ │ ├── layout/
│ │ │ │ ├── MainLayout.tsx
│ │ │ │ ├── Navigation.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ └── useBackendHealth.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── onboarding/
│ │ │ │ └── ProviderStep.tsx
│ │ │ ├── settings/
│ │ │ │ ├── APIKeysSection.tsx
│ │ │ │ ├── ButtonPlayground.tsx
│ │ │ │ ├── CodeExtractionSettings.tsx
│ │ │ │ ├── FeaturesSection.tsx
│ │ │ │ ├── IDEGlobalRules.tsx
│ │ │ │ ├── OllamaConfigurationPanel.tsx
│ │ │ │ ├── OllamaInstanceHealthIndicator.tsx
│ │ │ │ ├── OllamaModelDiscoveryModal.tsx
│ │ │ │ ├── OllamaModelSelectionModal.tsx
│ │ │ │ ├── RAGSettings.tsx
│ │ │ │ └── types/
│ │ │ │ └── OllamaTypes.ts
│ │ │ └── ui/
│ │ │ ├── Badge.tsx
│ │ │ ├── Button.tsx
│ │ │ ├── Card.tsx
│ │ │ ├── Checkbox.tsx
│ │ │ ├── CollapsibleSettingsCard.tsx
│ │ │ ├── CoverageVisualization.tsx
│ │ │ ├── GlassCrawlDepthSelector.tsx
│ │ │ ├── Input.tsx
│ │ │ ├── MigrationBanner.tsx
│ │ │ ├── NeonButton.tsx
│ │ │ ├── PowerButton.tsx
│ │ │ ├── Select.tsx
│ │ │ ├── ThemeToggle.tsx
│ │ │ └── Toggle.tsx
│ │ ├── config/
│ │ │ └── api.ts
│ │ ├── contexts/
│ │ │ ├── SettingsContext.tsx
│ │ │ └── ThemeContext.tsx
│ │ ├── env.d.ts
│ │ ├── features/
│ │ │ ├── agent-work-orders/
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddRepositoryModal.tsx
│ │ │ │ │ ├── CreateWorkOrderModal.tsx
│ │ │ │ │ ├── EditRepositoryModal.tsx
│ │ │ │ │ ├── ExecutionLogs.tsx
│ │ │ │ │ ├── RealTimeStats.tsx
│ │ │ │ │ ├── RepositoryCard.tsx
│ │ │ │ │ ├── SidebarRepositoryCard.tsx
│ │ │ │ │ ├── StepHistoryCard.tsx
│ │ │ │ │ ├── WorkOrderRow.tsx
│ │ │ │ │ ├── WorkOrderTable.tsx
│ │ │ │ │ ├── WorkflowStepButton.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ ├── CreateWorkOrderModal.test.tsx
│ │ │ │ │ └── RepositoryCard.test.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── useAgentWorkOrderQueries.test.tsx
│ │ │ │ │ │ └── useRepositoryQueries.test.tsx
│ │ │ │ │ ├── useAgentWorkOrderQueries.ts
│ │ │ │ │ └── useRepositoryQueries.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── agentWorkOrdersService.test.ts
│ │ │ │ │ │ └── repositoryService.test.ts
│ │ │ │ │ ├── agentWorkOrdersService.ts
│ │ │ │ │ └── repositoryService.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── agentWorkOrdersStore.test.ts
│ │ │ │ │ │ └── sseIntegration.test.ts
│ │ │ │ │ ├── agentWorkOrdersStore.ts
│ │ │ │ │ └── slices/
│ │ │ │ │ ├── filtersSlice.ts
│ │ │ │ │ ├── modalsSlice.ts
│ │ │ │ │ ├── sseSlice.ts
│ │ │ │ │ └── uiPreferencesSlice.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── repository.ts
│ │ │ │ └── views/
│ │ │ │ ├── AgentWorkOrderDetailView.tsx
│ │ │ │ └── AgentWorkOrdersView.tsx
│ │ │ ├── knowledge/
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddKnowledgeDialog.tsx
│ │ │ │ │ ├── KnowledgeCard.tsx
│ │ │ │ │ ├── KnowledgeCardActions.tsx
│ │ │ │ │ ├── KnowledgeCardTags.tsx
│ │ │ │ │ ├── KnowledgeCardTitle.tsx
│ │ │ │ │ ├── KnowledgeCardType.tsx
│ │ │ │ │ ├── KnowledgeHeader.tsx
│ │ │ │ │ ├── KnowledgeList.tsx
│ │ │ │ │ ├── KnowledgeTable.tsx
│ │ │ │ │ ├── KnowledgeTypeSelector.tsx
│ │ │ │ │ ├── LevelSelector.tsx
│ │ │ │ │ ├── TagInput.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useKnowledgeQueries.test.ts
│ │ │ │ │ └── useKnowledgeQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── inspector/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── ContentViewer.tsx
│ │ │ │ │ │ ├── InspectorHeader.tsx
│ │ │ │ │ │ ├── InspectorSidebar.tsx
│ │ │ │ │ │ ├── KnowledgeInspector.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useInspectorData.ts
│ │ │ │ │ │ ├── useInspectorPagination.ts
│ │ │ │ │ │ └── usePaginatedInspectorData.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── knowledgeService.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── knowledge.ts
│ │ │ │ ├── utils/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── knowledge-utils.ts
│ │ │ │ │ ├── providerErrorHandler.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── providerErrorHandler.test.ts
│ │ │ │ └── views/
│ │ │ │ ├── KnowledgeView.tsx
│ │ │ │ ├── KnowledgeViewWithBoundary.tsx
│ │ │ │ └── index.ts
│ │ │ ├── mcp/
│ │ │ │ ├── components/
│ │ │ │ │ ├── McpClientList.tsx
│ │ │ │ │ ├── McpConfigSection.tsx
│ │ │ │ │ ├── McpStatusBar.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useMcpQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── mcpApi.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── mcp.ts
│ │ │ │ └── views/
│ │ │ │ ├── McpView.tsx
│ │ │ │ └── McpViewWithBoundary.tsx
│ │ │ ├── progress/
│ │ │ │ ├── components/
│ │ │ │ │ ├── CrawlingProgress.tsx
│ │ │ │ │ ├── KnowledgeCardProgress.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useProgressQueries.test.ts
│ │ │ │ │ └── useProgressQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── progressService.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── progress.ts
│ │ │ │ └── utils/
│ │ │ │ └── urlValidation.ts
│ │ │ ├── projects/
│ │ │ │ ├── components/
│ │ │ │ │ ├── NewProjectModal.tsx
│ │ │ │ │ ├── ProjectCard.tsx
│ │ │ │ │ ├── ProjectCardActions.tsx
│ │ │ │ │ ├── ProjectHeader.tsx
│ │ │ │ │ ├── ProjectList.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── ProjectCard.test.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ ├── DocsTab.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── AddDocumentModal.tsx
│ │ │ │ │ │ ├── DocumentCard.tsx
│ │ │ │ │ │ ├── DocumentViewer.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useDocumentQueries.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ └── documentService.ts
│ │ │ │ │ └── types/
│ │ │ │ │ ├── document.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useProjectQueries.test.ts
│ │ │ │ │ └── useProjectQueries.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── schemas/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── projectService.ts
│ │ │ │ ├── shared/
│ │ │ │ │ └── api.ts
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── TasksTab.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── EditableTableCell.tsx
│ │ │ │ │ │ ├── FeatureSelect.tsx
│ │ │ │ │ │ ├── KanbanColumn.tsx
│ │ │ │ │ │ ├── TaskAssignee.tsx
│ │ │ │ │ │ ├── TaskCard.tsx
│ │ │ │ │ │ ├── TaskCardActions.tsx
│ │ │ │ │ │ ├── TaskEditModal.tsx
│ │ │ │ │ │ ├── TaskPriorityComponent.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── tests/
│ │ │ │ │ │ │ └── useTaskQueries.test.ts
│ │ │ │ │ │ ├── useTaskActions.ts
│ │ │ │ │ │ ├── useTaskEditor.ts
│ │ │ │ │ │ └── useTaskQueries.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── schemas/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── taskService.ts
│ │ │ │ │ │ └── tests/
│ │ │ │ │ │ └── taskService.test.ts
│ │ │ │ │ ├── types/
│ │ │ │ │ │ ├── hooks.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── priority.ts
│ │ │ │ │ │ └── task.ts
│ │ │ │ │ ├── utils/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── task-ordering.ts
│ │ │ │ │ │ └── task-styles.tsx
│ │ │ │ │ └── views/
│ │ │ │ │ ├── BoardView.tsx
│ │ │ │ │ ├── TableView.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── project.ts
│ │ │ │ ├── utils/
│ │ │ │ │ └── index.ts
│ │ │ │ └── views/
│ │ │ │ ├── ProjectsView.tsx
│ │ │ │ └── ProjectsViewWithBoundary.tsx
│ │ │ ├── settings/
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── MigrationStatusCard.tsx
│ │ │ │ │ │ └── PendingMigrationsModal.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ └── useMigrationQueries.ts
│ │ │ │ │ ├── services/
│ │ │ │ │ │ └── migrationService.ts
│ │ │ │ │ └── types/
│ │ │ │ │ └── index.ts
│ │ │ │ └── version/
│ │ │ │ ├── components/
│ │ │ │ │ ├── UpdateBanner.tsx
│ │ │ │ │ └── VersionStatusCard.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ └── useVersionQueries.ts
│ │ │ │ ├── services/
│ │ │ │ │ └── versionService.ts
│ │ │ │ └── types/
│ │ │ │ └── index.ts
│ │ │ ├── shared/
│ │ │ │ ├── api/
│ │ │ │ │ ├── apiClient.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── apiClient.test.ts
│ │ │ │ ├── config/
│ │ │ │ │ ├── queryClient.ts
│ │ │ │ │ └── queryPatterns.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── useSmartPolling.test.ts
│ │ │ │ │ ├── useSmartPolling.ts
│ │ │ │ │ ├── useThemeAware.ts
│ │ │ │ │ └── useToast.ts
│ │ │ │ ├── types/
│ │ │ │ │ └── errors.ts
│ │ │ │ └── utils/
│ │ │ │ ├── clipboard.ts
│ │ │ │ ├── optimistic.ts
│ │ │ │ └── tests/
│ │ │ │ └── optimistic.test.ts
│ │ │ ├── style-guide/
│ │ │ │ ├── components/
│ │ │ │ │ └── StyleGuideView.tsx
│ │ │ │ ├── components.json
│ │ │ │ ├── index.ts
│ │ │ │ ├── layouts/
│ │ │ │ │ ├── AgentWorkOrderExample.tsx
│ │ │ │ │ ├── AgentWorkOrderLayoutExample.tsx
│ │ │ │ │ ├── DocumentBrowserExample.tsx
│ │ │ │ │ ├── KnowledgeLayoutExample.tsx
│ │ │ │ │ ├── NavigationExplanation.tsx
│ │ │ │ │ ├── ProjectsLayoutExample.tsx
│ │ │ │ │ ├── SettingsLayoutExample.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── ExecutionLogsExample.tsx
│ │ │ │ │ ├── RealTimeStatsExample.tsx
│ │ │ │ │ ├── StepHistoryCard.tsx
│ │ │ │ │ └── WorkflowStepButton.tsx
│ │ │ │ ├── shared/
│ │ │ │ │ └── SideNavigation.tsx
│ │ │ │ ├── showcases/
│ │ │ │ │ ├── StaticButtons.tsx
│ │ │ │ │ ├── StaticCards.tsx
│ │ │ │ │ ├── StaticColors.tsx
│ │ │ │ │ ├── StaticEffects.tsx
│ │ │ │ │ ├── StaticForms.tsx
│ │ │ │ │ ├── StaticSpacing.tsx
│ │ │ │ │ ├── StaticTables.tsx
│ │ │ │ │ ├── StaticToggles.tsx
│ │ │ │ │ └── StaticTypography.tsx
│ │ │ │ ├── standards/
│ │ │ │ │ └── modalStandards.ts
│ │ │ │ ├── tabs/
│ │ │ │ │ ├── LayoutsTab.tsx
│ │ │ │ │ └── StyleGuideTab.tsx
│ │ │ │ └── types/
│ │ │ │ └── index.ts
│ │ │ ├── testing/
│ │ │ │ └── test-utils.tsx
│ │ │ └── ui/
│ │ │ ├── components/
│ │ │ │ ├── DeleteConfirmModal.tsx
│ │ │ │ ├── FeatureErrorBoundary.tsx
│ │ │ │ ├── ToastProvider.tsx
│ │ │ │ └── index.ts
│ │ │ └── primitives/
│ │ │ ├── OptimisticIndicator.tsx
│ │ │ ├── alert-dialog.tsx
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── checkbox.tsx
│ │ │ ├── combobox.tsx
│ │ │ ├── data-card.tsx
│ │ │ ├── dialog.tsx
│ │ │ ├── draggable-card.tsx
│ │ │ ├── dropdown-menu.tsx
│ │ │ ├── grouped-card.tsx
│ │ │ ├── index.ts
│ │ │ ├── input.tsx
│ │ │ ├── inspector-dialog.tsx
│ │ │ ├── label.tsx
│ │ │ ├── pill-navigation.tsx
│ │ │ ├── pill.tsx
│ │ │ ├── radio-group.tsx
│ │ │ ├── select.tsx
│ │ │ ├── selectable-card.tsx
│ │ │ ├── styles.ts
│ │ │ ├── switch.tsx
│ │ │ ├── tabs.tsx
│ │ │ ├── toast.tsx
│ │ │ ├── toggle-group.tsx
│ │ │ └── tooltip.tsx
│ │ ├── hooks/
│ │ │ ├── useBugReport.ts
│ │ │ ├── useMigrationStatus.ts
│ │ │ └── useStaggeredEntrance.ts
│ │ ├── index.css
│ │ ├── index.tsx
│ │ ├── lib/
│ │ │ └── utils.ts
│ │ ├── pages/
│ │ │ ├── AgentWorkOrderDetailPage.tsx
│ │ │ ├── AgentWorkOrdersPage.tsx
│ │ │ ├── KnowledgeBasePage.tsx
│ │ │ ├── MCPPage.tsx
│ │ │ ├── OnboardingPage.tsx
│ │ │ ├── ProjectPage.tsx
│ │ │ ├── SettingsPage.tsx
│ │ │ └── StyleGuidePage.tsx
│ │ ├── services/
│ │ │ ├── agentChatService.ts
│ │ │ ├── bugReportService.ts
│ │ │ ├── credentialsService.ts
│ │ │ ├── ollamaService.ts
│ │ │ ├── openrouterService.ts
│ │ │ └── serverHealthService.ts
│ │ ├── styles/
│ │ │ ├── card-animations.css
│ │ │ ├── luminous-button.css
│ │ │ └── toggle.css
│ │ └── utils/
│ │ └── onboarding.ts
│ ├── tailwind.config.js
│ ├── tests/
│ │ ├── README.md
│ │ ├── integration/
│ │ │ ├── knowledge/
│ │ │ │ ├── knowledge-api.test.ts
│ │ │ │ └── progress-api.test.ts
│ │ │ └── setup.ts
│ │ ├── manual/
│ │ │ └── test-knowledge-api.ts
│ │ └── setup.ts
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── tsconfig.prod.json
│ ├── vite.config.ts
│ ├── vitest.config.ts
│ └── vitest.integration.config.ts
├── check-env.js
├── docker-compose.yml
├── migration/
│ ├── 0.1.0/
│ │ ├── 001_add_source_url_display_name.sql
│ │ ├── 002_add_hybrid_search_tsvector.sql
│ │ ├── 003_ollama_add_columns.sql
│ │ ├── 004_ollama_migrate_data.sql
│ │ ├── 005_ollama_create_functions.sql
│ │ ├── 006_ollama_create_indexes_optional.sql
│ │ ├── 007_add_priority_column_to_tasks.sql
│ │ ├── 008_add_migration_tracking.sql
│ │ ├── 009_add_cascade_delete_constraints.sql
│ │ ├── 010_add_provider_placeholders.sql
│ │ ├── 011_add_page_metadata_table.sql
│ │ └── DB_UPGRADE_INSTRUCTIONS.md
│ ├── AGENT_WORK_ORDERS.md
│ ├── RESET_DB.sql
│ ├── agent_work_orders_repositories.sql
│ ├── agent_work_orders_state.sql
│ ├── backup_database.sql
│ └── complete_setup.sql
└── python/
├── .claude/
│ └── commands/
│ └── agent-work-orders/
│ ├── commit.md
│ ├── create-branch.md
│ ├── create-pr.md
│ ├── execute.md
│ ├── noqa.md
│ ├── planning.md
│ ├── prime.md
│ ├── prp-review.md
│ └── start-server.md
├── .dockerignore
├── .gitignore
├── Dockerfile.agent-work-orders
├── Dockerfile.agents
├── Dockerfile.mcp
├── Dockerfile.server
├── pyproject.toml
├── pyrightconfig.json
├── pytest.ini
├── src/
│ ├── __init__.py
│ ├── agent_work_orders/
│ │ ├── CLAUDE.md
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent_executor/
│ │ │ ├── __init__.py
│ │ │ └── agent_cli_executor.py
│ │ ├── api/
│ │ │ ├── __init__.py
│ │ │ ├── routes.py
│ │ │ └── sse_streams.py
│ │ ├── command_loader/
│ │ │ ├── __init__.py
│ │ │ └── claude_command_loader.py
│ │ ├── config.py
│ │ ├── database/
│ │ │ ├── __init__.py
│ │ │ └── client.py
│ │ ├── github_integration/
│ │ │ ├── __init__.py
│ │ │ └── github_client.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── sandbox_manager/
│ │ │ ├── __init__.py
│ │ │ ├── git_branch_sandbox.py
│ │ │ ├── git_worktree_sandbox.py
│ │ │ ├── sandbox_factory.py
│ │ │ └── sandbox_protocol.py
│ │ ├── server.py
│ │ ├── state_manager/
│ │ │ ├── __init__.py
│ │ │ ├── file_state_repository.py
│ │ │ ├── repository_config_repository.py
│ │ │ ├── repository_factory.py
│ │ │ ├── supabase_repository.py
│ │ │ └── work_order_repository.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── git_operations.py
│ │ │ ├── id_generator.py
│ │ │ ├── log_buffer.py
│ │ │ ├── port_allocation.py
│ │ │ ├── state_reconciliation.py
│ │ │ ├── structured_logger.py
│ │ │ └── worktree_operations.py
│ │ └── workflow_engine/
│ │ ├── __init__.py
│ │ ├── agent_names.py
│ │ ├── workflow_operations.py
│ │ └── workflow_orchestrator.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── base_agent.py
│ │ ├── document_agent.py
│ │ ├── mcp_client.py
│ │ ├── rag_agent.py
│ │ └── server.py
│ ├── mcp_server/
│ │ ├── __init__.py
│ │ ├── features/
│ │ │ ├── documents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── document_tools.py
│ │ │ │ └── version_tools.py
│ │ │ ├── feature_tools.py
│ │ │ ├── projects/
│ │ │ │ ├── __init__.py
│ │ │ │ └── project_tools.py
│ │ │ ├── rag/
│ │ │ │ ├── __init__.py
│ │ │ │ └── rag_tools.py
│ │ │ └── tasks/
│ │ │ ├── __init__.py
│ │ │ └── task_tools.py
│ │ ├── mcp_server.py
│ │ ├── models.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── error_handling.py
│ │ ├── http_client.py
│ │ └── timeout_config.py
│ └── server/
│ ├── __init__.py
│ ├── api_routes/
│ │ ├── __init__.py
│ │ ├── agent_chat_api.py
│ │ ├── agent_work_orders_proxy.py
│ │ ├── bug_report_api.py
│ │ ├── internal_api.py
│ │ ├── knowledge_api.py
│ │ ├── mcp_api.py
│ │ ├── migration_api.py
│ │ ├── ollama_api.py
│ │ ├── openrouter_api.py
│ │ ├── pages_api.py
│ │ ├── progress_api.py
│ │ ├── projects_api.py
│ │ ├── providers_api.py
│ │ ├── settings_api.py
│ │ └── version_api.py
│ ├── config/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── logfire_config.py
│ │ ├── service_discovery.py
│ │ └── version.py
│ ├── main.py
│ ├── middleware/
│ │ └── logging_middleware.py
│ ├── models/
│ │ └── progress_models.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── client_manager.py
│ │ ├── crawler_manager.py
│ │ ├── crawling/
│ │ │ ├── __init__.py
│ │ │ ├── code_extraction_service.py
│ │ │ ├── crawling_service.py
│ │ │ ├── discovery_service.py
│ │ │ ├── document_storage_operations.py
│ │ │ ├── helpers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── llms_full_parser.py
│ │ │ │ ├── site_config.py
│ │ │ │ └── url_handler.py
│ │ │ ├── page_storage_operations.py
│ │ │ ├── progress_mapper.py
│ │ │ └── strategies/
│ │ │ ├── __init__.py
│ │ │ ├── batch.py
│ │ │ ├── recursive.py
│ │ │ ├── single_page.py
│ │ │ └── sitemap.py
│ │ ├── credential_service.py
│ │ ├── embeddings/
│ │ │ ├── __init__.py
│ │ │ ├── contextual_embedding_service.py
│ │ │ ├── embedding_exceptions.py
│ │ │ ├── embedding_service.py
│ │ │ ├── multi_dimensional_embedding_service.py
│ │ │ └── provider_error_adapters.py
│ │ ├── knowledge/
│ │ │ ├── __init__.py
│ │ │ ├── database_metrics_service.py
│ │ │ ├── knowledge_item_service.py
│ │ │ └── knowledge_summary_service.py
│ │ ├── llm_provider_service.py
│ │ ├── mcp_service_client.py
│ │ ├── mcp_session_manager.py
│ │ ├── migration_service.py
│ │ ├── ollama/
│ │ │ ├── __init__.py
│ │ │ ├── embedding_router.py
│ │ │ └── model_discovery_service.py
│ │ ├── openrouter_discovery_service.py
│ │ ├── projects/
│ │ │ ├── __init__.py
│ │ │ ├── document_service.py
│ │ │ ├── project_creation_service.py
│ │ │ ├── project_service.py
│ │ │ ├── source_linking_service.py
│ │ │ ├── task_service.py
│ │ │ └── versioning_service.py
│ │ ├── prompt_service.py
│ │ ├── provider_discovery_service.py
│ │ ├── search/
│ │ │ ├── __init__.py
│ │ │ ├── agentic_rag_strategy.py
│ │ │ ├── base_search_strategy.py
│ │ │ ├── hybrid_search_strategy.py
│ │ │ ├── keyword_extractor.py
│ │ │ ├── rag_service.py
│ │ │ └── reranking_strategy.py
│ │ ├── source_management_service.py
│ │ ├── storage/
│ │ │ ├── __init__.py
│ │ │ ├── base_storage_service.py
│ │ │ ├── code_storage_service.py
│ │ │ ├── document_storage_service.py
│ │ │ └── storage_services.py
│ │ ├── threading_service.py
│ │ └── version_service.py
│ └── utils/
│ ├── __init__.py
│ ├── document_processing.py
│ ├── etag_utils.py
│ ├── progress/
│ │ ├── __init__.py
│ │ └── progress_tracker.py
│ └── semantic_version.py
└── tests/
├── __init__.py
├── agent_work_orders/
│ ├── conftest.py
│ ├── pytest.ini
│ ├── test_agent_executor.py
│ ├── test_api.py
│ ├── test_command_loader.py
│ ├── test_config.py
│ ├── test_github_integration.py
│ ├── test_id_generator.py
│ ├── test_log_buffer.py
│ ├── test_models.py
│ ├── test_port_allocation.py
│ ├── test_repository_config_repository.py
│ ├── test_sandbox_manager.py
│ ├── test_server.py
│ ├── test_sse_streams.py
│ ├── test_state_manager.py
│ ├── test_workflow_operations.py
│ └── test_workflow_orchestrator.py
├── conftest.py
├── mcp_server/
│ ├── __init__.py
│ ├── features/
│ │ ├── __init__.py
│ │ ├── documents/
│ │ │ ├── __init__.py
│ │ │ ├── test_document_tools.py
│ │ │ └── test_version_tools.py
│ │ ├── projects/
│ │ │ ├── __init__.py
│ │ │ └── test_project_tools.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ └── test_task_tools.py
│ │ └── test_feature_tools.py
│ └── utils/
│ ├── __init__.py
│ ├── test_error_handling.py
│ └── test_timeout_config.py
├── progress_tracking/
│ ├── __init__.py
│ ├── integration/
│ │ ├── __init__.py
│ │ ├── test_crawl_orchestration_progress.py
│ │ └── test_document_storage_progress.py
│ ├── test_batch_progress_bug.py
│ ├── test_progress_api.py
│ ├── test_progress_mapper.py
│ ├── test_progress_models.py
│ ├── test_progress_tracker.py
│ └── utils/
│ ├── __init__.py
│ └── test_helpers.py
├── server/
│ ├── __init__.py
│ ├── api_routes/
│ │ ├── __init__.py
│ │ ├── test_bug_report_api.py
│ │ ├── test_mcp_api.py
│ │ ├── test_migration_api.py
│ │ ├── test_projects_api_polling.py
│ │ └── test_version_api.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── projects/
│ │ │ └── __init__.py
│ │ ├── test_llms_full_parser.py
│ │ ├── test_migration_service.py
│ │ └── test_version_service.py
│ └── utils/
│ ├── __init__.py
│ └── test_etag_utils.py
├── test_api_essentials.py
├── test_async_credential_service.py
├── test_async_embedding_service.py
├── test_async_llm_provider_service.py
├── test_async_source_summary.py
├── test_business_logic.py
├── test_code_extraction_source_id.py
├── test_crawl_orchestration_isolated.py
├── test_crawling_service_subdomain.py
├── test_discovery_service.py
├── test_document_storage_metrics.py
├── test_embedding_service_no_zeros.py
├── test_keyword_extraction.py
├── test_knowledge_api_integration.py
├── test_knowledge_api_pagination.py
├── test_llms_txt_link_following.py
├── test_openrouter_discovery.py
├── test_port_configuration.py
├── test_progress_api.py
├── test_rag_simple.py
├── test_rag_strategies.py
├── test_service_integration.py
├── test_settings_api.py
├── test_source_id_refactor.py
├── test_source_race_condition.py
├── test_source_url_shadowing.py
├── test_supabase_validation.py
├── test_task_counts.py
├── test_token_optimization.py
├── test_token_optimization_integration.py
├── test_url_canonicalization.py
└── test_url_handler.py
Showing preview only (289K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2832 symbols across 412 files)
FILE: archon-ui-main/src/App.tsx
function App (line 127) | function App() {
FILE: archon-ui-main/src/components/DisconnectScreenOverlay.tsx
type DisconnectScreenOverlayProps (line 6) | interface DisconnectScreenOverlayProps {
FILE: archon-ui-main/src/components/agent-chat/ArchonChatPanel.tsx
type ArchonChatPanelProps (line 9) | interface ArchonChatPanelProps {
FILE: archon-ui-main/src/components/bug-report/BugReportButton.tsx
type BugReportButtonProps (line 6) | interface BugReportButtonProps {
FILE: archon-ui-main/src/components/bug-report/BugReportModal.tsx
type BugReportModalProps (line 16) | interface BugReportModalProps {
FILE: archon-ui-main/src/components/bug-report/ErrorBoundaryWithBugReport.tsx
type Props (line 8) | interface Props {
type State (line 13) | interface State {
class ErrorBoundaryWithBugReport (line 21) | class ErrorBoundaryWithBugReport extends Component<Props, State> {
method constructor (line 22) | constructor(props: Props) {
method getDerivedStateFromError (line 33) | static getDerivedStateFromError(error: Error): Partial<State> {
method componentDidCatch (line 40) | componentDidCatch(error: Error, errorInfo: ErrorInfo) {
method collectBugContext (line 52) | private async collectBugContext(error: Error) {
method render (line 83) | render() {
FILE: archon-ui-main/src/components/code/CodeViewerModal.tsx
type CodeExample (line 35) | interface CodeExample {
type CodeViewerModalProps (line 44) | interface CodeViewerModalProps {
type TabButtonProps (line 408) | interface TabButtonProps {
FILE: archon-ui-main/src/components/common/DeleteConfirmModal.tsx
type DeleteConfirmModalProps (line 4) | interface DeleteConfirmModalProps {
FILE: archon-ui-main/src/components/layout/MainLayout.tsx
type MainLayoutProps (line 15) | interface MainLayoutProps {
type BackendStatusProps (line 20) | interface BackendStatusProps {
function BackendStatus (line 29) | function BackendStatus({ isHealthLoading, isBackendError, healthData }: ...
function MainLayout (line 64) | function MainLayout({ children, className }: MainLayoutProps) {
function MinimalLayout (line 177) | function MinimalLayout({ children, className }: MainLayoutProps) {
FILE: archon-ui-main/src/components/layout/Navigation.tsx
type NavigationItem (line 10) | interface NavigationItem {
type NavigationProps (line 17) | interface NavigationProps {
function Navigation (line 25) | function Navigation({ className }: NavigationProps) {
FILE: archon-ui-main/src/components/layout/hooks/useBackendHealth.ts
function useBackendHealth (line 10) | function useBackendHealth() {
FILE: archon-ui-main/src/components/layout/types.ts
type NavigationItem (line 3) | interface NavigationItem {
type HealthResponse (line 10) | interface HealthResponse {
type AppSettings (line 19) | interface AppSettings {
type OnboardingCheckResult (line 25) | interface OnboardingCheckResult {
FILE: archon-ui-main/src/components/onboarding/ProviderStep.tsx
type ProviderStepProps (line 9) | interface ProviderStepProps {
FILE: archon-ui-main/src/components/settings/APIKeysSection.tsx
type CustomCredential (line 9) | interface CustomCredential {
FILE: archon-ui-main/src/components/settings/CodeExtractionSettings.tsx
type CodeExtractionSettingsProps (line 9) | interface CodeExtractionSettingsProps {
type CustomCheckboxProps (line 259) | interface CustomCheckboxProps {
FILE: archon-ui-main/src/components/settings/IDEGlobalRules.tsx
type RuleType (line 8) | type RuleType = 'claude' | 'universal';
FILE: archon-ui-main/src/components/settings/OllamaConfigurationPanel.tsx
type OllamaConfigurationPanelProps (line 12) | interface OllamaConfigurationPanelProps {
type ConnectionTestResult (line 19) | interface ConnectionTestResult {
FILE: archon-ui-main/src/components/settings/OllamaModelDiscoveryModal.tsx
type OllamaModelDiscoveryModalProps (line 20) | interface OllamaModelDiscoveryModalProps {
type EnrichedModel (line 29) | interface EnrichedModel extends OllamaModel {
FILE: archon-ui-main/src/components/settings/OllamaModelSelectionModal.tsx
type ContextInfo (line 8) | interface ContextInfo {
type ModelInfo (line 14) | interface ModelInfo {
type OllamaModelSelectionModalProps (line 46) | interface OllamaModelSelectionModalProps {
type CompatibilityBadgeProps (line 56) | interface CompatibilityBadgeProps {
type ModelCardProps (line 101) | interface ModelCardProps {
FILE: archon-ui-main/src/components/settings/RAGSettings.tsx
type ProviderKey (line 15) | type ProviderKey = 'openai' | 'google' | 'ollama' | 'anthropic' | 'grok'...
constant EMBEDDING_CAPABLE_PROVIDERS (line 18) | const EMBEDDING_CAPABLE_PROVIDERS: ProviderKey[] = ['openai', 'google', ...
type ProviderModels (line 20) | interface ProviderModels {
type ProviderModelMap (line 25) | type ProviderModelMap = Record<ProviderKey, ProviderModels>;
constant PROVIDER_MODELS_KEY (line 28) | const PROVIDER_MODELS_KEY = 'archon_provider_models';
constant DEFAULT_OLLAMA_URL (line 111) | const DEFAULT_OLLAMA_URL = 'http://host.docker.internal:11434/v1';
constant PROVIDER_CREDENTIAL_KEYS (line 113) | const PROVIDER_CREDENTIAL_KEYS = [
type ProviderCredentialKey (line 121) | type ProviderCredentialKey = typeof PROVIDER_CREDENTIAL_KEYS[number];
constant CREDENTIAL_PROVIDER_MAP (line 123) | const CREDENTIAL_PROVIDER_MAP: Record<ProviderCredentialKey, ProviderKey...
type RAGSettingsProps (line 141) | interface RAGSettingsProps {
function getDisplayedChatModel (line 2360) | function getDisplayedChatModel(ragSettings: RAGSettingsProps["ragSetting...
function getDisplayedEmbeddingModel (line 2388) | function getDisplayedEmbeddingModel(ragSettings: RAGSettingsProps["ragSe...
function getModelPlaceholder (line 2417) | function getModelPlaceholder(provider: ProviderKey): string {
function getEmbeddingPlaceholder (line 2436) | function getEmbeddingPlaceholder(provider: ProviderKey): string {
type CustomCheckboxProps (line 2455) | interface CustomCheckboxProps {
FILE: archon-ui-main/src/components/settings/types/OllamaTypes.ts
type OllamaInstance (line 9) | interface OllamaInstance {
type OllamaConfiguration (line 29) | interface OllamaConfiguration {
type OllamaModel (line 38) | interface OllamaModel {
type InstanceHealth (line 54) | interface InstanceHealth {
type ModelDiscoveryResults (line 64) | interface ModelDiscoveryResults {
type ModelDiscoveryModalProps (line 77) | interface ModelDiscoveryModalProps {
type HealthIndicatorProps (line 85) | interface HealthIndicatorProps {
type ConfigurationPanelProps (line 92) | interface ConfigurationPanelProps {
type ValidationResult (line 100) | interface ValidationResult {
type ConnectionTestResult (line 107) | interface ConnectionTestResult {
type ModelSelectionState (line 115) | interface ModelSelectionState {
type AddInstanceFormData (line 125) | interface AddInstanceFormData {
type EmbeddingRoute (line 132) | interface EmbeddingRoute {
type InstanceStatistics (line 142) | interface InstanceStatistics {
type OllamaEvent (line 151) | type OllamaEvent =
type OllamaError (line 169) | interface OllamaError {
type OllamaSettings (line 177) | interface OllamaSettings {
FILE: archon-ui-main/src/components/ui/Badge.tsx
type BadgeProps (line 2) | interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
FILE: archon-ui-main/src/components/ui/Button.tsx
type ButtonProps (line 5) | interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonEleme...
FILE: archon-ui-main/src/components/ui/Card.tsx
type CardProps (line 2) | interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
FILE: archon-ui-main/src/components/ui/Checkbox.tsx
type CheckboxProps (line 5) | interface CheckboxProps {
FILE: archon-ui-main/src/components/ui/CollapsibleSettingsCard.tsx
type CollapsibleSettingsCardProps (line 6) | interface CollapsibleSettingsCardProps {
FILE: archon-ui-main/src/components/ui/CoverageVisualization.tsx
type CoverageMetrics (line 5) | interface CoverageMetrics {
type CoverageData (line 12) | interface CoverageData {
type CoverageVisualizationProps (line 18) | interface CoverageVisualizationProps {
type CoverageGaugeProps (line 25) | interface CoverageGaugeProps {
FILE: archon-ui-main/src/components/ui/GlassCrawlDepthSelector.tsx
type GlassCrawlDepthSelectorProps (line 5) | interface GlassCrawlDepthSelectorProps {
FILE: archon-ui-main/src/components/ui/Input.tsx
type InputProps (line 2) | interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
FILE: archon-ui-main/src/components/ui/MigrationBanner.tsx
type MigrationBannerProps (line 5) | interface MigrationBannerProps {
FILE: archon-ui-main/src/components/ui/NeonButton.tsx
type CornerRadius (line 5) | interface CornerRadius {
type GlowIntensity (line 12) | type GlowIntensity = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
type ColorOption (line 13) | type ColorOption = 'none' | 'purple' | 'pink' | 'blue' | 'green' | 'red';
type NeonButtonProps (line 15) | interface NeonButtonProps extends Omit<HTMLMotionProps<'button'>, 'child...
FILE: archon-ui-main/src/components/ui/PowerButton.tsx
type PowerButtonProps (line 4) | interface PowerButtonProps {
FILE: archon-ui-main/src/components/ui/Select.tsx
type SelectProps (line 2) | interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectEleme...
FILE: archon-ui-main/src/components/ui/ThemeToggle.tsx
type ThemeToggleProps (line 4) | interface ThemeToggleProps {
FILE: archon-ui-main/src/components/ui/Toggle.tsx
type ToggleProps (line 3) | interface ToggleProps {
FILE: archon-ui-main/src/config/api.ts
function getApiUrl (line 9) | function getApiUrl(): string {
function getApiBasePath (line 22) | function getApiBasePath(): string {
constant API_BASE_URL (line 35) | const API_BASE_URL = '/api';
constant API_FULL_URL (line 36) | const API_FULL_URL = getApiUrl();
FILE: archon-ui-main/src/contexts/SettingsContext.tsx
type SettingsContextType (line 4) | interface SettingsContextType {
type SettingsProviderProps (line 25) | interface SettingsProviderProps {
FILE: archon-ui-main/src/contexts/ThemeContext.tsx
type Theme (line 2) | type Theme = 'dark' | 'light';
type ThemeContextType (line 3) | interface ThemeContextType {
FILE: archon-ui-main/src/env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {
type ImportMeta (line 9) | interface ImportMeta {
FILE: archon-ui-main/src/features/agent-work-orders/components/AddRepositoryModal.tsx
type AddRepositoryModalProps (line 18) | interface AddRepositoryModalProps {
constant WORKFLOW_STEPS (line 29) | const WORKFLOW_STEPS: { value: WorkflowStep; label: string; description:...
constant DEFAULT_STEPS (line 41) | const DEFAULT_STEPS: WorkflowStep[] = ["create-branch", "planning", "exe...
function AddRepositoryModal (line 43) | function AddRepositoryModal({ open, onOpenChange }: AddRepositoryModalPr...
FILE: archon-ui-main/src/features/agent-work-orders/components/CreateWorkOrderModal.tsx
type CreateWorkOrderModalProps (line 22) | interface CreateWorkOrderModalProps {
constant WORKFLOW_STEPS (line 33) | const WORKFLOW_STEPS: { value: WorkflowStep; label: string; dependsOn?: ...
function CreateWorkOrderModal (line 42) | function CreateWorkOrderModal({ open, onOpenChange }: CreateWorkOrderMod...
FILE: archon-ui-main/src/features/agent-work-orders/components/EditRepositoryModal.tsx
type EditRepositoryModalProps (line 19) | interface EditRepositoryModalProps {
constant WORKFLOW_STEPS (line 30) | const WORKFLOW_STEPS: { value: WorkflowStep; label: string; description:...
function EditRepositoryModal (line 39) | function EditRepositoryModal({ open, onOpenChange }: EditRepositoryModal...
FILE: archon-ui-main/src/features/agent-work-orders/components/ExecutionLogs.tsx
type ExecutionLogsProps (line 9) | interface ExecutionLogsProps {
function formatRelativeTime (line 33) | function formatRelativeTime(timestamp: string): string {
function LogEntryRow (line 47) | function LogEntryRow({ log }: { log: LogEntry }) {
function ExecutionLogs (line 67) | function ExecutionLogs({ logs, isLive = false, onClearLogs = () => {} }:...
FILE: archon-ui-main/src/features/agent-work-orders/components/RealTimeStats.tsx
type RealTimeStatsProps (line 10) | interface RealTimeStatsProps {
constant EMPTY_LOGS (line 19) | const EMPTY_LOGS: never[] = [];
type LogEntryWithSteps (line 24) | type LogEntryWithSteps = LogEntry & {
function hasStepInfo (line 29) | function hasStepInfo(log: LogEntry): log is LogEntryWithSteps {
function useCalculateProgressFromLogs (line 37) | function useCalculateProgressFromLogs(logs: LogEntry[]): LiveProgress | ...
function useCalculateProgressFromSteps (line 86) | function useCalculateProgressFromSteps(stepHistory: any): LiveProgress |...
function useConvertStepsToLogs (line 113) | function useConvertStepsToLogs(stepHistory: any): LogEntry[] {
function formatDuration (line 134) | function formatDuration(seconds: number): string {
function RealTimeStats (line 148) | function RealTimeStats({ workOrderId }: RealTimeStatsProps) {
FILE: archon-ui-main/src/features/agent-work-orders/components/RepositoryCard.tsx
type RepositoryCardProps (line 15) | interface RepositoryCardProps {
function getBackgroundClass (line 42) | function getBackgroundClass(isSelected: boolean): string {
function copyToClipboard (line 52) | async function copyToClipboard(text: string): Promise<boolean> {
function RepositoryCard (line 62) | function RepositoryCard({
FILE: archon-ui-main/src/features/agent-work-orders/components/SidebarRepositoryCard.tsx
type SidebarRepositoryCardProps (line 17) | interface SidebarRepositoryCardProps {
constant BACKGROUND_CLASSES (line 47) | const BACKGROUND_CLASSES = {
constant TITLE_CLASSES (line 58) | const TITLE_CLASSES = {
function getBackgroundClass (line 66) | function getBackgroundClass(isPinned: boolean, isSelected: boolean): str...
function getTitleClass (line 75) | function getTitleClass(isSelected: boolean): string {
function SidebarRepositoryCard (line 79) | function SidebarRepositoryCard({
FILE: archon-ui-main/src/features/agent-work-orders/components/StepHistoryCard.tsx
type StepHistoryCardProps (line 9) | interface StepHistoryCardProps {
FILE: archon-ui-main/src/features/agent-work-orders/components/WorkOrderRow.tsx
type WorkOrderRowProps (line 18) | interface WorkOrderRowProps {
type StatusConfig (line 39) | interface StatusConfig {
constant STATUS_COLORS (line 47) | const STATUS_COLORS: Record<string, StatusConfig> = {
function getStatusConfig (line 81) | function getStatusConfig(status: string): StatusConfig {
function WorkOrderRow (line 85) | function WorkOrderRow({
FILE: archon-ui-main/src/features/agent-work-orders/components/WorkOrderTable.tsx
type WorkOrderTableProps (line 13) | interface WorkOrderTableProps {
type EnhancedWorkOrder (line 27) | interface EnhancedWorkOrder extends AgentWorkOrder {
function WorkOrderTable (line 31) | function WorkOrderTable({ workOrders, selectedRepositoryId, onStartWorkO...
FILE: archon-ui-main/src/features/agent-work-orders/components/WorkflowStepButton.tsx
type WorkflowStepButtonProps (line 5) | interface WorkflowStepButtonProps {
FILE: archon-ui-main/src/features/agent-work-orders/hooks/useAgentWorkOrderQueries.ts
function useWorkOrders (line 40) | function useWorkOrders(statusFilter?: AgentWorkOrderStatus) {
function useWorkOrder (line 55) | function useWorkOrder(id: string | undefined) {
function useStepHistory (line 71) | function useStepHistory(workOrderId: string | undefined) {
function useWorkOrderLogs (line 89) | function useWorkOrderLogs(
function useCreateWorkOrder (line 115) | function useCreateWorkOrder() {
function useStartWorkOrder (line 139) | function useStartWorkOrder() {
FILE: archon-ui-main/src/features/agent-work-orders/hooks/useRepositoryQueries.ts
function useRepositories (line 29) | function useRepositories() {
function useRepository (line 43) | function useRepository(id: string | undefined) {
function useCreateRepository (line 64) | function useCreateRepository() {
function useUpdateRepository (line 132) | function useUpdateRepository() {
function useDeleteRepository (line 193) | function useDeleteRepository() {
function useVerifyRepository (line 235) | function useVerifyRepository() {
FILE: archon-ui-main/src/features/agent-work-orders/services/agentWorkOrdersService.ts
method createWorkOrder (line 41) | async createWorkOrder(request: CreateAgentWorkOrderRequest): Promise<Age...
method listWorkOrders (line 56) | async listWorkOrders(statusFilter?: AgentWorkOrderStatus): Promise<Agent...
method getWorkOrder (line 69) | async getWorkOrder(id: string): Promise<AgentWorkOrder> {
method getStepHistory (line 81) | async getStepHistory(id: string): Promise<StepHistory> {
method startWorkOrder (line 94) | async startWorkOrder(id: string): Promise<AgentWorkOrder> {
method getWorkOrderLogs (line 112) | async getWorkOrderLogs(
FILE: archon-ui-main/src/features/agent-work-orders/services/repositoryService.ts
function listRepositories (line 15) | async function listRepositories(): Promise<ConfiguredRepository[]> {
function createRepository (line 26) | async function createRepository(request: CreateRepositoryRequest): Promi...
function updateRepository (line 42) | async function updateRepository(id: string, request: UpdateRepositoryReq...
function deleteRepository (line 56) | async function deleteRepository(id: string): Promise<void> {
function verifyRepositoryAccess (line 68) | async function verifyRepositoryAccess(id: string): Promise<{ is_accessib...
FILE: archon-ui-main/src/features/agent-work-orders/state/__tests__/sseIntegration.test.ts
class MockEventSource (line 13) | class MockEventSource {
method constructor (line 21) | constructor(url: string) {
method addEventListener (line 26) | addEventListener(type: string, listener: (event: Event) => void): void {
method removeEventListener (line 33) | removeEventListener(type: string, listener: (event: Event) => void): v...
method close (line 43) | close(): void {
method simulateOpen (line 48) | simulateOpen(): void {
method simulateMessage (line 55) | simulateMessage(data: string): void {
method simulateError (line 62) | simulateError(): void {
FILE: archon-ui-main/src/features/agent-work-orders/state/agentWorkOrdersStore.ts
type AgentWorkOrdersStore (line 12) | type AgentWorkOrdersStore = UIPreferencesSlice & ModalsSlice & FiltersSl...
FILE: archon-ui-main/src/features/agent-work-orders/state/slices/filtersSlice.ts
type FiltersSlice (line 3) | type FiltersSlice = {
FILE: archon-ui-main/src/features/agent-work-orders/state/slices/modalsSlice.ts
type ModalsSlice (line 4) | type ModalsSlice = {
FILE: archon-ui-main/src/features/agent-work-orders/state/slices/sseSlice.ts
type LiveProgress (line 4) | type LiveProgress = {
type SSESlice (line 13) | type SSESlice = {
FILE: archon-ui-main/src/features/agent-work-orders/state/slices/uiPreferencesSlice.ts
type LayoutMode (line 3) | type LayoutMode = "horizontal" | "sidebar";
type UIPreferencesSlice (line 5) | type UIPreferencesSlice = {
FILE: archon-ui-main/src/features/agent-work-orders/types/index.ts
type AgentWorkOrderStatus (line 15) | type AgentWorkOrderStatus = "pending" | "running" | "completed" | "failed";
type WorkflowStep (line 21) | type WorkflowStep = "create-branch" | "planning" | "execute" | "commit" ...
type SandboxType (line 28) | type SandboxType = "git_branch" | "git_worktree";
type AgentWorkOrder (line 34) | interface AgentWorkOrder {
type CreateAgentWorkOrderRequest (line 84) | interface CreateAgentWorkOrderRequest {
type StepExecutionResult (line 107) | interface StepExecutionResult {
type StepHistory (line 136) | interface StepHistory {
type LogEntry (line 148) | interface LogEntry {
type SSEConnectionState (line 195) | type SSEConnectionState = "connecting" | "connected" | "disconnected" | ...
type WorkOrderLogsResponse (line 201) | interface WorkOrderLogsResponse {
FILE: archon-ui-main/src/features/agent-work-orders/types/repository.ts
type ConfiguredRepository (line 17) | interface ConfiguredRepository {
type CreateRepositoryRequest (line 59) | interface CreateRepositoryRequest {
type UpdateRepositoryRequest (line 73) | interface UpdateRepositoryRequest {
FILE: archon-ui-main/src/features/agent-work-orders/views/AgentWorkOrderDetailView.tsx
constant ALL_WORKFLOW_STEPS (line 24) | const ALL_WORKFLOW_STEPS: WorkflowStep[] = [
function AgentWorkOrderDetailView (line 33) | function AgentWorkOrderDetailView() {
FILE: archon-ui-main/src/features/agent-work-orders/views/AgentWorkOrdersView.tsx
function AgentWorkOrdersView (line 26) | function AgentWorkOrdersView() {
FILE: archon-ui-main/src/features/knowledge/components/AddKnowledgeDialog.tsx
type AddKnowledgeDialogProps (line 19) | interface AddKnowledgeDialogProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeCard.tsx
type KnowledgeCardProps (line 27) | interface KnowledgeCardProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeCardActions.tsx
type KnowledgeCardActionsProps (line 20) | interface KnowledgeCardActionsProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeCardTags.tsx
type KnowledgeCardTagsProps (line 14) | interface KnowledgeCardTagsProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeCardTitle.tsx
constant ICON_COLOR_CLASSES (line 14) | const ICON_COLOR_CLASSES: Record<string, string> = {
constant TOOLTIP_COLOR_CLASSES (line 24) | const TOOLTIP_COLOR_CLASSES: Record<string, string> = {
type KnowledgeCardTitleProps (line 37) | interface KnowledgeCardTitleProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeCardType.tsx
type KnowledgeCardTypeProps (line 13) | interface KnowledgeCardTypeProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeHeader.tsx
type KnowledgeHeaderProps (line 10) | interface KnowledgeHeaderProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeList.tsx
type KnowledgeListProps (line 14) | interface KnowledgeListProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeTable.tsx
type KnowledgeTableProps (line 22) | interface KnowledgeTableProps {
FILE: archon-ui-main/src/features/knowledge/components/KnowledgeTypeSelector.tsx
type KnowledgeTypeSelectorProps (line 10) | interface KnowledgeTypeSelectorProps {
constant TYPES (line 16) | const TYPES = [
FILE: archon-ui-main/src/features/knowledge/components/LevelSelector.tsx
type LevelSelectorProps (line 11) | interface LevelSelectorProps {
constant LEVELS (line 17) | const LEVELS = [
FILE: archon-ui-main/src/features/knowledge/components/TagInput.tsx
type TagInputProps (line 12) | interface TagInputProps {
FILE: archon-ui-main/src/features/knowledge/hooks/useKnowledgeQueries.ts
function useKnowledgeItem (line 52) | function useKnowledgeItem(sourceId: string | null) {
function useKnowledgeItemChunks (line 64) | function useKnowledgeItemChunks(
function useCodeExamples (line 87) | function useCodeExamples(sourceId: string | null) {
function useCrawlUrl (line 100) | function useCrawlUrl() {
function useUploadDocument (line 303) | function useUploadDocument() {
function useStopCrawl (line 481) | function useStopCrawl() {
function useDeleteKnowledgeItem (line 510) | function useDeleteKnowledgeItem() {
function useUpdateKnowledgeItem (line 563) | function useUpdateKnowledgeItem() {
function useRefreshKnowledgeItem (line 689) | function useRefreshKnowledgeItem() {
function useKnowledgeSummaries (line 718) | function useKnowledgeSummaries(filter?: KnowledgeItemsFilter) {
function useKnowledgeChunks (line 768) | function useKnowledgeChunks(
function useKnowledgeCodeExamples (line 791) | function useKnowledgeCodeExamples(
FILE: archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx
type ContentViewerProps (line 21) | interface ContentViewerProps {
FILE: archon-ui-main/src/features/knowledge/inspector/components/InspectorHeader.tsx
type InspectorHeaderProps (line 11) | interface InspectorHeaderProps {
FILE: archon-ui-main/src/features/knowledge/inspector/components/InspectorSidebar.tsx
type InspectorSidebarProps (line 12) | interface InspectorSidebarProps {
FILE: archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx
type KnowledgeInspectorProps (line 15) | interface KnowledgeInspectorProps {
type ViewMode (line 22) | type ViewMode = "documents" | "code";
FILE: archon-ui-main/src/features/knowledge/inspector/hooks/useInspectorData.ts
type UseInspectorDataProps (line 10) | interface UseInspectorDataProps {
type UseInspectorDataResult (line 15) | interface UseInspectorDataResult {
function useInspectorData (line 28) | function useInspectorData({ sourceId, searchQuery }: UseInspectorDataPro...
FILE: archon-ui-main/src/features/knowledge/inspector/hooks/useInspectorPagination.ts
type UseInspectorPaginationProps (line 13) | interface UseInspectorPaginationProps {
type UseInspectorPaginationResult (line 19) | interface UseInspectorPaginationResult {
function useInspectorPagination (line 29) | function useInspectorPagination({
FILE: archon-ui-main/src/features/knowledge/inspector/hooks/usePaginatedInspectorData.ts
constant PAGE_SIZE (line 10) | const PAGE_SIZE = 20;
type UsePaginatedInspectorDataProps (line 12) | interface UsePaginatedInspectorDataProps {
type PaginatedData (line 18) | interface PaginatedData<T> {
type UsePaginatedInspectorDataResult (line 27) | interface UsePaginatedInspectorDataResult {
function usePaginatedInspectorData (line 32) | function usePaginatedInspectorData({
FILE: archon-ui-main/src/features/knowledge/services/knowledgeService.ts
method getKnowledgeSummaries (line 28) | async getKnowledgeSummaries(filter?: KnowledgeItemsFilter): Promise<Know...
method getKnowledgeItem (line 50) | async getKnowledgeItem(sourceId: string): Promise<KnowledgeItem> {
method deleteKnowledgeItem (line 57) | async deleteKnowledgeItem(sourceId: string): Promise<{ success: boolean;...
method updateKnowledgeItem (line 68) | async updateKnowledgeItem(
method crawlUrl (line 83) | async crawlUrl(request: CrawlRequest): Promise<CrawlStartResponse> {
method refreshKnowledgeItem (line 95) | async refreshKnowledgeItem(sourceId: string): Promise<RefreshResponse> {
method uploadDocument (line 106) | async uploadDocument(
method stopCrawl (line 146) | async stopCrawl(progressId: string): Promise<{ success: boolean; message...
method getKnowledgeItemChunks (line 155) | async getKnowledgeItemChunks(
method getCodeExamples (line 183) | async getCodeExamples(
method searchKnowledgeBase (line 207) | async searchKnowledgeBase(options: SearchOptions): Promise<SearchResults...
method getKnowledgeSources (line 217) | async getKnowledgeSources(): Promise<KnowledgeSource[]> {
FILE: archon-ui-main/src/features/knowledge/types/knowledge.ts
type KnowledgeItemMetadata (line 6) | interface KnowledgeItemMetadata {
type KnowledgeItem (line 26) | interface KnowledgeItem {
type CodeExampleMetadata (line 41) | interface CodeExampleMetadata {
type CodeExample (line 49) | interface CodeExample {
type DocumentChunkMetadata (line 64) | interface DocumentChunkMetadata {
type DocumentChunk (line 73) | interface DocumentChunk {
type GroupedKnowledgeItem (line 87) | interface GroupedKnowledgeItem {
type KnowledgeItemsResponse (line 98) | interface KnowledgeItemsResponse {
type ChunksResponse (line 105) | interface ChunksResponse {
type CodeExamplesResponse (line 116) | interface CodeExamplesResponse {
type KnowledgeItemsFilter (line 127) | interface KnowledgeItemsFilter {
type CrawlRequest (line 136) | interface CrawlRequest {
type UploadMetadata (line 145) | interface UploadMetadata {
type SearchOptions (line 150) | interface SearchOptions {
type KnowledgeViewMode (line 158) | type KnowledgeViewMode = "grid" | "table";
type InspectorSelectedItem (line 161) | interface InspectorSelectedItem {
type CrawlStartResponse (line 169) | interface CrawlStartResponse {
type RefreshResponse (line 176) | interface RefreshResponse {
type SearchResultsResponse (line 182) | interface SearchResultsResponse {
type KnowledgeSource (line 190) | interface KnowledgeSource {
FILE: archon-ui-main/src/features/knowledge/utils/knowledge-utils.ts
function groupKnowledgeItems (line 10) | function groupKnowledgeItems(items: KnowledgeItem[]) {
function getKnowledgeItemType (line 38) | function getKnowledgeItemType(item: KnowledgeItem): string {
function formatFileSize (line 51) | function formatFileSize(bytes?: number): string {
function getStatusColor (line 69) | function getStatusColor(status?: KnowledgeItemMetadata["status"]) {
function needsRefresh (line 85) | function needsRefresh(item: KnowledgeItem): boolean {
function extractDomain (line 106) | function extractDomain(url: string): string {
function getFileTypeIcon (line 118) | function getFileTypeIcon(fileType?: string): string {
FILE: archon-ui-main/src/features/knowledge/utils/providerErrorHandler.ts
type ProviderError (line 6) | interface ProviderError extends Error {
type ErrorWithStatus (line 14) | interface ErrorWithStatus {
type ErrorWithMessage (line 19) | interface ErrorWithMessage {
function hasStatusProperty (line 24) | function hasStatusProperty(obj: unknown): obj is ErrorWithStatus {
function hasMessageProperty (line 28) | function hasMessageProperty(obj: unknown): obj is ErrorWithMessage {
function parseProviderError (line 35) | function parseProviderError(error: unknown): ProviderError {
function getProviderErrorMessage (line 78) | function getProviderErrorMessage(error: unknown): string {
FILE: archon-ui-main/src/features/mcp/components/McpClientList.tsx
type McpClientListProps (line 7) | interface McpClientListProps {
FILE: archon-ui-main/src/features/mcp/components/McpConfigSection.tsx
type McpConfigSectionProps (line 9) | interface McpConfigSectionProps {
FILE: archon-ui-main/src/features/mcp/components/McpStatusBar.tsx
type McpStatusBarProps (line 6) | interface McpStatusBarProps {
FILE: archon-ui-main/src/features/mcp/hooks/useMcpQueries.ts
function useMcpStatus (line 16) | function useMcpStatus() {
function useMcpConfig (line 29) | function useMcpConfig() {
function useMcpClients (line 38) | function useMcpClients() {
function useMcpSessionInfo (line 51) | function useMcpSessionInfo() {
FILE: archon-ui-main/src/features/mcp/services/mcpApi.ts
method getStatus (line 5) | async getStatus(): Promise<McpServerStatus> {
method getConfig (line 15) | async getConfig(): Promise<McpServerConfig> {
method getSessionInfo (line 25) | async getSessionInfo(): Promise<McpSessionInfo> {
method getClients (line 35) | async getClients(): Promise<McpClient[]> {
FILE: archon-ui-main/src/features/mcp/types/mcp.ts
type McpServerStatus (line 2) | interface McpServerStatus {
type McpServerConfig (line 8) | interface McpServerConfig {
type McpClient (line 15) | interface McpClient {
type McpSessionInfo (line 23) | interface McpSessionInfo {
type SupportedIDE (line 31) | type SupportedIDE = "windsurf" | "cursor" | "claudecode" | "cline" | "ki...
type IdeConfiguration (line 33) | interface IdeConfiguration {
FILE: archon-ui-main/src/features/progress/components/CrawlingProgress.tsx
type CrawlingProgressProps (line 17) | interface CrawlingProgressProps {
FILE: archon-ui-main/src/features/progress/components/KnowledgeCardProgress.tsx
type KnowledgeCardProgressProps (line 12) | interface KnowledgeCardProgressProps {
FILE: archon-ui-main/src/features/progress/hooks/useProgressQueries.ts
constant TERMINAL_STATES (line 23) | const TERMINAL_STATES: ProgressStatus[] = ["completed", "error", "failed...
function useOperationProgress (line 29) | function useOperationProgress(
function useActiveOperations (line 196) | function useActiveOperations(enabled = false) {
function useCrawlProgressPolling (line 213) | function useCrawlProgressPolling() {
function useMultipleOperations (line 227) | function useMultipleOperations(
FILE: archon-ui-main/src/features/progress/services/progressService.ts
method getProgress (line 13) | async getProgress(progressId: string): Promise<ProgressResponse> {
method listActiveOperations (line 20) | async listActiveOperations(): Promise<ActiveOperationsResponse> {
FILE: archon-ui-main/src/features/progress/types/progress.ts
type ProgressStatus (line 6) | type ProgressStatus =
type CrawlType (line 28) | type CrawlType =
type UploadType (line 38) | type UploadType = "document";
type BaseProgressData (line 40) | interface BaseProgressData {
type CrawlProgressData (line 50) | interface CrawlProgressData extends BaseProgressData {
type UploadProgressData (line 73) | interface UploadProgressData extends BaseProgressData {
type ProgressData (line 82) | type ProgressData = CrawlProgressData | UploadProgressData;
type ActiveOperation (line 86) | interface ActiveOperation {
type ActiveOperationsResponse (line 123) | interface ActiveOperationsResponse {
type ProgressResponse (line 129) | interface ProgressResponse {
FILE: archon-ui-main/src/features/progress/utils/urlValidation.ts
constant SAFE_PROTOCOLS (line 6) | const SAFE_PROTOCOLS = ["http:", "https:"];
function isValidHttpUrl (line 15) | function isValidHttpUrl(url: string | undefined | null): boolean {
FILE: archon-ui-main/src/features/projects/components/NewProjectModal.tsx
type NewProjectModalProps (line 18) | interface NewProjectModalProps {
FILE: archon-ui-main/src/features/projects/components/ProjectCard.tsx
type ProjectCardProps (line 10) | interface ProjectCardProps {
FILE: archon-ui-main/src/features/projects/components/ProjectCardActions.tsx
type ProjectCardActionsProps (line 7) | interface ProjectCardActionsProps {
FILE: archon-ui-main/src/features/projects/components/ProjectHeader.tsx
type ProjectHeaderProps (line 9) | interface ProjectHeaderProps {
FILE: archon-ui-main/src/features/projects/components/ProjectList.tsx
type ProjectListProps (line 8) | interface ProjectListProps {
FILE: archon-ui-main/src/features/projects/documents/DocsTab.tsx
type DocsTabProps (line 11) | interface DocsTabProps {
FILE: archon-ui-main/src/features/projects/documents/components/AddDocumentModal.tsx
type AddDocumentModalProps (line 19) | interface AddDocumentModalProps {
FILE: archon-ui-main/src/features/projects/documents/components/DocumentViewer.tsx
type DocumentViewerProps (line 9) | interface DocumentViewerProps {
FILE: archon-ui-main/src/features/projects/documents/hooks/useDocumentQueries.ts
function useProjectDocuments (line 21) | function useProjectDocuments(projectId: string | undefined) {
function useProjectDocument (line 36) | function useProjectDocument(projectId: string | undefined, documentId: s...
type DocumentUpdateData (line 49) | interface DocumentUpdateData {
function useUpdateDocument (line 57) | function useUpdateDocument(projectId: string) {
function useCreateDocument (line 83) | function useCreateDocument(projectId: string) {
function useDeleteDocument (line 119) | function useDeleteDocument(projectId: string) {
FILE: archon-ui-main/src/features/projects/documents/services/documentService.ts
type DocumentsResponse (line 9) | interface DocumentsResponse {
method getDocumentsByProject (line 20) | async getDocumentsByProject(projectId: string): Promise<ProjectDocument[...
method getDocument (line 28) | async getDocument(projectId: string, documentId: string): Promise<Projec...
method updateDocument (line 41) | async updateDocument(
method deleteDocument (line 62) | async deleteDocument(projectId: string, documentId: string): Promise<voi...
FILE: archon-ui-main/src/features/projects/documents/types/document.ts
type DocumentContent (line 8) | type DocumentContent =
type ProjectDocument (line 19) | interface ProjectDocument {
type DocumentType (line 29) | type DocumentType =
type DocumentCardProps (line 40) | interface DocumentCardProps {
FILE: archon-ui-main/src/features/projects/hooks/useProjectQueries.ts
function useProjects (line 25) | function useProjects() {
function useProjectFeatures (line 38) | function useProjectFeatures(projectId: string | undefined) {
function useCreateProject (line 48) | function useCreateProject() {
function useUpdateProject (line 120) | function useUpdateProject() {
function useDeleteProject (line 173) | function useDeleteProject() {
FILE: archon-ui-main/src/features/projects/schemas/index.ts
function validateProject (line 47) | function validateProject(data: unknown) {
function validateCreateProject (line 51) | function validateCreateProject(data: unknown) {
function validateUpdateProject (line 55) | function validateUpdateProject(data: unknown) {
type CreateProjectInput (line 60) | type CreateProjectInput = z.infer<typeof CreateProjectSchema>;
type UpdateProjectInput (line 61) | type UpdateProjectInput = z.infer<typeof UpdateProjectSchema>;
type ProjectInput (line 62) | type ProjectInput = z.infer<typeof ProjectSchema>;
FILE: archon-ui-main/src/features/projects/services/projectService.ts
method listProjects (line 16) | async listProjects(): Promise<Project[]> {
method getProject (line 52) | async getProject(projectId: string): Promise<Project> {
method createProject (line 70) | async createProject(projectData: CreateProjectRequest): Promise<{
method updateProject (line 114) | async updateProject(projectId: string, updates: UpdateProjectRequest): P...
method deleteProject (line 152) | async deleteProject(projectId: string): Promise<void> {
method getProjectFeatures (line 166) | async getProjectFeatures(projectId: string): Promise<{ features: Project...
FILE: archon-ui-main/src/features/projects/shared/api.ts
function formatRelativeTime (line 6) | function formatRelativeTime(dateString: string): string {
FILE: archon-ui-main/src/features/projects/tasks/TasksTab.tsx
type TasksTabProps (line 14) | interface TasksTabProps {
type ViewControlsProps (line 225) | interface ViewControlsProps {
FILE: archon-ui-main/src/features/projects/tasks/components/EditableTableCell.tsx
type EditableTableCellProps (line 16) | interface EditableTableCellProps {
constant STATUS_OPTIONS (line 27) | const STATUS_OPTIONS = ["todo", "doing", "review", "done"] as const;
constant ASSIGNEE_OPTIONS (line 30) | const ASSIGNEE_OPTIONS: ComboBoxOption[] = COMMON_ASSIGNEES.map((name) =...
FILE: archon-ui-main/src/features/projects/tasks/components/FeatureSelect.tsx
type FeatureSelectProps (line 11) | interface FeatureSelectProps {
FILE: archon-ui-main/src/features/projects/tasks/components/KanbanColumn.tsx
type KanbanColumnProps (line 9) | interface KanbanColumnProps {
FILE: archon-ui-main/src/features/projects/tasks/components/TaskAssignee.tsx
type TaskAssigneeProps (line 7) | interface TaskAssigneeProps {
constant ASSIGNEE_OPTIONS (line 14) | const ASSIGNEE_OPTIONS: ComboBoxOption[] = COMMON_ASSIGNEES.map((name) =...
FILE: archon-ui-main/src/features/projects/tasks/components/TaskCard.tsx
type TaskCardProps (line 16) | interface TaskCardProps {
FILE: archon-ui-main/src/features/projects/tasks/components/TaskCardActions.tsx
type TaskCardActionsProps (line 7) | interface TaskCardActionsProps {
FILE: archon-ui-main/src/features/projects/tasks/components/TaskEditModal.tsx
type TaskEditModalProps (line 26) | interface TaskEditModalProps {
constant ASSIGNEE_OPTIONS (line 36) | const ASSIGNEE_OPTIONS: ComboBoxOption[] = COMMON_ASSIGNEES.map((name) =...
FILE: archon-ui-main/src/features/projects/tasks/components/TaskPriorityComponent.tsx
type TaskPriorityProps (line 15) | interface TaskPriorityProps {
constant PRIORITY_OPTIONS (line 22) | const PRIORITY_OPTIONS: Array<{
FILE: archon-ui-main/src/features/projects/tasks/hooks/useTaskQueries.ts
function useProjectTasks (line 24) | function useProjectTasks(projectId: string | undefined, enabled = true) {
function useTaskCounts (line 41) | function useTaskCounts() {
function useCreateTask (line 52) | function useCreateTask() {
function useUpdateTask (line 123) | function useUpdateTask(projectId: string) {
function useDeleteTask (line 179) | function useDeleteTask(projectId: string) {
FILE: archon-ui-main/src/features/projects/tasks/schemas/index.ts
function validateTask (line 63) | function validateTask(data: unknown) {
function validateCreateTask (line 67) | function validateCreateTask(data: unknown) {
function validateUpdateTask (line 71) | function validateUpdateTask(data: unknown) {
function validateUpdateTaskStatus (line 75) | function validateUpdateTaskStatus(data: unknown) {
type CreateTaskInput (line 80) | type CreateTaskInput = z.infer<typeof CreateTaskSchema>;
type UpdateTaskInput (line 81) | type UpdateTaskInput = z.infer<typeof UpdateTaskSchema>;
type UpdateTaskStatusInput (line 82) | type UpdateTaskStatusInput = z.infer<typeof UpdateTaskStatusSchema>;
type TaskInput (line 83) | type TaskInput = z.infer<typeof TaskSchema>;
FILE: archon-ui-main/src/features/projects/tasks/services/taskService.ts
method getTasksByProject (line 16) | async getTasksByProject(projectId: string): Promise<Task[]> {
method getTask (line 31) | async getTask(taskId: string): Promise<Task> {
method createTask (line 44) | async createTask(taskData: CreateTaskRequest): Promise<Task> {
method updateTask (line 71) | async updateTask(taskId: string, updates: UpdateTaskRequest): Promise<Ta...
method updateTaskStatus (line 95) | async updateTaskStatus(taskId: string, status: DatabaseTaskStatus): Prom...
method deleteTask (line 123) | async deleteTask(taskId: string): Promise<void> {
method updateTaskOrder (line 137) | async updateTaskOrder(taskId: string, newOrder: number, newStatus?: Data...
method getTasksByStatus (line 159) | async getTasksByStatus(status: DatabaseTaskStatus): Promise<Task[]> {
method getTaskCountsForAllProjects (line 174) | async getTaskCountsForAllProjects(): Promise<Record<string, TaskCounts>> {
FILE: archon-ui-main/src/features/projects/tasks/types/hooks.ts
type UseTaskActionsReturn (line 12) | interface UseTaskActionsReturn {
type UseTaskEditorReturn (line 32) | interface UseTaskEditorReturn {
FILE: archon-ui-main/src/features/projects/tasks/types/priority.ts
type TaskPriority (line 8) | type TaskPriority = "critical" | "high" | "medium" | "low";
type TaskPriorityOption (line 10) | interface TaskPriorityOption {
constant TASK_PRIORITY_OPTIONS (line 16) | const TASK_PRIORITY_OPTIONS: readonly TaskPriorityOption[] = [
function getTaskPriorityOption (line 26) | function getTaskPriorityOption(priority: TaskPriority): TaskPriorityOpti...
function isValidTaskPriority (line 34) | function isValidTaskPriority(priority: string): priority is TaskPriority {
FILE: archon-ui-main/src/features/projects/tasks/types/task.ts
type DatabaseTaskStatus (line 12) | type DatabaseTaskStatus = "todo" | "doing" | "review" | "done";
type Assignee (line 15) | type Assignee = string;
constant COMMON_ASSIGNEES (line 18) | const COMMON_ASSIGNEES = ["User", "Archon", "Coding Agent"] as const;
type CommonAssignee (line 19) | type CommonAssignee = (typeof COMMON_ASSIGNEES)[number];
type TaskCounts (line 22) | interface TaskCounts {
type TaskSource (line 30) | type TaskSource =
type TaskCodeExample (line 38) | type TaskCodeExample =
type Task (line 47) | interface Task {
type CreateTaskRequest (line 74) | interface CreateTaskRequest {
type UpdateTaskRequest (line 88) | interface UpdateTaskRequest {
FILE: archon-ui-main/src/features/projects/tasks/utils/task-ordering.ts
constant ORDER_INCREMENT (line 7) | const ORDER_INCREMENT = 1000;
constant MAX_ORDER (line 8) | const MAX_ORDER = Number.MAX_SAFE_INTEGER - ORDER_INCREMENT;
function getDefaultTaskOrder (line 14) | function getDefaultTaskOrder(existingTasks: Task[]): number {
function getInsertTaskOrder (line 34) | function getInsertTaskOrder(beforeTask: Task | null, afterTask: Task | n...
function getReorderTaskOrder (line 53) | function getReorderTaskOrder(tasks: Task[], taskId: string, newIndex: nu...
function validateTaskOrder (line 87) | function validateTaskOrder(order: number): number {
FILE: archon-ui-main/src/features/projects/tasks/views/BoardView.tsx
type BoardViewProps (line 5) | interface BoardViewProps {
FILE: archon-ui-main/src/features/projects/tasks/views/TableView.tsx
type TableViewProps (line 19) | interface TableViewProps {
type DraggableRowProps (line 29) | interface DraggableRowProps {
FILE: archon-ui-main/src/features/projects/types/project.ts
type ProjectPRD (line 8) | type ProjectPRD = Record<string, unknown>;
type ProjectDocs (line 9) | type ProjectDocs = unknown[];
type ProjectFeature (line 10) | type ProjectFeature = {
type ProjectFeatures (line 17) | type ProjectFeatures = ProjectFeature[];
type ProjectData (line 18) | type ProjectData = unknown[];
type ProjectCreationProgress (line 21) | interface ProjectCreationProgress {
type Project (line 44) | interface Project {
type CreateProjectRequest (line 68) | interface CreateProjectRequest {
type UpdateProjectRequest (line 80) | interface UpdateProjectRequest {
type MCPToolResponse (line 94) | interface MCPToolResponse<T = unknown> {
type PaginatedResponse (line 101) | interface PaginatedResponse<T> {
FILE: archon-ui-main/src/features/projects/views/ProjectsView.tsx
type ProjectsViewProps (line 22) | interface ProjectsViewProps {
function ProjectsView (line 44) | function ProjectsView({ className = "", "data-id": dataId }: ProjectsVie...
type SidebarProjectCardProps (line 342) | interface SidebarProjectCardProps {
FILE: archon-ui-main/src/features/settings/migrations/components/MigrationStatusCard.tsx
function MigrationStatusCard (line 11) | function MigrationStatusCard() {
FILE: archon-ui-main/src/features/settings/migrations/components/PendingMigrationsModal.tsx
type PendingMigrationsModalProps (line 12) | interface PendingMigrationsModalProps {
function PendingMigrationsModal (line 19) | function PendingMigrationsModal({
FILE: archon-ui-main/src/features/settings/migrations/hooks/useMigrationQueries.ts
function useMigrationStatus (line 23) | function useMigrationStatus() {
function useMigrationHistory (line 38) | function useMigrationHistory() {
function usePendingMigrations (line 49) | function usePendingMigrations() {
FILE: archon-ui-main/src/features/settings/migrations/services/migrationService.ts
method getMigrationStatus (line 12) | async getMigrationStatus(): Promise<MigrationStatusResponse> {
method getMigrationHistory (line 25) | async getMigrationHistory(): Promise<MigrationHistoryResponse> {
method getPendingMigrations (line 38) | async getPendingMigrations(): Promise<PendingMigration[]> {
FILE: archon-ui-main/src/features/settings/migrations/types/index.ts
type MigrationRecord (line 5) | interface MigrationRecord {
type PendingMigration (line 12) | interface PendingMigration {
type MigrationStatusResponse (line 20) | interface MigrationStatusResponse {
type MigrationHistoryResponse (line 30) | interface MigrationHistoryResponse {
type MigrationState (line 36) | interface MigrationState {
FILE: archon-ui-main/src/features/settings/version/components/UpdateBanner.tsx
function UpdateBanner (line 10) | function UpdateBanner() {
FILE: archon-ui-main/src/features/settings/version/components/VersionStatusCard.tsx
function VersionStatusCard (line 9) | function VersionStatusCard() {
FILE: archon-ui-main/src/features/settings/version/hooks/useVersionQueries.ts
function useVersionCheck (line 22) | function useVersionCheck() {
function useCurrentVersion (line 38) | function useCurrentVersion() {
function useClearVersionCache (line 49) | function useClearVersionCache() {
FILE: archon-ui-main/src/features/settings/version/services/versionService.ts
method checkVersion (line 12) | async checkVersion(): Promise<VersionCheckResponse> {
method getCurrentVersion (line 25) | async getCurrentVersion(): Promise<CurrentVersionResponse> {
method clearCache (line 38) | async clearCache(): Promise<{ message: string; success: boolean }> {
FILE: archon-ui-main/src/features/settings/version/types/index.ts
type ReleaseAsset (line 5) | interface ReleaseAsset {
type VersionCheckResponse (line 13) | interface VersionCheckResponse {
type CurrentVersionResponse (line 25) | interface CurrentVersionResponse {
type VersionStatus (line 30) | interface VersionStatus {
FILE: archon-ui-main/src/features/shared/api/apiClient.ts
function buildFullUrl (line 21) | function buildFullUrl(cleanEndpoint: string): string {
function callAPIWithETag (line 43) | async function callAPIWithETag<T = unknown>(endpoint: string, options: R...
FILE: archon-ui-main/src/features/shared/config/queryClient.ts
function createTestQueryClient (line 54) | function createTestQueryClient(): QueryClient {
FILE: archon-ui-main/src/features/shared/config/queryPatterns.ts
constant DISABLED_QUERY_KEY (line 14) | const DISABLED_QUERY_KEY = ["disabled"] as const;
constant STALE_TIMES (line 18) | const STALE_TIMES = {
function getErrorStatus (line 34) | function getErrorStatus(error: unknown): number | undefined {
function isAbortError (line 50) | function isAbortError(error: unknown): boolean {
function createRetryLogic (line 63) | function createRetryLogic(maxRetries: number = 2) {
FILE: archon-ui-main/src/features/shared/hooks/useSmartPolling.ts
function useSmartPolling (line 13) | function useSmartPolling(baseInterval: number = 10000) {
FILE: archon-ui-main/src/features/shared/hooks/useThemeAware.ts
function useThemeAware (line 8) | function useThemeAware() {
FILE: archon-ui-main/src/features/shared/hooks/useToast.ts
type Toast (line 6) | interface Toast {
type ToastContextType (line 14) | interface ToastContextType {
function useToast (line 26) | function useToast() {
function createToastContext (line 38) | function createToastContext() {
function getToastIcon (line 88) | function getToastIcon(type: Toast["type"]) {
FILE: archon-ui-main/src/features/shared/types/errors.ts
class APIServiceError (line 19) | class APIServiceError extends Error {
method constructor (line 20) | constructor(
class ValidationError (line 33) | class ValidationError extends APIServiceError {
method constructor (line 34) | constructor(message: string) {
class MCPToolError (line 43) | class MCPToolError extends APIServiceError {
method constructor (line 44) | constructor(
type ValidationErrorDetail (line 56) | interface ValidationErrorDetail {
type ValidationErrorObject (line 61) | interface ValidationErrorObject {
function formatValidationErrors (line 68) | function formatValidationErrors(errors: ValidationErrorObject): string {
function formatZodErrors (line 75) | function formatZodErrors(zodError: { issues: Array<{ path: (string | num...
FILE: archon-ui-main/src/features/shared/utils/clipboard.ts
type ClipboardResult (line 6) | interface ClipboardResult {
FILE: archon-ui-main/src/features/shared/utils/optimistic.ts
type OptimisticEntity (line 6) | interface OptimisticEntity {
function isOptimistic (line 16) | function isOptimistic<T>(entity: T & Partial<OptimisticEntity>): entity ...
function createOptimisticId (line 23) | function createOptimisticId(): string {
function createOptimisticEntity (line 30) | function createOptimisticEntity<T extends { id: string }>(
function replaceOptimisticEntity (line 48) | function replaceOptimisticEntity<T extends { id: string }>(
function removeDuplicateEntities (line 65) | function removeDuplicateEntities<T extends { id: string }>(entities: T[]...
function cleanOptimisticMetadata (line 79) | function cleanOptimisticMetadata<T>(entity: T & Partial<OptimisticEntity...
FILE: archon-ui-main/src/features/style-guide/layouts/AgentWorkOrderExample.tsx
constant MOCK_WORK_ORDER (line 12) | const MOCK_WORK_ORDER = {
FILE: archon-ui-main/src/features/style-guide/layouts/AgentWorkOrderLayoutExample.tsx
constant MOCK_REPOSITORIES (line 32) | const MOCK_REPOSITORIES = [
type WorkOrderStatus (line 56) | type WorkOrderStatus = "pending" | "create_branch" | "plan" | "execute" ...
type WorkOrder (line 58) | interface WorkOrder {
constant MOCK_WORK_ORDERS (line 74) | const MOCK_WORK_ORDERS: WorkOrder[] = [
FILE: archon-ui-main/src/features/style-guide/layouts/DocumentBrowserExample.tsx
constant MOCK_DOCUMENTS (line 9) | const MOCK_DOCUMENTS = [
constant MOCK_CODE (line 39) | const MOCK_CODE = [
FILE: archon-ui-main/src/features/style-guide/layouts/KnowledgeLayoutExample.tsx
constant MOCK_KNOWLEDGE_ITEMS (line 11) | const MOCK_KNOWLEDGE_ITEMS = [
FILE: archon-ui-main/src/features/style-guide/layouts/ProjectsLayoutExample.tsx
constant MOCK_PROJECTS (line 29) | const MOCK_PROJECTS = [
constant MOCK_TASKS (line 56) | const MOCK_TASKS = [
constant MOCK_DOCUMENTS (line 107) | const MOCK_DOCUMENTS = [
FILE: archon-ui-main/src/features/style-guide/layouts/components/ExecutionLogsExample.tsx
type ExecutionLogsExampleProps (line 8) | interface ExecutionLogsExampleProps {
type MockLog (line 13) | interface MockLog {
function formatRelativeTime (line 34) | function formatRelativeTime(timestamp: string): string {
function LogEntryRow (line 47) | function LogEntryRow({ log }: { log: MockLog }) {
function ExecutionLogsExample (line 67) | function ExecutionLogsExample({ status }: ExecutionLogsExampleProps) {
FILE: archon-ui-main/src/features/style-guide/layouts/components/RealTimeStatsExample.tsx
type RealTimeStatsExampleProps (line 6) | interface RealTimeStatsExampleProps {
function formatDuration (line 16) | function formatDuration(seconds: number): string {
function RealTimeStatsExample (line 30) | function RealTimeStatsExample({ status, stepNumber }: RealTimeStatsExamp...
FILE: archon-ui-main/src/features/style-guide/layouts/components/StepHistoryCard.tsx
type StepHistoryCardProps (line 9) | interface StepHistoryCardProps {
FILE: archon-ui-main/src/features/style-guide/layouts/components/WorkflowStepButton.tsx
type WorkflowStepButtonProps (line 5) | interface WorkflowStepButtonProps {
FILE: archon-ui-main/src/features/style-guide/shared/SideNavigation.tsx
type SideNavigationSection (line 7) | interface SideNavigationSection {
type SideNavigationProps (line 13) | interface SideNavigationProps {
FILE: archon-ui-main/src/features/style-guide/showcases/StaticColors.tsx
constant GRAY_CLASSES (line 4) | const GRAY_CLASSES: Record<number, string> = {
FILE: archon-ui-main/src/features/style-guide/standards/modalStandards.ts
constant MODAL_TYPES (line 1) | const MODAL_TYPES = {
FILE: archon-ui-main/src/features/style-guide/types/index.ts
type GlowColor (line 4) | type GlowColor = "none" | "purple" | "blue" | "cyan" | "green" | "orange...
type GlowType (line 5) | type GlowType = "none" | "inner" | "outer";
type EdgePosition (line 6) | type EdgePosition = "none" | "top" | "left" | "right" | "bottom";
type EdgeColor (line 7) | type EdgeColor = "purple" | "blue" | "cyan" | "green" | "orange" | "pink...
type CardSize (line 8) | type CardSize = "sm" | "md" | "lg" | "xl";
type Transparency (line 9) | type Transparency = "clear" | "light" | "medium" | "frosted" | "solid";
type BlurLevel (line 10) | type BlurLevel = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
type GlassTint (line 11) | type GlassTint = "none" | "purple" | "blue" | "cyan" | "green" | "orange...
type ButtonVariant (line 14) | type ButtonVariant = "default" | "destructive" | "outline" | "ghost" | "...
type ButtonSize (line 15) | type ButtonSize = "xs" | "sm" | "default" | "lg" | "icon";
type InputType (line 18) | type InputType = "text" | "email" | "password" | "number" | "search" | "...
type LabelPosition (line 19) | type LabelPosition = "left" | "right" | "top" | "bottom";
type ModalSize (line 22) | type ModalSize = "sm" | "md" | "lg" | "xl";
type ToggleSize (line 25) | type ToggleSize = "sm" | "md" | "lg";
FILE: archon-ui-main/src/features/testing/test-utils.tsx
function renderWithProviders (line 12) | function renderWithProviders(
FILE: archon-ui-main/src/features/ui/components/DeleteConfirmModal.tsx
type DeleteConfirmModalProps (line 16) | interface DeleteConfirmModalProps {
FILE: archon-ui-main/src/features/ui/components/FeatureErrorBoundary.tsx
type Props (line 6) | interface Props {
type State (line 12) | interface State {
class FeatureErrorBoundary (line 18) | class FeatureErrorBoundary extends Component<Props, State> {
method constructor (line 19) | constructor(props: Props) {
method getDerivedStateFromError (line 24) | static getDerivedStateFromError(error: Error): Partial<State> {
method componentDidCatch (line 28) | componentDidCatch(error: Error, errorInfo: ErrorInfo) {
method render (line 52) | render() {
FILE: archon-ui-main/src/features/ui/components/ToastProvider.tsx
type ToastProviderProps (line 11) | interface ToastProviderProps {
function ToastProvider (line 22) | function ToastProvider({ children, duration = 4000, swipeDirection = "ri...
FILE: archon-ui-main/src/features/ui/primitives/OptimisticIndicator.tsx
type OptimisticIndicatorProps (line 5) | interface OptimisticIndicatorProps {
function OptimisticIndicator (line 16) | function OptimisticIndicator({
function withOptimisticStyles (line 35) | function withOptimisticStyles<T extends { className?: string }>(
FILE: archon-ui-main/src/features/ui/primitives/button.tsx
type ButtonProps (line 4) | interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonEleme...
type ButtonVariant (line 21) | type ButtonVariant = NonNullable<ButtonProps["variant"]>;
type ButtonSize (line 117) | type ButtonSize = NonNullable<ButtonProps["size"]>;
type IconButtonProps (line 158) | interface IconButtonProps extends Omit<ButtonProps, "size" | "children"> {
FILE: archon-ui-main/src/features/ui/primitives/card.tsx
type CardProps (line 4) | interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
FILE: archon-ui-main/src/features/ui/primitives/checkbox.tsx
type CheckboxColor (line 6) | type CheckboxColor = "purple" | "blue" | "green" | "pink" | "orange" | "...
type CheckboxProps (line 8) | interface CheckboxProps extends React.ComponentPropsWithoutRef<typeof Ch...
FILE: archon-ui-main/src/features/ui/primitives/combobox.tsx
type ComboBoxOption (line 15) | interface ComboBoxOption {
type ComboBoxProps (line 21) | interface ComboBoxProps {
FILE: archon-ui-main/src/features/ui/primitives/data-card.tsx
type DataCardProps (line 4) | interface DataCardProps extends React.HTMLAttributes<HTMLDivElement> {
type DataCardHeaderProps (line 17) | interface DataCardHeaderProps extends React.HTMLAttributes<HTMLDivElemen...
type DataCardContentProps (line 18) | interface DataCardContentProps extends React.HTMLAttributes<HTMLDivEleme...
type DataCardFooterProps (line 19) | interface DataCardFooterProps extends React.HTMLAttributes<HTMLDivElemen...
FILE: archon-ui-main/src/features/ui/primitives/draggable-card.tsx
type DraggableCardProps (line 5) | interface DraggableCardProps extends Omit<CardProps, "ref"> {
FILE: archon-ui-main/src/features/ui/primitives/grouped-card.tsx
type GroupedCardProps (line 5) | interface GroupedCardProps extends React.HTMLAttributes<HTMLDivElement> {
FILE: archon-ui-main/src/features/ui/primitives/input.tsx
type InputProps (line 4) | interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
type TextAreaProps (line 33) | interface TextAreaProps extends React.TextareaHTMLAttributes<HTMLTextAre...
type LabelProps (line 63) | interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {
type FormFieldProps (line 86) | interface FormFieldProps {
type FormGridProps (line 96) | interface FormGridProps {
FILE: archon-ui-main/src/features/ui/primitives/pill-navigation.tsx
type PillNavigationItem (line 6) | interface PillNavigationItem {
type PillNavigationProps (line 13) | interface PillNavigationProps {
FILE: archon-ui-main/src/features/ui/primitives/pill.tsx
type PillColor (line 4) | type PillColor = "blue" | "orange" | "cyan" | "purple" | "pink" | "green...
type StatPillProps (line 6) | interface StatPillProps extends React.HTMLAttributes<HTMLDivElement> {
constant SIZE_MAP (line 14) | const SIZE_MAP = {
constant COLOR_MAP (line 19) | const COLOR_MAP: Record<PillColor, { bg: string; text: string; border: s...
FILE: archon-ui-main/src/features/ui/primitives/select.tsx
type SelectColor (line 6) | type SelectColor = "purple" | "blue" | "green" | "pink" | "orange" | "cy...
FILE: archon-ui-main/src/features/ui/primitives/selectable-card.tsx
type SelectableCardProps (line 6) | interface SelectableCardProps extends Omit<CardProps, "ref"> {
FILE: archon-ui-main/src/features/ui/primitives/styles.ts
function cn (line 605) | function cn(...classes: (string | undefined | false)[]): string {
FILE: archon-ui-main/src/features/ui/primitives/switch.tsx
type SwitchSize (line 5) | type SwitchSize = "sm" | "md" | "lg";
type SwitchColor (line 6) | type SwitchColor = "purple" | "blue" | "green" | "pink" | "orange" | "cy...
type SwitchProps (line 8) | interface SwitchProps extends React.ComponentPropsWithoutRef<typeof Swit...
FILE: archon-ui-main/src/features/ui/primitives/tabs.tsx
type TabColor (line 27) | type TabColor = "blue" | "purple" | "pink" | "orange" | "cyan" | "green";
FILE: archon-ui-main/src/features/ui/primitives/toast.tsx
function getToastIcon (line 150) | function getToastIcon(type: "success" | "error" | "info" | "warning") {
FILE: archon-ui-main/src/features/ui/primitives/toggle-group.tsx
type ToggleGroupProps (line 5) | type ToggleGroupProps = (
type ToggleGroupItemProps (line 33) | interface ToggleGroupItemProps extends React.ComponentPropsWithoutRef<ty...
FILE: archon-ui-main/src/features/ui/primitives/tooltip.tsx
type SimpleTooltipProps (line 54) | interface SimpleTooltipProps {
FILE: archon-ui-main/src/hooks/useMigrationStatus.ts
type MigrationStatus (line 3) | interface MigrationStatus {
FILE: archon-ui-main/src/lib/utils.ts
function cn (line 3) | function cn(...inputs: ClassValue[]) {
FILE: archon-ui-main/src/pages/AgentWorkOrderDetailPage.tsx
function AgentWorkOrderDetailPage (line 10) | function AgentWorkOrderDetailPage() {
FILE: archon-ui-main/src/pages/AgentWorkOrdersPage.tsx
function AgentWorkOrdersPage (line 10) | function AgentWorkOrdersPage() {
FILE: archon-ui-main/src/pages/KnowledgeBasePage.tsx
function KnowledgeBasePage (line 7) | function KnowledgeBasePage(props: any) {
FILE: archon-ui-main/src/pages/ProjectPage.tsx
function ProjectPage (line 7) | function ProjectPage(props: any) {
FILE: archon-ui-main/src/services/agentChatService.ts
type ChatMessage (line 8) | interface ChatMessage {
type ChatSession (line 16) | interface ChatSession {
type ChatRequest (line 24) | interface ChatRequest {
class AgentChatService (line 30) | class AgentChatService {
method constructor (line 37) | constructor() {
method cleanupConnection (line 46) | private cleanupConnection(sessionId: string): void {
method checkServerStatus (line 60) | private async checkServerStatus(): Promise<'online' | 'offline'> {
method validateSession (line 83) | async validateSession(sessionId: string): Promise<boolean> {
method createSession (line 102) | async createSession(agentType: string, projectId?: string): Promise<Ch...
method sendMessage (line 138) | async sendMessage(sessionId: string, request: ChatRequest): Promise<Ch...
method streamMessages (line 163) | async streamMessages(
method stopStreaming (line 229) | stopStreaming(sessionId: string): void {
method getChatHistory (line 236) | async getChatHistory(sessionId: string): Promise<ChatMessage[]> {
method deleteSession (line 260) | async deleteSession(sessionId: string): Promise<void> {
method getServerStatus (line 284) | async getServerStatus(): Promise<'online' | 'offline' | 'unknown'> {
method cleanup (line 297) | cleanup(): void {
FILE: archon-ui-main/src/services/bugReportService.ts
type BugContext (line 9) | interface BugContext {
type BugReportData (line 33) | interface BugReportData {
class BugReportService (line 44) | class BugReportService {
method collectBugContext (line 48) | async collectBugContext(error?: Error): Promise<BugContext> {
method getVersion (line 79) | private async getVersion(): Promise<string> {
method getMemoryInfo (line 96) | private getMemoryInfo(): string {
method quickHealthCheck (line 111) | private async quickHealthCheck(): Promise<{ server: boolean; mcp: bool...
method getRecentLogs (line 135) | private async getRecentLogs(limit: number): Promise<string[]> {
method submitBugReport (line 150) | async submitBugReport(bugReport: BugReportData): Promise<{ success: bo...
method formatReportForClipboard (line 198) | formatReportForClipboard(bugReport: BugReportData): string {
FILE: archon-ui-main/src/services/credentialsService.ts
type Credential (line 1) | interface Credential {
type RagSettings (line 13) | interface RagSettings {
type CodeExtractionSettings (line 45) | interface CodeExtractionSettings {
type OllamaInstance (line 60) | interface OllamaInstance {
class CredentialsService (line 76) | class CredentialsService {
method notifyCredentialUpdate (line 79) | private notifyCredentialUpdate(keys: string[]): void {
method handleCredentialError (line 89) | private handleCredentialError(error: any, context: string): Error {
method getAllCredentials (line 108) | async getAllCredentials(): Promise<Credential[]> {
method getCredentialsByCategory (line 116) | async getCredentialsByCategory(category: string): Promise<Credential[]> {
method getCredential (line 156) | async getCredential(
method checkCredentialStatus (line 170) | async checkCredentialStatus(
method getRagSettings (line 188) | async getRagSettings(): Promise<RagSettings> {
method updateCredential (line 276) | async updateCredential(credential: Credential): Promise<Credential> {
method createCredential (line 305) | async createCredential(credential: Credential): Promise<Credential> {
method deleteCredential (line 331) | async deleteCredential(key: string): Promise<void> {
method updateRagSettings (line 348) | async updateRagSettings(settings: RagSettings): Promise<void> {
method getCodeExtractionSettings (line 369) | async getCodeExtractionSettings(): Promise<CodeExtractionSettings> {
method updateCodeExtractionSettings (line 410) | async updateCodeExtractionSettings(
method getOllamaInstances (line 431) | async getOllamaInstances(): Promise<OllamaInstance[]> {
method setOllamaInstances (line 488) | async setOllamaInstances(instances: OllamaInstance[]): Promise<void> {
method addOllamaInstance (line 542) | async addOllamaInstance(instance: OllamaInstance): Promise<void> {
method updateOllamaInstance (line 548) | async updateOllamaInstance(instanceId: string, updates: Partial<Ollama...
method removeOllamaInstance (line 560) | async removeOllamaInstance(instanceId: string): Promise<void> {
method migrateOllamaFromLocalStorage (line 571) | async migrateOllamaFromLocalStorage(): Promise<{ migrated: boolean; in...
FILE: archon-ui-main/src/services/ollamaService.ts
type OllamaModel (line 11) | interface OllamaModel {
type ModelDiscoveryResponse (line 36) | interface ModelDiscoveryResponse {
type InstanceHealthResponse (line 74) | interface InstanceHealthResponse {
type InstanceValidationResponse (line 91) | interface InstanceValidationResponse {
type EmbeddingRouteResponse (line 107) | interface EmbeddingRouteResponse {
type EmbeddingRoutesResponse (line 118) | interface EmbeddingRoutesResponse {
type ModelDiscoveryOptions (line 137) | interface ModelDiscoveryOptions {
type InstanceValidationOptions (line 142) | interface InstanceValidationOptions {
type EmbeddingRouteOptions (line 148) | interface EmbeddingRouteOptions {
class OllamaService (line 154) | class OllamaService {
method handleApiError (line 157) | private handleApiError(error: any, context: string): Error {
method discoverModels (line 186) | async discoverModels(options: ModelDiscoveryOptions): Promise<ModelDis...
method checkInstanceHealth (line 224) | async checkInstanceHealth(instanceUrls: string[], includeModels: boole...
method validateInstance (line 262) | async validateInstance(options: InstanceValidationOptions): Promise<In...
method analyzeEmbeddingRoute (line 293) | async analyzeEmbeddingRoute(options: EmbeddingRouteOptions): Promise<E...
method getEmbeddingRoutes (line 324) | async getEmbeddingRoutes(instanceUrls: string[], sortByPerformance: bo...
method clearCaches (line 362) | async clearCaches(): Promise<{ message: string }> {
method testConnection (line 386) | async testConnection(instanceUrl: string, retryCount = 3): Promise<{ i...
method getModelCapabilities (line 434) | async getModelCapabilities(modelName: string, instanceUrl: string): Pr...
FILE: archon-ui-main/src/services/openrouterService.ts
type OpenRouterEmbeddingModel (line 10) | interface OpenRouterEmbeddingModel {
type OpenRouterModelListResponse (line 20) | interface OpenRouterModelListResponse {
class OpenRouterService (line 25) | class OpenRouterService {
method handleApiError (line 30) | private handleApiError(error: unknown, context: string): Error {
method isCacheEntry (line 59) | private isCacheEntry(
method getCachedModels (line 114) | private getCachedModels(): OpenRouterModelListResponse | null {
method cacheModels (line 147) | private cacheModels(data: OpenRouterModelListResponse): void {
method discoverModels (line 162) | async discoverModels(): Promise<OpenRouterModelListResponse> {
method clearCache (line 234) | clearCache(): void {
FILE: archon-ui-main/src/services/serverHealthService.ts
type HealthCheckCallback (line 3) | interface HealthCheckCallback {
constant HEALTH_CHECK_INTERVAL_MS (line 9) | const HEALTH_CHECK_INTERVAL_MS = 30000;
class ServerHealthService (line 11) | class ServerHealthService {
method loadSettings (line 22) | async loadSettings() {
method checkHealth (line 32) | async checkHealth(): Promise<boolean> {
method startMonitoring (line 55) | startMonitoring(callbacks: HealthCheckCallback) {
method handleConnectionRestored (line 104) | private handleConnectionRestored() {
method stopMonitoring (line 114) | stopMonitoring() {
method isServerConnected (line 122) | isServerConnected(): boolean {
method handleImmediateDisconnect (line 130) | handleImmediateDisconnect() {
method handleConnectionReconnect (line 144) | handleConnectionReconnect() {
method getSettings (line 150) | getSettings() {
method updateSettings (line 156) | async updateSettings(settings: { enabled?: boolean }) {
FILE: archon-ui-main/src/utils/onboarding.ts
type NormalizedCredential (line 1) | interface NormalizedCredential {
type ProviderInfo (line 9) | interface ProviderInfo {
function isLmConfigured (line 23) | function isLmConfigured(
FILE: archon-ui-main/tests/manual/test-knowledge-api.ts
function testKnowledgeAPI (line 21) | async function testKnowledgeAPI() {
FILE: archon-ui-main/vite.config.ts
method configureServer (line 34) | configureServer(server) {
FILE: migration/0.1.0/001_add_source_url_display_name.sql
type idx_archon_sources_url (line 18) | CREATE INDEX IF NOT EXISTS idx_archon_sources_url ON archon_sources(sour...
type idx_archon_sources_display_name (line 19) | CREATE INDEX IF NOT EXISTS idx_archon_sources_display_name ON archon_sou...
FILE: migration/0.1.0/002_add_hybrid_search_tsvector.sql
type idx_archon_crawled_pages_content_search (line 26) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_content_search ON ar...
type idx_archon_code_examples_content_search (line 27) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_content_search ON ar...
type idx_archon_crawled_pages_content_trgm (line 30) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_content_trgm ON arch...
type idx_archon_code_examples_content_trgm (line 31) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_content_trgm ON arch...
type idx_archon_code_examples_summary_trgm (line 32) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_summary_trgm ON arch...
function hybrid_search_archon_crawled_pages_multi (line 39) | CREATE OR REPLACE FUNCTION hybrid_search_archon_crawled_pages_multi(
function hybrid_search_archon_crawled_pages (line 147) | CREATE OR REPLACE FUNCTION hybrid_search_archon_crawled_pages(
function hybrid_search_archon_code_examples_multi (line 172) | CREATE OR REPLACE FUNCTION hybrid_search_archon_code_examples_multi(
function hybrid_search_archon_code_examples (line 284) | CREATE OR REPLACE FUNCTION hybrid_search_archon_code_examples(
FILE: migration/0.1.0/005_ollama_create_functions.sql
function detect_embedding_dimension (line 9) | CREATE OR REPLACE FUNCTION detect_embedding_dimension(embedding_vector v...
function get_embedding_column_name (line 17) | CREATE OR REPLACE FUNCTION get_embedding_column_name(dimension INTEGER)
function match_archon_crawled_pages_multi (line 32) | CREATE OR REPLACE FUNCTION match_archon_crawled_pages_multi (
function match_archon_code_examples (line 148) | CREATE OR REPLACE FUNCTION match_archon_code_examples (
FILE: migration/0.1.0/006_ollama_create_indexes_optional.sql
type idx_archon_crawled_pages_embedding_1536 (line 17) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_1536
type idx_archon_code_examples_embedding_1536 (line 22) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_1536
type idx_archon_crawled_pages_embedding_768 (line 27) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_768
type idx_archon_code_examples_embedding_768 (line 32) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_768
type idx_archon_crawled_pages_embedding_384 (line 37) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_384
type idx_archon_code_examples_embedding_384 (line 42) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_384
type idx_archon_crawled_pages_embedding_1024 (line 47) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_1024
type idx_archon_code_examples_embedding_1024 (line 52) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_1024
type idx_archon_crawled_pages_embedding_model (line 57) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_model ON a...
type idx_archon_crawled_pages_embedding_dimension (line 58) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_dimension ...
type idx_archon_crawled_pages_llm_chat_model (line 59) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_llm_chat_model ON ar...
type idx_archon_code_examples_embedding_model (line 60) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_model ON a...
type idx_archon_code_examples_embedding_dimension (line 61) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_dimension ...
type idx_archon_code_examples_llm_chat_model (line 62) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_llm_chat_model ON ar...
FILE: migration/0.1.0/007_add_priority_column_to_tasks.sql
type idx_archon_tasks_priority (line 66) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_priority ON archon_tasks(pri...
FILE: migration/0.1.0/008_add_migration_tracking.sql
type archon_migrations (line 8) | CREATE TABLE IF NOT EXISTS archon_migrations (
type idx_archon_migrations_version (line 18) | CREATE INDEX IF NOT EXISTS idx_archon_migrations_version ON archon_migra...
type idx_archon_migrations_applied_at (line 21) | CREATE INDEX IF NOT EXISTS idx_archon_migrations_applied_at ON archon_mi...
FILE: migration/0.1.0/011_add_page_metadata_table.sql
type archon_page_metadata (line 14) | CREATE TABLE IF NOT EXISTS archon_page_metadata (
type idx_archon_page_metadata_source_id (line 52) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_source_id ON archon_...
type idx_archon_page_metadata_url (line 53) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_url ON archon_page_m...
type idx_archon_page_metadata_section (line 54) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_section ON archon_pa...
type idx_archon_page_metadata_created_at (line 55) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_created_at ON archon...
type idx_archon_page_metadata_metadata (line 56) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_metadata ON archon_p...
type idx_archon_crawled_pages_page_id (line 57) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_page_id ON archon_cr...
FILE: migration/agent_work_orders_repositories.sql
type archon_configured_repositories (line 23) | CREATE TABLE IF NOT EXISTS archon_configured_repositories (
type idx_configured_repositories_url (line 59) | CREATE UNIQUE INDEX IF NOT EXISTS idx_configured_repositories_url
type idx_configured_repositories_verified (line 63) | CREATE INDEX IF NOT EXISTS idx_configured_repositories_verified
type idx_configured_repositories_created_at (line 67) | CREATE INDEX IF NOT EXISTS idx_configured_repositories_created_at
type idx_configured_repositories_commands (line 71) | CREATE INDEX IF NOT EXISTS idx_configured_repositories_commands
FILE: migration/agent_work_orders_state.sql
type archon_agent_work_orders (line 25) | CREATE TABLE IF NOT EXISTS archon_agent_work_orders (
type archon_agent_work_order_steps (line 47) | CREATE TABLE IF NOT EXISTS archon_agent_work_order_steps (
type idx_agent_work_orders_status (line 73) | CREATE INDEX IF NOT EXISTS idx_agent_work_orders_status
type idx_agent_work_orders_created_at (line 77) | CREATE INDEX IF NOT EXISTS idx_agent_work_orders_created_at
type idx_agent_work_orders_repository (line 81) | CREATE INDEX IF NOT EXISTS idx_agent_work_orders_repository
type idx_agent_work_orders_metadata (line 85) | CREATE INDEX IF NOT EXISTS idx_agent_work_orders_metadata
type idx_agent_work_order_steps_work_order_id (line 91) | CREATE INDEX IF NOT EXISTS idx_agent_work_order_steps_work_order_id
type idx_agent_work_order_steps_executed_at (line 95) | CREATE INDEX IF NOT EXISTS idx_agent_work_order_steps_executed_at
FILE: migration/backup_database.sql
function get_backup_timestamp (line 13) | CREATE OR REPLACE FUNCTION get_backup_timestamp()
FILE: migration/complete_setup.sql
type archon_settings (line 26) | CREATE TABLE IF NOT EXISTS archon_settings (
type idx_archon_settings_key (line 39) | CREATE INDEX IF NOT EXISTS idx_archon_settings_key ON archon_settings(key)
type idx_archon_settings_category (line 40) | CREATE INDEX IF NOT EXISTS idx_archon_settings_category ON archon_settin...
function update_updated_at_column (line 43) | CREATE OR REPLACE FUNCTION update_updated_at_column()
type archon_sources (line 175) | CREATE TABLE IF NOT EXISTS archon_sources (
type idx_archon_sources_title (line 188) | CREATE INDEX IF NOT EXISTS idx_archon_sources_title ON archon_sources(ti...
type idx_archon_sources_url (line 189) | CREATE INDEX IF NOT EXISTS idx_archon_sources_url ON archon_sources(sour...
type idx_archon_sources_display_name (line 190) | CREATE INDEX IF NOT EXISTS idx_archon_sources_display_name ON archon_sou...
type idx_archon_sources_metadata (line 191) | CREATE INDEX IF NOT EXISTS idx_archon_sources_metadata ON archon_sources...
type idx_archon_sources_knowledge_type (line 192) | CREATE INDEX IF NOT EXISTS idx_archon_sources_knowledge_type ON archon_s...
type archon_crawled_pages (line 202) | CREATE TABLE IF NOT EXISTS archon_crawled_pages (
type idx_archon_crawled_pages_embedding_384 (line 231) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_384 ON arc...
type idx_archon_crawled_pages_embedding_768 (line 232) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_768 ON arc...
type idx_archon_crawled_pages_embedding_1024 (line 233) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_1024 ON ar...
type idx_archon_crawled_pages_embedding_1536 (line 234) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_embedding_1536 ON ar...
type idx_archon_crawled_pages_metadata (line 239) | CREATE INDEX idx_archon_crawled_pages_metadata ON archon_crawled_pages U...
type idx_archon_crawled_pages_source_id (line 240) | CREATE INDEX idx_archon_crawled_pages_source_id ON archon_crawled_pages ...
type idx_archon_crawled_pages_content_search (line 242) | CREATE INDEX idx_archon_crawled_pages_content_search ON archon_crawled_p...
type idx_archon_crawled_pages_content_trgm (line 243) | CREATE INDEX idx_archon_crawled_pages_content_trgm ON archon_crawled_pag...
type idx_archon_crawled_pages_embedding_model (line 245) | CREATE INDEX idx_archon_crawled_pages_embedding_model ON archon_crawled_...
type idx_archon_crawled_pages_embedding_dimension (line 246) | CREATE INDEX idx_archon_crawled_pages_embedding_dimension ON archon_craw...
type idx_archon_crawled_pages_llm_chat_model (line 247) | CREATE INDEX idx_archon_crawled_pages_llm_chat_model ON archon_crawled_p...
type archon_code_examples (line 250) | CREATE TABLE IF NOT EXISTS archon_code_examples (
type archon_page_metadata (line 281) | CREATE TABLE IF NOT EXISTS archon_page_metadata (
type idx_archon_page_metadata_source_id (line 319) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_source_id ON archon_...
type idx_archon_page_metadata_url (line 320) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_url ON archon_page_m...
type idx_archon_page_metadata_section (line 321) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_section ON archon_pa...
type idx_archon_page_metadata_created_at (line 322) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_created_at ON archon...
type idx_archon_page_metadata_metadata (line 323) | CREATE INDEX IF NOT EXISTS idx_archon_page_metadata_metadata ON archon_p...
type idx_archon_crawled_pages_page_id (line 324) | CREATE INDEX IF NOT EXISTS idx_archon_crawled_pages_page_id ON archon_cr...
type idx_archon_code_examples_embedding_384 (line 343) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_384 ON arc...
type idx_archon_code_examples_embedding_768 (line 344) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_768 ON arc...
type idx_archon_code_examples_embedding_1024 (line 345) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_1024 ON ar...
type idx_archon_code_examples_embedding_1536 (line 346) | CREATE INDEX IF NOT EXISTS idx_archon_code_examples_embedding_1536 ON ar...
type idx_archon_code_examples_metadata (line 351) | CREATE INDEX idx_archon_code_examples_metadata ON archon_code_examples U...
type idx_archon_code_examples_source_id (line 352) | CREATE INDEX idx_archon_code_examples_source_id ON archon_code_examples ...
type idx_archon_code_examples_content_search (line 354) | CREATE INDEX idx_archon_code_examples_content_search ON archon_code_exam...
type idx_archon_code_examples_content_trgm (line 355) | CREATE INDEX idx_archon_code_examples_content_trgm ON archon_code_exampl...
type idx_archon_code_examples_summary_trgm (line 356) | CREATE INDEX idx_archon_code_examples_summary_trgm ON archon_code_exampl...
type idx_archon_code_examples_embedding_model (line 358) | CREATE INDEX idx_archon_code_examples_embedding_model ON archon_code_exa...
type idx_archon_code_examples_embedding_dimension (line 359) | CREATE INDEX idx_archon_code_examples_embedding_dimension ON archon_code...
type idx_archon_code_examples_llm_chat_model (line 360) | CREATE INDEX idx_archon_code_examples_llm_chat_model ON archon_code_exam...
function detect_embedding_dimension (line 367) | CREATE OR REPLACE FUNCTION detect_embedding_dimension(embedding_vector v...
function get_embedding_column_name (line 375) | CREATE OR REPLACE FUNCTION get_embedding_column_name(dimension INTEGER)
function match_archon_crawled_pages_multi (line 394) | CREATE OR REPLACE FUNCTION match_archon_crawled_pages_multi (
function match_archon_crawled_pages (line 444) | CREATE OR REPLACE FUNCTION match_archon_crawled_pages (
function match_archon_code_examples_multi (line 466) | CREATE OR REPLACE FUNCTION match_archon_code_examples_multi (
function match_archon_code_examples (line 517) | CREATE OR REPLACE FUNCTION match_archon_code_examples (
function hybrid_search_archon_crawled_pages_multi (line 544) | CREATE OR REPLACE FUNCTION hybrid_search_archon_crawled_pages_multi(
function hybrid_search_archon_crawled_pages (line 652) | CREATE OR REPLACE FUNCTION hybrid_search_archon_crawled_pages(
function hybrid_search_archon_code_examples_multi (line 677) | CREATE OR REPLACE FUNCTION hybrid_search_archon_code_examples_multi(
function hybrid_search_archon_code_examples (line 789) | CREATE OR REPLACE FUNCTION hybrid_search_archon_code_examples(
type archon_projects (line 877) | CREATE TABLE IF NOT EXISTS archon_projects (
type archon_tasks (line 891) | CREATE TABLE IF NOT EXISTS archon_tasks (
type archon_project_sources (line 912) | CREATE TABLE IF NOT EXISTS archon_project_sources (
type archon_document_versions (line 924) | CREATE TABLE IF NOT EXISTS archon_document_versions (
type idx_archon_tasks_project_id (line 946) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_project_id ON archon_tasks(p...
type idx_archon_tasks_status (line 947) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_status ON archon_tasks(status)
type idx_archon_tasks_assignee (line 948) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_assignee ON archon_tasks(ass...
type idx_archon_tasks_order (line 949) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_order ON archon_tasks(task_o...
type idx_archon_tasks_priority (line 950) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_priority ON archon_tasks(pri...
type idx_archon_tasks_archived (line 951) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_archived ON archon_tasks(arc...
type idx_archon_tasks_archived_at (line 952) | CREATE INDEX IF NOT EXISTS idx_archon_tasks_archived_at ON archon_tasks(...
type idx_archon_project_sources_project_id (line 953) | CREATE INDEX IF NOT EXISTS idx_archon_project_sources_project_id ON arch...
type idx_archon_project_sources_source_id (line 954) | CREATE INDEX IF NOT EXISTS idx_archon_project_sources_source_id ON archo...
type idx_archon_document_versions_project_id (line 955) | CREATE INDEX IF NOT EXISTS idx_archon_document_versions_project_id ON ar...
type idx_archon_document_versions_task_id (line 956) | CREATE INDEX IF NOT EXISTS idx_archon_document_versions_task_id ON archo...
type idx_archon_document_versions_field_name (line 957) | CREATE INDEX IF NOT EXISTS idx_archon_document_versions_field_name ON ar...
type idx_archon_document_versions_version_number (line 958) | CREATE INDEX IF NOT EXISTS idx_archon_document_versions_version_number O...
type idx_archon_document_versions_created_at (line 959) | CREATE INDEX IF NOT EXISTS idx_archon_document_versions_created_at ON ar...
function archive_task (line 971) | CREATE OR REPLACE FUNCTION archive_task(
type archon_migrations (line 1031) | CREATE TABLE IF NOT EXISTS archon_migrations (
type idx_archon_migrations_version (line 1041) | CREATE INDEX IF NOT EXISTS idx_archon_migrations_version ON archon_migra...
type idx_archon_migrations_applied_at (line 1042) | CREATE INDEX IF NOT EXISTS idx_archon_migrations_applied_at ON archon_mi...
type archon_prompts (line 1090) | CREATE TABLE IF NOT EXISTS archon_prompts (
type idx_archon_prompts_name (line 1100) | CREATE INDEX IF NOT EXISTS idx_archon_prompts_name ON archon_prompts(pro...
FILE: python/src/agent_work_orders/agent_executor/agent_cli_executor.py
class AgentCLIExecutor (line 18) | class AgentCLIExecutor:
method __init__ (line 21) | def __init__(self, cli_path: str | None = None):
method build_command (line 25) | def build_command(
method execute_async (line 95) | async def execute_async(
method _save_prompt (line 260) | def _save_prompt(self, prompt_text: str, work_order_id: str) -> Path |...
method _save_output_artifacts (line 291) | def _save_output_artifacts(self, jsonl_output: str, work_order_id: str...
method _extract_session_id (line 332) | def _extract_session_id(self, jsonl_output: str) -> str | None:
method _extract_result_message (line 360) | def _extract_result_message(self, jsonl_output: str) -> dict[str, obje...
FILE: python/src/agent_work_orders/api/routes.py
function _create_task_done_callback (line 49) | def _create_task_done_callback(agent_work_order_id: str) -> Callable[[as...
function create_agent_work_order (line 149) | async def create_agent_work_order(
function list_configured_repositories (line 275) | async def list_configured_repositories() -> list[ConfiguredRepository]:
function create_configured_repository (line 302) | async def create_configured_repository(
function update_configured_repository (line 418) | async def update_configured_repository(
function delete_configured_repository (line 470) | async def delete_configured_repository(repository_id: str) -> None:
function verify_repository_access (line 507) | async def verify_repository_access(repository_id: str) -> dict[str, bool...
function get_agent_work_order (line 582) | async def get_agent_work_order(agent_work_order_id: str) -> AgentWorkOrder:
function list_agent_work_orders (line 628) | async def list_agent_work_orders(
function send_prompt_to_agent (line 671) | async def send_prompt_to_agent(
function get_git_progress (line 696) | async def get_git_progress(agent_work_order_id: str) -> GitProgressSnaps...
function get_agent_work_order_logs (line 744) | async def get_agent_work_order_logs(
function stream_agent_work_order_logs (line 799) | async def stream_agent_work_order_logs(
function get_agent_work_order_steps (line 859) | async def get_agent_work_order_steps(agent_work_order_id: str) -> StepHi...
function verify_github_repository (line 904) | async def verify_github_repository(
FILE: python/src/agent_work_orders/api/sse_streams.py
function stream_work_order_logs (line 16) | async def stream_work_order_logs(
function format_log_event (line 98) | def format_log_event(log_dict: dict[str, Any]) -> dict[str, str]:
function get_current_timestamp (line 124) | def get_current_timestamp() -> str:
FILE: python/src/agent_work_orders/command_loader/claude_command_loader.py
class ClaudeCommandLoader (line 15) | class ClaudeCommandLoader:
method __init__ (line 18) | def __init__(self, commands_directory: str | None = None):
method load_command (line 22) | def load_command(self, command_name: str) -> str:
method list_available_commands (line 49) | def list_available_commands(self) -> list[str]:
FILE: python/src/agent_work_orders/config.py
function get_project_root (line 10) | def get_project_root() -> Path:
class AgentWorkOrdersConfig (line 17) | class AgentWorkOrdersConfig:
method ensure_temp_dir (line 75) | def ensure_temp_dir(cls) -> Path:
method get_archon_server_url (line 82) | def get_archon_server_url(cls) -> str:
method get_archon_mcp_url (line 95) | def get_archon_mcp_url(cls) -> str:
FILE: python/src/agent_work_orders/database/client.py
function get_agent_work_orders_client (line 17) | def get_agent_work_orders_client() -> Client:
function check_database_health (line 45) | async def check_database_health() -> dict[str, Any]:
FILE: python/src/agent_work_orders/github_integration/github_client.py
class GitHubClient (line 17) | class GitHubClient:
method __init__ (line 20) | def __init__(self, gh_cli_path: str | None = None):
method verify_repository_access (line 24) | async def verify_repository_access(self, repository_url: str) -> bool:
method get_repository_info (line 71) | async def get_repository_info(self, repository_url: str) -> GitHubRepo...
method get_issue (line 134) | async def get_issue(self, repository_url: str, issue_number: str) -> d...
method create_pull_request (line 180) | async def create_pull_request(
method _parse_repository_url (line 277) | def _parse_repository_url(self, repository_url: str) -> tuple[str, str]:
FILE: python/src/agent_work_orders/main.py
function health (line 36) | async def health() -> dict:
FILE: python/src/agent_work_orders/models.py
class AgentWorkOrderStatus (line 12) | class AgentWorkOrderStatus(str, Enum):
class AgentWorkflowType (line 21) | class AgentWorkflowType(str, Enum):
class SandboxType (line 27) | class SandboxType(str, Enum):
class AgentWorkflowPhase (line 36) | class AgentWorkflowPhase(str, Enum):
class WorkflowStep (line 43) | class WorkflowStep(str, Enum):
class AgentWorkOrderState (line 54) | class AgentWorkOrderState(BaseModel):
class AgentWorkOrder (line 68) | class AgentWorkOrder(BaseModel):
class CreateAgentWorkOrderRequest (line 96) | class CreateAgentWorkOrderRequest(BaseModel):
method validate_commands (line 118) | def validate_commands(cls, v: list[str]) -> list[str]:
class AgentWorkOrderResponse (line 127) | class AgentWorkOrderResponse(BaseModel):
class AgentPromptRequest (line 135) | class AgentPromptRequest(BaseModel):
class GitProgressSnapshot (line 142) | class GitProgressSnapshot(BaseModel):
class GitHubRepositoryVerificationRequest (line 153) | class GitHubRepositoryVerificationRequest(BaseModel):
class GitHubRepositoryVerificationResponse (line 159) | class GitHubRepositoryVerificationResponse(BaseModel):
class GitHubRepository (line 169) | class GitHubRepository(BaseModel):
class ConfiguredRepository (line 178) | class ConfiguredRepository(BaseModel):
class CreateRepositoryRequest (line 211) | class CreateRepositoryRequest(BaseModel):
class UpdateRepositoryRequest (line 226) | class UpdateRepositoryRequest(BaseModel):
class GitHubPullRequest (line 243) | class GitHubPullRequest(BaseModel):
class GitHubIssue (line 253) | class GitHubIssue(BaseModel):
class CommandExecutionResult (line 263) | class CommandExecutionResult(BaseModel):
class StepExecutionResult (line 277) | class StepExecutionResult(BaseModel):
class StepHistory (line 290) | class StepHistory(BaseModel):
method get_current_step (line 296) | def get_current_step(self) -> WorkflowStep | None:
class CommandNotFoundError (line 323) | class CommandNotFoundError(Exception):
class WorkflowExecutionError (line 329) | class WorkflowExecutionError(Exception):
class SandboxSetupError (line 335) | class SandboxSetupError(Exception):
class GitHubOperationError (line 341) | class GitHubOperationError(Exception):
FILE: python/src/agent_work_orders/sandbox_manager/git_branch_sandbox.py
class GitBranchSandbox (line 20) | class GitBranchSandbox:
method __init__ (line 27) | def __init__(self, repository_url: str, sandbox_identifier: str):
method setup (line 38) | async def setup(self) -> None:
method execute_command (line 72) | async def execute_command(
method get_git_branch_name (line 168) | async def get_git_branch_name(self) -> str | None:
method cleanup (line 180) | async def cleanup(self) -> None:
FILE: python/src/agent_work_orders/sandbox_manager/git_worktree_sandbox.py
class GitWorktreeSandbox (line 27) | class GitWorktreeSandbox:
method __init__ (line 35) | def __init__(self, repository_url: str, sandbox_identifier: str):
method setup (line 48) | async def setup(self) -> None:
method execute_command (line 107) | async def execute_command(
method get_git_branch_name (line 192) | async def get_git_branch_name(self) -> str | None:
method cleanup (line 204) | async def cleanup(self) -> None:
method _delete_temp_branch (line 243) | async def _delete_temp_branch(self) -> None:
FILE: python/src/agent_work_orders/sandbox_manager/sandbox_factory.py
class SandboxFactory (line 12) | class SandboxFactory:
method create_sandbox (line 15) | def create_sandbox(
FILE: python/src/agent_work_orders/sandbox_manager/sandbox_protocol.py
class AgentSandbox (line 11) | class AgentSandbox(Protocol):
method setup (line 22) | async def setup(self) -> None:
method execute_command (line 31) | async def execute_command(self, command: str, timeout: int = 300) -> C...
method get_git_branch_name (line 43) | async def get_git_branch_name(self) -> str | None:
method cleanup (line 51) | async def cleanup(self) -> None:
FILE: python/src/agent_work_orders/server.py
function lifespan (line 27) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
function health_check (line 123) | async def health_check() -> dict[str, Any]:
function root (line 259) | async def root() -> dict:
FILE: python/src/agent_work_orders/state_manager/file_state_repository.py
class FileStateRepository (line 22) | class FileStateRepository:
method __init__ (line 29) | def __init__(self, state_directory: str):
method _get_state_file_path (line 38) | def _get_state_file_path(self, agent_work_order_id: str) -> Path:
method _serialize_datetime (line 49) | def _serialize_datetime(self, obj):
method _read_state_file (line 62) | async def _read_state_file(self, agent_work_order_id: str) -> dict[str...
method _write_state_file (line 88) | async def _write_state_file(self, agent_work_order_id: str, data: dict...
method create (line 109) | async def create(self, work_order: AgentWorkOrderState, metadata: dict...
method get (line 130) | async def get(self, agent_work_order_id: str) -> tuple[AgentWorkOrderS...
method list (line 149) | async def list(self, status_filter: AgentWorkOrderStatus | None = None...
method update_status (line 183) | async def update_status(
method update_git_branch (line 219) | async def update_git_branch(
method update_session_id (line 248) | async def update_session_id(
method save_step_history (line 277) | async def save_step_history(
method get_step_history (line 306) | async def get_step_history(self, agent_work_order_id: str) -> StepHist...
method delete (line 322) | async def delete(self, agent_work_order_id: str) -> None:
method list_state_ids (line 337) | def list_state_ids(self) -> "list[str]": # type: ignore[valid-type]
FILE: python/src/agent_work_orders/state_manager/repository_config_repository.py
function get_supabase_client (line 19) | def get_supabase_client() -> Client:
class RepositoryConfigRepository (line 39) | class RepositoryConfigRepository:
method __init__ (line 59) | def __init__(self) -> None:
method _row_to_model (line 66) | def _row_to_model(self, row: dict[str, Any]) -> ConfiguredRepository:
method list_repositories (line 126) | async def list_repositories(self) -> list[ConfiguredRepository]:
method get_repository (line 155) | async def get_repository(self, repository_id: str) -> ConfiguredReposi...
method create_repository (line 196) | async def create_repository(
method update_repository (line 254) | async def update_repository(
method delete_repository (line 317) | async def delete_repository(self, repository_id: str) -> bool:
FILE: python/src/agent_work_orders/state_manager/repository_factory.py
function create_repository (line 21) | def create_repository() -> WorkOrderRepository | FileStateRepository | S...
FILE: python/src/agent_work_orders/state_manager/supabase_repository.py
class SupabaseWorkOrderRepository (line 31) | class SupabaseWorkOrderRepository:
method __init__ (line 48) | def __init__(self) -> None:
method _row_to_state_and_metadata (line 60) | def _row_to_state_and_metadata(self, row: dict[str, Any]) -> tuple[Age...
method create (line 90) | async def create(self, work_order: AgentWorkOrderState, metadata: dict...
method get (line 142) | async def get(self, agent_work_order_id: str) -> tuple[AgentWorkOrderS...
method list (line 176) | async def list(self, status_filter: AgentWorkOrderStatus | None = None...
method update_status (line 219) | async def update_status(
method update_git_branch (line 292) | async def update_git_branch(
method update_session_id (line 326) | async def update_session_id(
method save_step_history (line 360) | async def save_step_history(
method get_step_history (line 429) | async def get_step_history(self, agent_work_order_id: str) -> StepHist...
FILE: python/src/agent_work_orders/state_manager/work_order_repository.py
class WorkOrderRepository (line 16) | class WorkOrderRepository:
method __init__ (line 23) | def __init__(self):
method create (line 30) | async def create(self, work_order: AgentWorkOrderState, metadata: dict...
method get (line 45) | async def get(self, agent_work_order_id: str) -> tuple[AgentWorkOrderS...
method list (line 62) | async def list(self, status_filter: AgentWorkOrderStatus | None = None...
method update_status (line 82) | async def update_status(
method update_git_branch (line 109) | async def update_git_branch(
method update_session_id (line 128) | async def update_session_id(
method save_step_history (line 147) | async def save_step_history(
method get_step_history (line 164) | async def get_step_history(self, agent_work_order_id: str) -> StepHist...
FILE: python/src/agent_work_orders/utils/git_operations.py
function get_commit_count (line 10) | async def get_commit_count(branch_name: str, repo_path: str | Path, base...
function get_files_changed (line 36) | async def get_files_changed(branch_name: str, repo_path: str | Path, bas...
function get_latest_commit_message (line 63) | async def get_latest_commit_message(branch_name: str, repo_path: str | P...
function has_planning_commits (line 88) | async def has_planning_commits(branch_name: str, repo_path: str | Path) ...
function get_current_branch (line 138) | async def get_current_branch(repo_path: str | Path) -> str | None:
FILE: python/src/agent_work_orders/utils/id_generator.py
function generate_work_order_id (line 9) | def generate_work_order_id() -> str:
function generate_sandbox_identifier (line 21) | def generate_sandbox_identifier(agent_work_order_id: str) -> str:
FILE: python/src/agent_work_orders/utils/log_buffer.py
class WorkOrderLogBuffer (line 15) | class WorkOrderLogBuffer:
method __init__ (line 26) | def __init__(self) -> None:
method add_log (line 35) | def add_log(
method get_logs (line 72) | def get_logs(
method get_logs_since (line 127) | def get_logs_since(
method clear_work_order (line 151) | def clear_work_order(self, work_order_id: str) -> None:
method cleanup_old_work_orders (line 166) | def cleanup_old_work_orders(self) -> int:
method start_cleanup_task (line 196) | async def start_cleanup_task(self, interval_seconds: int = 300) -> None:
method stop_cleanup_task (line 219) | async def stop_cleanup_task(self) -> None:
method get_work_order_count (line 233) | def get_work_order_count(self) -> int:
method get_log_count (line 242) | def get_log_count(self, work_order_id: str) -> int:
FILE: python/src/agent_work_orders/utils/port_allocation.py
function get_port_range_for_work_order (line 23) | def get_port_range_for_work_order(work_order_id: str) -> tuple[int, int]:
function is_port_available (line 54) | def is_port_available(port: int) -> bool:
function find_available_port_range (line 72) | def find_available_port_range(
function create_ports_env_file (line 118) | def create_ports_env_file(
function get_ports_for_work_order (line 177) | def get_ports_for_work_order(work_order_id: str) -> tuple[int, int]:
function find_next_available_ports (line 195) | def find_next_available_ports(work_order_id: str, max_attempts: int = 20...
FILE: python/src/agent_work_orders/utils/state_reconciliation.py
function find_orphaned_worktrees (line 21) | async def find_orphaned_worktrees(repository: SupabaseWorkOrderRepositor...
function find_dangling_state (line 66) | async def find_dangling_state(repository: SupabaseWorkOrderRepository) -...
function reconcile_state (line 106) | async def reconcile_state(
FILE: python/src/agent_work_orders/utils/structured_logger.py
class BufferProcessor (line 16) | class BufferProcessor:
method __init__ (line 23) | def __init__(self, buffer: WorkOrderLogBuffer) -> None:
method __call__ (line 31) | def __call__(
function configure_structured_logging (line 70) | def configure_structured_logging(log_level: str = "INFO") -> None:
function configure_structured_logging_with_buffer (line 98) | def configure_structured_logging_with_buffer(
function bind_work_order_context (line 130) | def bind_work_order_context(work_order_id: str) -> None:
function clear_work_order_context (line 147) | def clear_work_order_context() -> None:
function get_logger (line 164) | def get_logger(name: str | None = None) -> structlog.stdlib.BoundLogger:
FILE: python/src/agent_work_orders/utils/worktree_operations.py
function _get_repo_hash (line 21) | def _get_repo_hash(repository_url: str) -> str:
function get_base_repo_path (line 33) | def get_base_repo_path(repository_url: str) -> str:
function get_worktree_path (line 47) | def get_worktree_path(repository_url: str, work_order_id: str) -> str:
function ensure_base_repository (line 62) | def ensure_base_repository(repository_url: str, logger: "structlog.stdli...
function create_worktree (line 107) | def create_worktree(
function validate_worktree (line 172) | def validate_worktree(
function remove_worktree (line 218) | def remove_worktree(
function setup_worktree_environment (line 267) | def setup_worktree_environment(
FILE: python/src/agent_work_orders/workflow_engine/workflow_operations.py
function run_create_branch_step (line 25) | async def run_create_branch_step(
function run_planning_step (line 97) | async def run_planning_step(
function run_execute_step (line 170) | async def run_execute_step(
function run_commit_step (line 244) | async def run_commit_step(
function run_create_pr_step (line 314) | async def run_create_pr_step(
function run_review_step (line 390) | async def run_review_step(
FILE: python/src/agent_work_orders/workflow_engine/workflow_orchestrator.py
class WorkflowOrchestrator (line 32) | class WorkflowOrchestrator:
method __init__ (line 35) | def __init__(
method execute_workflow (line 50) | async def execute_workflow(
method _calculate_git_stats (line 272) | async def _calculate_git_stats(
FILE: python/src/agents/base_agent.py
class ArchonDependencies (line 21) | class ArchonDependencies:
class BaseAgentOutput (line 34) | class BaseAgentOutput(BaseModel):
class RateLimitHandler (line 43) | class RateLimitHandler:
method __init__ (line 46) | def __init__(self, max_retries: int = 5, base_delay: float = 1.0):
method execute_with_rate_limit (line 52) | async def execute_with_rate_limit(self, func, *args, progress_callback...
method _extract_wait_time (line 127) | def _extract_wait_time(self, error_message: str) -> float | None:
class BaseAgent (line 141) | class BaseAgent(ABC, Generic[DepsT, OutputT]):
method __init__ (line 153) | def __init__(
method _create_agent (line 179) | def _create_agent(self, **kwargs) -> Agent:
method get_system_prompt (line 184) | def get_system_prompt(self) -> str:
method run (line 188) | async def run(self, user_prompt: str, deps: DepsT) -> OutputT:
method _run_agent (line 208) | async def _run_agent(self, user_prompt: str, deps: DepsT) -> OutputT:
method run_stream (line 226) | def run_stream(self, user_prompt: str, deps: DepsT):
method add_tool (line 243) | def add_tool(self, func, **tool_kwargs):
method add_system_prompt_function (line 253) | def add_system_prompt_function(self, func):
method agent (line 263) | def agent(self) -> Agent:
FILE: python/src/agents/document_agent.py
class DocumentDependencies (line 27) | class DocumentDependencies(ArchonDependencies):
class DocumentOperation (line 35) | class DocumentOperation(BaseModel):
class DocumentAgent (line 52) | class DocumentAgent(BaseAgent[DocumentDependencies, DocumentOperation]):
method __init__ (line 64) | def __init__(self, model: str = None, **kwargs):
method _create_agent (line 73) | def _create_agent(self, **kwargs) -> Agent:
method _generate_block_id (line 662) | def _generate_block_id(self) -> str:
method _create_block (line 666) | def _create_block(
method _convert_to_blocks (line 677) | def _convert_to_blocks(
method get_system_prompt (line 795) | def get_system_prompt(self) -> str:
method run_conversation (line 810) | async def run_conversation(
FILE: python/src/agents/mcp_client.py
class MCPClient (line 18) | class MCPClient:
method __init__ (line 21) | def __init__(self, mcp_url: str = None):
method __aenter__ (line 49) | async def __aenter__(self):
method __aexit__ (line 53) | async def __aexit__(self, exc_type, exc_val, exc_tb):
method close (line 57) | async def close(self):
method call_tool (line 61) | async def call_tool(self, tool_name: str, **kwargs) -> dict[str, Any]:
method perform_rag_query (line 101) | async def perform_rag_query(self, query: str, source: str = None, matc...
method get_available_sources (line 108) | async def get_available_sources(self) -> str:
method search_code_examples (line 113) | async def search_code_examples(
method manage_project (line 122) | async def manage_project(self, action: str, **kwargs) -> str:
method manage_document (line 127) | async def manage_document(self, action: str, project_id: str, **kwargs...
method manage_task (line 134) | async def manage_task(self, action: str, project_id: str, **kwargs) ->...
function get_mcp_client (line 144) | async def get_mcp_client() -> MCPClient:
FILE: python/src/agents/rag_agent.py
class RagDependencies (line 25) | class RagDependencies(ArchonDependencies):
class RagQueryResult (line 34) | class RagQueryResult(BaseModel):
class RagAgent (line 50) | class RagAgent(BaseAgent[RagDependencies, str]):
method __init__ (line 62) | def __init__(self, model: str = None, **kwargs):
method _create_agent (line 71) | def _create_agent(self, **kwargs) -> Agent:
method get_system_prompt (line 316) | def get_system_prompt(self) -> str:
method run_conversation (line 329) | async def run_conversation(
FILE: python/src/agents/server.py
class AgentRequest (line 36) | class AgentRequest(BaseModel):
class AgentResponse (line 45) | class AgentResponse(BaseModel):
function fetch_credentials_from_server (line 64) | async def fetch_credentials_from_server():
function lifespan (line 112) | async def lifespan(app: FastAPI):
function health_check (line 152) | async def health_check():
function run_agent (line 163) | async def run_agent(request: AgentRequest):
function list_agents (line 198) | async def list_agents():
function stream_agent (line 214) | async def stream_agent(agent_type: str, request: AgentRequest):
FILE: python/src/mcp_server/features/documents/document_tools.py
function optimize_document_response (line 24) | def optimize_document_response(doc: dict) -> dict:
function register_document_tools (line 35) | def register_document_tools(mcp: FastMCP):
FILE: python/src/mcp_server/features/documents/version_tools.py
function optimize_version_response (line 24) | def optimize_version_response(version: dict) -> dict:
function register_version_tools (line 35) | def register_version_tools(mcp: FastMCP):
FILE: python/src/mcp_server/features/feature_tools.py
function register_feature_tools (line 21) | def register_feature_tools(mcp: FastMCP):
FILE: python/src/mcp_server/features/projects/project_tools.py
function truncate_text (line 30) | def truncate_text(text: str, max_length: int = MAX_DESCRIPTION_LENGTH) -...
function optimize_project_response (line 36) | def optimize_project_response(project: dict) -> dict:
function register_project_tools (line 53) | def register_project_tools(mcp: FastMCP):
FILE: python/src/mcp_server/features/rag/rag_tools.py
function get_setting (line 27) | def get_setting(key: str, default: str = "false") -> str:
function get_bool_setting (line 32) | def get_bool_setting(key: str, default: bool = False) -> bool:
function register_rag_tools (line 38) | def register_rag_tools(mcp: FastMCP):
FILE: python/src/mcp_server/features/tasks/task_tools.py
function truncate_text (line 25) | def truncate_text(text: str, max_length: int = MAX_DESCRIPTION_LENGTH) -...
function optimize_task_response (line 31) | def optimize_task_response(task: dict) -> dict:
function register_task_tools (line 51) | def register_task_tools(mcp: FastMCP):
FILE: python/src/mcp_server/mcp_server.py
class ArchonContext (line 85) | class ArchonContext:
method __post_init__ (line 95) | def __post_init__(self):
function perform_health_checks (line 107) | async def perform_health_checks(context: ArchonContext):
function lifespan (line 134) | async def lifespan(server: FastMCP) -> AsyncIterator[ArchonContext]:
function health_check (line 338) | async def health_check(ctx: Context) -> str:
function session_info (line 387) | async def session_info(ctx: Context) -> str:
function register_modules (line 424) | def register_modules():
function http_health_endpoint (line 555) | async def http_health_endpoint(request: Request):
function main (line 600) | def main():
FILE: python/src/mcp_server/models.py
class DocumentType (line 17) | class DocumentType(str, Enum):
class Priority (line 28) | class Priority(str, Enum):
class UserStory (line 37) | class UserStory(BaseModel):
class Goal (line 53) | class Goal(BaseModel):
class TechnicalRequirement (line 65) | class TechnicalRequirement(BaseModel):
class ProjectRequirementsDocument (line 75) | class ProjectRequirementsDocument(BaseModel):
method set_last_updated (line 118) | def set_last_updated(cls, v):
class GeneralDocument (line 122) | class GeneralDocument(BaseModel):
method set_timestamps (line 150) | def set_timestamps(cls, v):
class CreateDocumentRequest (line 154) | class CreateDocumentRequest(BaseModel):
class UpdateDocumentRequest (line 165) | class UpdateDocumentRequest(BaseModel):
function create_default_prd (line 179) | def create_default_prd(project_title: str) -> ProjectRequirementsDocument:
function create_default_document (line 217) | def create_default_document(
FILE: python/src/mcp_server/utils/error_handling.py
class MCPErrorFormatter (line 16) | class MCPErrorFormatter:
method format_error (line 20) | def format_error(
method from_http_error (line 60) | def from_http_error(response: httpx.Response, operation: str) -> str:
method from_exception (line 103) | def from_exception(exception: Exception, operation: str, context: dict...
function _get_suggestion_for_status (line 151) | def _get_suggestion_for_status(status_code: int) -> str | None:
FILE: python/src/mcp_server/utils/http_client.py
function get_http_client (line 16) | async def get_http_client(
FILE: python/src/mcp_server/utils/timeout_config.py
function get_default_timeout (line 12) | def get_default_timeout() -> httpx.Timeout:
function get_polling_timeout (line 33) | def get_polling_timeout() -> httpx.Timeout:
function get_max_polling_attempts (line 50) | def get_max_polling_attempts() -> int:
function get_polling_interval (line 64) | def get_polling_interval(attempt: int) -> float:
FILE: python/src/server/api_routes/agent_chat_api.py
class CreateSessionRequest (line 22) | class CreateSessionRequest(BaseModel):
class ChatMessage (line 27) | class ChatMessage(BaseModel):
function create_session (line 37) | async def create_session(request: CreateSessionRequest):
function get_session (line 53) | async def get_session(session_id: str):
function get_messages (line 61) | async def get_messages(session_id: str):
function send_message (line 69) | async def send_message(session_id: str, request: dict):
FILE: python/src/server/api_routes/agent_work_orders_proxy.py
function proxy_to_agent_work_orders (line 23) | async def proxy_to_agent_work_orders(request: Request, path: str = "") -...
FILE: python/src/server/api_routes/bug_report_api.py
class BugContext (line 22) | class BugContext(BaseModel):
class BugReportRequest (line 30) | class BugReportRequest(BaseModel):
class BugReportResponse (line 41) | class BugReportResponse(BaseModel):
class GitHubService (line 48) | class GitHubService:
method __init__ (line 49) | def __init__(self):
method create_issue (line 55) | async def create_issue(self, bug_report: BugReportRequest) -> dict[str...
method _format_issue_body (line 115) | def _format_issue_body(self, bug_report: BugReportRequest) -> str:
function create_github_issue (line 195) | async def create_github_issue(bug_report: BugReportRequest):
function _create_manual_submission_response (line 239) | def _create_manual_submission_response(bug_report: BugReportRequest) -> ...
function bug_report_health (line 271) | async def bug_report_health():
FILE: python/src/server/api_routes/internal_api.py
function is_internal_request (line 30) | def is_internal_request(request: Request) -> bool:
function internal_health (line 55) | async def internal_health():
function get_agent_credentials (line 61) | async def get_agent_credentials(request: Request) -> dict[str, Any]:
function get_mcp_credentials (line 118) | async def get_mcp_credentials(request: Request) -> dict[str, Any]:
FILE: python/src/server/api_routes/knowledge_api.py
function _validate_provider_api_key (line 62) | async def _validate_provider_api_key(provider: str = None) -> None:
class KnowledgeItemRequest (line 147) | class KnowledgeItemRequest(BaseModel):
class Config (line 155) | class Config:
class CrawlRequest (line 168) | class CrawlRequest(BaseModel):
class RagQueryRequest (line 176) | class RagQueryRequest(BaseModel):
function get_crawl_progress (line 184) | async def get_crawl_progress(progress_id: str):
function get_knowledge_sources (line 227) | async def get_knowledge_sources():
function get_knowledge_items (line 239) | async def get_knowledge_items(
function get_knowledge_items_summary (line 259) | async def get_knowledge_items_summary(
function update_knowledge_item (line 290) | async def update_knowledge_item(source_id: str, updates: dict):
function delete_knowledge_item (line 315) | async def delete_knowledge_item(source_id: str):
function get_knowledge_item_chunks (line 364) | async def get_knowledge_item_chunks(
function get_knowledge_item_code_examples (line 523) | async def get_knowledge_item_code_examples(
function refresh_knowledge_item (line 613) | async def refresh_knowledge_item(source_id: str):
function crawl_knowledge_item (line 731) | async def crawl_knowledge_item(request: KnowledgeItemRequest):
function _perform_crawl_with_progress (line 807) | async def _perform_crawl_with_progress(
function upload_document (line 895) | async def upload_document(
function _perform_upload_with_progress (line 975) | async def _perform_upload_with_progress(
function search_knowledge_items (line 1096) | async def search_knowledge_items(request: RagQueryRequest):
function perform_rag_query (line 1110) | async def perform_rag_query(request: RagQueryRequest):
function search_code_examples (line 1147) | async def search_code_examples(request: RagQueryRequest):
function search_code_examples_simple (line 1183) | async def search_code_examples_simple(request: RagQueryRequest):
function get_available_sources (line 1190) | async def get_available_sources():
function delete_source (line 1208) | async def delete_source(source_id: str):
function get_database_metrics (line 1243) | async def get_database_metrics():
function knowledge_health (line 1256) | async def knowledge_health():
function stop_crawl_task (line 1285) | async def stop_crawl_task(progress_id: str):
FILE: python/src/server/api_routes/mcp_api.py
function get_container_status_http (line 25) | async def get_container_status_http() -> dict[str, Any]:
function get_container_status_docker (line 80) | def get_container_status_docker() -> dict[str, Any]:
function get_container_status (line 148) | async def get_container_status() -> dict[str, Any]:
function get_status (line 168) | async def get_status():
function get_mcp_config (line 191) | async def get_mcp_config():
function get_mcp_clients (line 234) | async def get_mcp_clients():
function get_mcp_sessions (line 253) | async def get_mcp_sessions():
function mcp_health (line 283) | async def mcp_health():
FILE: python/src/server/api_routes/migration_api.py
class MigrationRecord (line 17) | class MigrationRecord(BaseModel):
class PendingMigration (line 26) | class PendingMigration(BaseModel):
class MigrationStatusResponse (line 36) | class MigrationStatusResponse(BaseModel):
class MigrationHistoryResponse (line 48) | class MigrationHistoryResponse(BaseModel):
function get_migration_status (line 61) | async def get_migration_status(
function get_migration_history (line 99) | async def get_migration_history(response: Response, if_none_match: str |...
function get_pending_migrations (line 146) | async def get_pending_migrations():
FILE: python/src/server/api_routes/ollama_api.py
class InstanceValidationRequest (line 29) | class InstanceValidationRequest(BaseModel):
class InstanceValidationResponse (line 36) | class InstanceValidationResponse(BaseModel):
class ModelDiscoveryRequest (line 47) | class ModelDiscoveryRequest(BaseModel):
class ModelDiscoveryResponse (line 54) | class ModelDiscoveryResponse(BaseModel):
class EmbeddingRouteRequest (line 64) | class EmbeddingRouteRequest(BaseModel):
class EmbeddingRouteResponse (line 71) | class EmbeddingRouteResponse(BaseModel):
function discover_models_endpoint (line 84) | async def discover_models_endpoint(
function health_check_endpoint (line 143) | async def health_check_endpoint(
function validate_instance_endpoint (line 208) | async def validate_instance_endpoint(request: InstanceValidationRequest)...
function analyze_embedding_route_endpoint (line 258) | async def analyze_embedding_route_endpoint(request: EmbeddingRouteReques...
function get_available_embedding_routes_endpoint (line 295) | async def get_available_embedding_routes_endpoint(
function clear_ollama_cache_endpoint (line 351) | async def clear_ollama_cache_endpoint() -> dict[str, str]:
class ModelDiscoveryAndStoreRequest (line 378) | class ModelDiscoveryAndStoreRequest(BaseModel):
class StoredModelInfo (line 384) | class StoredModelInfo(BaseModel):
class ModelListResponse (line 402) | class ModelListResponse(BaseModel):
function discover_and_store_models_endpoint (line 412) | async def discover_and_store_models_endpoint(request: ModelDiscoveryAndS...
function get_stored_models_endpoint (line 500) | async def get_stored_models_endpoint() -> ModelListResponse:
function _warm_model_cache (line 583) | async def _warm_model_cache(instance_urls: list[str]) -> None:
function _assess_archon_compatibility_with_testing (line 602) | async def _assess_archon_compatibility_with_testing(model, instance_url:...
function _assess_archon_compatibility (line 653) | def _assess_archon_compatibility(model) -> dict[str, Any]:
function _determine_model_type (line 714) | def _determine_model_type(model) -> str:
function _extract_model_size (line 754) | def _extract_model_size(model) -> int | None:
function _extract_context_length (line 776) | def _extract_context_length(model) -> int | None:
function _extract_parameters (line 793) | def _extract_parameters(model) -> str | None:
function _assess_performance_rating (line 806) | def _assess_performance_rating(model) -> str | None:
function _generate_model_description (line 825) | def _generate_model_description(model) -> str | None:
function _test_function_calling_capability (line 842) | async def _test_function_calling_capability(model_name: str, instance_ur...
function _test_structured_output_capability (line 901) | async def _test_structured_output_capability(model_name: str, instance_u...
function discover_models_with_real_details (line 958) | async def discover_models_with_real_details(request: ModelDiscoveryAndSt...
function _determine_model_type_from_name_only (line 1184) | def _determine_model_type_from_name_only(model_name: str) -> str:
class ModelCapabilityTestRequest (line 1212) | class ModelCapabilityTestRequest(BaseModel):
class ModelCapabilityTestResponse (line 1221) | class ModelCapabilityTestResponse(BaseModel):
function test_model_capabilities_endpoint (line 1232) | async def test_model_capabilities_endpoint(request: ModelCapabilityTestR...
FILE: python/src/server/api_routes/openrouter_api.py
function get_openrouter_models (line 15) | async def get_openrouter_models() -> OpenRouterModelListResponse:
FILE: python/src/server/api_routes/pages_api.py
class PageSummary (line 26) | class PageSummary(BaseModel):
class PageResponse (line 38) | class PageResponse(BaseModel):
class PageListResponse (line 55) | class PageListResponse(BaseModel):
function _handle_large_page_content (line 63) | def _handle_large_page_content(page_data: dict) -> dict:
function list_pages (line 93) | async def list_pages(
function get_page_by_url (line 137) | async def get_page_by_url(url: str = Query(..., description="The URL of ...
function get_page_by_id (line 171) | async def get_page_by_id(page_id: str):
FILE: python/src/server/api_routes/progress_api.py
function get_progress (line 23) | async def get_progress(
function list_active_operations (line 101) | async def list_active_operations():
FILE: python/src/server/api_routes/projects_api.py
class CreateProjectRequest (line 43) | class CreateProjectRequest(BaseModel):
class UpdateProjectRequest (line 55) | class UpdateProjectRequest(BaseModel):
class CreateTaskRequest (line 67) | class CreateTaskRequest(BaseModel):
function list_projects (line 79) | async def list_projects(
function create_project (line 163) | async def create_project(request: CreateProjectRequest):
function projects_health (line 215) | async def projects_health():
function get_all_task_counts (line 278) | async def get_all_task_counts(
function get_project (line 339) | async def get_project(project_id: str):
function update_project (line 379) | async def update_project(project_id: str, request: UpdateProjectRequest):
function delete_project (line 490) | async def delete_project(project_id: str):
function get_project_features (line 522) | async def get_project_features(project_id: str):
function list_project_tasks (line 552) | async def list_project_tasks(
function create_task (line 658) | async def create_task(request: CreateTaskRequest):
function list_tasks (line 692) | async def list_tasks(
function get_task (line 773) | async def get_task(task_id: str):
class UpdateTaskRequest (line 801) | class UpdateTaskRequest(BaseModel):
class CreateDocumentRequest (line 811) | class CreateDocumentRequest(BaseModel):
class UpdateDocumentRequest (line 819) | class UpdateDocumentRequest(BaseModel):
class CreateVersionRequest (line 826) | class CreateVersionRequest(BaseModel):
class RestoreVersionRequest (line 835) | class RestoreVersionRequest(BaseModel):
function update_task (line 840) | async def update_task(task_id: str, request: UpdateTaskRequest):
function delete_task (line 886) | async def delete_task(task_id: str):
function mcp_update_task_status (line 916) | async def mcp_update_task_status(task_id: str, status: str):
function list_project_documents (line 957) | async def list_project_documents(project_id: str, include_content: bool ...
function create_project_document (line 995) | async def create_project_document(project_id: str, request: CreateDocume...
function get_project_document (line 1033) | async def get_project_document(project_id: str, doc_id: str):
function update_project_document (line 1062) | async def update_project_document(project_id: str, doc_id: str, request:...
function delete_project_document (line 1102) | async def delete_project_document(project_id: str, doc_id: str):
function list_project_versions (line 1134) | async def list_project_versions(project_id: str, field_name: str = None):
function create_project_version (line 1165) | async def create_project_version(project_id: str, request: CreateVersion...
function get_project_version (line 1204) | async def get_project_version(project_id: str, field_name: str, version_...
function restore_project_version (line 1239) | async def restore_project_version(
FILE: python/src/server/api_routes/providers_api.py
function test_openai_connection (line 17) | async def test_openai_connection(api_key: str) -> bool:
function test_google_connection (line 31) | async def test_google_connection(api_key: str) -> bool:
function test_anthropic_connection (line 45) | async def test_anthropic_connection(api_key: str) -> bool:
function test_openrouter_connection (line 62) | async def test_openrouter_connection(api_key: str) -> bool:
function test_grok_connection (line 76) | async def test_grok_connection(api_key: str) -> bool:
function get_provider_status (line 100) | async def get_provider_status(
FILE: python/src/server/api_routes/settings_api.py
class CredentialRequest (line 24) | class CredentialRequest(BaseModel):
class CredentialUpdateRequest (line 32) | class CredentialUpdateRequest(BaseModel):
class CredentialResponse (line 39) | class CredentialResponse(BaseModel):
function list_credentials (line 46) | async def list_credentials(category: str | None = None):
function get_credentials_by_category (line 78) | async def get_credentials_by_category(category: str):
function create_credential (line 97) | async def create_credential(request: CredentialRequest):
function get_credential (line 142) | async def get_credential(key: str):
function update_credential (line 187) | async def update_credential(key: str, request: dict[str, Any]):
function delete_credential (line 247) | async def delete_credential(key: str):
function initialize_credentials_endpoint (line 267) | async def initialize_credentials_endpoint():
function database_metrics (line 282) | async def database_metrics():
function settings_health (line 338) | async def settings_health():
function check_credential_status (line 347) | async def check_credential_status(request: dict[str, list[str]]):
FILE: python/src/server/api_routes/version_api.py
class ReleaseAsset (line 18) | class ReleaseAsset(BaseModel):
class VersionCheckResponse (line 28) | class VersionCheckResponse(BaseModel):
class CurrentVersionResponse (line 42) | class CurrentVersionResponse(BaseModel):
function check_for_updates (line 54) | async def check_for_updates(response: Response, if_none_match: str | Non...
function get_current_version (line 99) | async def get_current_version():
function clear_version_cache (line 109) | async def clear_version_cache():
FILE: python/src/server/config/config.py
class ConfigurationError (line 13) | class ConfigurationError(Exception):
class EnvironmentConfig (line 20) | class EnvironmentConfig:
class RAGStrategyConfig (line 32) | class RAGStrategyConfig:
class MCPMonitoringConfig (line 42) | class MCPMonitoringConfig:
function validate_openai_api_key (line 58) | def validate_openai_api_key(api_key: str) -> bool:
function validate_openrouter_api_key (line 69) | def validate_openrouter_api_key(api_key: str) -> bool:
function validate_supabase_key (line 82) | def validate_supabase_key(supabase_key: str) -> tuple[bool, str]:
function validate_supabase_url (line 125) | def validate_supabase_url(url: str) -> bool:
function load_environment_config (line 168) | def load_environment_config() -> EnvironmentConfig:
function get_config (line 245) | def get_config() -> EnvironmentConfig:
function get_rag_strategy_config (line 250) | def get_rag_strategy_config() -> RAGStrategyConfig:
function get_mcp_monitoring_config (line 267) | def get_mcp_monitoring_config() -> MCPMonitoringConfig:
FILE: python/src/server/config/logfire_config.py
function is_logfire_enabled (line 39) | def is_logfire_enabled() -> bool:
function setup_logfire (line 53) | def setup_logfire(
function get_logger (line 137) | def get_logger(name: str) -> logging.Logger:
function safe_span (line 151) | def safe_span(name: str, **kwargs):
class NoOpSpan (line 175) | class NoOpSpan:
method set_attribute (line 178) | def set_attribute(self, key: str, value: Any) -> None:
method record_exception (line 182) | def record_exception(self, exception: Exception) -> None:
method __enter__ (line 186) | def __enter__(self):
method __exit__ (line 189) | def __exit__(self, exc_type, exc_val, exc_tb):
function safe_set_attribute (line 193) | def safe_set_attribute(span: Any, key: str, value: Any) -> None:
function safe_record_exception (line 209) | def safe_record_exception(span: Any, exception: Exception) -> None:
function safe_logfire_info (line 224) | def safe_logfire_info(message: str, **kwargs) -> None:
function safe_logfire_error (line 239) | def safe_logfire_error(message: str, **kwargs) -> None:
function safe_logfire_warning (line 254) | def safe_logfire_warning(message: str, **kwargs) -> None:
function safe_logfire_debug (line 269) | def safe_logfire_debug(message: str, **kwargs) -> None:
FILE: python/src/server/config/service_discovery.py
class Environment (line 15) | class Environment(Enum):
class ServiceDiscovery (line 22) | class ServiceDiscovery:
method __init__ (line 30) | def __init__(self):
method _detect_environment (line 82) | def _detect_environment() -> Environment:
method is_service_available (line 91) | def is_service_available(self, service: str) -> bool:
method get_service_url (line 104) | def get_service_url(self, service: str, protocol: str = "http") -> str...
method get_service_host_port (line 140) | def get_service_host_port(self, service: str) -> tuple[str | None, int]:
method health_check (line 153) | async def health_check(self, service: str, timeout: float = 5.0) -> bool:
method wait_for_service (line 174) | async def wait_for_service(
method get_all_services (line 199) | def get_all_services(self) -> dict[str, str]:
method is_docker (line 208) | def is_docker(self) -> bool:
method is_local (line 213) | def is_local(self) -> bool:
function get_discovery (line 222) | def get_discovery() -> ServiceDiscovery:
class _LazyDiscovery (line 231) | class _LazyDiscovery:
method __getattr__ (line 232) | def __getattr__(self, name):
function get_api_url (line 240) | def get_api_url() -> str:
function get_mcp_url (line 245) | def get_mcp_url() -> str:
function get_agents_url (line 250) | def get_agents_url() -> str:
function get_agent_work_orders_url (line 255) | def get_agent_work_orders_url() -> str | None:
function is_service_available (line 265) | def is_service_available(service: str) -> bool:
function is_service_healthy (line 278) | async def is_service_healthy(service: str) -> bool:
FILE: python/src/server/main.py
function lifespan (line 70) | async def lifespan(app: FastAPI):
function skip_health_check_logs (line 169) | async def skip_health_check_logs(request, call_next):
function root (line 205) | async def root():
function health_check (line 218) | async def health_check(response: Response):
function api_health_check (line 260) | async def api_health_check(response: Response):
function _check_database_schema (line 268) | async def _check_database_schema():
function main (line 345) | def main():
FILE: python/src/server/middleware/logging_middleware.py
class LoggingMiddleware (line 18) | class LoggingMiddleware(BaseHTTPMiddleware):
method __init__ (line 27) | def __init__(self, app):
method dispatch (line 31) | async def dispatch(self, request: Request, call_next: Callable) -> Res...
function instrument_fastapi (line 67) | def instrument_fastapi(app):
class LoggingRoute (line 93) | class LoggingRoute(APIRoute):
method get_route_handler (line 100) | def get_route_handler(self) -> Callable:
FILE: python/src/server/models/progress_models.py
class ProgressDetails (line 8) | class ProgressDetails(BaseModel):
class BaseProgressResponse (line 27) | class BaseProgressResponse(BaseModel):
method ensure_logs_is_list (line 44) | def ensure_logs_is_list(cls, v):
class CrawlProgressResponse (line 68) | class CrawlProgressResponse(BaseProgressResponse):
method convert_duration_to_string (line 109) | def convert_duration_to_string(cls, v):
class UploadProgressResponse (line 120) | class UploadProgressResponse(BaseProgressResponse):
class ProjectCreationProgressResponse (line 142) | class ProjectCreationProgressResponse(BaseProgressResponse):
function create_progress_response (line 158) | def create_progress_response(
FILE: python/src/server/services/client_manager.py
function get_supabase_client (line 15) | def get_supabase_client() -> Client:
FILE: python/src/server/services/crawler_manager.py
class CrawlerManager (line 22) | class CrawlerManager:
method __new__ (line 29) | def __new__(cls):
method get_crawler (line 34) | async def get_crawler(self) -> AsyncWebCrawler:
method initialize (line 40) | async def initialize(self):
method cleanup (line 135) | async def cleanup(self):
function get_crawler (line 152) | async def get_crawler() -> AsyncWebCrawler | None:
function initialize_crawler (line 168) | async def initialize_crawler():
function cleanup_crawler (line 173) | async def cleanup_crawler():
FILE: python/src/server/services/crawling/code_extraction_service.py
class CodeExtractionService (line 20) | class CodeExtractionService:
method __init__ (line 59) | def __init__(self, supabase_client):
method _get_setting (line 69) | async def _get_setting(self, key: str, default: Any) -> Any:
method _get_min_code_length (line 91) | async def _get_min_code_length(self) -> int:
method _get_max_code_length (line 95) | async def _get_max_code_length(self) -> int:
method _is_complete_block_detection_enabled (line 99) | async def _is_complete_block_detection_enabled(self) -> bool:
method _is_language_patterns_enabled (line 103) | async def _is_language_patterns_enabled(self) -> bool:
method _is_prose_filtering_enabled (line 107) | async def _is_prose_filtering_enabled(self) -> bool:
method _get_max_prose_ratio (line 111) | async def _get_max_prose_ratio(self) -> float:
method _get_min_code_indicators (line 115) | async def _get_min_code_indicators(self) -> int:
method _is_diagram_filtering_enabled (line 119) | async def _is_diagram_filtering_enabled(self) -> bool:
method _is_contextual_length_enabled (line 123) | async def _is_contextual_length_enabled(self) -> bool:
method _get_context_window_size (line 127) | async def _get_context_window_size(self) -> int:
method _is_code_summaries_enabled (line 131) | async def _is_code_summaries_enabled(self) -> bool:
method extract_and_store_code_examples (line 135) | async def extract_and_store_code_examples(
method _extract_code_blocks_from_documents (line 258) | async def _extract_code_blocks_from_documents(
method _extract_html_code_blocks (line 426) | async def _extract_html_code_blocks(self, content: str) -> list[dict[s...
method _extract_text_file_code_blocks (line 759) | async def _extract_text_file_code_blocks(
method _extract_pdf_code_blocks (line 971) | async def _extract_pdf_code_blocks(
method _is_pdf_section_code_like (line 1035) | def _is_pdf_section_code_like(self, section: str) -> bool:
method _detect_language_from_content (line 1100) | def _detect_language_from_content(self, code: str) -> str:
method _find_complete_code_block (line 1152) | async def _find_complete_code_block(
method _calculate_min_length (line 1224) | async def _calculate_min_length(self, language: str, context: str) -> ...
method _decode_html_entities (line 1276) | def _decode_html_entities(self, text: str) -> str:
method _clean_code_content (line 1330) | def _clean_code_content(self, code: str, language: str = "") -> str:
method _validate_code_quality (line 1405) | async def _validate_code_quality(self, code: str, language: str = "") ...
method _generate_code_summaries (line 1561) | async def _generate_code_summaries(
method _prepare_code_examples_for_storage (line 1651) | def _prepare_code_examples_for_storage(
method _store_code_examples (line 1706) | async def _store_code_examples(
FILE: python/src/server/services/crawling/crawling_service.py
function get_root_domain (line 43) | def get_root_domain(host: str) -> str:
function _ensure_orchestration_lock (line 71) | def _ensure_orchestration_lock() -> asyncio.Lock:
function get_active_orchestration (line 78) | async def get_active_orchestration(progress_id: str) -> Optional["Crawli...
function register_orchestration (line 85) | async def register_orchestration(progress_id: str, orchestration: "Crawl...
function unregister_orchestration (line 92) | async def unregister_orchestration(progress_id: str):
class CrawlingService (line 99) | class CrawlingService:
method __init__ (line 105) | def __init__(self, crawler=None, supabase_client=None, progress_id=None):
method set_progress_id (line 143) | def set_progress_id(self, progress_id: str):
method cancel (line 151) | def cancel(self):
method is_cancelled (line 156) | def is_cancelled(self) -> bool:
method _check_cancellation (line 160) | def _check_cancellation(self):
method _create_crawl_progress_callback (line 165) | async def _create_crawl_progress_callback(
method _handle_progress_update (line 203) | async def _handle_progress_update(self, task_id: str, update: dict[str...
method crawl_single_page (line 221) | async def crawl_single_page(self, url: str, retry_count: int = 3) -> d...
method crawl_markdown_file (line 230) | async def crawl_markdown_file(
method parse_sitemap (line 243) | def parse_sitemap(self, sitemap_url: str) -> list[str]:
method crawl_batch_with_progress (line 247) | async def crawl_batch_with_progress(
method crawl_recursive_with_progress (line 265) | async def crawl_recursive_with_progress(
method orchestrate_crawl (line 284) | async def orchestrate_crawl(self, request: dict[str, Any]) -> dict[str...
method _async_orchestrate_crawl (line 321) | async def _async_orchestrate_crawl(self, request: dict[str, Any], task...
method _is_same_domain (line 753) | def _is_same_domain(self, url: str, base_domain: str) -> bool:
method _is_same_domain_or_subdomain (line 774) | def _is_same_domain_or_subdomain(self, url: str, base_domain: str) -> ...
method _is_self_link (line 813) | def _is_self_link(self, link: str, base_url: str) -> bool:
method _crawl_by_url_type (line 847) | async def _crawl_by_url_type(self, url: str, request: dict[str, Any]) ...
FILE: python/src/server/services/crawling/discovery_service.py
class SitemapHTMLParser (line 20) | class SitemapHTMLParser(HTMLParser):
method __init__ (line 23) | def __init__(self):
method handle_starttag (line 27) | def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]):
class DiscoveryService (line 50) | class DiscoveryService:
method discover_files (line 78) | def discover_files(self, base_url: str) -> str | None:
method _extract_directory (line 116) | def _extract_directory(self, base_url: str) -> str:
method _try_locations (line 140) | def _try_locations(self, base_url: str, base_dir: str, filename: str) ...
method _get_subdirs_for_file (line 179) | def _get_subdirs_for_file(self, base_dir: str, filename: str) -> list[...
method _is_safe_ip (line 208) | def _is_safe_ip(self, ip_str: str) -> bool:
method _resolve_and_validate_hostname (line 263) | def _resolve_and_validate_hostname(self, hostname: str) -> bool:
method _check_url_exists (line 293) | def _check_url_exists(self, url: str) -> bool:
method _parse_robots_txt (line 382) | def _parse_robots_txt(self, base_url: str) -> list[str]:
method _parse_html_meta_tags (line 447) | def _parse_html_meta_tags(self, base_url: str) -> list[str]:
method _read_response_with_limit (line 511) | def _read_response_with_limit(self, response: requests.Response, url: ...
FILE: python/src/server/services/crawling/document_storage_operations.py
class DocumentStorageOperations (line 21) | class DocumentStorageOperations:
method __init__ (line 26) | def __init__(self, supabase_client):
method process_and_store_documents (line 37) | async def process_and_store_documents(
method _create_source_records (line 291) | async def _create_source_records(
method extract_and_store_code_examples (line 438) | async def extract_and_store_code_examples(
FILE: python/src/server/services/crawling/helpers/llms_full_parser.py
class LLMsFullSection (line 13) | class LLMsFullSection(BaseModel):
function create_section_slug (line 23) | def create_section_slug(h1_heading: str) -> str:
function create_section_url (line 59) | def create_section_url(base_url: str, h1_heading: str, section_order: in...
function parse_llms_full_sections (line 75) | def parse_llms_full_sections(content: str, base_url: str) -> list[LLMsFu...
FILE: python/src/server/services/crawling/helpers/site_config.py
class SiteConfig (line 14) | class SiteConfig:
method is_documentation_site (line 51) | def is_documentation_site(url: str) -> bool:
method get_markdown_generator (line 78) | def get_markdown_generator():
method get_link_pruning_markdown_generator (line 102) | def get_link_pruning_markdown_generator():
FILE: python/src/server/services/crawling/helpers/url_handler.py
class URLHandler (line 17) | class URLHandler:
method is_sitemap (line 21) | def is_sitemap(url: str) -> bool:
method is_markdown (line 41) | def is_markdown(url: str) -> bool:
method is_txt (line 61) | def is_txt(url: str) -> bool:
method is_binary_file (line 80) | def is_binary_file(url: str) -> bool:
method transform_github_url (line 180) | def transform_github_url(url: str) -> str:
method generate_unique_source_id (line 212) | def generate_unique_source_id(url: str) -> str:
method extract_markdown_links (line 282) | def extract_markdown_links(content: str, base_url: str | None = None) ...
method extract_markdown_links_with_text (line 298) | def extract_markdown_links_with_text(content: str, base_url: Optional[...
method is_link_collection_file (line 390) | def is_link_collection_file(url: str, content: str | None = None) -> b...
method extract_display_name (line 460) | def extract_display_name(url: str) -> str:
method is_robots_txt (line 609) | def is_robots_txt(url: str) -> bool:
method is_llms_variant (line 630) | def is_llms_variant(url: str) -> bool:
method is_well_known_file (line 665) | def is_well_known_file(url: str) -> bool:
method get_base_url (line 687) | def get_base_url(url: str) -> str:
FILE: python/src/server/services/crawling/page_storage_operations.py
class PageStorageOperations (line 18) | class PageStorageOperations:
method __init__ (line 26) | def __init__(self, supabase_client):
method store_pages (line 35) | async def store_pages(
method store_llms_full_sections (line 127) | async def store_llms_full_sections(
method update_page_chunk_count (line 226) | async def update_page_chunk_count(self, page_id: str, chunk_count: int...
FILE: python/src/server/services/crawling/progress_mapper.py
class ProgressMapper (line 9) | class ProgressMapper:
method __init__ (line 44) | def __init__(self):
method map_progress (line 49) | def map_progress(self, stage: str, stage_progress: float) -> int:
method get_stage_range (line 103) | def get_stage_range(self, stage: str) -> tuple:
method calculate_stage_progress (line 107) | def calculate_stage_progress(self, current_value: int, max_value: int)...
method map_batch_progress (line 123) | def map_batch_progress(self, stage: str, current_batch: int, total_bat...
method map_with_substage (line 143) | def map_with_substage(self, stage: str, substage: str, stage_progress:...
method reset (line 159) | def reset(self):
method get_current_stage (line 164) | def get_current_stage(self) -> str:
method get_current_progress (line 168) | def get_current_progress(self) -> int:
FILE: python/src/server/services/crawling/strategies/batch.py
class BatchCrawlStrategy (line 19) | class BatchCrawlStrategy:
method __init__ (line 22) | def __init__(self, crawler, markdown_generator):
method crawl_batch_with_progress (line 33) | async def crawl_batch_with_progress(
FILE: python/src/server/services/crawling/strategies/recursive.py
class RecursiveCrawlStrategy (line 21) | class RecursiveCrawlStrategy:
method __init__ (line 24) | def __init__(self, crawler, markdown_generator):
method crawl_recursive_with_progress (line 36) | async def crawl_recursive_with_progress(
FILE: python/src/server/services/crawling/strategies/single_page.py
class SinglePageCrawlStrategy (line 18) | class SinglePageCrawlStrategy:
method __init__ (line 21) | def __init__(self, crawler, markdown_generator):
method _get_wait_selector_for_docs (line 32) | def _get_wait_selector_for_docs(self, url: str) -> str:
method crawl_single_page (line 57) | async def crawl_single_page(
method crawl_markdown_file (line 222) | async def crawl_markdown_file(
FILE: python/src/server/services/crawling/strategies/sitemap.py
class SitemapCrawlStrategy (line 17) | class SitemapCrawlStrategy:
method parse_sitemap (line 20) | def parse_sitemap(self, sitemap_url: str, cancellation_check: Callable...
FILE: python/src/server/services/credential_service.py
class CredentialItem (line 28) | class CredentialItem:
class CredentialService (line 41) | class CredentialService:
method __init__ (line 44) | def __init__(self):
method _get_supabase_client (line 52) | def _get_supabase_client(self) -> Client:
method _get_encryption_key (line 84) | def _get_encryption_key(self) -> bytes:
method _encrypt_value (line 99) | def _encrypt_value(self, value: str) -> str:
method _decrypt_value (line 112) | def _decrypt_value(self, encrypted_value: str) -> str:
method load_all_credentials (line 126) | async def load_all_credentials(self) -> dict[str, Any]:
method get_credential (line 160) | async def get_credential(self, key: str, default: Any = None, decrypt:...
method get_encrypted_credential_raw (line 179) | async def get_encrypted_credential_raw(self, key: str) -> str | None:
method set_credential (line 190) | async def set_credential(
method delete_credential (line 275) | async def delete_credential(self, key: str) -> bool:
method get_credentials_by_category (line 323) | async def get_credentials_by_category(self, category: str) -> dict[str...
method list_all_credentials (line 371) | async def list_all_credentials(self) -> list[CredentialItem]:
method get_config_as_env_dict (line 405) | def get_config_as_env_dict(self) -> dict[str, str]:
method get_active_provider (line 426) | async def get_active_provider(self, service_type: str = "llm") -> dict...
method _get_provider_api_key (line 503) | async def _get_provider_api_key(self, provider: str) -> str | None:
method _get_provider_base_url (line 519) | def _get_provider_base_url(self, provider: str, rag_settings: dict) ->...
method set_active_provider (line 533) | async def set_active_provider(self, provider: str, service_type: str =...
function get_credential (line 552) | async def get_credential(key: str, default: Any = None) -> Any:
function set_credential (line 557) | async def set_credential(
function initialize_credentials (line 564) | async def initialize_credentials() -> None:
FILE: python/src/server/services/embeddings/contextual_embedding_service.py
function generate_contextual_embedding (line 23) | async def generate_contextual_embedding(
function process_chunk_with_context (line 103) | async def process_chunk_with_context(
function _get_model_choice (line 122) | async def _get_model_choice(provider: str | None = None) -> str:
function generate_contextual_embeddings_batch (line 166) | async def generate_contextual_embeddings_batch(
FILE: python/src/server/services/embeddings/embedding_exceptions.py
class EmbeddingError (line 11) | class EmbeddingError(Exception):
method __init__ (line 14) | def __init__(
method to_dict (line 35) | def to_dict(self) -> dict[str, Any]:
class EmbeddingQuotaExhaustedError (line 46) | class EmbeddingQuotaExhaustedError(EmbeddingError):
method __init__ (line 54) | def __init__(self, message: str, tokens_used: int | None = None, **kwa...
class EmbeddingRateLimitError (line 61) | class EmbeddingRateLimitError(EmbeddingError):
method __init__ (line 69) | def __init__(self, message: str, retry_count: int = 0, **kwargs):
class EmbeddingAsyncContextError (line 75) | class EmbeddingAsyncContextError(EmbeddingError):
class EmbeddingAPIError (line 86) | class EmbeddingAPIError(EmbeddingError):
method __init__ (line 94) | def __init__(self, message: str, original_error: Exception | None = No...
class EmbeddingAuthenticationError (line 102) | class EmbeddingAuthenticationError(EmbeddingError):
method __init__ (line 110) | def __init__(self, message: str, api_key_prefix: str | None = None, **...
class EmbeddingValidationError (line 118) | class EmbeddingValidationError(EmbeddingError):
method __init__ (line 126) | def __init__(self, message: str, embedding_sample: list | None = None,...
FILE: python/src/server/services/embeddings/embedding_service.py
class EmbeddingBatchResult (line 31) | class EmbeddingBatchResult:
method add_success (line 40) | def add_success(self, embedding: list[float], text: str):
method add_failure (line 46) | def add_failure(self, text: str, error: Exception, batch_index: int | ...
method has_failures (line 63) | def has_failures(self) -> bool:
method total_requested (line 67) | def total_requested(self) -> int:
class EmbeddingProviderAdapter (line 71) | class EmbeddingProviderAdapter(ABC):
method create_embeddings (line 75) | async def create_embeddings(
class OpenAICompatibleEmbeddingAdapter (line 84) | class OpenAICompatibleEmbeddingAdapter(EmbeddingProviderAdapter):
method __init__ (line 87) | def __init__(self, client: Any):
method create_embeddings (line 90) | async def create_embeddings(
class GoogleEmbeddingAdapter (line 107) | class GoogleEmbeddingAdapter(EmbeddingProviderAdapter):
method create_embeddings (line 110) | async def create_embeddings(
method _fetch_single_embedding (line 147) | async def _fetch_single_embedding(
method _normalize_embedding (line 203) | def _normalize_embedding(self, embedding: list[float]) -> list[float]:
function _get_embedding_adapter (line 220) | def _get_embedding_adapter(provider: str, client: Any) -> EmbeddingProvi...
function _maybe_await (line 227) | async def _maybe_await(value: Any) -> Any:
function create_embedding (line 236) | async def create_embedding(text: str, provider: str | None = None) -> li...
function create_embeddings_batch (line 296) | async def create_embeddings_batch(
function get_openai_api_key (line 528) | async def get_openai_api_key() -> str | None:
FILE: python/src/server/services/embeddings/multi_dimensional_embedding_service.py
class MultiDimensionalEmbeddingService (line 25) | class MultiDimensionalEmbeddingService:
method __init__ (line 28) | def __init__(self):
method get_supported_dimensions (line 31) | def get_supported_dimensions(self) -> dict[int, list[str]]:
method get_dimension_for_model (line 35) | def get_dimension_for_model(self, model_name: str) -> int:
method get_embedding_column_name (line 63) | def get_embedding_column_name(self, dimension: int) -> str:
method is_dimension_supported (line 71) | def is_dimension_supported(self, dimension: int) -> bool:
FILE: python/src/server/services/embeddings/provider_error_adapters.py
class ProviderErrorAdapter (line 12) | class ProviderErrorAdapter(ABC):
method get_provider_name (line 16) | def get_provider_name(self) -> str:
method sanitize_error_message (line 20) | def sanitize_error_message(self, message: str) -> str:
class OpenAIErrorAdapter (line 24) | class OpenAIErrorAdapter(ProviderErrorAdapter):
method get_provider_name (line 25) | def get_provider_name(self) -> str:
method sanitize_error_message (line 28) | def sanitize_error_message(self, message: str) -> str:
class GoogleAIErrorAdapter (line 55) | class GoogleAIErrorAdapter(ProviderErrorAdapter):
method get_provider_name (line 56) | def get_provider_name(self) -> str:
method sanitize_error_message (line 59) | def sanitize_error_message(self, message: str) -> str:
class AnthropicErrorAdapter (line 86) | class AnthropicErrorAdapter(ProviderErrorAdapter):
method get_provider_name (line 87) | def get_provider_name(self) -> str:
method sanitize_error_message (line 90) | def sanitize_error_message(self, message: str) -> str:
class OpenRouterErrorAdapter (line 114) | class OpenRouterErrorAdapter(ProviderErrorAdapter):
method get_provider_name (line 115) | def get_provider_name(self) -> str:
method sanitize_error_message (line 118) | def sanitize_error_message(self, message: str) -> str:
class ProviderErrorFactory (line 142) | class ProviderErrorFactory:
method get_adapter (line 153) | def get_adapter(cls, provider: str) -> ProviderErrorAdapter:
method sanitize_provider_error (line 157) | def sanitize_provider_error(cls, message: str, provider: str) -> str:
method detect_provider_from_error (line 162) | def detect_provider_from_error(cls, error_str: str) -> str:
FILE: python/src/server/services/knowledge/database_metrics_service.py
class DatabaseMetricsService (line 13) | class DatabaseMetricsService:
method __init__ (line 18) | def __init__(self, supabase_client):
method get_metrics (line 27) | async def get_metrics(self) -> dict[str, Any]:
method get_storage_statistics (line 83) | async def get_storage_statistics(self) -> dict[str, Any]:
FILE: python/src/server/services/knowledge/knowledge_item_service.py
class KnowledgeItemService (line 12) | class KnowledgeItemService:
method __init__ (line 17) | def __init__(self, supabase_client):
method list_items (line 26) | async def list_items(
method get_item (line 202) | async def get_item(self, source_id: str) -> dict[str, Any] | None:
method update_item (line 237) | async def update_item(
method get_available_sources (line 313) | async def get_available_sources(self) -> dict[str, Any]:
method _get_all_sources (line 345) | async def _get_all_sources(self) -> list[dict[str, Any]]:
method _transform_source_to_item (line 350) | async def _transform_source_to_item(self, source: dict[str, Any]) -> d...
method _get_first_page_url (line 402) | async def _get_first_page_url(self, source_id: str) -> str:
method _get_code_examples (line 421) | async def _get_code_examples(self, source_id: str) -> list[dict[str, A...
method _determine_source_type (line 436) | def _determine_source_type(self, metadata: dict[str, Any], url: str) -...
method _filter_by_search (line 445) | def _filter_by_search(self, items: list[dict[str, Any]], search: str) ...
method _filter_by_knowledge_type (line 456) | def _filter_by_knowledge_type(
method _get_chunks_count (line 462) | async def _get_chunks_count(self, source_id: str) -> int:
FILE: python/src/server/services/knowledge/knowledge_summary_service.py
class KnowledgeSummaryService (line 13) | class KnowledgeSummaryService:
method __init__ (line 19) | def __init__(self, supabase_client):
method get_summaries (line 28) | async def get_summaries(
method _get_document_counts_batch (line 167) | async def _get_document_counts_batch(self, source_ids: list[str]) -> d...
method _get_code_example_counts_batch (line 198) | async def _get_code_example_counts_batch(self, source_ids: list[str]) ...
method _get_first_urls_batch (line 227) | async def _get_first_urls_batch(self, source_ids: list[str]) -> dict[s...
FILE: python/src/server/services/llm_provider_service.py
function _is_valid_provider (line 22) | def _is_valid_provider(provider: str) -> bool:
function _sanitize_for_log (line 29) | def _sanitize_for_log(text: str) -> str:
function _calculate_cache_checksum (line 45) | def _calculate_cache_checksum(value: Any) -> str:
function _log_cache_access (line 59) | def _log_cache_access(key: str, action: str, hit: bool = None, security_...
function _get_cached_settings (line 81) | def _get_cached_settings(key: str) -> Any | None:
function _set_cached_settings (line 126) | def _set_cached_settings(key: str, value: Any) -> None:
function clear_provider_cache (line 150) | def clear_provider_cache() -> None:
function invalidate_provider_cache (line 160) | def invalidate_provider_cache(provider: str = None) -> None:
function get_cache_stats (line 196) | def get_cache_stats() -> dict[str, Any]:
function get_cache_security_report (line 273) | def get_cache_security_report() -> dict[str, Any]:
function get_llm_client (line 313) | async def get_llm_client(
function _get_optimal_ollama_instance (line 552) | async def _get_optimal_ollama_instance(instance_type: str | None = None,
function get_embedding_model (line 600) | async def get_embedding_model(provider: str | None = None) -> str:
function is_openai_embedding_model (line 678) | def is_openai_embedding_model(model: str) -> bool:
function is_google_embedding_model (line 706) | def is_google_embedding_model(model: str) -> bool:
function is_valid_embedding_model_for_provider (line 723) | def is_valid_embedding_model_for_provider(model: str, provider: str) -> ...
function get_supported_embedding_models (line 756) | def get_supported_embedding_models(provider: str) -> list[str]:
function is_reasoning_model (line 799) | def is_reasoning_model(model_name: str) -> bool:
function _extract_reasoning_strings (line 839) | def _extract_reasoning_strings(value: Any) -> list[str]:
function _get_message_attr (line 875) | def _get_message_attr(message: Any, attribute: str) -> Any:
function extract_message_text (line 885) | def extract_message_text(choice: Any) -> tuple[str, str, bool]:
function _is_reasoning_text (line 925) | def _is_reasoning_text(text: str) -> bool:
function extract_json_from_reasoning (line 942) | def extract_json_from_reasoning(reasoning_text: str, context_code: str =...
function synthesize_json_from_reasoning (line 979) | def synthesize_json_from_reasoning(reasoning_text: str, context_code: st...
function prepare_chat_completion_params (line 1095) | def prepare_chat_completion_params(model: str, params: dict) -> dict:
function get_embedding_model_with_routing (line 1135) | async def get_embedding_model_with_routing(provider: str | None = None, ...
function validate_provider_instance (line 1171) | async def validate_provider_instance(provider: str, instance_url: str | ...
function requires_max_completion_tokens (line 1248) | def requires_max_completion_tokens(model_name: str) -> bool:
FILE: python/src/server/services/mcp_service_client.py
class MCPServiceClient (line 18) | class MCPServiceClient:
method __init__ (line 24) | def __init__(self):
method _get_headers (line 35) | def _get_headers(self, request_id: str | None = None) -> dict[str, str]:
method crawl_url (line 44) | async def crawl_url(self, url: str, options: dict[str, Any] | None = N...
method search (line 97) | async def search(
method store_documents (line 149) | async def store_documents(
method generate_embeddings (line 173) | async def generate_embeddings(
method health_check (line 192) | async def health_check(self) -> dict[str, Any]:
function get_mcp_service_client (line 228) | def get_mcp_service_client() -> MCPServiceClient:
FILE: python/src/server/services/mcp_session_manager.py
class SimplifiedSessionManager (line 17) | class SimplifiedSessionManager:
method __init__ (line 20) | def __init__(self, timeout: int = 3600):
method create_session (line 30) | def create_session(self) -> str:
method validate_session (line 37) | def validate_session(self, session_id: str) -> bool:
method cleanup_expired_sessions (line 53) | def cleanup_expired_sessions(self) -> int:
method get_active_session_count (line 68) | def get_active_session_count(self) -> int:
function get_session_manager (line 79) | def get_session_manager() -> SimplifiedSessionManager:
FILE: python/src/server/services/migration_service.py
class MigrationRecord (line 16) | class MigrationRecord:
method __init__ (line 19) | def __init__(self, data: dict[str, Any]):
class PendingMigration (line 27) | class PendingMigration:
method __init__ (line 30) | def __init__(self, version: str, name: str, sql_content: str, file_pat...
method _calculate_checksum (line 37) | def _calculate_checksum(self, content: str) -> str:
class MigrationService (line 42) | class MigrationService:
method __init__ (line 45) | def __init__(self):
method _get_supabase_client (line 53) | def _get_supabase_client(self) -> Client:
method check_migrations_table_exists (line 59) | async def check_migrations_table_exists(self) -> bool:
method get_applied_migrations (line 99) | async def get_applied_migrations(self) -> list[MigrationRecord]:
method scan_migration_directory (line 121) | async def scan_migration_directory(self) -> list[PendingMigration]:
method get_pending_migrations (line 164) | async def get_pending_migrations(self) -> list[PendingMigration]:
method get_migration_status (line 191) | async def get_migration_status(self) -> dict[str, Any]:
FILE: python/src/server/services/ollama/embedding_router.py
class RoutingDecision (line 20) | class RoutingDecision:
class EmbeddingRoute (line 33) | class EmbeddingRoute:
class EmbeddingRouter (line 43) | class EmbeddingRouter:
method __init__ (line 71) | def __init__(self):
method route_embedding (line 75) | async def route_embedding(self, model_name: str, instance_url: str,
method _detect_model_dimensions (line 132) | async def _detect_model_dimensions(self, model_name: str, instance_url...
method _route_by_dimensions (line 169) | async def _route_by_dimensions(self, model_name: str, instance_url: str,
method _route_by_model_mapping (line 206) | async def _route_by_model_mapping(self, model_name: str, instance_url:...
method _get_target_column (line 233) | def _get_target_column(self, dimensions: int) -> str:
method get_optimal_index_type (line 261) | def get_optimal_index_type(self, dimensions: int) -> str:
method get_available_embedding_routes (line 273) | async def get_available_embedding_routes(self, instance_urls: list[str...
method _calculate_performance_score (line 323) | def _calculate_performance_score(self, dimensions: int) -> float:
method validate_routing_decision (line 363) | async def validate_routing_decision(self, decision: RoutingDecision) -...
method clear_routing_cache (line 394) | def clear_routing_cache(self) -> None:
method get_routing_statistics (line 399) | def get_routing_statistics(self) -> dict[str, Any]:
FILE: python/src/server/services/ollama/model_discovery_service.py
class OllamaModel (line 22) | class OllamaModel:
class ModelCapabilities (line 61) | class ModelCapabilities:
class InstanceHealthStatus (line 75) | class InstanceHealthStatus:
class ModelDiscoveryService (line 85) | class ModelDiscoveryService:
method __init__ (line 88) | def __init__(self):
method _get_cached_models (line 95) | def _get_cached_models(self, instance_url: str) -> list[OllamaModel] |...
method _cache_models (line 112) | def _cache_models(self, instance_url: str, models: list[OllamaModel]) ...
method discover_models (line 122) | async def discover_models(self, instance_url: str, fetch_details: bool...
method _enrich_model_capabilities (line 239) | async def _enrich_model_capabilities(self, models: list[OllamaModel], ...
method _detect_model_capabilities_optimized (line 429) | async def _detect_model_capabilities_optimized(self, model_name: str, ...
method _detect_model_capabilities (line 488) | async def _detect_model_capabilities(self, model_name: str, instance_u...
method _test_embedding_capability_fast (line 550) | async def _test_embedding_capability_fast(self, model_name: str, insta...
method _test_chat_capability_fast (line 574) | async def _test_chat_capability_fast(self, model_name: str, instance_u...
method _test_structured_output_capability_fast (line 595) | async def _test_structured_output_capability_fast(self, model_name: st...
method _test_embedding_capability (line 623) | async def _test_embedding_capability(self, model_name: str, instance_u...
method _test_chat_capability (line 654) | async def _test_chat_capability(self, model_name: str, instance_url: s...
method _get_model_details (line 682) | async def _get_model_details(self, model_name: str, instance_url: str)...
method _test_function_calling_capability (line 817) | async def _test_function_calling_capability(self, model_name: str, ins...
method _test_structured_output_capability (line 859) | async def _test_structured_output_capability(self, model_name: str, in...
method validate_model_capabilities (line 902) | async def validate_model_capabilities(self, model_name: str, instance_...
method get_model_info (line 933) | async def get_model_info(self, model_name: str, instance_url: str) -> ...
method check_instance_health (line 958) | async def check_instance_health(self, instance_url: str) -> InstanceHe...
method discover_models_from_multiple_instances (line 1014) | async def discover_models_from_multiple_instances(self, instance_urls:...
FILE: python/src/server/services/openrouter_discovery_service.py
class OpenRouterEmbeddingModel (line 10) | class OpenRouterEmbeddingModel(BaseModel):
method validate_model_id_has_prefix (line 23) | def validate_model_id_has_prefix(cls, v: str) -> str:
class OpenRouterModelListResponse (line 30) | class OpenRouterModelListResponse(BaseModel):
class OpenRouterDiscoveryService (line 37) | class OpenRouterDiscoveryService:
method discover_embedding_models (line 40) | async def discover_embedding_models(self) -> list[OpenRouterEmbeddingM...
FILE: python/src/server/services/projects/document_service.py
class DocumentService (line 21) | class DocumentService:
method __init__ (line 24) | def __init__(self, supabase_client=None):
method add_document (line 28) | def add_document(
method list_documents (line 99) | def list_documents(self, project_id: str, include_content: bool = Fals...
method get_document (line 157) | def get_document(self, project_id: str, doc_id: str) -> tuple[bool, di...
method update_document (line 195) | def update_document(
method delete_document (line 297) | def delete_document(self, project_id: str, doc_id: str) -> tuple[bool,...
method _build_change_summary (line 343) | def _build_change_summary(self, doc_id: str, update_fields: dict[str, ...
FILE: python/src/server/services/projects/project_creation_service.py
class ProjectCreationService (line 19) | class ProjectCreationService:
method __init__ (line 22) | def __init__(self, supabase_client=None):
method create_project_with_ai (line 26) | async def create_project_with_ai(
method _generate_ai_documentation (line 131) | async def _generate_ai_documentation(
FILE: python/src/server/services/projects/project_service.py
class ProjectService (line 20) | class ProjectService:
method __init__ (line 23) | def __init__(self, supabase_client=None):
method create_project (line 27) | def create_project(self, title: str, github_repo: str = None) -> tuple...
method list_projects (line 76) | def list_projects(self, include_content: bool = True) -> tuple[bool, d...
method get_project (line 150) | def get_project(self, project_id: str) -> tuple[bool, dict[str, Any]]:
method delete_project (line 227) | def delete_project(self, project_id: str) -> tuple[bool, dict[str, Any]]:
method get_project_features (line 274) | def get_project_features(self, project_id: str) -> tuple[bool, dict[st...
method update_project (line 317) | def update_project(
FILE: python/src/server/services/projects/source_linking_service.py
class SourceLinkingService (line 18) | class SourceLinkingService:
method __init__ (line 21) | def __init__(self, supabase_client=None):
method get_project_sources (line 25) | def get_project_sources(self, project_id: str) -> tuple[bool, dict[str...
method update_project_sources (line 61) | def update_project_sources(
method format_project_with_sources (line 130) | def format_project_with_sources(self, project: dict[str, Any]) -> dict...
method format_projects_with_sources (line 167) | def format_projects_with_sources(self, projects: list[dict[str, Any]])...
FILE: python/src/server/services/projects/task_service.py
class TaskService (line 21) | class TaskService:
method __init__ (line 26) | def __init__(self, supabase_client=None):
method validate_status (line 30) | def validate_status(self, status: str) -> tuple[bool, str]:
method validate_assignee (line 39) | def validate_assignee(self, assignee: str) -> tuple[bool, str]:
method validate_priority (line 45) | def validate_priority(self, priority: str) -> tuple[bool, str]:
method create_task (line 55) | async def create_task(
method list_tasks (line 159) | def list_tasks(
method get_task (line 339) | def get_task(self, task_id: str) -> tuple[bool, dict[str, Any]]:
method update_task (line 361) | async def update_task(
method archive_task (line 425) | async def archive_task(
method get_all_project_task_counts (line 472) | def get_all_project_task_counts(self) -> tuple[bool, dict[str, dict[st...
FILE: python/src/server/services/projects/versioning_service.py
class VersioningService (line 19) | class VersioningService:
method __init__ (line 22) | def __init__(self, supabase_client=None):
method create_version (line 26) | def create_version(
method list_versions (line 91) | def list_versions(self, project_id: str, field_name: str = None) -> tu...
method get_version_content (line 126) | def get_version_content(
method restore_version (line 161) | def restore_version(
FILE: python/src/server/services/prompt_service.py
class PromptService (line 18) | class PromptService:
method __new__ (line 25) | def __new__(cls):
method load_prompts (line 31) | async def load_prompts(self) -> None:
method get_prompt (line 56) | def get_prompt(self, prompt_name: str, default: str | None = None) -> ...
method reload_prompts (line 77) | async def reload_prompts(self) -> None:
method get_all_prompt_names (line 85) | def get_all_prompt_names(self) -> list[str]:
method get_last_loaded_time (line 89) | def get_last_loaded_time(self) -> datetime | None:
FILE: python/src/server/services/provider_discovery_service.py
class ModelSpec (line 51) | class ModelSpec:
method __post_init__ (line 65) | def __post_init__(self):
class ProviderStatus (line 70) | class ProviderStatus:
class ProviderDiscoveryService (line 80) | class ProviderDiscoveryService:
method __init__ (line 83) | def __init__(self):
method _get_session (line 86) | async def _get_session(self) -> aiohttp.ClientSession:
method close (line 93) | async def close(self):
method _get_cached_result (line 99) | def _get_cached_result(self, cache_key: str) -> Any | None:
method _cache_result (line 109) | def _cache_result(self, cache_key: str, result: Any) -> None:
method _test_tool_support (line 113) | async def _test_tool_support(self, model_name: str, api_url: str) -> b...
method discover_openai_models (line 177) | async def discover_openai_models(self, api_key: str) -> list[ModelSpec]:
method discover_google_models (line 220) | async def discover_google_models(self, api_key: str) -> list[ModelSpec]:
method discover_ollama_models (line 255) | async def discover_ollama_models(self, base_urls: list[str]) -> list[M...
method discover_anthropic_models (line 332) | async def discover_anthropic_models(self, api_key: str) -> list[ModelS...
method discover_grok_models (line 362) | async def discover_grok_models(self, api_key: str) -> list[ModelSpec]:
method check_provider_health (line 392) | async def check_provider_health(self, provider: str, config: dict[str,...
method get_all_available_models (line 519) | async def get_all_available_models(self) -> dict[str, list[ModelSpec]]:
FILE: python/src/server/services/search/agentic_rag_strategy.py
class AgenticRAGStrategy (line 25) | class AgenticRAGStrategy:
method __init__ (line 28) | def __init__(self, supabase_client: Client, base_strategy):
method is_enabled (line 39) | def is_enabled(self) -> bool:
method search_code_examples (line 68) | async def search_code_examples(
method perform_agentic_search (line 124) | async def perform_agentic_search(
method _extract_code_context (line 222) | def _extract_code_context(self, result: dict[str, Any]) -> dict[str, A...
method analyze_code_query (line 260) | def analyze_code_query(self, query: str) -> dict[str, Any]:
function create_agentic_rag_strategy (line 368) | def create_agentic_rag_strategy(supabase_client: Client) -> AgenticRAGSt...
function search_code_examples_agentic (line 373) | async def search_code_examples_agentic(
function analyze_query_for_code_search (line 397) | def analyze_query_for_code_search(query: str) -> dict[str, Any]:
FILE: python/src/server/services/search/base_search_strategy.py
class BaseSearchStrategy (line 20) | class BaseSearchStrategy:
method __init__ (line 23) | def __init__(self, supabase_client: Client):
method vector_search (line 27) | async def vector_search(
FILE: python/src/server/services/search/hybrid_search_strategy.py
class HybridSearchStrategy (line 24) | class HybridSearchStrategy:
method __init__ (line 27) | def __init__(self, supabase_client: Client, base_strategy):
method search_documents_hybrid (line 31) | async def search_documents_hybrid(
method search_code_examples_hybrid (line 108) | async def search_code_examples_hybrid(
FILE: python/src/server/services/search/keyword_extractor.py
class KeywordExtractor (line 242) | class KeywordExtractor:
method __init__ (line 245) | def __init__(self):
method extract_keywords (line 249) | def extract_keywords(
method _prioritize_keywords (line 320) | def _prioritize_keywords(self, keywords: list[str], original_query: st...
method build_search_terms (line 364) | def build_search_terms(self, keywords: list[str]) -> list[str]:
function extract_keywords (line 424) | def extract_keywords(query: str, min_length: int = 2, max_keywords: int ...
function build_search_terms (line 439) | def build_search_terms(keywords: list[str]) -> list[str]:
FILE: python/src/server/services/search/rag_service.py
class RAGService (line 31) | class RAGService:
method __init__ (line 39) | def __init__(self, supabase_client=None):
method get_setting (line 61) | def get_setting(self, key: str, default: str = "false") -> str:
method get_bool_setting (line 82) | def get_bool_setting(self, key: str, default: bool = False) -> bool:
method search_documents (line 87) | async def search_documents(
method search_code_examples (line 148) | async def search_code_examples(
method _group_chunks_by_pages (line 175) | async def _group_chunks_by_pages(
method perform_rag_query (line 244) | async def perform_rag_query(
method search_code_examples_service (line 380) | async def search_code_examples_service(
FILE: python/src/server/services/search/reranking_strategy.py
class RerankingStrategy (line 30) | class RerankingStrategy:
method __init__ (line 33) | def __init__(
method from_model (line 47) | def from_model(cls, model: Any, model_name: str = "custom_model") -> "...
method _load_model (line 62) | def _load_model(self) -> CrossEncoder:
method is_available (line 75) | def is_available(self) -> bool:
method build_query_document_pairs (line 79) | def build_query_document_pairs(
method apply_rerank_scores (line 107) | def apply_rerank_scores(
method rerank_results (line 139) | async def rerank_results(
method get_model_info (line 196) | def get_model_info(self) -> dict[str, Any]:
class RerankingConfig (line 206) | class RerankingConfig:
method from_credential_service (line 210) | def from_credential_service(credential_service) -> dict[str, Any]:
method from_env (line 227) | def from_env() -> dict[str, Any]:
FILE: python/src/server/services/source_management_service.py
function extract_source_summary (line 19) | async def extract_source_summary(
function generate_source_title_and_metadata (line 100) | async def generate_source_title_and_metadata(
function update_source_info (line 214) | async def update_source_info(
class SourceManagementService (line 362) | class SourceManagementService:
method __init__ (line 365) | def __init__(self, supabase_client=None):
method get_available_sources (line 369) | def get_available_sources(self) -> tuple[bool, dict[str, Any]]:
method delete_source (line 397) | def delete_source(self, source_id: str) -> tuple[bool, dict[str, Any]]:
method update_source_metadata (line 440) | def update_source_metadata(
method create_source_info (line 511) | async def create_source_info(
method get_source_details (line 565) | def get_source_details(self, source_id: str) -> tuple[bool, dict[str, ...
method list_sources_by_type (line 617) | def list_sources_by_type(self, knowledge_type: str = None) -> tuple[bo...
FILE: python/src/server/services/storage/base_storage_service.py
class BaseStorageService (line 22) | class BaseStorageService(ABC):
method __init__ (line 25) | def __init__(self, supabase_client=None):
method smart_chunk_text (line 39) | def smart_chunk_text(self, text: str, chunk_size: int = 5000) -> list[...
method smart_chunk_text_async (line 122) | async def smart_chunk_text_async(
method extract_metadata (line 166) | def extract_metadata(
method extract_source_id (line 199) | def extract_source_id(self, url: str) -> str:
method batch_process_with_progress (line 216) | async def batch_process_with_progress(
method store_documents (line 258) | async def store_documents(self, documents: list[dict[str, Any]], **kwa...
method process_document (line 272) | async def process_document(self, document: dict[str, Any], **kwargs) -...
FILE: python/src/server/services/storage/code_storage_service.py
function _extract_json_payload (line 33) | def _extract_json_payload(raw_response: str, context_code: str = "", lan...
function _is_reasoning_text_response (line 78) | def _is_reasoning_text_response(text: str) -> bool:
function _get_model_choice (line 96) | async def _get_model_choice() -> str:
function _get_max_workers (line 125) | def _get_max_workers() -> int:
function _normalize_code_for_comparison (line 130) | def _normalize_code_for_comparison(code: str) -> str:
function _calculate_code_similarity (line 163) | def _calculate_code_similarity(code1: str, code2: str) -> float:
function _select_best_code_variant (line 184) | def _select_best_code_variant(similar_blocks: list[dict[str, Any]]) -> d...
function extract_code_blocks (line 243) | def extract_code_blocks(markdown_content: str, min_length: int = None) -...
function generate_code_example_summary (line 576) | def generate_code_example_summary(
function _generate_code_example_summary_async (line 598) | async def _generate_code_example_summary_async(
function _generate_summary_with_client (line 683) | async def _generate_summary_with_client(
function generate_code_summaries_batch (line 1016) | async def generate_code_summaries_batch(
function add_code_examples_to_supabase (line 1131) | async def add_code_examples_to_supabase(
FILE: python/src/server/services/storage/document_storage_service.py
function add_documents_to_supabase (line 16) | async def add_documents_to_supabase(
FILE: python/src/server/services/storage/storage_services.py
class DocumentStorageService (line 17) | class DocumentStorageService(BaseStorageService):
method upload_document (line 20) | async def upload_document(
method store_documents (line 235) | async def store_documents(self, documents: list[dict[str, Any]], **kwa...
method process_document (line 266) | async def process_document(self, document: dict[str, Any], **kwargs) -...
method store_code_examples (line 297) | def store_code_examples(
FILE: python/src/server/services/threading_service.py
class ProcessingMode (line 32) | class ProcessingMode(str, Enum):
class RateLimitConfig (line 41) | class RateLimitConfig:
class SystemMetrics (line 52) | class SystemMetrics:
class ThreadingConfig (line 63) | class ThreadingConfig:
class RateLimiter (line 75) | class RateLimiter:
method __init__ (line 78) | def __init__(self, config: RateLimitConfig):
method acquire (line 85) | async def acquire(self, estimated_tokens: int = 8000, progress_callbac...
method _can_make_request (line 143) | def _can_make_request(self, estimated_tokens: int) -> bool:
method _clean_old_entries (line 156) | def _clean_old_entries(self, current_time: float):
method _calculate_wait_time (line 166) | def _calculate_wait_time(self, estimated_tokens: int) -> float:
method _get_current_usage (line 179) | def _get_current_usage(self) -> dict[str, int]:
class MemoryAdaptiveDispatcher (line 190) | class MemoryAdaptiveDispatcher:
method __init__ (line 193) | def __init__(self, config: ThreadingConfig):
method get_system_metrics (line 198) | def get_system_metrics(self) -> SystemMetrics:
method calculate_optimal_workers (line 211) | def calculate_optimal_workers(self, mode: ProcessingMode = ProcessingM...
method process_with_adaptive_concurrency (line 257) | async def process_with_adaptive_concurrency(
class ThreadingService (line 406) | class ThreadingService:
method __init__ (line 409) | def __init__(
method start (line 429) | async def start(self):
method stop (line 438) | async def stop(self):
method rate_limited_operation (line 459) | async def rate_limited_operation(self, estimated_tokens: int = 8000, p...
method run_cpu_intensive (line 481) | async def run_cpu_intensive(self, func: Callable, *args, **kwargs) -> ...
method run_io_bound (line 486) | async def run_io_bound(self, func: Callable, *args, **kwargs) -> Any:
method batch_process (line 491) | async def batch_process(
method get_system_metrics (line 509) | def get_system_metrics(self) -> SystemMetrics:
method _health_check_loop (line 513) | async def _health_check_loop(self):
function get_threading_service (line 565) | def get_threading_service() -> ThreadingService:
function start_threading_service (line 573) | async def start_threading_service() -> ThreadingService:
function stop_threading_service (line 580) | async def stop_threading_service():
FILE: python/src/server/services/version_service.py
class VersionService (line 15) | class VersionService:
method __init__ (line 18) | def __init__(self):
method _is_cache_valid (line 23) | def _is_cache_valid(self) -> bool:
method get_latest_release (line 31) | async def get_latest_release(self) -> dict[str, Any] | None:
method check_for_updates (line 89) | async def check_for_updates(self) -> dict[str, Any]:
method clear_cache (line 155) | def clear_cache(self):
FILE: python/src/server/utils/__init__.py
function initialize_threading_service (line 54) | async def initialize_threading_service(
function get_utils_threading_service (line 68) | def get_utils_threading_service():
FILE: python/src/server/utils/document_processing.py
function _preserve_code_blocks_across_pages (line 39) | def _preserve_code_blocks_across_pages(text: str) -> str:
function _clean_html_to_text (line 78) | def _clean_html_to_text(html_content: str) -> str:
function extract_text_from_document (line 158) | def extract_text_from_document(file_content: bytes, filename: str, conte...
function extract_text_from_pdf (line 224) | def extract_text_from_pdf(file_content: bytes) -> str:
function extract_text_from_docx (line 307) | def extract_text_from_docx(file_content: bytes) -> str:
FILE: python/src/server/utils/etag_utils.py
function generate_etag (line 8) | def generate_etag(data: Any) -> str:
function check_etag (line 27) | def check_etag(request_etag: str | None, current_etag: str) -> bool:
FILE: python/src/server/utils/progress/progress_tracker.py
class ProgressTracker (line 14) | class ProgressTracker:
method __init__ (line 23) | def __init__(self, progress_id: str, operation_type: str = "crawl"):
method get_progress (line 45) | def get_progress(cls, progress_id: str) -> dict[str, Any] | None:
method clear_progress (line 50) | def clear_progress(cls, progress_id: str) -> None:
method list_active (line 56) | def list_active(cls) -> dict[str, dict[str, Any]]:
method _delayed_cleanup (line 61) | async def _delayed_cleanup(cls, progress_id: str, delay_seconds: int =...
method start (line 75) | async def start(self, initial_data: dict[str, Any] | None = None):
method update (line 93) | async def update(self, status: str, progress: int, log: str, **kwargs):
method complete (line 166) | async def complete(self, completion_data: dict[str, Any] | None = None):
method error (line 196) | async def error(self, error_message: str, error_details: dict[str, Any...
method update_batch_progress (line 221) | async def update_batch_progress(
method update_crawl_stats (line 243) | async def update_crawl_stats(
method update_storage_progress (line 278) | async def update_storage_progress(
method update_code_extraction_progress (line 313) | async def update_code_extraction_progress(
method _update_state (line 345) | def _update_state(self):
method _format_duration (line 355) | def _format_duration(self, seconds: float) -> str:
method get_state (line 366) | def get_state(self) -> dict[str, Any]:
FILE: python/src/server/utils/semantic_version.py
function parse_version (line 8) | def parse_version(version_string: str) -> tuple[int, int, int, str | None]:
function compare_versions (line 52) | def compare_versions(version1: str, version2: str) -> int:
function is_newer_version (line 92) | def is_newer_version(current: str, latest: str) -> bool:
FILE: python/tests/agent_work_orders/conftest.py
function reset_structlog (line 22) | def reset_structlog():
FILE: python/tests/agent_work_orders/test_agent_executor.py
function test_build_command (line 13) | def test_build_command():
function test_build_command_no_args (line 50) | def test_build_command_no_args():
function test_build_command_with_custom_max_turns (line 75) | def test_build_command_with_custom_max_turns():
function test_build_command_missing_file (line 100) | def test_build_command_missing_file():
function test_execute_async_success (line 112) | async def test_execute_async_success():
function test_execute_async_failure (line 141) | async def test_execute_async_failure():
function test_execute_async_timeout (line 165) | async def test_execute_async_timeout():
function test_extract_session_id (line 193) | def test_extract_session_id():
function test_extract_session_id_not_found (line 207) | def test_extract_session_id_not_found():
function test_extract_session_id_invalid_json (line 220) | def test_extract_session_id_invalid_json():
function test_execute_async_extracts_result_text (line 231) | async def test_execute_async_extracts_result_text():
function test_build_command_replaces_arguments_placeholder (line 257) | def test_build_command_replaces_arguments_placeholder():
function test_build_command_replaces_positional_arguments (line 281) | def test_build_command_replaces_positional_arguments():
FILE: python/tests/agent_work_orders/test_api.py
function test_health_endpoint (line 18) | def test_health_endpoint():
function test_create_agent_work_order (line 35) | def test_create_agent_work_order():
function test_create_agent_work_order_without_issue (line 57) | def test_create_agent_work_order_without_issue():
function test_create_agent_work_order_invalid_data (line 76) | def test_create_agent_work_order_invalid_data():
function test_list_agent_work_orders_empty (line 88) | def test_list_agent_work_orders_empty():
function test_list_agent_work_orders_with_data (line 102) | def test_list_agent_work_orders_with_data():
function test_list_agent_work_orders_with_status_filter (line 136) | def test_list_agent_work_orders_with_status_filter():
function test_get_agent_work_order (line 147) | def test_get_agent_work_order():
function test_get_agent_work_order_not_found (line 186) | def test_get_agent_work_order_not_found():
function test_get_git_progress (line 196) | def test_get_git_progress():
function test_get_git_progress_not_found (line 232) | def test_get_git_progress_not_found():
function test_send_prompt_to_agent (line 242) | def test_send_prompt_to_agent():
function test_get_logs (line 257) | def test_get_logs():
function test_verify_repository_success (line 273) | def test_verify_repository_success():
function test_verify_repository_failure (line 300) | def test_verify_repository_failure():
function test_get_agent_work_order_steps (line 315) | def test_get_agent_work_order_steps():
function test_get_agent_work_order_steps_not_found (line 374) | def test_get_agent_work_order_steps_not_found():
function test_get_agent_work_order_steps_empty (line 387) | def test_get_agent_work_order_steps_empty():
FILE: python/tests/agent_work_orders/test_command_loader.py
function test_load_command_success (line 14) | def test_load_command_success():
function test_load_command_not_found (line 30) | def test_load_command_not_found():
function test_list_available_commands (line 44) | def test_list_available_commands():
function test_list_available_commands_empty_directory (line 64) | def test_list_available_commands_empty_directory():
function test_list_available_commands_nonexistent_directory (line 76) | def test_list_available_commands_nonexistent_directory():
FILE: python/tests/agent_work_orders/test_config.py
function test_config_default_values (line 13) | def test_config_default_values():
function test_config_local_service_discovery (line 28) | def test_config_local_service_discovery():
function test_config_docker_service_discovery (line 41) | def test_config_docker_service_discovery():
function test_config_explicit_server_url_override (line 56) | def test_config_explicit_server_url_override():
function test_config_explicit_mcp_url_override (line 67) | def test_config_explicit_mcp_url_override():
function test_config_claude_cli_path_override (line 78) | def test_config_claude_cli_path_override():
function test_config_log_level_override (line 91) | def test_config_log_level_override():
function test_config_cors_origins_override (line 104) | def test_config_cors_origins_override():
function test_config_ensure_temp_dir (line 116) | def test_config_ensure_temp_dir(tmp_path):
function test_config_explicit_url_overrides_discovery_mode (line 143) | def test_config_explicit_url_overrides_discovery_mode():
function test_config_state_storage_type (line 157) | def test_config_state_storage_type():
function test_config_file_state_directory (line 182) | def test_config_file_state_directory():
FILE: python/tests/agent_work_orders/test_github_integration.py
function test_verify_repository_access_success (line 13) | async def test_verify_repository_access_success():
function test_verify_repository_access_failure (line 29) | async def test_verify_repository_access_failure():
function test_get_repository_info_success (line 45) | async def test_get_repository_info_success():
function test_get_repository_info_failure (line 65) | async def test_get_repository_info_failure():
function test_create_pull_request_success (line 80) | async def test_create_pull_request_success():
function test_create_pull_request_failure (line 108) | async def test_create_pull_request_failure():
function test_parse_repository_url_https (line 128) | def test_parse_repository_url_https():
function test_parse_repository_url_https_with_git (line 137) | def test_parse_repository_url_https_with_git():
function test_parse_repository_url_short_format (line 146) | def test_parse_repository_url_short_format():
function test_parse_repository_url_invalid (line 155) | def test_parse_repository_url_invalid():
function test_get_issue_success (line 167) | async def test_get_issue_success():
function test_get_issue_failure (line 192) | async def test_get_issue_failure():
FILE: python/tests/agent_work_orders/test_id_generator.py
function test_generate_work_order_id_format (line 9) | def test_generate_work_order_id_format():
function test_generate_work_order_id_uniqueness (line 20) | def test_generate_work_order_id_uniqueness():
function test_generate_sandbox_identifier (line 26) | def test_generate_sandbox_identifier():
FILE: python/tests/agent_work_orders/test_log_buffer.py
function test_add_and_get_logs (line 16) | def test_add_and_get_logs():
function test_circular_buffer_overflow (line 35) | def test_circular_buffer_overflow():
function test_filter_by_level (line 54) | def test_filter_by_level():
function test_filter_by_step (line 78) | def test_filter_by_step():
function test_filter_by_timestamp (line 95) | def test_filter_by_timestamp():
function test_multiple_work_orders (line 115) | def test_multiple_work_orders():
function test_clear_work_order (line 133) | def test_clear_work_order():
function test_thread_safety (line 150) | def test_thread_safety():
function test_cleanup_old_work_orders (line 175) | def test_cleanup_old_work_orders():
function test_get_logs_with_pagination (line 196) | def test_get_logs_with_pagination():
function test_get_logs_since_convenience_method (line 219) | def test_get_logs_since_convenience_method():
function test_get_work_order_count (line 235) | def test_get_work_order_count():
function test_em
Condensed preview — 674 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,109K chars).
[
{
"path": ".claude/agents/codebase-analyst.md",
"chars": 3411,
"preview": "---\nname: \"codebase-analyst\"\ndescription: \"Use proactively to find codebase patterns, coding style and team standards. S"
},
{
"path": ".claude/agents/library-researcher.md",
"chars": 3000,
"preview": "---\nname: \"library-researcher\"\ndescription: \"Use proactively to research external libraries and fetch implementation-cri"
},
{
"path": ".claude/commands/agent-work-orders/commit.md",
"chars": 1542,
"preview": "# Create Git Commit\n\nCreate an atomic git commit with a properly formatted commit message following best practices for t"
},
{
"path": ".claude/commands/agent-work-orders/execute.md",
"chars": 844,
"preview": "# Execute PRP Plan\n\nImplement a feature plan from the PRPs directory by following its Step by Step Tasks section.\n\n## Va"
},
{
"path": ".claude/commands/agent-work-orders/noqa.md",
"chars": 4811,
"preview": "# NOQA Analysis and Resolution\n\nFind all noqa/type:ignore comments in the codebase, investigate why they exist, and prov"
},
{
"path": ".claude/commands/agent-work-orders/planning.md",
"chars": 6981,
"preview": "# Feature Planning\n\nCreate a new plan to implement the `PRP` using the exact specified markdown `PRP Format`. Follow the"
},
{
"path": ".claude/commands/agent-work-orders/prime.md",
"chars": 1043,
"preview": "# Prime\n\nExecute the following sections to understand the codebase before starting new work, then summarize your underst"
},
{
"path": ".claude/commands/agent-work-orders/prp-review.md",
"chars": 3224,
"preview": "# Code Review\n\nReview implemented work against a PRP specification to ensure code quality, correctness, and adherence to"
},
{
"path": ".claude/commands/agent-work-orders/start-server.md",
"chars": 1149,
"preview": "# Start Servers\n\nStart both the FastAPI backend and React frontend development servers with hot reload.\n\n## Run\n\n### Run"
},
{
"path": ".claude/commands/archon/archon-alpha-review.md",
"chars": 6675,
"preview": "---\ndescription: Perform comprehensive code review for Archon V2 Beta, this command will save a report to `code-review.m"
},
{
"path": ".claude/commands/archon/archon-coderabbit-helper.md",
"chars": 1882,
"preview": "---\nname: Archon CodeRabbit Helper\ndescription: Analyze CodeRabbit suggestions, assess validity, and provide actionable "
},
{
"path": ".claude/commands/archon/archon-onboarding.md",
"chars": 6055,
"preview": "---\nname: archon-onboarding\ndescription: |\n Onboard new developers to the Archon codebase with a comprehensive overview"
},
{
"path": ".claude/commands/archon/archon-prime-simple.md",
"chars": 1727,
"preview": "---\nname: prime-simple\ndescription: Quick context priming for Archon development - reads essential files and provides pr"
},
{
"path": ".claude/commands/archon/archon-prime.md",
"chars": 7168,
"preview": "---\nname: prime\ndescription: |\n Prime Claude Code with deep context for a specific part of the Archon codebase.\n\n Usag"
},
{
"path": ".claude/commands/archon/archon-rca.md",
"chars": 5011,
"preview": "---\ndescription: Generate Root Cause Analysis report for Archon V2 Beta issues\nargument-hint: <issue description or erro"
},
{
"path": ".claude/commands/archon/archon-ui-consistency-review.md",
"chars": 2176,
"preview": "---\ndescription: Analyze UI components for reusability, Radix usage, primitives, and styling consistency\nargument-hint: "
},
{
"path": ".claude/commands/prp-any-agent/prp-any-cli-create.md",
"chars": 2645,
"preview": "# Create PRP\n\n## Feature file: $ARGUMENTS\n\nGenerate a complete PRP for general feature implementation with thorough rese"
},
{
"path": ".claude/commands/prp-any-agent/prp-any-cli-execute.md",
"chars": 1265,
"preview": "# Execute BASE PRP\n\nImplement a feature using using the PRP file.\n\n## PRP File: $ARGUMENTS\n\n## Execution Process\n\n1. **L"
},
{
"path": ".claude/commands/prp-claude-code/prp-claude-code-create.md",
"chars": 4708,
"preview": "# Create BASE PRP\n\n## Feature: $ARGUMENTS\n\n## PRP Creation Mission\n\nCreate a comprehensive PRP that enables **one-pass i"
},
{
"path": ".claude/commands/prp-claude-code/prp-claude-code-execute.md",
"chars": 2480,
"preview": "# Execute BASE PRP\n\n## PRP File: $ARGUMENTS\n\n## Mission: One-Pass Implementation Success\n\nPRPs enable working code on th"
},
{
"path": ".claude/commands/prp-claude-code/prp-story-task-create.md",
"chars": 5288,
"preview": "---\ndescription: \"Convert user story/task into executable PRP with deep codebase analysis\"\n---\n\n# Create Story PRP from "
},
{
"path": ".claude/commands/prp-claude-code/prp-story-task-execute.md",
"chars": 2302,
"preview": "---\ndescription: \"Execute a Story PRP with focused task implementation\"\n---\n\n# Execute Story PRP\n\n## PRP File: $ARGUMENT"
},
{
"path": ".dockerignore",
"chars": 44,
"preview": "crawl4ai_mcp.egg-info\n__pycache__\n.venv\n.env"
},
{
"path": ".github/ISSUE_TEMPLATE/auto_bug_report.md",
"chars": 283,
"preview": "---\nname: Auto Bug Report\nabout: Automated bug report from Archon\ntitle: ''\nlabels: bug, auto-report\nassignees: ''\n---\n\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 4068,
"preview": "name: 🐛 Bug Report\ndescription: Report a bug to help us improve Archon Beta\ntitle: \"🐛 [Bug]: \"\nlabels: [\"bug\", \"needs-tr"
},
{
"path": ".github/RELEASE_NOTES_SETUP.md",
"chars": 12281,
"preview": "# AI-Generated Release Notes Setup\r\n\r\nThis repository uses Claude AI to automatically generate comprehensive release not"
},
{
"path": ".github/pull_request_template.md",
"chars": 1919,
"preview": "# Pull Request\n\n## Summary\n<!-- Provide a brief description of what this PR accomplishes -->\n\n## Changes Made\n<!-- List "
},
{
"path": ".github/test-release-notes.sh",
"chars": 8967,
"preview": "#!/bin/bash\nset -e\n\n# Colors for output\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nNC='\\0"
},
{
"path": ".github/workflows/ci.yml",
"chars": 10343,
"preview": "name: Continuous Integration\n\non:\n push:\n branches: [ main, unit-testing-ci ]\n pull_request:\n branches: [ main ]"
},
{
"path": ".github/workflows/claude-fix.yml",
"chars": 6865,
"preview": "name: Claude Code Fix (Write Access)\n\non:\n issue_comment:\n types: [created]\n pull_request_review_comment:\n types"
},
{
"path": ".github/workflows/claude-review.yml",
"chars": 9107,
"preview": "name: Claude Code Review (Read-Only)\n\non:\n issue_comment:\n types: [created]\n pull_request_review_comment:\n types"
},
{
"path": ".github/workflows/release-notes.yml",
"chars": 11224,
"preview": "name: AI-Generated Release Notes\r\n\r\non:\r\n workflow_dispatch:\r\n inputs:\r\n tag_name:\r\n description: 'Tag n"
},
{
"path": ".gitignore",
"chars": 385,
"preview": "__pycache__\n.env\n.serena\n.claude/settings.local.json\nPRPs/local\nPRPs/completed/\nPRPs/stories/\nPRPs/examples\nPRPs/feature"
},
{
"path": "AGENTS.md",
"chars": 11780,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CLAUDE.md",
"chars": 13829,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CONTRIBUTING.md",
"chars": 18806,
"preview": "# Contributing to Archon\n\nHelp us build the definitive knowledge and task management engine for AI coding assistants! Th"
},
{
"path": "LICENSE",
"chars": 1410,
"preview": "Archon Community License (ACL) v1.2\n\nCopyright © 2025 The Archon Project Community\nMaintained by the [Dynamous community"
},
{
"path": "Makefile",
"chars": 6832,
"preview": "# Archon Makefile - Simple, Secure, Cross-Platform\nSHELL := /bin/bash\n.SHELLFLAGS := -ec\n\n# Docker compose command - pre"
},
{
"path": "PRPs/ai_docs/AGENT_WORK_ORDERS_SSE_AND_ZUSTAND.md",
"chars": 40896,
"preview": "# Agent Work Orders: SSE + Zustand State Management Standards\n\n## Purpose\n\nThis document defines the **complete architec"
},
{
"path": "PRPs/ai_docs/API_NAMING_CONVENTIONS.md",
"chars": 8027,
"preview": "# API Naming Conventions\n\n## Overview\n\nThis document describes the actual naming conventions used throughout Archon's co"
},
{
"path": "PRPs/ai_docs/ARCHITECTURE.md",
"chars": 5989,
"preview": "# Archon Architecture\n\n## Overview\n\nArchon is a knowledge management system with AI capabilities, built as a monolithic "
},
{
"path": "PRPs/ai_docs/DATA_FETCHING_ARCHITECTURE.md",
"chars": 5952,
"preview": "# Data Fetching Architecture\n\n## Overview\n\nArchon uses **TanStack Query v5** for all data fetching, caching, and synchro"
},
{
"path": "PRPs/ai_docs/ETAG_IMPLEMENTATION.md",
"chars": 5536,
"preview": "# ETag Implementation\n\n## Overview\n\nArchon implements HTTP ETag caching to optimize bandwidth usage by reducing redundan"
},
{
"path": "PRPs/ai_docs/QUERY_PATTERNS.md",
"chars": 7166,
"preview": "# TanStack Query Patterns Guide\n\nThis guide documents the standardized patterns for using TanStack Query v5 in the Archo"
},
{
"path": "PRPs/ai_docs/UI_STANDARDS.md",
"chars": 25570,
"preview": "# Archon UI Standards\n\n**Audience**: AI agents performing automated UI audits and refactors\n**Purpose**: Single source o"
},
{
"path": "PRPs/ai_docs/ZUSTAND_STATE_MANAGEMENT.md",
"chars": 8346,
"preview": "Zustand v4 AI Coding Assistant Standards\n\nPurpose\n\nThese guidelines define how an AI coding assistant should generate, r"
},
{
"path": "PRPs/ai_docs/cc_cli_ref.md",
"chars": 10112,
"preview": "# CLI reference\n\n> Complete reference for Claude Code command-line interface, including commands and flags.\n\n## CLI comm"
},
{
"path": "PRPs/ai_docs/optimistic_updates.md",
"chars": 5058,
"preview": "# Optimistic Updates Pattern Guide\n\n## Core Architecture\n\n### Shared Utilities Module\n**Location**: `src/features/shared"
},
{
"path": "PRPs/templates/prp_base.md",
"chars": 10149,
"preview": "name: \"Base PRP Template v3 - Implementation-Focused with Precision Standards\"\ndescription: |\n\n---\n\n## Goal\n\n**Feature G"
},
{
"path": "PRPs/templates/prp_story_task.md",
"chars": 5491,
"preview": "---\nname: \"Story PRP Template - Task Implementation Focus\"\ndescription: \"Template for converting user stories into execu"
},
{
"path": "README.md",
"chars": 20137,
"preview": "<p align=\"center\">\n <img src=\"./archon-ui-main/public/archon-main-graphic.png\" alt=\"Archon Main Graphic\" width=\"853\" he"
},
{
"path": "archon-example-workflow/.claude/agents/codebase-analyst.md",
"chars": 3411,
"preview": "---\nname: \"codebase-analyst\"\ndescription: \"Use proactively to find codebase patterns, coding style and team standards. S"
},
{
"path": "archon-example-workflow/.claude/agents/validator.md",
"chars": 5285,
"preview": "---\nname: validator\ndescription: Testing specialist for software features. USE AUTOMATICALLY after implementation to cre"
},
{
"path": "archon-example-workflow/.claude/commands/create-plan.md",
"chars": 6036,
"preview": "---\ndescription: Create a comprehensive implementation plan from requirements document through extensive research\nargume"
},
{
"path": "archon-example-workflow/.claude/commands/execute-plan.md",
"chars": 5388,
"preview": "---\ndescription: Execute a development plan with full Archon task management integration\nargument-hint: [plan-file-path]"
},
{
"path": "archon-example-workflow/.claude/commands/primer.md",
"chars": 468,
"preview": "# Prime Context for the AI Coding Assistant (catch it up to speed on the project when starting a new conversation)\n\nStar"
},
{
"path": "archon-example-workflow/CLAUDE.md",
"chars": 3454,
"preview": "# CRITICAL: ARCHON-FIRST RULE - READ THIS FIRST\n BEFORE doing ANYTHING else, when you see ANY task management scenario:"
},
{
"path": "archon-example-workflow/README.md",
"chars": 6497,
"preview": "# Archon AI Coding Workflow Template\n\nA simple yet reliable template for systematic AI-assisted development using **crea"
},
{
"path": "archon-ui-main/.dockerignore",
"chars": 643,
"preview": "# Dependencies\nnode_modules\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Build output\ndist\nbuild\n\n# Environment var"
},
{
"path": "archon-ui-main/.eslintrc.cjs",
"chars": 4535,
"preview": "module.exports = {\n root: true,\n env: { browser: true, es2020: true, node: true },\n extends: [\n 'eslint:recommende"
},
{
"path": "archon-ui-main/.gitignore",
"chars": 329,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": "archon-ui-main/Dockerfile",
"chars": 605,
"preview": "# Simple Vite dev server setup\nFROM node:18-alpine\n\nWORKDIR /app\n\n# Install system dependencies needed for some npm pack"
},
{
"path": "archon-ui-main/README.md",
"chars": 7753,
"preview": "# Archon UI - Knowledge Engine Web Interface\n\nA modern React-based web interface for the Archon Knowledge Engine MCP Ser"
},
{
"path": "archon-ui-main/biome.json",
"chars": 837,
"preview": "{\n \"$schema\": \"https://biomejs.dev/schemas/2.2.2/schema.json\",\n \"files\": {\n \"includes\": [\"src/features/**\", \"src/co"
},
{
"path": "archon-ui-main/index.html",
"chars": 378,
"preview": "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
},
{
"path": "archon-ui-main/package.json",
"chars": 4098,
"preview": "{\n \"name\": \"archon-ui\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"npx vit"
},
{
"path": "archon-ui-main/postcss.config.js",
"chars": 91,
"preview": "export default {\n plugins: {\n '@tailwindcss/postcss': {},\n autoprefixer: {},\n },\n}\n"
},
{
"path": "archon-ui-main/src/App.tsx",
"chars": 5339,
"preview": "import { useState, useEffect } from 'react';\nimport { BrowserRouter as Router, Routes, Route, Navigate } from 'react-rou"
},
{
"path": "archon-ui-main/src/components/BackendStartupError.tsx",
"chars": 4097,
"preview": "import React from 'react';\nimport { AlertCircle, Terminal, RefreshCw } from 'lucide-react';\n\nexport const BackendStartup"
},
{
"path": "archon-ui-main/src/components/DisconnectScreenOverlay.tsx",
"chars": 1285,
"preview": "import React, { useState } from 'react';\nimport { X, Wifi, WifiOff } from 'lucide-react';\nimport { DisconnectScreen } fr"
},
{
"path": "archon-ui-main/src/components/agent-chat/ArchonChatPanel.tsx",
"chars": 20795,
"preview": "import React, { useEffect, useState, useRef } from 'react';\nimport { Send, User, WifiOff, RefreshCw, BookOpen, Search } "
},
{
"path": "archon-ui-main/src/components/animations/Animations.tsx",
"chars": 5187,
"preview": "import React from 'react';\n/**\n * ArchonLoadingSpinner - A loading animation component with neon trail effects\n *\n * Thi"
},
{
"path": "archon-ui-main/src/components/animations/DisconnectScreenAnimations.tsx",
"chars": 6119,
"preview": "import React, { useEffect, useRef } from 'react';\n\n/**\n * Disconnect Screen\n * Frosted glass medallion with aurora borea"
},
{
"path": "archon-ui-main/src/components/bug-report/BugReportButton.tsx",
"chars": 1217,
"preview": "import { Bug, Loader } from \"lucide-react\";\nimport { Button } from \"../ui/Button\";\nimport { BugReportModal } from \"./Bug"
},
{
"path": "archon-ui-main/src/components/bug-report/BugReportModal.tsx",
"chars": 15994,
"preview": "import { useState } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { Bug, X, Send, Copy, "
},
{
"path": "archon-ui-main/src/components/bug-report/ErrorBoundaryWithBugReport.tsx",
"chars": 5613,
"preview": "import React, { Component, ErrorInfo, ReactNode } from \"react\";\nimport { AlertCircle, Bug, RefreshCw } from \"lucide-reac"
},
{
"path": "archon-ui-main/src/components/code/CodeViewerModal.tsx",
"chars": 16977,
"preview": "import React, { useEffect, useState, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { motion } f"
},
{
"path": "archon-ui-main/src/components/common/DeleteConfirmModal.tsx",
"chars": 3584,
"preview": "import React, { useId } from 'react';\nimport { Trash2 } from 'lucide-react';\n\ninterface DeleteConfirmModalProps {\n item"
},
{
"path": "archon-ui-main/src/components/layout/MainLayout.tsx",
"chars": 7525,
"preview": "import { AlertCircle, WifiOff } from \"lucide-react\";\nimport type React from \"react\";\nimport { useEffect } from \"react\";\n"
},
{
"path": "archon-ui-main/src/components/layout/Navigation.tsx",
"chars": 7365,
"preview": "import { BookOpen, Bot, Palette, Settings } from \"lucide-react\";\nimport type React from \"react\";\nimport { Link, useLocat"
},
{
"path": "archon-ui-main/src/components/layout/hooks/useBackendHealth.ts",
"chars": 1581,
"preview": "import { useQuery } from \"@tanstack/react-query\";\nimport { callAPIWithETag } from \"../../../features/shared/api/apiClien"
},
{
"path": "archon-ui-main/src/components/layout/index.ts",
"chars": 162,
"preview": "export { useBackendHealth } from \"./hooks/useBackendHealth\";\nexport { MainLayout, MinimalLayout } from \"./MainLayout\";\ne"
},
{
"path": "archon-ui-main/src/components/layout/types.ts",
"chars": 605,
"preview": "import type React from \"react\";\n\nexport interface NavigationItem {\n path: string;\n icon: React.ReactNode;\n label: str"
},
{
"path": "archon-ui-main/src/components/onboarding/ProviderStep.tsx",
"chars": 7351,
"preview": "import { useState } from \"react\";\nimport { Key, ExternalLink, Save, Loader } from \"lucide-react\";\nimport { Input } from "
},
{
"path": "archon-ui-main/src/components/settings/APIKeysSection.tsx",
"chars": 15862,
"preview": "import { useState, useEffect } from 'react';\nimport { Key, Plus, Trash2, Save, Lock, Unlock, Eye, EyeOff } from 'lucide-"
},
{
"path": "archon-ui-main/src/components/settings/ButtonPlayground.tsx",
"chars": 28170,
"preview": "import React, { useState } from 'react';\nimport { Copy, Check, Link, Unlink } from 'lucide-react';\nimport { NeonButton, "
},
{
"path": "archon-ui-main/src/components/settings/CodeExtractionSettings.tsx",
"chars": 11707,
"preview": "import React, { useState } from 'react';\nimport { Code, Check, Save, Loader } from 'lucide-react';\nimport { Card } from "
},
{
"path": "archon-ui-main/src/components/settings/FeaturesSection.tsx",
"chars": 16440,
"preview": "import React, { useState, useEffect } from 'react';\nimport { Moon, Sun, FileText, Layout, Bot, Settings, Palette, Flame,"
},
{
"path": "archon-ui-main/src/components/settings/IDEGlobalRules.tsx",
"chars": 15591,
"preview": "import { useState } from 'react';\nimport { FileCode, Copy, Check } from 'lucide-react';\nimport { Card } from '../ui/Card"
},
{
"path": "archon-ui-main/src/components/settings/OllamaConfigurationPanel.tsx",
"chars": 33266,
"preview": "import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Card } from '../ui/Card';\nimport { But"
},
{
"path": "archon-ui-main/src/components/settings/OllamaInstanceHealthIndicator.tsx",
"chars": 9742,
"preview": "import React, { useState } from 'react';\nimport { Badge } from '../ui/Badge';\nimport { Button } from '../ui/Button';\nimp"
},
{
"path": "archon-ui-main/src/components/settings/OllamaModelDiscoveryModal.tsx",
"chars": 35540,
"preview": "import React, { useState, useEffect, useMemo, useCallback } from 'react';\n\n// FORCE DEBUG - This should ALWAYS appear in"
},
{
"path": "archon-ui-main/src/components/settings/OllamaModelSelectionModal.tsx",
"chars": 45827,
"preview": "import React, { useState, useEffect, useMemo } from 'react';\nimport ReactDOM from 'react-dom';\nimport { X, Search, Rotat"
},
{
"path": "archon-ui-main/src/components/settings/RAGSettings.tsx",
"chars": 106481,
"preview": "import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { Settings, Check, Save, Loader, Chevron"
},
{
"path": "archon-ui-main/src/components/settings/types/OllamaTypes.ts",
"chars": 4630,
"preview": "/**\n * TypeScript type definitions for Ollama components and services\n * \n * Provides comprehensive type definitions for"
},
{
"path": "archon-ui-main/src/components/ui/Badge.tsx",
"chars": 1871,
"preview": "import React from 'react';\ninterface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactN"
},
{
"path": "archon-ui-main/src/components/ui/Button.tsx",
"chars": 4755,
"preview": "import React from 'react';\n/**\n * Props for the Button component\n */\ninterface ButtonProps extends React.ButtonHTMLAttri"
},
{
"path": "archon-ui-main/src/components/ui/Card.tsx",
"chars": 3917,
"preview": "import React from 'react';\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNod"
},
{
"path": "archon-ui-main/src/components/ui/Checkbox.tsx",
"chars": 2547,
"preview": "import { useState, useEffect } from 'react';\nimport { Check, Minus } from 'lucide-react';\nimport { motion, AnimatePresen"
},
{
"path": "archon-ui-main/src/components/ui/CollapsibleSettingsCard.tsx",
"chars": 3875,
"preview": "import React, { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Po"
},
{
"path": "archon-ui-main/src/components/ui/CoverageVisualization.tsx",
"chars": 13058,
"preview": "import React from 'react';\nimport { motion } from 'framer-motion';\nimport { BarChart, Target, TrendingUp, TrendingDown, "
},
{
"path": "archon-ui-main/src/components/ui/GlassCrawlDepthSelector.tsx",
"chars": 6680,
"preview": "import React, { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport { cn } from '../../lib/utils';\n\n"
},
{
"path": "archon-ui-main/src/components/ui/Input.tsx",
"chars": 1536,
"preview": "import React from 'react';\ninterface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n accentColor?: 'p"
},
{
"path": "archon-ui-main/src/components/ui/MigrationBanner.tsx",
"chars": 2607,
"preview": "import React from 'react';\nimport { AlertTriangle, ExternalLink } from 'lucide-react';\nimport { Card } from './Card';\n\ni"
},
{
"path": "archon-ui-main/src/components/ui/NeonButton.tsx",
"chars": 10890,
"preview": "import React from 'react';\nimport { motion, HTMLMotionProps } from 'framer-motion';\nimport { cn } from '../../lib/utils'"
},
{
"path": "archon-ui-main/src/components/ui/PowerButton.tsx",
"chars": 5330,
"preview": "import React from 'react';\nimport { motion } from 'framer-motion';\n\ninterface PowerButtonProps {\n isOn: boolean;\n onCl"
},
{
"path": "archon-ui-main/src/components/ui/Select.tsx",
"chars": 2001,
"preview": "import React from 'react';\ninterface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n accentColor?:"
},
{
"path": "archon-ui-main/src/components/ui/ThemeToggle.tsx",
"chars": 2223,
"preview": "import React from 'react';\nimport { Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../../contexts/ThemeConte"
},
{
"path": "archon-ui-main/src/components/ui/Toggle.tsx",
"chars": 885,
"preview": "import React from 'react';\nimport '../../styles/toggle.css';\ninterface ToggleProps {\n checked: boolean;\n onCheckedChan"
},
{
"path": "archon-ui-main/src/config/api.ts",
"chars": 1092,
"preview": "/**\n * Unified API Configuration\n * \n * This module provides centralized configuration for API endpoints\n * and handles "
},
{
"path": "archon-ui-main/src/contexts/SettingsContext.tsx",
"chars": 5097,
"preview": "import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { credentialsService } "
},
{
"path": "archon-ui-main/src/contexts/ThemeContext.tsx",
"chars": 1300,
"preview": "import React, { useEffect, useState, createContext, useContext } from 'react';\ntype Theme = 'dark' | 'light';\ninterface "
},
{
"path": "archon-ui-main/src/env.d.ts",
"chars": 236,
"preview": "/// <reference types=\"vite/client\" />\n\ninterface ImportMetaEnv {\n readonly VITE_HOST: string;\n readonly VITE_PORT: str"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/AddRepositoryModal.tsx",
"chars": 8373,
"preview": "/**\n * Add Repository Modal Component\n *\n * Modal for adding new configured repositories with GitHub verification.\n * Tw"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/CreateWorkOrderModal.tsx",
"chars": 12274,
"preview": "/**\n * Create Work Order Modal Component\n *\n * Two-column modal for creating work orders with improved layout.\n * Left c"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/EditRepositoryModal.tsx",
"chars": 10168,
"preview": "/**\n * Edit Repository Modal Component\n *\n * Modal for editing configured repository settings.\n * Two-column layout: Lef"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/ExecutionLogs.tsx",
"chars": 8204,
"preview": "import { Trash2 } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"@/fe"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/RealTimeStats.tsx",
"chars": 13808,
"preview": "import { Activity, ChevronDown, ChevronUp, Clock, TrendingUp } from \"lucide-react\";\nimport { useEffect, useMemo, useStat"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/RepositoryCard.tsx",
"chars": 12076,
"preview": "/**\n * Repository Card Component\n *\n * Displays a configured repository with custom stat pills matching the example layo"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/SidebarRepositoryCard.tsx",
"chars": 7590,
"preview": "/**\n * Sidebar Repository Card Component\n *\n * Compact version of RepositoryCard for sidebar layout.\n * Shows repository"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/StepHistoryCard.tsx",
"chars": 11424,
"preview": "import { AnimatePresence, motion } from \"framer-motion\";\nimport { AlertCircle, CheckCircle2, ChevronDown, ChevronUp, Edi"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/WorkOrderRow.tsx",
"chars": 7041,
"preview": "/**\n * Work Order Row Component\n *\n * Individual table row for a work order with status indicator, start/details buttons"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/WorkOrderTable.tsx",
"chars": 4856,
"preview": "/**\n * Work Order Table Component\n *\n * Displays work orders in a table with start buttons, status indicators,\n * and ex"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/WorkflowStepButton.tsx",
"chars": 5720,
"preview": "import { motion } from \"framer-motion\";\nimport type React from \"react\";\nimport { cn } from \"@/features/ui/primitives/sty"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/__tests__/CreateWorkOrderModal.test.tsx",
"chars": 3978,
"preview": "/**\n * CreateWorkOrderModal Component Tests\n *\n * Tests for create work order modal form validation and submission.\n */\n"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/components/__tests__/RepositoryCard.test.tsx",
"chars": 3991,
"preview": "/**\n * RepositoryCard Component Tests\n *\n * Tests for repository card rendering and interactions.\n */\n\nimport { render, "
},
{
"path": "archon-ui-main/src/features/agent-work-orders/hooks/__tests__/useAgentWorkOrderQueries.test.tsx",
"chars": 14734,
"preview": "/**\n * Tests for Agent Work Order Query Hooks\n */\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-que"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/hooks/__tests__/useRepositoryQueries.test.tsx",
"chars": 12328,
"preview": "/**\n * Repository Query Hooks Tests\n *\n * Unit tests for repository query hooks.\n * Mocks repositoryService and query pa"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/hooks/useAgentWorkOrderQueries.ts",
"chars": 6446,
"preview": "/**\n * TanStack Query Hooks for Agent Work Orders\n *\n * This module provides React hooks for fetching and mutating agent"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/hooks/useRepositoryQueries.ts",
"chars": 10013,
"preview": "/**\n * Repository Query Hooks\n *\n * TanStack Query hooks for repository management.\n * Follows patterns from QUERY_PATTE"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/services/__tests__/agentWorkOrdersService.test.ts",
"chars": 5417,
"preview": "/**\n * Tests for Agent Work Orders Service\n */\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport * "
},
{
"path": "archon-ui-main/src/features/agent-work-orders/services/__tests__/repositoryService.test.ts",
"chars": 9303,
"preview": "/**\n * Repository Service Tests\n *\n * Unit tests for repository service methods.\n * Mocks callAPIWithETag to test reques"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/services/agentWorkOrdersService.ts",
"chars": 4510,
"preview": "/**\n * Agent Work Orders API Service\n *\n * This service handles all API communication for agent work orders.\n * It follo"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/services/repositoryService.ts",
"chars": 2692,
"preview": "/**\n * Repository Service\n *\n * Service layer for repository CRUD operations.\n * All methods use callAPIWithETag for aut"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/__tests__/agentWorkOrdersStore.test.ts",
"chars": 13804,
"preview": "/**\n * Unit tests for Agent Work Orders Zustand Store\n *\n * Tests all slices: UI Preferences, Modals, Filters, and SSE\n "
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/__tests__/sseIntegration.test.ts",
"chars": 10808,
"preview": "/**\n * Integration tests for SSE Connection Lifecycle\n *\n * Tests EventSource connection management, event handling, and"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/agentWorkOrdersStore.ts",
"chars": 2802,
"preview": "import { create } from \"zustand\";\nimport { devtools, persist, subscribeWithSelector } from \"zustand/middleware\";\nimport "
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/slices/filtersSlice.ts",
"chars": 1557,
"preview": "import type { StateCreator } from \"zustand\";\n\nexport type FiltersSlice = {\n // State\n searchQuery: string;\n selectedR"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/slices/modalsSlice.ts",
"chars": 2721,
"preview": "import type { StateCreator } from \"zustand\";\nimport type { ConfiguredRepository } from \"../../types/repository\";\n\nexport"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/slices/sseSlice.ts",
"chars": 8243,
"preview": "import type { StateCreator } from \"zustand\";\nimport type { LogEntry, SSEConnectionState } from \"../../types\";\n\nexport ty"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/state/slices/uiPreferencesSlice.ts",
"chars": 1352,
"preview": "import type { StateCreator } from \"zustand\";\n\nexport type LayoutMode = \"horizontal\" | \"sidebar\";\n\nexport type UIPreferen"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/types/index.ts",
"chars": 5991,
"preview": "/**\n * Agent Work Orders Type Definitions\n *\n * This module defines TypeScript interfaces and types for the Agent Work O"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/types/repository.ts",
"chars": 2552,
"preview": "/**\n * Repository Type Definitions\n *\n * This module defines TypeScript interfaces for configured repositories.\n * These"
},
{
"path": "archon-ui-main/src/features/agent-work-orders/views/AgentWorkOrderDetailView.tsx",
"chars": 14126,
"preview": "/**\n * Agent Work Order Detail View\n *\n * Detailed view of a single agent work order showing progress, step history,\n * "
},
{
"path": "archon-ui-main/src/features/agent-work-orders/views/AgentWorkOrdersView.tsx",
"chars": 14852,
"preview": "/**\n * Agent Work Orders View\n *\n * Main view for agent work orders with repository management and layout switching.\n * "
},
{
"path": "archon-ui-main/src/features/knowledge/components/AddKnowledgeDialog.tsx",
"chars": 11702,
"preview": "/**\n * Add Knowledge Dialog Component\n * Modal for crawling URLs or uploading documents\n */\n\nimport { Globe, Loader2, Up"
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeCard.tsx",
"chars": 11468,
"preview": "/**\n * Knowledge Card component\n * Displays a knowledge item with inline progress and status UI\n * Following the pattern"
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeCardActions.tsx",
"chars": 5074,
"preview": "/**\n * Knowledge Card Actions Component\n * Handles actions for knowledge items (recrawl, delete, etc.)\n * Following the "
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeCardTags.tsx",
"chars": 12276,
"preview": "/**\n * Knowledge Card Tags Component\n * Displays and allows inline editing of tags for knowledge items\n */\n\nimport { Che"
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeCardTitle.tsx",
"chars": 7168,
"preview": "/**\n * Knowledge Card Title Component\n * Displays and allows inline editing of knowledge item titles\n */\n\nimport { Info "
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeCardType.tsx",
"chars": 4093,
"preview": "/**\n * Knowledge Card Type Component\n * Displays and allows inline editing of knowledge item type (technical/business)\n "
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeHeader.tsx",
"chars": 4821,
"preview": "/**\n * Knowledge Base Header Component\n * Contains search, filters, and view controls\n */\n\nimport { Asterisk, BookOpen, "
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeList.tsx",
"chars": 5652,
"preview": "/**\n * Knowledge List Component\n * Displays knowledge items in grid or table view\n */\n\nimport { AnimatePresence, motion "
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeTable.tsx",
"chars": 9199,
"preview": "/**\n * Knowledge Table Component\n * Table view for knowledge items with Tron styling\n */\n\nimport { formatDistanceToNowSt"
},
{
"path": "archon-ui-main/src/features/knowledge/components/KnowledgeTypeSelector.tsx",
"chars": 4525,
"preview": "/**\n * Knowledge Type Selection Component\n * Radio cards for Technical vs Business knowledge type selection\n */\n\nimport "
},
{
"path": "archon-ui-main/src/features/knowledge/components/LevelSelector.tsx",
"chars": 6381,
"preview": "/**\n * Level Selection Component\n * Circular level selector for crawl depth using radio-like selection\n */\n\nimport { mot"
},
{
"path": "archon-ui-main/src/features/knowledge/components/TagInput.tsx",
"chars": 4755,
"preview": "/**\n * Tag Input Component\n * Visual tag management with add/remove functionality\n */\n\nimport { motion } from \"framer-mo"
},
{
"path": "archon-ui-main/src/features/knowledge/components/index.ts",
"chars": 206,
"preview": "export * from \"./AddKnowledgeDialog\";\nexport * from \"./KnowledgeCard\";\nexport * from \"./KnowledgeList\";\nexport * from \"."
},
{
"path": "archon-ui-main/src/features/knowledge/hooks/index.ts",
"chars": 39,
"preview": "export * from \"./useKnowledgeQueries\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/hooks/tests/useKnowledgeQueries.test.ts",
"chars": 8326,
"preview": "import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor } from \"@testing-"
},
{
"path": "archon-ui-main/src/features/knowledge/hooks/useKnowledgeQueries.ts",
"chars": 30210,
"preview": "/**\n * Knowledge Base Query Hooks\n * Following TanStack Query best practices with query key factories\n */\n\nimport { useM"
},
{
"path": "archon-ui-main/src/features/knowledge/index.ts",
"chars": 513,
"preview": "/**\n * Knowledge Feature Module\n *\n * Vertical slice containing all knowledge base functionality:\n * - Knowledge item ma"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx",
"chars": 9894,
"preview": "/**\n * Content Viewer Component\n * Displays the selected document or code content\n */\n\nimport { Check, Code, Copy, FileT"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/components/InspectorHeader.tsx",
"chars": 4558,
"preview": "/**\n * Inspector Header Component\n * Displays item metadata and badges\n */\n\nimport { formatDistanceToNow } from \"date-fn"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/components/InspectorSidebar.tsx",
"chars": 7475,
"preview": "/**\n * Inspector Sidebar Component\n * Displays list of documents or code examples with search\n */\n\nimport { motion } fro"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx",
"chars": 6625,
"preview": "/**\n * Knowledge Inspector Modal\n * Orchestrates split-view design with sidebar navigation and content viewer\n */\n\nimpor"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/components/index.ts",
"chars": 142,
"preview": "export * from \"./ContentViewer\";\nexport * from \"./InspectorHeader\";\nexport * from \"./InspectorSidebar\";\nexport * from \"."
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/hooks/index.ts",
"chars": 36,
"preview": "export * from \"./useInspectorData\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/hooks/useInspectorData.ts",
"chars": 2406,
"preview": "/**\n * Inspector Data Hook\n * Encapsulates data fetching and filtering logic for the inspector\n */\n\nimport { useMemo } f"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/hooks/useInspectorPagination.ts",
"chars": 4094,
"preview": "/**\n * Inspector Pagination Hook\n * Handles pagination for the Knowledge Inspector with \"Load More\" functionality\n */\n\ni"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/hooks/usePaginatedInspectorData.ts",
"chars": 5037,
"preview": "/**\n * Paginated Inspector Data Hook\n * Implements progressive loading for documents and code examples\n */\n\nimport { use"
},
{
"path": "archon-ui-main/src/features/knowledge/inspector/index.ts",
"chars": 30,
"preview": "export * from \"./components\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/services/index.ts",
"chars": 36,
"preview": "export * from \"./knowledgeService\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/services/knowledgeService.ts",
"chars": 6521,
"preview": "/**\n * Knowledge Base Service\n * Handles all knowledge-related API operations using TanStack Query patterns\n */\n\nimport "
},
{
"path": "archon-ui-main/src/features/knowledge/types/index.ts",
"chars": 29,
"preview": "export * from \"./knowledge\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/types/knowledge.ts",
"chars": 4879,
"preview": "/**\n * Knowledge Base Types\n * Matches backend models from knowledge_api.py\n */\n\nexport interface KnowledgeItemMetadata "
},
{
"path": "archon-ui-main/src/features/knowledge/utils/index.ts",
"chars": 75,
"preview": "export * from \"./knowledge-utils\";\nexport * from \"./providerErrorHandler\";\n"
},
{
"path": "archon-ui-main/src/features/knowledge/utils/knowledge-utils.ts",
"chars": 3059,
"preview": "/**\n * Knowledge Base Utility Functions\n */\n\nimport type { KnowledgeItem, KnowledgeItemMetadata } from \"../types\";\n\n/**\n"
},
{
"path": "archon-ui-main/src/features/knowledge/utils/providerErrorHandler.ts",
"chars": 2910,
"preview": "/**\n * Provider-agnostic error handler for LLM operations\n * Supports OpenAI, Google AI, Anthropic, and other providers\n"
},
{
"path": "archon-ui-main/src/features/knowledge/utils/tests/providerErrorHandler.test.ts",
"chars": 9642,
"preview": "import { describe, expect, it } from \"vitest\";\nimport { getProviderErrorMessage, type ProviderError, parseProviderError "
},
{
"path": "archon-ui-main/src/features/knowledge/views/KnowledgeView.tsx",
"chars": 6844,
"preview": "/**\n * Main Knowledge Base View Component\n * Orchestrates the knowledge base UI using vertical slice architecture\n */\n\ni"
},
{
"path": "archon-ui-main/src/features/knowledge/views/KnowledgeViewWithBoundary.tsx",
"chars": 473,
"preview": "import { QueryErrorResetBoundary } from \"@tanstack/react-query\";\nimport { FeatureErrorBoundary } from \"../../ui/componen"
},
{
"path": "archon-ui-main/src/features/knowledge/views/index.ts",
"chars": 33,
"preview": "export * from \"./KnowledgeView\";\n"
},
{
"path": "archon-ui-main/src/features/mcp/components/McpClientList.tsx",
"chars": 3664,
"preview": "import { motion } from \"framer-motion\";\nimport { Activity, Clock, Monitor } from \"lucide-react\";\nimport type React from "
},
{
"path": "archon-ui-main/src/features/mcp/components/McpConfigSection.tsx",
"chars": 12965,
"preview": "import { Copy, ExternalLink } from \"lucide-react\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimp"
},
{
"path": "archon-ui-main/src/features/mcp/components/McpStatusBar.tsx",
"chars": 3284,
"preview": "import { AlertCircle, CheckCircle, Clock, Server, Users } from \"lucide-react\";\nimport type React from \"react\";\nimport { "
},
{
"path": "archon-ui-main/src/features/mcp/components/index.ts",
"chars": 101,
"preview": "export * from \"./McpClientList\";\nexport * from \"./McpConfigSection\";\nexport * from \"./McpStatusBar\";\n"
},
{
"path": "archon-ui-main/src/features/mcp/hooks/index.ts",
"chars": 33,
"preview": "export * from \"./useMcpQueries\";\n"
},
{
"path": "archon-ui-main/src/features/mcp/hooks/useMcpQueries.ts",
"chars": 1740,
"preview": "import { useQuery } from \"@tanstack/react-query\";\nimport { useSmartPolling } from \"@/features/shared/hooks\";\nimport { ST"
},
{
"path": "archon-ui-main/src/features/mcp/index.ts",
"chars": 218,
"preview": "export * from \"./components\";\nexport * from \"./hooks\";\nexport * from \"./services\";\nexport * from \"./types\";\nexport { Mcp"
},
{
"path": "archon-ui-main/src/features/mcp/services/index.ts",
"chars": 26,
"preview": "export * from \"./mcpApi\";\n"
},
{
"path": "archon-ui-main/src/features/mcp/services/mcpApi.ts",
"chars": 1303,
"preview": "import { callAPIWithETag } from \"../../shared/api/apiClient\";\nimport type { McpClient, McpServerConfig, McpServerStatus,"
},
{
"path": "archon-ui-main/src/features/mcp/types/index.ts",
"chars": 23,
"preview": "export * from \"./mcp\";\n"
},
{
"path": "archon-ui-main/src/features/mcp/types/mcp.ts",
"chars": 978,
"preview": "// Core MCP interfaces matching backend schema\nexport interface McpServerStatus {\n status: \"running\" | \"starting\" | \"st"
},
{
"path": "archon-ui-main/src/features/mcp/views/McpView.tsx",
"chars": 3876,
"preview": "import { motion } from \"framer-motion\";\nimport { Loader, Server } from \"lucide-react\";\nimport type React from \"react\";\ni"
},
{
"path": "archon-ui-main/src/features/mcp/views/McpViewWithBoundary.tsx",
"chars": 448,
"preview": "import { QueryErrorResetBoundary } from \"@tanstack/react-query\";\nimport { FeatureErrorBoundary } from \"../../ui/componen"
},
{
"path": "archon-ui-main/src/features/progress/components/CrawlingProgress.tsx",
"chars": 13927,
"preview": "/**\n * Crawling Progress Component\n * Shows active crawling operations with progress tracking\n */\n\n// Removed relative s"
},
{
"path": "archon-ui-main/src/features/progress/components/KnowledgeCardProgress.tsx",
"chars": 4918,
"preview": "/**\n * Knowledge Card Progress Component\n * Displays inline crawl progress for knowledge items\n * Simplified to directly"
},
{
"path": "archon-ui-main/src/features/progress/components/index.ts",
"chars": 77,
"preview": "export * from \"./CrawlingProgress\";\nexport * from \"./KnowledgeCardProgress\";\n"
},
{
"path": "archon-ui-main/src/features/progress/hooks/index.ts",
"chars": 38,
"preview": "export * from \"./useProgressQueries\";\n"
}
]
// ... and 474 more files (download for full content)
About this extraction
This page contains the full source code of the coleam00/Archon GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 674 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 2832 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.