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
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import path from 'path'
|
|
2
|
+
import * as dateHelper from './date-helper'
|
|
3
|
+
import * as jsonlHelper from './jsonl-helper'
|
|
4
|
+
import * as fileHelper from './file-helper'
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Session Helper - High-level session operations
|
|
@@ -11,19 +11,37 @@ const fileHelper = require('./file-helper')
|
|
|
11
11
|
* - jsonl-helper (JSONL parsing)
|
|
12
12
|
* - file-helper (file operations)
|
|
13
13
|
* - path-manager (path construction)
|
|
14
|
-
*
|
|
15
|
-
* @module session-helper
|
|
16
14
|
*/
|
|
17
15
|
|
|
16
|
+
interface SessionEntry {
|
|
17
|
+
ts?: string
|
|
18
|
+
timestamp?: string
|
|
19
|
+
type?: string
|
|
20
|
+
[key: string]: unknown
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface SessionStats {
|
|
24
|
+
totalEntries: number
|
|
25
|
+
byType: Record<string, number>
|
|
26
|
+
byDate: Record<string, number>
|
|
27
|
+
activeDays: number
|
|
28
|
+
averagePerDay: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface ArchiveResult {
|
|
32
|
+
archived: number
|
|
33
|
+
files: string[]
|
|
34
|
+
errors: Array<{ filename: string; error: string }>
|
|
35
|
+
}
|
|
36
|
+
|
|
18
37
|
/**
|
|
19
38
|
* Build session file path for today
|
|
20
|
-
*
|
|
21
|
-
* @param {string} projectGlobalPath - Global project path
|
|
22
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
23
|
-
* @param {string} filename - Filename (e.g., '2025-10-04.jsonl')
|
|
24
|
-
* @returns {string} - Full path to session file
|
|
25
39
|
*/
|
|
26
|
-
function getTodaySessionFilePath(
|
|
40
|
+
export function getTodaySessionFilePath(
|
|
41
|
+
projectGlobalPath: string,
|
|
42
|
+
layer: string,
|
|
43
|
+
filename: string | null = null
|
|
44
|
+
): string {
|
|
27
45
|
const today = dateHelper.getTodayKey()
|
|
28
46
|
const yearMonth = dateHelper.formatMonth(new Date())
|
|
29
47
|
const [year, month] = yearMonth.split('-')
|
|
@@ -39,12 +57,11 @@ function getTodaySessionFilePath(projectGlobalPath, layer, filename = null) {
|
|
|
39
57
|
|
|
40
58
|
/**
|
|
41
59
|
* Ensure today's session directory exists
|
|
42
|
-
*
|
|
43
|
-
* @param {string} projectGlobalPath - Global project path
|
|
44
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
45
|
-
* @returns {Promise<string>} - Path to session directory
|
|
46
60
|
*/
|
|
47
|
-
async function ensureTodaySessionDir(
|
|
61
|
+
export async function ensureTodaySessionDir(
|
|
62
|
+
projectGlobalPath: string,
|
|
63
|
+
layer: string
|
|
64
|
+
): Promise<string> {
|
|
48
65
|
const yearMonth = dateHelper.formatMonth(new Date())
|
|
49
66
|
const [year, month] = yearMonth.split('-')
|
|
50
67
|
|
|
@@ -56,14 +73,13 @@ async function ensureTodaySessionDir(projectGlobalPath, layer) {
|
|
|
56
73
|
|
|
57
74
|
/**
|
|
58
75
|
* Write log entry to today's session
|
|
59
|
-
*
|
|
60
|
-
* @param {string} projectGlobalPath - Global project path
|
|
61
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
62
|
-
* @param {Object} entry - Log entry to write
|
|
63
|
-
* @param {string} filename - Optional custom filename (defaults to YYYY-MM-DD.jsonl)
|
|
64
|
-
* @returns {Promise<void>}
|
|
65
76
|
*/
|
|
66
|
-
async function writeToSession(
|
|
77
|
+
export async function writeToSession(
|
|
78
|
+
projectGlobalPath: string,
|
|
79
|
+
layer: string,
|
|
80
|
+
entry: SessionEntry,
|
|
81
|
+
filename: string | null = null
|
|
82
|
+
): Promise<void> {
|
|
67
83
|
await ensureTodaySessionDir(projectGlobalPath, layer)
|
|
68
84
|
|
|
69
85
|
const filePath = getTodaySessionFilePath(projectGlobalPath, layer, filename)
|
|
@@ -78,31 +94,29 @@ async function writeToSession(projectGlobalPath, layer, entry, filename = null)
|
|
|
78
94
|
|
|
79
95
|
/**
|
|
80
96
|
* Read today's session logs
|
|
81
|
-
*
|
|
82
|
-
* @param {string} projectGlobalPath - Global project path
|
|
83
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
84
|
-
* @param {string} filename - Optional custom filename
|
|
85
|
-
* @returns {Promise<Array<Object>>} - Array of log entries
|
|
86
97
|
*/
|
|
87
|
-
async function readTodaySession
|
|
98
|
+
export async function readTodaySession<T = SessionEntry>(
|
|
99
|
+
projectGlobalPath: string,
|
|
100
|
+
layer: string,
|
|
101
|
+
filename: string | null = null
|
|
102
|
+
): Promise<T[]> {
|
|
88
103
|
const filePath = getTodaySessionFilePath(projectGlobalPath, layer, filename)
|
|
89
|
-
return await jsonlHelper.readJsonLines(filePath)
|
|
104
|
+
return await jsonlHelper.readJsonLines<T>(filePath)
|
|
90
105
|
}
|
|
91
106
|
|
|
92
107
|
/**
|
|
93
108
|
* Read session logs for a date range
|
|
94
|
-
*
|
|
95
|
-
* @param {string} projectGlobalPath - Global project path
|
|
96
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
97
|
-
* @param {number} daysBack - Number of days to look back
|
|
98
|
-
* @returns {Promise<Array<Object>>} - Array of all log entries
|
|
99
109
|
*/
|
|
100
|
-
async function readRecentSessions
|
|
110
|
+
export async function readRecentSessions<T = SessionEntry>(
|
|
111
|
+
projectGlobalPath: string,
|
|
112
|
+
layer: string,
|
|
113
|
+
daysBack = 7
|
|
114
|
+
): Promise<T[]> {
|
|
101
115
|
const fromDate = dateHelper.getDaysAgo(daysBack)
|
|
102
116
|
const toDate = new Date()
|
|
103
117
|
|
|
104
118
|
const dates = dateHelper.getDateRange(fromDate, toDate)
|
|
105
|
-
const allEntries = []
|
|
119
|
+
const allEntries: T[] = []
|
|
106
120
|
|
|
107
121
|
for (const date of dates) {
|
|
108
122
|
const yearMonth = dateHelper.formatMonth(date)
|
|
@@ -118,7 +132,7 @@ async function readRecentSessions(projectGlobalPath, layer, daysBack = 7) {
|
|
|
118
132
|
`${dateKey}.jsonl`
|
|
119
133
|
)
|
|
120
134
|
|
|
121
|
-
const entries = await jsonlHelper.readJsonLines(filePath)
|
|
135
|
+
const entries = await jsonlHelper.readJsonLines<T>(filePath)
|
|
122
136
|
allEntries.push(...entries)
|
|
123
137
|
}
|
|
124
138
|
|
|
@@ -127,24 +141,23 @@ async function readRecentSessions(projectGlobalPath, layer, daysBack = 7) {
|
|
|
127
141
|
|
|
128
142
|
/**
|
|
129
143
|
* Get session statistics for a layer
|
|
130
|
-
*
|
|
131
|
-
* @param {string} projectGlobalPath - Global project path
|
|
132
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
133
|
-
* @param {number} daysBack - Number of days to analyze
|
|
134
|
-
* @returns {Promise<Object>} - Statistics object
|
|
135
144
|
*/
|
|
136
|
-
async function getSessionStats(
|
|
137
|
-
|
|
145
|
+
export async function getSessionStats(
|
|
146
|
+
projectGlobalPath: string,
|
|
147
|
+
layer: string,
|
|
148
|
+
daysBack = 30
|
|
149
|
+
): Promise<SessionStats> {
|
|
150
|
+
const entries = await readRecentSessions<SessionEntry>(projectGlobalPath, layer, daysBack)
|
|
138
151
|
|
|
139
152
|
// Group by type
|
|
140
|
-
const byType = {}
|
|
153
|
+
const byType: Record<string, number> = {}
|
|
141
154
|
for (const entry of entries) {
|
|
142
155
|
const type = entry.type || 'unknown'
|
|
143
156
|
byType[type] = (byType[type] || 0) + 1
|
|
144
157
|
}
|
|
145
158
|
|
|
146
159
|
// Group by date
|
|
147
|
-
const byDate = {}
|
|
160
|
+
const byDate: Record<string, number> = {}
|
|
148
161
|
for (const entry of entries) {
|
|
149
162
|
const timestamp = entry.ts || entry.timestamp
|
|
150
163
|
if (timestamp) {
|
|
@@ -164,13 +177,12 @@ async function getSessionStats(projectGlobalPath, layer, daysBack = 30) {
|
|
|
164
177
|
|
|
165
178
|
/**
|
|
166
179
|
* Archive old session data (move sessions older than N days)
|
|
167
|
-
*
|
|
168
|
-
* @param {string} projectGlobalPath - Global project path
|
|
169
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
170
|
-
* @param {number} daysToKeep - Keep sessions newer than this (default: 30)
|
|
171
|
-
* @returns {Promise<Object>} - Archive result
|
|
172
180
|
*/
|
|
173
|
-
async function archiveOldSessions(
|
|
181
|
+
export async function archiveOldSessions(
|
|
182
|
+
projectGlobalPath: string,
|
|
183
|
+
layer: string,
|
|
184
|
+
daysToKeep = 30
|
|
185
|
+
): Promise<ArchiveResult> {
|
|
174
186
|
const cutoffDate = dateHelper.getDaysAgo(daysToKeep)
|
|
175
187
|
const archiveDir = path.join(projectGlobalPath, layer, 'archive')
|
|
176
188
|
await fileHelper.ensureDir(archiveDir)
|
|
@@ -178,8 +190,8 @@ async function archiveOldSessions(projectGlobalPath, layer, daysToKeep = 30) {
|
|
|
178
190
|
const sessionsDir = path.join(projectGlobalPath, layer, 'sessions')
|
|
179
191
|
|
|
180
192
|
// Find all session files older than cutoff
|
|
181
|
-
const archived = []
|
|
182
|
-
const errors = []
|
|
193
|
+
const archived: string[] = []
|
|
194
|
+
const errors: Array<{ filename: string; error: string }> = []
|
|
183
195
|
|
|
184
196
|
try {
|
|
185
197
|
const years = await fileHelper.listFiles(sessionsDir, { dirsOnly: true })
|
|
@@ -206,13 +218,13 @@ async function archiveOldSessions(projectGlobalPath, layer, daysToKeep = 30) {
|
|
|
206
218
|
await fileHelper.moveFile(sourcePath, destPath)
|
|
207
219
|
archived.push(filename)
|
|
208
220
|
} catch (error) {
|
|
209
|
-
errors.push({ filename, error: error.message })
|
|
221
|
+
errors.push({ filename, error: (error as Error).message })
|
|
210
222
|
}
|
|
211
223
|
}
|
|
212
224
|
}
|
|
213
225
|
}
|
|
214
226
|
}
|
|
215
|
-
} catch
|
|
227
|
+
} catch {
|
|
216
228
|
// Sessions directory might not exist yet
|
|
217
229
|
}
|
|
218
230
|
|
|
@@ -225,12 +237,11 @@ async function archiveOldSessions(projectGlobalPath, layer, daysToKeep = 30) {
|
|
|
225
237
|
|
|
226
238
|
/**
|
|
227
239
|
* Clean empty session directories
|
|
228
|
-
*
|
|
229
|
-
* @param {string} projectGlobalPath - Global project path
|
|
230
|
-
* @param {string} layer - Layer (planning/progress/memory)
|
|
231
|
-
* @returns {Promise<number>} - Number of directories removed
|
|
232
240
|
*/
|
|
233
|
-
async function cleanEmptySessionDirs(
|
|
241
|
+
export async function cleanEmptySessionDirs(
|
|
242
|
+
projectGlobalPath: string,
|
|
243
|
+
layer: string
|
|
244
|
+
): Promise<number> {
|
|
234
245
|
const sessionsDir = path.join(projectGlobalPath, layer, 'sessions')
|
|
235
246
|
let cleaned = 0
|
|
236
247
|
|
|
@@ -258,14 +269,15 @@ async function cleanEmptySessionDirs(projectGlobalPath, layer) {
|
|
|
258
269
|
cleaned++
|
|
259
270
|
}
|
|
260
271
|
}
|
|
261
|
-
} catch
|
|
272
|
+
} catch {
|
|
262
273
|
// Sessions directory might not exist
|
|
263
274
|
}
|
|
264
275
|
|
|
265
276
|
return cleaned
|
|
266
277
|
}
|
|
267
278
|
|
|
268
|
-
|
|
279
|
+
// Default export for CommonJS compatibility
|
|
280
|
+
export default {
|
|
269
281
|
getTodaySessionFilePath,
|
|
270
282
|
ensureTodaySessionDir,
|
|
271
283
|
writeToSession,
|
|
@@ -273,5 +285,6 @@ module.exports = {
|
|
|
273
285
|
readRecentSessions,
|
|
274
286
|
getSessionStats,
|
|
275
287
|
archiveOldSessions,
|
|
276
|
-
cleanEmptySessionDirs
|
|
288
|
+
cleanEmptySessionDirs
|
|
277
289
|
}
|
|
290
|
+
|
|
@@ -1,46 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Version Manager - Single source of truth for application version
|
|
6
6
|
*
|
|
7
7
|
* Reads version from package.json dynamically to ensure consistency
|
|
8
8
|
* across the entire application.
|
|
9
|
-
*
|
|
10
|
-
* @module version
|
|
11
9
|
*/
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
interface PackageJson {
|
|
12
|
+
version: string
|
|
13
|
+
name?: string
|
|
14
|
+
description?: string
|
|
15
|
+
[key: string]: unknown
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let cachedVersion: string | null = null
|
|
19
|
+
let cachedPackageJson: PackageJson | null = null
|
|
15
20
|
|
|
16
21
|
/**
|
|
17
22
|
* Get the current application version from package.json
|
|
18
|
-
*
|
|
19
|
-
* @returns {string} - Semantic version string (e.g., "0.2.1")
|
|
20
23
|
*/
|
|
21
|
-
function getVersion() {
|
|
24
|
+
export function getVersion(): string {
|
|
22
25
|
if (cachedVersion) {
|
|
23
26
|
return cachedVersion
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
try {
|
|
27
30
|
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json')
|
|
28
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))
|
|
31
|
+
const packageJson: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))
|
|
29
32
|
cachedVersion = packageJson.version
|
|
30
33
|
cachedPackageJson = packageJson
|
|
31
34
|
return cachedVersion
|
|
32
35
|
} catch (error) {
|
|
33
|
-
console.error('Failed to read version from package.json:', error.message)
|
|
36
|
+
console.error('Failed to read version from package.json:', (error as Error).message)
|
|
34
37
|
return '0.0.0'
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
/**
|
|
39
42
|
* Get the full package.json object
|
|
40
|
-
*
|
|
41
|
-
* @returns {Object} - Package.json contents
|
|
42
43
|
*/
|
|
43
|
-
function getPackageInfo() {
|
|
44
|
+
export function getPackageInfo(): PackageJson | null {
|
|
44
45
|
if (!cachedPackageJson) {
|
|
45
46
|
getVersion()
|
|
46
47
|
}
|
|
@@ -49,12 +50,9 @@ function getPackageInfo() {
|
|
|
49
50
|
|
|
50
51
|
/**
|
|
51
52
|
* Compare two semantic version strings
|
|
52
|
-
*
|
|
53
|
-
* @param {string} v1 - First version (e.g., "0.2.1")
|
|
54
|
-
* @param {string} v2 - Second version (e.g., "0.2.0")
|
|
55
|
-
* @returns {number} - Returns -1 if v1 < v2, 0 if equal, 1 if v1 > v2
|
|
53
|
+
* @returns -1 if v1 < v2, 0 if equal, 1 if v1 > v2
|
|
56
54
|
*/
|
|
57
|
-
function compareVersions(v1, v2) {
|
|
55
|
+
export function compareVersions(v1: string, v2: string): number {
|
|
58
56
|
const parts1 = v1.split('.').map(Number)
|
|
59
57
|
const parts2 = v2.split('.').map(Number)
|
|
60
58
|
|
|
@@ -71,11 +69,8 @@ function compareVersions(v1, v2) {
|
|
|
71
69
|
|
|
72
70
|
/**
|
|
73
71
|
* Check if a config version is compatible with current version
|
|
74
|
-
*
|
|
75
|
-
* @param {string} configVersion - Version from config file
|
|
76
|
-
* @returns {boolean} - True if compatible
|
|
77
72
|
*/
|
|
78
|
-
function isCompatible(configVersion) {
|
|
73
|
+
export function isCompatible(configVersion: string): boolean {
|
|
79
74
|
const current = getVersion()
|
|
80
75
|
const [currentMajor, currentMinor] = current.split('.').map(Number)
|
|
81
76
|
const [configMajor, configMinor] = configVersion.split('.').map(Number)
|
|
@@ -85,23 +80,20 @@ function isCompatible(configVersion) {
|
|
|
85
80
|
|
|
86
81
|
/**
|
|
87
82
|
* Check if migration is needed based on version comparison
|
|
88
|
-
*
|
|
89
|
-
* @param {string} fromVersion - Current config version
|
|
90
|
-
* @param {string} toVersion - Target version (defaults to current)
|
|
91
|
-
* @returns {boolean} - True if migration needed
|
|
92
83
|
*/
|
|
93
|
-
function needsMigration(fromVersion, toVersion = null) {
|
|
84
|
+
export function needsMigration(fromVersion: string, toVersion: string | null = null): boolean {
|
|
94
85
|
const target = toVersion || getVersion()
|
|
95
86
|
return compareVersions(fromVersion, target) < 0
|
|
96
87
|
}
|
|
97
88
|
|
|
98
|
-
const VERSION = getVersion()
|
|
89
|
+
export const VERSION = getVersion()
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
|
|
91
|
+
// Default export for CommonJS compatibility
|
|
92
|
+
export default {
|
|
102
93
|
getVersion,
|
|
103
94
|
getPackageInfo,
|
|
104
95
|
compareVersions,
|
|
105
96
|
isCompatible,
|
|
106
97
|
needsMigration,
|
|
98
|
+
VERSION
|
|
107
99
|
}
|