prjct-cli 0.11.5 → 0.12.1
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 +190 -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 +600 -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 +58 -8
- 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,29 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TaskAnalyzer - Deep Semantic Task Analysis
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Analyzes tasks semantically, not just keywords
|
|
5
5
|
* Considers project context, history, and relationships
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* @version 1.0.0
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
import fs from 'fs/promises'
|
|
11
|
+
import path from 'path'
|
|
12
|
+
import analyzer from './analyzer'
|
|
13
|
+
import configManager from '../infrastructure/config-manager'
|
|
14
|
+
import pathManager from '../infrastructure/path-manager'
|
|
15
|
+
|
|
16
|
+
interface Task {
|
|
17
|
+
description?: string
|
|
18
|
+
type?: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface HistoryEntry {
|
|
22
|
+
type: string
|
|
23
|
+
domain?: string
|
|
24
|
+
description?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface SemanticAnalysis {
|
|
28
|
+
intent: string | null
|
|
29
|
+
requiresMultipleAgents: boolean
|
|
30
|
+
text: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface HistoricalAnalysis {
|
|
34
|
+
confidence: number
|
|
35
|
+
patterns: Array<{ domain: string; description: string }>
|
|
36
|
+
suggestedDomain?: string | null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface ProjectData {
|
|
40
|
+
packageJson: unknown
|
|
41
|
+
extensions: Record<string, number>
|
|
42
|
+
directories: string[]
|
|
43
|
+
configFiles: string[]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface TaskAnalysisResult {
|
|
47
|
+
primaryDomain: string
|
|
48
|
+
confidence: number
|
|
49
|
+
semantic: SemanticAnalysis
|
|
50
|
+
historical: HistoricalAnalysis
|
|
51
|
+
complexity: string
|
|
52
|
+
projectData: ProjectData
|
|
53
|
+
matchedKeywords: string[]
|
|
54
|
+
reason: string
|
|
55
|
+
alternatives: string[]
|
|
56
|
+
}
|
|
15
57
|
|
|
16
58
|
class TaskAnalyzer {
|
|
17
|
-
|
|
59
|
+
projectPath: string
|
|
60
|
+
projectId: string | null = null
|
|
61
|
+
taskHistory: HistoryEntry[] | null = null
|
|
62
|
+
|
|
63
|
+
constructor(projectPath: string) {
|
|
18
64
|
this.projectPath = projectPath
|
|
19
|
-
this.projectId = null
|
|
20
|
-
this.taskHistory = null
|
|
21
65
|
}
|
|
22
66
|
|
|
23
67
|
/**
|
|
24
68
|
* Initialize analyzer with project context
|
|
25
69
|
*/
|
|
26
|
-
async initialize() {
|
|
70
|
+
async initialize(): Promise<void> {
|
|
27
71
|
this.projectId = await configManager.getProjectId(this.projectPath)
|
|
28
72
|
analyzer.init(this.projectPath)
|
|
29
73
|
await this.loadTaskHistory()
|
|
@@ -34,11 +78,8 @@ class TaskAnalyzer {
|
|
|
34
78
|
*
|
|
35
79
|
* 100% AGENTIC: No hardcoded patterns. Uses task description
|
|
36
80
|
* and historical patterns only. Claude decides domain relevance.
|
|
37
|
-
*
|
|
38
|
-
* @param {Object} task - Task object {description, type}
|
|
39
|
-
* @returns {Promise<Object>} Analysis result
|
|
40
81
|
*/
|
|
41
|
-
async analyzeTask(task) {
|
|
82
|
+
async analyzeTask(task: Task): Promise<TaskAnalysisResult> {
|
|
42
83
|
if (!this.projectId) {
|
|
43
84
|
await this.initialize()
|
|
44
85
|
}
|
|
@@ -48,11 +89,11 @@ class TaskAnalyzer {
|
|
|
48
89
|
const fullText = `${description} ${type}`.trim()
|
|
49
90
|
|
|
50
91
|
// Get raw project data (no categorization)
|
|
51
|
-
const projectData = {
|
|
92
|
+
const projectData: ProjectData = {
|
|
52
93
|
packageJson: await analyzer.readPackageJson(),
|
|
53
94
|
extensions: await analyzer.getFileExtensions(),
|
|
54
95
|
directories: await analyzer.listDirectories(),
|
|
55
|
-
configFiles: await analyzer.listConfigFiles()
|
|
96
|
+
configFiles: await analyzer.listConfigFiles(),
|
|
56
97
|
}
|
|
57
98
|
|
|
58
99
|
// Semantic understanding (intent-based, not keyword-based)
|
|
@@ -77,7 +118,7 @@ class TaskAnalyzer {
|
|
|
77
118
|
projectData, // Raw data for Claude to analyze
|
|
78
119
|
matchedKeywords: [], // No keyword matching - Claude decides
|
|
79
120
|
reason: this.buildReason(primaryDomain, semantic, historical),
|
|
80
|
-
alternatives: ['full-stack', 'generalist']
|
|
121
|
+
alternatives: ['full-stack', 'generalist'],
|
|
81
122
|
}
|
|
82
123
|
}
|
|
83
124
|
|
|
@@ -91,7 +132,7 @@ class TaskAnalyzer {
|
|
|
91
132
|
* This method is kept for backward compatibility but returns empty.
|
|
92
133
|
* Use analyzeTask() which provides raw data for Claude.
|
|
93
134
|
*/
|
|
94
|
-
detectDomains(text) {
|
|
135
|
+
detectDomains(text: string): Record<string, unknown> {
|
|
95
136
|
// No hardcoded patterns - Claude decides domain
|
|
96
137
|
return {}
|
|
97
138
|
}
|
|
@@ -101,7 +142,7 @@ class TaskAnalyzer {
|
|
|
101
142
|
* AGENTIC: Claude uses templates/analysis/intent.md for detailed analysis
|
|
102
143
|
* This returns minimal structure - Claude determines actual intent
|
|
103
144
|
*/
|
|
104
|
-
analyzeSemantics(text) {
|
|
145
|
+
analyzeSemantics(text: string): SemanticAnalysis {
|
|
105
146
|
// AGENTIC: Return structure only, Claude analyzes via template
|
|
106
147
|
return {
|
|
107
148
|
intent: null, // Claude determines via templates/analysis/intent.md
|
|
@@ -113,14 +154,14 @@ class TaskAnalyzer {
|
|
|
113
154
|
/**
|
|
114
155
|
* Analyze historical patterns
|
|
115
156
|
*/
|
|
116
|
-
async analyzeHistory(text) {
|
|
157
|
+
async analyzeHistory(text: string): Promise<HistoricalAnalysis> {
|
|
117
158
|
if (!this.taskHistory) {
|
|
118
159
|
return { confidence: 0, patterns: [] }
|
|
119
160
|
}
|
|
120
161
|
|
|
121
162
|
// Find similar tasks in history
|
|
122
|
-
const similar = this.taskHistory.filter(task => {
|
|
123
|
-
const similarity = this.calculateTextSimilarity(text, task.description)
|
|
163
|
+
const similar = this.taskHistory.filter((task) => {
|
|
164
|
+
const similarity = this.calculateTextSimilarity(text, task.description || '')
|
|
124
165
|
return similarity > 0.5
|
|
125
166
|
})
|
|
126
167
|
|
|
@@ -129,20 +170,19 @@ class TaskAnalyzer {
|
|
|
129
170
|
}
|
|
130
171
|
|
|
131
172
|
// Find most common domain for similar tasks
|
|
132
|
-
const domainCounts = {}
|
|
133
|
-
similar.forEach(task => {
|
|
173
|
+
const domainCounts: Record<string, number> = {}
|
|
174
|
+
similar.forEach((task) => {
|
|
134
175
|
if (task.domain) {
|
|
135
176
|
domainCounts[task.domain] = (domainCounts[task.domain] || 0) + 1
|
|
136
177
|
}
|
|
137
178
|
})
|
|
138
179
|
|
|
139
|
-
const mostCommon = Object.entries(domainCounts)
|
|
140
|
-
.sort((a, b) => b[1] - a[1])[0]
|
|
180
|
+
const mostCommon = Object.entries(domainCounts).sort((a, b) => b[1] - a[1])[0]
|
|
141
181
|
|
|
142
182
|
return {
|
|
143
183
|
confidence: mostCommon ? mostCommon[1] / similar.length : 0,
|
|
144
|
-
patterns: similar.map(t => ({ domain: t.domain, description: t.description })),
|
|
145
|
-
suggestedDomain: mostCommon ? mostCommon[0] : null
|
|
184
|
+
patterns: similar.map((t) => ({ domain: t.domain || '', description: t.description || '' })),
|
|
185
|
+
suggestedDomain: mostCommon ? mostCommon[0] : null,
|
|
146
186
|
}
|
|
147
187
|
}
|
|
148
188
|
|
|
@@ -151,7 +191,7 @@ class TaskAnalyzer {
|
|
|
151
191
|
* AGENTIC: Claude uses templates/analysis/complexity.md for real estimation
|
|
152
192
|
* This returns default - Claude determines actual complexity
|
|
153
193
|
*/
|
|
154
|
-
estimateComplexity(text) {
|
|
194
|
+
estimateComplexity(text: string): string {
|
|
155
195
|
// AGENTIC: Return default, Claude analyzes via templates/analysis/complexity.md
|
|
156
196
|
return 'medium'
|
|
157
197
|
}
|
|
@@ -164,7 +204,7 @@ class TaskAnalyzer {
|
|
|
164
204
|
* - Basic intent detection
|
|
165
205
|
* Claude decides actual domain based on project context.
|
|
166
206
|
*/
|
|
167
|
-
selectPrimaryDomain(semantic, historical) {
|
|
207
|
+
selectPrimaryDomain(semantic: SemanticAnalysis, historical: HistoricalAnalysis): string {
|
|
168
208
|
// Priority: historical > default
|
|
169
209
|
if (historical && historical.suggestedDomain && historical.confidence > 0.7) {
|
|
170
210
|
return historical.suggestedDomain
|
|
@@ -182,7 +222,7 @@ class TaskAnalyzer {
|
|
|
182
222
|
/**
|
|
183
223
|
* Calculate confidence based on available signals
|
|
184
224
|
*/
|
|
185
|
-
calculateConfidence(semantic, historical) {
|
|
225
|
+
calculateConfidence(semantic: SemanticAnalysis, historical: HistoricalAnalysis): number {
|
|
186
226
|
let confidence = 0.5 // Base confidence
|
|
187
227
|
|
|
188
228
|
// Boost from historical patterns
|
|
@@ -201,8 +241,8 @@ class TaskAnalyzer {
|
|
|
201
241
|
/**
|
|
202
242
|
* Build human-readable reason
|
|
203
243
|
*/
|
|
204
|
-
buildReason(primaryDomain, semantic, historical) {
|
|
205
|
-
const parts = []
|
|
244
|
+
buildReason(primaryDomain: string, semantic: SemanticAnalysis, historical: HistoricalAnalysis): string {
|
|
245
|
+
const parts: string[] = []
|
|
206
246
|
|
|
207
247
|
if (historical && historical.suggestedDomain && historical.confidence > 0.7) {
|
|
208
248
|
parts.push(`Historical: similar tasks used ${primaryDomain}`)
|
|
@@ -218,21 +258,21 @@ class TaskAnalyzer {
|
|
|
218
258
|
/**
|
|
219
259
|
* Load task history from memory
|
|
220
260
|
*/
|
|
221
|
-
async loadTaskHistory() {
|
|
261
|
+
async loadTaskHistory(): Promise<void> {
|
|
222
262
|
try {
|
|
223
|
-
const memoryPath = pathManager.getFilePath(this.projectId
|
|
263
|
+
const memoryPath = pathManager.getFilePath(this.projectId!, 'memory', 'context.jsonl')
|
|
224
264
|
const content = await fs.readFile(memoryPath, 'utf-8')
|
|
225
265
|
const lines = content.split('\n').filter(Boolean)
|
|
226
266
|
|
|
227
267
|
this.taskHistory = lines
|
|
228
|
-
.map(line => {
|
|
268
|
+
.map((line) => {
|
|
229
269
|
try {
|
|
230
|
-
return JSON.parse(line)
|
|
270
|
+
return JSON.parse(line) as HistoryEntry
|
|
231
271
|
} catch {
|
|
232
272
|
return null
|
|
233
273
|
}
|
|
234
274
|
})
|
|
235
|
-
.filter(entry => entry && entry.type === 'task_start' && entry.domain)
|
|
275
|
+
.filter((entry): entry is HistoryEntry => entry !== null && entry.type === 'task_start' && !!entry.domain)
|
|
236
276
|
.slice(-100) // Last 100 tasks
|
|
237
277
|
} catch {
|
|
238
278
|
this.taskHistory = []
|
|
@@ -242,16 +282,15 @@ class TaskAnalyzer {
|
|
|
242
282
|
/**
|
|
243
283
|
* Calculate text similarity (simple Jaccard)
|
|
244
284
|
*/
|
|
245
|
-
calculateTextSimilarity(text1, text2) {
|
|
285
|
+
calculateTextSimilarity(text1: string, text2: string): number {
|
|
246
286
|
const words1 = new Set(text1.toLowerCase().split(/\s+/))
|
|
247
287
|
const words2 = new Set(text2.toLowerCase().split(/\s+/))
|
|
248
288
|
|
|
249
|
-
const intersection = new Set([...words1].filter(w => words2.has(w)))
|
|
289
|
+
const intersection = new Set([...words1].filter((w) => words2.has(w)))
|
|
250
290
|
const union = new Set([...words1, ...words2])
|
|
251
291
|
|
|
252
292
|
return intersection.size / union.size
|
|
253
293
|
}
|
|
254
294
|
}
|
|
255
295
|
|
|
256
|
-
|
|
257
|
-
|
|
296
|
+
export default TaskAnalyzer
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Stack Manager - Handles multiple concurrent tasks with pause/resume capability
|
|
3
|
+
* Enables natural workflow with interruptions and context switching
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type {
|
|
7
|
+
TaskEntry,
|
|
8
|
+
ParsedNowFile,
|
|
9
|
+
MigrationResult,
|
|
10
|
+
SwitchResult,
|
|
11
|
+
StackSummary,
|
|
12
|
+
} from './types'
|
|
13
|
+
|
|
14
|
+
export { parseNowFile, formatDuration } from './parser'
|
|
15
|
+
export { ensureStackFile, appendToStack, readStack, writeStack, updateNowFile } from './storage'
|
|
16
|
+
export { TaskStack } from './task-stack'
|
|
17
|
+
|
|
18
|
+
import { TaskStack } from './task-stack'
|
|
19
|
+
export default TaskStack
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Stack Parser
|
|
3
|
+
* Parsing utilities for now.md files
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ParsedNowFile } from './types'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Parse legacy now.md format
|
|
10
|
+
*/
|
|
11
|
+
export function parseNowFile(content: string): ParsedNowFile {
|
|
12
|
+
const result: ParsedNowFile = {
|
|
13
|
+
description: '',
|
|
14
|
+
started: null,
|
|
15
|
+
agent: null,
|
|
16
|
+
complexity: null,
|
|
17
|
+
dev: null,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Check for frontmatter
|
|
21
|
+
if (content.startsWith('---')) {
|
|
22
|
+
const frontmatterEnd = content.indexOf('---', 3)
|
|
23
|
+
if (frontmatterEnd > 0) {
|
|
24
|
+
const frontmatter = content.substring(3, frontmatterEnd)
|
|
25
|
+
const lines = frontmatter.split('\n')
|
|
26
|
+
|
|
27
|
+
for (const line of lines) {
|
|
28
|
+
if (line.includes('task:')) {
|
|
29
|
+
result.description = line.split('task:')[1].trim().replace(/['"]/g, '')
|
|
30
|
+
}
|
|
31
|
+
if (line.includes('started:')) {
|
|
32
|
+
result.started = line.split('started:')[1].trim()
|
|
33
|
+
}
|
|
34
|
+
if (line.includes('agent:')) {
|
|
35
|
+
result.agent = line.split('agent:')[1].trim()
|
|
36
|
+
}
|
|
37
|
+
if (line.includes('complexity:')) {
|
|
38
|
+
result.complexity = line.split('complexity:')[1].trim()
|
|
39
|
+
}
|
|
40
|
+
if (line.includes('dev:')) {
|
|
41
|
+
result.dev = line.split('dev:')[1].trim()
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Get description from content if not in frontmatter
|
|
46
|
+
if (!result.description) {
|
|
47
|
+
const contentBody = content.substring(frontmatterEnd + 3).trim()
|
|
48
|
+
const firstLine = contentBody.split('\n')[0]
|
|
49
|
+
if (firstLine && !firstLine.startsWith('#')) {
|
|
50
|
+
result.description = firstLine.replace(/^[*-]\s*/, '').trim()
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
// No frontmatter, try to extract task from content
|
|
56
|
+
const lines = content.split('\n')
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
if (line.trim() && !line.startsWith('#') && !line.startsWith('---')) {
|
|
59
|
+
result.description = line.replace(/^[*-]\s*/, '').trim()
|
|
60
|
+
break
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Format duration in human-readable format
|
|
70
|
+
*/
|
|
71
|
+
export function formatDuration(ms: number): string {
|
|
72
|
+
const seconds = Math.floor(ms / 1000)
|
|
73
|
+
const minutes = Math.floor(seconds / 60)
|
|
74
|
+
const hours = Math.floor(minutes / 60)
|
|
75
|
+
const days = Math.floor(hours / 24)
|
|
76
|
+
|
|
77
|
+
if (days > 0) {
|
|
78
|
+
return `${days}d ${hours % 24}h`
|
|
79
|
+
} else if (hours > 0) {
|
|
80
|
+
return `${hours}h ${minutes % 60}m`
|
|
81
|
+
} else if (minutes > 0) {
|
|
82
|
+
return `${minutes}m`
|
|
83
|
+
} else {
|
|
84
|
+
return `${seconds}s`
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Stack Storage
|
|
3
|
+
* File operations for task stack
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from 'fs/promises'
|
|
7
|
+
import log from '../../utils/logger'
|
|
8
|
+
import type { TaskEntry } from './types'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Ensure stack file exists
|
|
12
|
+
*/
|
|
13
|
+
export async function ensureStackFile(stackPath: string): Promise<void> {
|
|
14
|
+
try {
|
|
15
|
+
await fs.access(stackPath)
|
|
16
|
+
} catch {
|
|
17
|
+
// Create empty file
|
|
18
|
+
await fs.writeFile(stackPath, '')
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Append entry to stack
|
|
24
|
+
*/
|
|
25
|
+
export async function appendToStack(stackPath: string, entry: TaskEntry): Promise<void> {
|
|
26
|
+
await ensureStackFile(stackPath)
|
|
27
|
+
const line = JSON.stringify(entry) + '\n'
|
|
28
|
+
await fs.appendFile(stackPath, line)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Read all stack entries
|
|
33
|
+
*/
|
|
34
|
+
export async function readStack(stackPath: string): Promise<TaskEntry[]> {
|
|
35
|
+
await ensureStackFile(stackPath)
|
|
36
|
+
const content = await fs.readFile(stackPath, 'utf8')
|
|
37
|
+
|
|
38
|
+
if (!content.trim()) {
|
|
39
|
+
return []
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const entries: TaskEntry[] = []
|
|
43
|
+
const lines = content.split('\n').filter((line) => line.trim())
|
|
44
|
+
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
try {
|
|
47
|
+
entries.push(JSON.parse(line))
|
|
48
|
+
} catch (error) {
|
|
49
|
+
log.error('Error parsing stack line:', (error as Error).message)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return entries
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Write full stack to file
|
|
58
|
+
*/
|
|
59
|
+
export async function writeStack(stackPath: string, stack: TaskEntry[]): Promise<void> {
|
|
60
|
+
const content = stack.map((task) => JSON.stringify(task)).join('\n') + '\n'
|
|
61
|
+
await fs.writeFile(stackPath, content)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Generate now.md content for a task
|
|
66
|
+
*/
|
|
67
|
+
export function generateNowContent(task: TaskEntry | null, customContent: string | null, formatDuration: (ms: number) => string): string {
|
|
68
|
+
if (customContent !== undefined && customContent !== null) {
|
|
69
|
+
return customContent
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!task) {
|
|
73
|
+
return `# Current Task
|
|
74
|
+
|
|
75
|
+
**No active task**
|
|
76
|
+
|
|
77
|
+
Use \`/p:work\` or \`/p:resume\` to start working.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
_Track your focus with \`/p:work [task]\`_
|
|
82
|
+
`
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const started = new Date(task.started)
|
|
86
|
+
const now = new Date()
|
|
87
|
+
const elapsed = formatDuration(now.getTime() - started.getTime() - (task.pausedDuration || 0))
|
|
88
|
+
|
|
89
|
+
return `---
|
|
90
|
+
task: "${task.task}"
|
|
91
|
+
started: ${task.started}
|
|
92
|
+
agent: ${task.agent}
|
|
93
|
+
complexity: ${task.complexity}
|
|
94
|
+
dev: ${task.dev}
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
# Current Task
|
|
98
|
+
|
|
99
|
+
**${task.task}**
|
|
100
|
+
|
|
101
|
+
- Started: ${started.toLocaleTimeString()} (${elapsed} ago)
|
|
102
|
+
- Agent: ${task.agent}
|
|
103
|
+
- Complexity: ${task.complexity}
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
When done: \`/p:done\`
|
|
108
|
+
Need to pause: \`/p:pause\`
|
|
109
|
+
`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Update now.md file
|
|
114
|
+
*/
|
|
115
|
+
export async function updateNowFile(
|
|
116
|
+
nowPath: string,
|
|
117
|
+
task: TaskEntry | null,
|
|
118
|
+
customContent: string | null,
|
|
119
|
+
formatDuration: (ms: number) => string
|
|
120
|
+
): Promise<void> {
|
|
121
|
+
const content = generateNowContent(task, customContent, formatDuration)
|
|
122
|
+
await fs.writeFile(nowPath, content)
|
|
123
|
+
}
|