prjct-cli 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +81 -25
- package/bin/dev.js +1 -1
- package/bin/generate-views.js +209 -0
- package/bin/migrate-to-json.js +742 -0
- package/bin/prjct +5 -5
- package/bin/serve.js +226 -50
- package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
- package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
- package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
- package/core/__tests__/utils/{date-helper.test.js → date-helper.test.ts} +19 -30
- package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
- package/core/agentic/agent-router.ts +137 -0
- package/core/agentic/chain-of-thought.ts +228 -0
- package/core/agentic/command-executor/command-executor.ts +384 -0
- package/core/agentic/command-executor/index.ts +16 -0
- package/core/agentic/command-executor/status-signal.ts +38 -0
- package/core/agentic/command-executor/types.ts +79 -0
- package/core/agentic/command-executor.ts +8 -0
- package/core/agentic/{context-builder.js → context-builder.ts} +92 -81
- package/core/agentic/context-filter.ts +365 -0
- package/core/agentic/ground-truth/index.ts +76 -0
- package/core/agentic/ground-truth/types.ts +33 -0
- package/core/agentic/ground-truth/utils.ts +48 -0
- package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
- package/core/agentic/ground-truth/verifiers/done.ts +75 -0
- package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
- package/core/agentic/ground-truth/verifiers/index.ts +37 -0
- package/core/agentic/ground-truth/verifiers/init.ts +52 -0
- package/core/agentic/ground-truth/verifiers/now.ts +57 -0
- package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
- package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
- package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
- package/core/agentic/ground-truth/verifiers.ts +6 -0
- package/core/agentic/ground-truth.ts +8 -0
- package/core/agentic/loop-detector/error-analysis.ts +97 -0
- package/core/agentic/loop-detector/hallucination.ts +71 -0
- package/core/agentic/loop-detector/index.ts +41 -0
- package/core/agentic/loop-detector/loop-detector.ts +222 -0
- package/core/agentic/loop-detector/types.ts +66 -0
- package/core/agentic/loop-detector.ts +8 -0
- package/core/agentic/memory-system/history.ts +53 -0
- package/core/agentic/memory-system/index.ts +192 -0
- package/core/agentic/memory-system/patterns.ts +156 -0
- package/core/agentic/memory-system/semantic-memories.ts +277 -0
- package/core/agentic/memory-system/session.ts +21 -0
- package/core/agentic/memory-system/types.ts +159 -0
- package/core/agentic/memory-system.ts +8 -0
- package/core/agentic/parallel-tools.ts +165 -0
- package/core/agentic/plan-mode/approval.ts +57 -0
- package/core/agentic/plan-mode/constants.ts +44 -0
- package/core/agentic/plan-mode/index.ts +28 -0
- package/core/agentic/plan-mode/plan-mode.ts +406 -0
- package/core/agentic/plan-mode/types.ts +193 -0
- package/core/agentic/plan-mode.ts +8 -0
- package/core/agentic/prompt-builder.ts +566 -0
- package/core/agentic/response-templates.ts +164 -0
- package/core/agentic/semantic-compression.ts +273 -0
- package/core/agentic/services.ts +206 -0
- package/core/agentic/smart-context.ts +476 -0
- package/core/agentic/{template-loader.js → template-loader.ts} +27 -16
- package/core/agentic/think-blocks.ts +202 -0
- package/core/agentic/tool-registry.ts +119 -0
- package/core/agentic/validation-rules.ts +313 -0
- package/core/agents/index.ts +28 -0
- package/core/agents/performance.ts +444 -0
- package/core/agents/types.ts +126 -0
- package/core/bus/{index.js → index.ts} +57 -61
- package/core/command-registry/categories.ts +23 -0
- package/core/command-registry/commands.ts +15 -0
- package/core/command-registry/core-commands.ts +319 -0
- package/core/command-registry/index.ts +158 -0
- package/core/command-registry/optional-commands.ts +119 -0
- package/core/command-registry/setup-commands.ts +53 -0
- package/core/command-registry/types.ts +59 -0
- package/core/command-registry.ts +9 -0
- package/core/commands/analysis.ts +298 -0
- package/core/commands/analytics.ts +288 -0
- package/core/commands/base.ts +273 -0
- package/core/commands/index.ts +211 -0
- package/core/commands/maintenance.ts +226 -0
- package/core/commands/planning.ts +311 -0
- package/core/commands/setup.ts +309 -0
- package/core/commands/shipping.ts +188 -0
- package/core/commands/types.ts +183 -0
- package/core/commands/workflow.ts +226 -0
- package/core/commands.ts +11 -0
- package/core/constants/formats.ts +187 -0
- package/core/constants/index.ts +7 -0
- package/core/{context-sync.js → context-sync.ts} +59 -26
- package/core/data/agents-manager.ts +76 -0
- package/core/data/analysis-manager.ts +83 -0
- package/core/data/base-manager.ts +156 -0
- package/core/data/ideas-manager.ts +81 -0
- package/core/data/index.ts +32 -0
- package/core/data/outcomes-manager.ts +96 -0
- package/core/data/project-manager.ts +75 -0
- package/core/data/roadmap-manager.ts +118 -0
- package/core/data/shipped-manager.ts +65 -0
- package/core/data/state-manager.ts +214 -0
- package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
- package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
- package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
- package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
- package/core/domain/{analyzer.js → analyzer.ts} +91 -85
- package/core/domain/{architect-session.js → architect-session.ts} +49 -34
- package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
- package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
- package/core/domain/{product-standards.js → product-standards.ts} +40 -26
- package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
- package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
- package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
- package/core/domain/task-stack/index.ts +19 -0
- package/core/domain/task-stack/parser.ts +86 -0
- package/core/domain/task-stack/storage.ts +123 -0
- package/core/domain/task-stack/task-stack.ts +340 -0
- package/core/domain/task-stack/types.ts +51 -0
- package/core/domain/task-stack.ts +8 -0
- package/core/{index.js → index.ts} +61 -18
- package/core/infrastructure/{agent-detector.js → agent-detector.ts} +55 -19
- package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
- package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
- package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
- package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
- package/core/infrastructure/command-installer/global-config.ts +106 -0
- package/core/infrastructure/command-installer/index.ts +25 -0
- package/core/infrastructure/command-installer/types.ts +41 -0
- package/core/infrastructure/command-installer.ts +8 -0
- package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
- package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
- package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
- package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
- package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
- package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
- package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
- package/core/infrastructure/legacy-installer-detector.ts +7 -0
- package/core/infrastructure/migrator/file-operations.ts +125 -0
- package/core/infrastructure/migrator/index.ts +288 -0
- package/core/infrastructure/migrator/project-scanner.ts +89 -0
- package/core/infrastructure/migrator/reports.ts +117 -0
- package/core/infrastructure/migrator/types.ts +124 -0
- package/core/infrastructure/migrator/validation.ts +94 -0
- package/core/infrastructure/migrator/version-migration.ts +117 -0
- package/core/infrastructure/migrator.ts +10 -0
- package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
- package/core/infrastructure/session-manager/index.ts +23 -0
- package/core/infrastructure/session-manager/migration.ts +88 -0
- package/core/infrastructure/session-manager/session-manager.ts +307 -0
- package/core/infrastructure/session-manager/types.ts +45 -0
- package/core/infrastructure/session-manager.ts +8 -0
- package/core/infrastructure/{setup.js → setup.ts} +29 -21
- package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
- package/core/outcomes/analyzer.ts +333 -0
- package/core/outcomes/index.ts +34 -0
- package/core/outcomes/recorder.ts +194 -0
- package/core/outcomes/types.ts +145 -0
- package/core/plugin/{hooks.js → hooks.ts} +56 -58
- package/core/plugin/{index.js → index.ts} +19 -8
- package/core/plugin/{loader.js → loader.ts} +87 -69
- package/core/plugin/{registry.js → registry.ts} +49 -45
- package/core/plugins/{webhook.js → webhook.ts} +43 -27
- package/core/schemas/agents.ts +27 -0
- package/core/schemas/analysis.ts +41 -0
- package/core/schemas/ideas.ts +83 -0
- package/core/schemas/index.ts +73 -0
- package/core/schemas/outcomes.ts +22 -0
- package/core/schemas/project.ts +26 -0
- package/core/schemas/roadmap.ts +90 -0
- package/core/schemas/shipped.ts +82 -0
- package/core/schemas/state.ts +107 -0
- package/core/session/index.ts +17 -0
- package/core/session/{metrics.js → metrics.ts} +64 -46
- package/core/session/{index.js → session-manager.ts} +51 -117
- package/core/session/types.ts +29 -0
- package/core/session/utils.ts +57 -0
- package/core/state/index.ts +25 -0
- package/core/state/manager.ts +376 -0
- package/core/state/types.ts +185 -0
- package/core/tsconfig.json +22 -0
- package/core/types/index.ts +506 -0
- package/core/utils/{animations.js → animations.ts} +74 -28
- package/core/utils/{branding.js → branding.ts} +29 -4
- package/core/utils/{date-helper.js → date-helper.ts} +31 -74
- package/core/utils/file-helper.ts +262 -0
- package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
- package/core/utils/{logger.js → logger.ts} +24 -12
- package/core/utils/{output.js → output.ts} +25 -13
- package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
- package/core/utils/{session-helper.js → session-helper.ts} +79 -66
- package/core/utils/{version.js → version.ts} +23 -31
- package/core/view-generator.ts +536 -0
- package/package.json +23 -17
- package/packages/shared/.turbo/turbo-build.log +14 -0
- package/packages/shared/dist/index.d.ts +8 -613
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +4110 -118
- package/packages/shared/dist/schemas.d.ts +408 -0
- package/packages/shared/dist/schemas.d.ts.map +1 -0
- package/packages/shared/dist/types.d.ts +144 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/unified.d.ts +139 -0
- package/packages/shared/dist/unified.d.ts.map +1 -0
- package/packages/shared/dist/utils.d.ts +60 -0
- package/packages/shared/dist/utils.d.ts.map +1 -0
- package/packages/shared/package.json +4 -4
- package/packages/shared/src/index.ts +1 -0
- package/packages/shared/src/unified.ts +174 -0
- package/packages/web/app/api/claude/sessions/route.ts +1 -1
- package/packages/web/app/api/claude/status/route.ts +1 -1
- package/packages/web/app/api/migrate/route.ts +46 -0
- package/packages/web/app/api/projects/[id]/route.ts +1 -1
- package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
- package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
- package/packages/web/app/api/projects/route.ts +1 -1
- package/packages/web/app/api/settings/route.ts +97 -0
- package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
- package/packages/web/app/globals.css +38 -0
- package/packages/web/app/layout.tsx +10 -2
- package/packages/web/app/page.tsx +9 -224
- package/packages/web/app/project/[id]/page.tsx +191 -63
- package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
- package/packages/web/app/project/[id]/stats/page.tsx +204 -163
- package/packages/web/app/settings/page.tsx +222 -2
- package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
- package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
- package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
- package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
- package/packages/web/components/ActivityTimeline/index.ts +2 -0
- package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
- package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
- package/packages/web/components/AgentsCard/index.ts +2 -0
- package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
- package/packages/web/components/AppSidebar/index.ts +1 -0
- package/packages/web/components/BackLink/BackLink.tsx +18 -0
- package/packages/web/components/BackLink/BackLink.types.ts +5 -0
- package/packages/web/components/BackLink/index.ts +2 -0
- package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
- package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
- package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
- package/packages/web/components/BentoCard/index.ts +2 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
- package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
- package/packages/web/components/{stats → BentoGrid}/BentoGrid.tsx +4 -8
- package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
- package/packages/web/components/BentoGrid/index.ts +2 -0
- package/packages/web/components/CommandButton/index.ts +1 -0
- package/packages/web/components/ConnectionStatus/index.ts +1 -0
- package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
- package/packages/web/components/DashboardContent/index.ts +1 -0
- package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
- package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
- package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
- package/packages/web/components/DateGroup/index.ts +2 -0
- package/packages/web/components/{stats → EmptyState}/EmptyState.tsx +1 -10
- package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
- package/packages/web/components/EmptyState/index.ts +2 -0
- package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
- package/packages/web/components/EventRow/EventRow.tsx +49 -0
- package/packages/web/components/EventRow/EventRow.types.ts +7 -0
- package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
- package/packages/web/components/EventRow/index.ts +2 -0
- package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
- package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
- package/packages/web/components/ExpandButton/index.ts +2 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
- package/packages/web/components/HealthGradientBackground/index.ts +2 -0
- package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
- package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
- package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
- package/packages/web/components/HeroSection/hooks/index.ts +2 -0
- package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
- package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
- package/packages/web/components/HeroSection/index.ts +2 -0
- package/packages/web/components/{stats → IdeasCard}/IdeasCard.tsx +3 -14
- package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
- package/packages/web/components/IdeasCard/index.ts +2 -0
- package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
- package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
- package/packages/web/components/InsightMessage/index.ts +2 -0
- package/packages/web/components/Logo/index.ts +1 -0
- package/packages/web/components/MarkdownContent/index.ts +1 -0
- package/packages/web/components/NowCard/NowCard.tsx +93 -0
- package/packages/web/components/NowCard/NowCard.types.ts +15 -0
- package/packages/web/components/NowCard/index.ts +2 -0
- package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
- package/packages/web/components/{stats → ProgressRing}/ProgressRing.tsx +4 -27
- package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
- package/packages/web/components/ProgressRing/index.ts +2 -0
- package/packages/web/components/ProjectAvatar/index.ts +1 -0
- package/packages/web/components/Providers/index.ts +1 -0
- package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
- package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
- package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
- package/packages/web/components/QueueCard/index.ts +2 -0
- package/packages/web/components/{stats → RoadmapCard}/RoadmapCard.tsx +3 -23
- package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
- package/packages/web/components/RoadmapCard/index.ts +2 -0
- package/packages/web/components/{stats → ShipsCard}/ShipsCard.tsx +4 -22
- package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
- package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
- package/packages/web/components/ShipsCard/index.ts +2 -0
- package/packages/web/components/{stats → SparklineChart}/SparklineChart.tsx +1 -7
- package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
- package/packages/web/components/SparklineChart/index.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
- package/packages/web/components/{stats → StreakCard}/StreakCard.tsx +5 -11
- package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
- package/packages/web/components/StreakCard/index.ts +2 -0
- package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
- package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
- package/packages/web/components/TasksCounter/index.ts +2 -0
- package/packages/web/components/TechStackBadges/index.ts +1 -0
- package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
- package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
- package/packages/web/components/TerminalTabs/index.ts +1 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
- package/packages/web/components/VelocityBadge/index.ts +2 -0
- package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
- package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
- package/packages/web/components/VelocityCard/index.ts +2 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
- package/packages/web/components/WeeklySparkline/index.ts +2 -0
- package/packages/web/components/ui/input.tsx +21 -0
- package/packages/web/context/TerminalTabsContext.tsx +46 -1
- package/packages/web/hooks/useClaudeTerminal.ts +71 -21
- package/packages/web/hooks/useProjectStats.ts +55 -0
- package/packages/web/hooks/useProjects.ts +6 -6
- package/packages/web/lib/actions/projects.ts +15 -0
- package/packages/web/lib/json-loader.ts +630 -0
- package/packages/web/lib/services/index.ts +9 -0
- package/packages/web/lib/services/migration.server.ts +598 -0
- package/packages/web/lib/services/projects.server.ts +52 -0
- package/packages/web/lib/services/stats.server.ts +264 -0
- package/packages/web/lib/unified-loader.ts +396 -0
- package/packages/web/package.json +10 -7
- package/packages/web/server.ts +36 -6
- package/templates/commands/done.md +76 -32
- package/templates/commands/feature.md +121 -47
- package/templates/commands/idea.md +81 -8
- package/templates/commands/now.md +41 -17
- package/templates/commands/ship.md +64 -25
- package/templates/commands/sync.md +28 -3
- package/core/agentic/agent-router.js +0 -140
- package/core/agentic/chain-of-thought.js +0 -578
- package/core/agentic/command-executor.js +0 -417
- package/core/agentic/context-filter.js +0 -354
- package/core/agentic/ground-truth.js +0 -591
- package/core/agentic/loop-detector.js +0 -406
- package/core/agentic/memory-system.js +0 -845
- package/core/agentic/parallel-tools.js +0 -366
- package/core/agentic/plan-mode.js +0 -572
- package/core/agentic/prompt-builder.js +0 -352
- package/core/agentic/response-templates.js +0 -290
- package/core/agentic/semantic-compression.js +0 -517
- package/core/agentic/think-blocks.js +0 -657
- package/core/agentic/tool-registry.js +0 -184
- package/core/agentic/validation-rules.js +0 -380
- package/core/command-registry.js +0 -698
- package/core/commands.js +0 -2237
- package/core/domain/task-stack.js +0 -497
- package/core/infrastructure/legacy-installer-detector.js +0 -546
- package/core/infrastructure/migrator.js +0 -796
- package/core/infrastructure/session-manager.js +0 -390
- package/core/utils/file-helper.js +0 -329
- package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
- package/packages/web/app/api/stats/route.ts +0 -38
- package/packages/web/components/AppSidebar.tsx +0 -113
- package/packages/web/components/stats/ActivityTimeline.tsx +0 -201
- package/packages/web/components/stats/AgentsCard.tsx +0 -56
- package/packages/web/components/stats/BentoCard.tsx +0 -88
- package/packages/web/components/stats/HeroSection.tsx +0 -172
- package/packages/web/components/stats/NowCard.tsx +0 -71
- package/packages/web/components/stats/QueueCard.tsx +0 -58
- package/packages/web/components/stats/VelocityCard.tsx +0 -60
- package/packages/web/components/stats/index.ts +0 -17
- package/packages/web/hooks/useStats.ts +0 -28
- /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
- /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
- /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
- /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
- /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
- /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
- /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Performance Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks agent performance for intelligent routing.
|
|
5
|
+
* Enables learning which agent works best for which task type.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import path from 'path'
|
|
9
|
+
import * as fileHelper from '../utils/file-helper'
|
|
10
|
+
import pathManager from '../infrastructure/path-manager'
|
|
11
|
+
import type {
|
|
12
|
+
AgentPerformance,
|
|
13
|
+
AgentTaskRecord,
|
|
14
|
+
AgentSuggestion,
|
|
15
|
+
AgentPerformanceSummary,
|
|
16
|
+
TaskType,
|
|
17
|
+
} from './types'
|
|
18
|
+
|
|
19
|
+
const PERFORMANCE_DIR = 'analysis'
|
|
20
|
+
const PERFORMANCE_FILE = 'agent-performance.json'
|
|
21
|
+
const RECORDS_FILE = 'agent-records.jsonl'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* AgentPerformanceTracker - Tracks and analyzes agent performance.
|
|
25
|
+
*/
|
|
26
|
+
export class AgentPerformanceTracker {
|
|
27
|
+
/**
|
|
28
|
+
* Get performance directory path for a project.
|
|
29
|
+
*/
|
|
30
|
+
private getPerformanceDir(projectId: string): string {
|
|
31
|
+
const globalPath = pathManager.getGlobalProjectPath(projectId)
|
|
32
|
+
return path.join(globalPath, PERFORMANCE_DIR)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get performance file path.
|
|
37
|
+
*/
|
|
38
|
+
private getPerformancePath(projectId: string): string {
|
|
39
|
+
return path.join(this.getPerformanceDir(projectId), PERFORMANCE_FILE)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get records file path.
|
|
44
|
+
*/
|
|
45
|
+
private getRecordsPath(projectId: string): string {
|
|
46
|
+
return path.join(this.getPerformanceDir(projectId), RECORDS_FILE)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Record a task completion for an agent.
|
|
51
|
+
*/
|
|
52
|
+
async recordTask(projectId: string, record: AgentTaskRecord): Promise<void> {
|
|
53
|
+
const recordsPath = this.getRecordsPath(projectId)
|
|
54
|
+
|
|
55
|
+
// Ensure directory exists
|
|
56
|
+
await fileHelper.ensureDir(path.dirname(recordsPath))
|
|
57
|
+
|
|
58
|
+
// Append record
|
|
59
|
+
await fileHelper.appendLine(recordsPath, JSON.stringify(record))
|
|
60
|
+
|
|
61
|
+
// Update performance summary
|
|
62
|
+
await this.updatePerformance(projectId, record)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get all task records for a project.
|
|
67
|
+
*/
|
|
68
|
+
async getRecords(projectId: string): Promise<AgentTaskRecord[]> {
|
|
69
|
+
const recordsPath = this.getRecordsPath(projectId)
|
|
70
|
+
|
|
71
|
+
if (!(await fileHelper.fileExists(recordsPath))) {
|
|
72
|
+
return []
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const content = await fileHelper.readFile(recordsPath)
|
|
76
|
+
if (!content.trim()) {
|
|
77
|
+
return []
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return content
|
|
81
|
+
.trim()
|
|
82
|
+
.split('\n')
|
|
83
|
+
.filter((line) => line.trim())
|
|
84
|
+
.map((line) => JSON.parse(line) as AgentTaskRecord)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get all agent performance data.
|
|
89
|
+
*/
|
|
90
|
+
async getAllPerformance(projectId: string): Promise<AgentPerformance[]> {
|
|
91
|
+
const perfPath = this.getPerformancePath(projectId)
|
|
92
|
+
|
|
93
|
+
if (!(await fileHelper.fileExists(perfPath))) {
|
|
94
|
+
return []
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const data = await fileHelper.readJson<{ agents: AgentPerformance[] }>(
|
|
98
|
+
perfPath,
|
|
99
|
+
{ agents: [] }
|
|
100
|
+
)
|
|
101
|
+
return data.agents
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get performance for a specific agent.
|
|
106
|
+
*/
|
|
107
|
+
async getAgentPerformance(
|
|
108
|
+
projectId: string,
|
|
109
|
+
agentName: string
|
|
110
|
+
): Promise<AgentPerformance | null> {
|
|
111
|
+
const all = await this.getAllPerformance(projectId)
|
|
112
|
+
return all.find((a) => a.agentName === agentName) || null
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Update performance summary after a task completion.
|
|
117
|
+
*/
|
|
118
|
+
private async updatePerformance(
|
|
119
|
+
projectId: string,
|
|
120
|
+
record: AgentTaskRecord
|
|
121
|
+
): Promise<void> {
|
|
122
|
+
const perfPath = this.getPerformancePath(projectId)
|
|
123
|
+
await fileHelper.ensureDir(path.dirname(perfPath))
|
|
124
|
+
|
|
125
|
+
const data = await fileHelper.readJson<{ agents: AgentPerformance[] }>(
|
|
126
|
+
perfPath,
|
|
127
|
+
{ agents: [] }
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
// Find or create agent performance
|
|
131
|
+
let agentPerf = data.agents.find((a) => a.agentName === record.agentName)
|
|
132
|
+
|
|
133
|
+
if (!agentPerf) {
|
|
134
|
+
agentPerf = {
|
|
135
|
+
agentName: record.agentName,
|
|
136
|
+
taskType: record.taskType,
|
|
137
|
+
tasksCompleted: 0,
|
|
138
|
+
successRate: 0,
|
|
139
|
+
avgDuration: '0m',
|
|
140
|
+
estimateAccuracy: 0,
|
|
141
|
+
improving: false,
|
|
142
|
+
lastUpdated: new Date().toISOString(),
|
|
143
|
+
bestFor: [],
|
|
144
|
+
avoidFor: [],
|
|
145
|
+
}
|
|
146
|
+
data.agents.push(agentPerf)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Get all records for this agent
|
|
150
|
+
const allRecords = await this.getRecords(projectId)
|
|
151
|
+
const agentRecords = allRecords.filter((r) => r.agentName === record.agentName)
|
|
152
|
+
|
|
153
|
+
// Calculate updated stats
|
|
154
|
+
agentPerf.tasksCompleted = agentRecords.length
|
|
155
|
+
agentPerf.successRate = Math.round(
|
|
156
|
+
(agentRecords.filter((r) => r.success).length / agentRecords.length) * 100
|
|
157
|
+
)
|
|
158
|
+
agentPerf.avgDuration = this.calculateAvgDuration(agentRecords)
|
|
159
|
+
agentPerf.estimateAccuracy = this.calculateEstimateAccuracy(agentRecords)
|
|
160
|
+
agentPerf.lastUpdated = new Date().toISOString()
|
|
161
|
+
|
|
162
|
+
// Calculate best/avoid task types
|
|
163
|
+
const taskTypeStats = this.calculateTaskTypeStats(agentRecords)
|
|
164
|
+
agentPerf.bestFor = taskTypeStats.bestFor
|
|
165
|
+
agentPerf.avoidFor = taskTypeStats.avoidFor
|
|
166
|
+
|
|
167
|
+
// Check if improving (compare last 5 vs previous 5)
|
|
168
|
+
agentPerf.improving = this.checkImproving(agentRecords)
|
|
169
|
+
|
|
170
|
+
await fileHelper.writeJson(perfPath, data)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Calculate average duration from records.
|
|
175
|
+
*/
|
|
176
|
+
private calculateAvgDuration(records: AgentTaskRecord[]): string {
|
|
177
|
+
if (records.length === 0) return '0m'
|
|
178
|
+
|
|
179
|
+
const totalMinutes = records.reduce((sum, r) => {
|
|
180
|
+
return sum + this.parseDuration(r.actualDuration)
|
|
181
|
+
}, 0)
|
|
182
|
+
|
|
183
|
+
const avgMinutes = Math.round(totalMinutes / records.length)
|
|
184
|
+
|
|
185
|
+
if (avgMinutes >= 60) {
|
|
186
|
+
const hours = Math.floor(avgMinutes / 60)
|
|
187
|
+
const mins = avgMinutes % 60
|
|
188
|
+
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`
|
|
189
|
+
}
|
|
190
|
+
return `${avgMinutes}m`
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Calculate estimate accuracy from records.
|
|
195
|
+
*/
|
|
196
|
+
private calculateEstimateAccuracy(records: AgentTaskRecord[]): number {
|
|
197
|
+
if (records.length === 0) return 0
|
|
198
|
+
|
|
199
|
+
const accurateCount = records.filter((r) => {
|
|
200
|
+
const estimated = this.parseDuration(r.estimatedDuration)
|
|
201
|
+
const actual = this.parseDuration(r.actualDuration)
|
|
202
|
+
if (estimated === 0) return false
|
|
203
|
+
return Math.abs(actual - estimated) / estimated <= 0.2
|
|
204
|
+
}).length
|
|
205
|
+
|
|
206
|
+
return Math.round((accurateCount / records.length) * 100)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Calculate best and avoid task types for an agent.
|
|
211
|
+
*/
|
|
212
|
+
private calculateTaskTypeStats(records: AgentTaskRecord[]): {
|
|
213
|
+
bestFor: TaskType[]
|
|
214
|
+
avoidFor: TaskType[]
|
|
215
|
+
} {
|
|
216
|
+
const byType = new Map<TaskType, { success: number; total: number }>()
|
|
217
|
+
|
|
218
|
+
for (const record of records) {
|
|
219
|
+
const stats = byType.get(record.taskType) || { success: 0, total: 0 }
|
|
220
|
+
stats.total++
|
|
221
|
+
if (record.success) stats.success++
|
|
222
|
+
byType.set(record.taskType, stats)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const bestFor: TaskType[] = []
|
|
226
|
+
const avoidFor: TaskType[] = []
|
|
227
|
+
|
|
228
|
+
for (const [taskType, stats] of byType) {
|
|
229
|
+
if (stats.total < 2) continue // Need at least 2 tasks
|
|
230
|
+
|
|
231
|
+
const successRate = stats.success / stats.total
|
|
232
|
+
|
|
233
|
+
if (successRate >= 0.8) {
|
|
234
|
+
bestFor.push(taskType)
|
|
235
|
+
} else if (successRate < 0.5) {
|
|
236
|
+
avoidFor.push(taskType)
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return { bestFor, avoidFor }
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Check if agent performance is improving.
|
|
245
|
+
*/
|
|
246
|
+
private checkImproving(records: AgentTaskRecord[]): boolean {
|
|
247
|
+
if (records.length < 10) return false
|
|
248
|
+
|
|
249
|
+
const recent = records.slice(-5)
|
|
250
|
+
const previous = records.slice(-10, -5)
|
|
251
|
+
|
|
252
|
+
const recentSuccess = recent.filter((r) => r.success).length / 5
|
|
253
|
+
const previousSuccess = previous.filter((r) => r.success).length / 5
|
|
254
|
+
|
|
255
|
+
return recentSuccess > previousSuccess
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Parse duration string to minutes.
|
|
260
|
+
*/
|
|
261
|
+
private parseDuration(duration: string): number {
|
|
262
|
+
let minutes = 0
|
|
263
|
+
|
|
264
|
+
const hourMatch = duration.match(/(\d+)h/)
|
|
265
|
+
if (hourMatch) {
|
|
266
|
+
minutes += parseInt(hourMatch[1], 10) * 60
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const minMatch = duration.match(/(\d+)m/)
|
|
270
|
+
if (minMatch) {
|
|
271
|
+
minutes += parseInt(minMatch[1], 10)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return minutes
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Suggest the best agent for a task type.
|
|
279
|
+
*/
|
|
280
|
+
async suggestAgent(
|
|
281
|
+
projectId: string,
|
|
282
|
+
taskType: TaskType
|
|
283
|
+
): Promise<AgentSuggestion | null> {
|
|
284
|
+
const allPerf = await this.getAllPerformance(projectId)
|
|
285
|
+
|
|
286
|
+
if (allPerf.length === 0) {
|
|
287
|
+
return null
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Find agents good at this task type
|
|
291
|
+
const suitable = allPerf.filter(
|
|
292
|
+
(a) => a.bestFor.includes(taskType) && !a.avoidFor.includes(taskType)
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
if (suitable.length > 0) {
|
|
296
|
+
// Sort by success rate
|
|
297
|
+
suitable.sort((a, b) => b.successRate - a.successRate)
|
|
298
|
+
const best = suitable[0]
|
|
299
|
+
|
|
300
|
+
return {
|
|
301
|
+
agentName: best.agentName,
|
|
302
|
+
confidence: best.successRate / 100,
|
|
303
|
+
reason: `Best success rate (${best.successRate}%) for ${taskType} tasks`,
|
|
304
|
+
alternatives: suitable.slice(1, 3).map((a) => a.agentName),
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Fallback to most experienced agent
|
|
309
|
+
const byExperience = [...allPerf].sort(
|
|
310
|
+
(a, b) => b.tasksCompleted - a.tasksCompleted
|
|
311
|
+
)
|
|
312
|
+
const fallback = byExperience[0]
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
agentName: fallback.agentName,
|
|
316
|
+
confidence: 0.5,
|
|
317
|
+
reason: `Most experienced agent (${fallback.tasksCompleted} tasks)`,
|
|
318
|
+
alternatives: byExperience.slice(1, 3).map((a) => a.agentName),
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Get performance summary for a project.
|
|
324
|
+
*/
|
|
325
|
+
async getSummary(projectId: string): Promise<AgentPerformanceSummary> {
|
|
326
|
+
const allPerf = await this.getAllPerformance(projectId)
|
|
327
|
+
|
|
328
|
+
if (allPerf.length === 0) {
|
|
329
|
+
return {
|
|
330
|
+
totalAgents: 0,
|
|
331
|
+
topPerformer: null,
|
|
332
|
+
mostUsed: null,
|
|
333
|
+
avgSuccessRate: 0,
|
|
334
|
+
byTaskType: {} as Record<TaskType, string | null>,
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Find top performer
|
|
339
|
+
const bySuccess = [...allPerf].sort((a, b) => b.successRate - a.successRate)
|
|
340
|
+
const topPerformer = bySuccess[0].agentName
|
|
341
|
+
|
|
342
|
+
// Find most used
|
|
343
|
+
const byTasks = [...allPerf].sort((a, b) => b.tasksCompleted - a.tasksCompleted)
|
|
344
|
+
const mostUsed = byTasks[0].agentName
|
|
345
|
+
|
|
346
|
+
// Average success rate
|
|
347
|
+
const avgSuccessRate = Math.round(
|
|
348
|
+
allPerf.reduce((sum, a) => sum + a.successRate, 0) / allPerf.length
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
// Best agent by task type
|
|
352
|
+
const taskTypes: TaskType[] = [
|
|
353
|
+
'frontend',
|
|
354
|
+
'backend',
|
|
355
|
+
'devops',
|
|
356
|
+
'database',
|
|
357
|
+
'testing',
|
|
358
|
+
'documentation',
|
|
359
|
+
'refactoring',
|
|
360
|
+
'bugfix',
|
|
361
|
+
'feature',
|
|
362
|
+
'design',
|
|
363
|
+
'other',
|
|
364
|
+
]
|
|
365
|
+
const byTaskType: Record<TaskType, string | null> = {} as Record<
|
|
366
|
+
TaskType,
|
|
367
|
+
string | null
|
|
368
|
+
>
|
|
369
|
+
|
|
370
|
+
for (const taskType of taskTypes) {
|
|
371
|
+
const best = allPerf.find((a) => a.bestFor.includes(taskType))
|
|
372
|
+
byTaskType[taskType] = best?.agentName || null
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return {
|
|
376
|
+
totalAgents: allPerf.length,
|
|
377
|
+
topPerformer,
|
|
378
|
+
mostUsed,
|
|
379
|
+
avgSuccessRate,
|
|
380
|
+
byTaskType,
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Generate markdown report of agent performance.
|
|
386
|
+
*/
|
|
387
|
+
async generateReport(projectId: string): Promise<string> {
|
|
388
|
+
const allPerf = await this.getAllPerformance(projectId)
|
|
389
|
+
const summary = await this.getSummary(projectId)
|
|
390
|
+
|
|
391
|
+
const lines: string[] = []
|
|
392
|
+
|
|
393
|
+
lines.push('# Agent Performance Report')
|
|
394
|
+
lines.push('')
|
|
395
|
+
lines.push(`Generated: ${new Date().toISOString()}`)
|
|
396
|
+
lines.push('')
|
|
397
|
+
|
|
398
|
+
lines.push('## Summary')
|
|
399
|
+
lines.push('')
|
|
400
|
+
lines.push(`- **Total Agents**: ${summary.totalAgents}`)
|
|
401
|
+
lines.push(`- **Top Performer**: ${summary.topPerformer || 'N/A'}`)
|
|
402
|
+
lines.push(`- **Most Used**: ${summary.mostUsed || 'N/A'}`)
|
|
403
|
+
lines.push(`- **Avg Success Rate**: ${summary.avgSuccessRate}%`)
|
|
404
|
+
lines.push('')
|
|
405
|
+
|
|
406
|
+
if (allPerf.length > 0) {
|
|
407
|
+
lines.push('## Agent Details')
|
|
408
|
+
lines.push('')
|
|
409
|
+
|
|
410
|
+
for (const agent of allPerf) {
|
|
411
|
+
lines.push(`### ${agent.agentName}`)
|
|
412
|
+
lines.push('')
|
|
413
|
+
lines.push(`- **Tasks Completed**: ${agent.tasksCompleted}`)
|
|
414
|
+
lines.push(`- **Success Rate**: ${agent.successRate}%`)
|
|
415
|
+
lines.push(`- **Avg Duration**: ${agent.avgDuration}`)
|
|
416
|
+
lines.push(`- **Estimate Accuracy**: ${agent.estimateAccuracy}%`)
|
|
417
|
+
lines.push(`- **Improving**: ${agent.improving ? 'Yes' : 'No'}`)
|
|
418
|
+
|
|
419
|
+
if (agent.bestFor.length > 0) {
|
|
420
|
+
lines.push(`- **Best For**: ${agent.bestFor.join(', ')}`)
|
|
421
|
+
}
|
|
422
|
+
if (agent.avoidFor.length > 0) {
|
|
423
|
+
lines.push(`- **Avoid For**: ${agent.avoidFor.join(', ')}`)
|
|
424
|
+
}
|
|
425
|
+
lines.push('')
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
lines.push('## Task Type Routing')
|
|
430
|
+
lines.push('')
|
|
431
|
+
lines.push('| Task Type | Recommended Agent |')
|
|
432
|
+
lines.push('|-----------|-------------------|')
|
|
433
|
+
|
|
434
|
+
for (const [taskType, agent] of Object.entries(summary.byTaskType)) {
|
|
435
|
+
lines.push(`| ${taskType} | ${agent || 'No data'} |`)
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
return lines.join('\n')
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Singleton instance
|
|
443
|
+
const agentPerformanceTracker = new AgentPerformanceTracker()
|
|
444
|
+
export default agentPerformanceTracker
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Types
|
|
3
|
+
*
|
|
4
|
+
* Types for agent performance tracking and management.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Task type categories for agent routing.
|
|
9
|
+
*/
|
|
10
|
+
export type TaskType =
|
|
11
|
+
| 'frontend'
|
|
12
|
+
| 'backend'
|
|
13
|
+
| 'devops'
|
|
14
|
+
| 'database'
|
|
15
|
+
| 'testing'
|
|
16
|
+
| 'documentation'
|
|
17
|
+
| 'refactoring'
|
|
18
|
+
| 'bugfix'
|
|
19
|
+
| 'feature'
|
|
20
|
+
| 'design'
|
|
21
|
+
| 'other'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Agent performance record.
|
|
25
|
+
*
|
|
26
|
+
* @property agentName - Name of the agent
|
|
27
|
+
* @property taskType - Type of tasks this agent handles
|
|
28
|
+
* @property tasksCompleted - Total tasks completed
|
|
29
|
+
*/
|
|
30
|
+
export interface AgentPerformance {
|
|
31
|
+
/** Agent name (e.g., "fe", "be", "devops") */
|
|
32
|
+
agentName: string
|
|
33
|
+
|
|
34
|
+
/** Primary task type this agent handles */
|
|
35
|
+
taskType: TaskType
|
|
36
|
+
|
|
37
|
+
/** Total tasks completed by this agent */
|
|
38
|
+
tasksCompleted: number
|
|
39
|
+
|
|
40
|
+
/** Success rate (0-100) */
|
|
41
|
+
successRate: number
|
|
42
|
+
|
|
43
|
+
/** Average task duration */
|
|
44
|
+
avgDuration: string
|
|
45
|
+
|
|
46
|
+
/** Estimate accuracy (0-100) */
|
|
47
|
+
estimateAccuracy: number
|
|
48
|
+
|
|
49
|
+
/** Whether performance is improving */
|
|
50
|
+
improving: boolean
|
|
51
|
+
|
|
52
|
+
/** When this record was last updated */
|
|
53
|
+
lastUpdated: string
|
|
54
|
+
|
|
55
|
+
/** Task types this agent excels at */
|
|
56
|
+
bestFor: TaskType[]
|
|
57
|
+
|
|
58
|
+
/** Task types to avoid for this agent */
|
|
59
|
+
avoidFor: TaskType[]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Task completion record for agent performance tracking.
|
|
64
|
+
*/
|
|
65
|
+
export interface AgentTaskRecord {
|
|
66
|
+
/** Agent that completed the task */
|
|
67
|
+
agentName: string
|
|
68
|
+
|
|
69
|
+
/** Type of task */
|
|
70
|
+
taskType: TaskType
|
|
71
|
+
|
|
72
|
+
/** Whether task was completed successfully */
|
|
73
|
+
success: boolean
|
|
74
|
+
|
|
75
|
+
/** Estimated duration */
|
|
76
|
+
estimatedDuration: string
|
|
77
|
+
|
|
78
|
+
/** Actual duration */
|
|
79
|
+
actualDuration: string
|
|
80
|
+
|
|
81
|
+
/** Quality score (1-5) */
|
|
82
|
+
qualityScore: 1 | 2 | 3 | 4 | 5
|
|
83
|
+
|
|
84
|
+
/** When task was completed */
|
|
85
|
+
completedAt: string
|
|
86
|
+
|
|
87
|
+
/** Optional notes about performance */
|
|
88
|
+
notes?: string
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Agent routing suggestion.
|
|
93
|
+
*/
|
|
94
|
+
export interface AgentSuggestion {
|
|
95
|
+
/** Recommended agent */
|
|
96
|
+
agentName: string
|
|
97
|
+
|
|
98
|
+
/** Confidence in this suggestion (0-1) */
|
|
99
|
+
confidence: number
|
|
100
|
+
|
|
101
|
+
/** Reason for this suggestion */
|
|
102
|
+
reason: string
|
|
103
|
+
|
|
104
|
+
/** Alternative agents */
|
|
105
|
+
alternatives?: string[]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Agent performance summary for a project.
|
|
110
|
+
*/
|
|
111
|
+
export interface AgentPerformanceSummary {
|
|
112
|
+
/** Total agents tracked */
|
|
113
|
+
totalAgents: number
|
|
114
|
+
|
|
115
|
+
/** Best performing agent */
|
|
116
|
+
topPerformer: string | null
|
|
117
|
+
|
|
118
|
+
/** Agent with most tasks */
|
|
119
|
+
mostUsed: string | null
|
|
120
|
+
|
|
121
|
+
/** Average success rate across all agents */
|
|
122
|
+
avgSuccessRate: number
|
|
123
|
+
|
|
124
|
+
/** Performance by task type */
|
|
125
|
+
byTaskType: Record<TaskType, string | null>
|
|
126
|
+
}
|