prjct-cli 0.11.4 → 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 +72 -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 +246 -54
- 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.ts +405 -0
- 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} +99 -89
- 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} +35 -18
- 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} +62 -23
- 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 +203 -403
- 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/BentoGrid/BentoGrid.tsx +18 -0
- 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/EmptyState/EmptyState.tsx +58 -0
- 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/IdeasCard/IdeasCard.tsx +48 -0
- 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/ProgressRing/ProgressRing.tsx +51 -0
- 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/RoadmapCard/RoadmapCard.tsx +77 -0
- package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
- package/packages/web/components/RoadmapCard/index.ts +2 -0
- package/packages/web/components/ShipsCard/ShipsCard.tsx +52 -0
- 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/SparklineChart/SparklineChart.tsx +38 -0
- 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/StreakCard/StreakCard.tsx +53 -0
- 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/components/ui/tooltip.tsx +2 -2
- 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/next-env.d.ts +1 -1
- package/packages/web/package.json +10 -6
- 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 -128
- package/core/agentic/chain-of-thought.js +0 -578
- package/core/agentic/command-executor.js +0 -421
- 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 -850
- package/core/agentic/parallel-tools.js +0 -366
- package/core/agentic/plan-mode.js +0 -572
- package/core/agentic/prompt-builder.js +0 -338
- 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 -799
- 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/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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shipping Commands: ship and related helpers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import path from 'path'
|
|
6
|
+
|
|
7
|
+
import memorySystem from '../agentic/memory-system'
|
|
8
|
+
import type { CommandResult, Context } from './types'
|
|
9
|
+
import {
|
|
10
|
+
PrjctCommandsBase,
|
|
11
|
+
contextBuilder,
|
|
12
|
+
toolRegistry,
|
|
13
|
+
configManager,
|
|
14
|
+
fileHelper,
|
|
15
|
+
dateHelper,
|
|
16
|
+
out
|
|
17
|
+
} from './base'
|
|
18
|
+
|
|
19
|
+
export class ShippingCommands extends PrjctCommandsBase {
|
|
20
|
+
/**
|
|
21
|
+
* /p:ship - Ship feature with complete automated workflow
|
|
22
|
+
*/
|
|
23
|
+
async ship(feature: string | null, projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
24
|
+
try {
|
|
25
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
26
|
+
if (!initResult.success) return initResult
|
|
27
|
+
|
|
28
|
+
let featureName = feature
|
|
29
|
+
if (!featureName) {
|
|
30
|
+
const context = await contextBuilder.build(projectPath) as Context
|
|
31
|
+
const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
|
|
32
|
+
if (nowContent && nowContent.includes('**')) {
|
|
33
|
+
const match = nowContent.match(/\*\*(.+?)\*\*/)
|
|
34
|
+
featureName = match ? match[1] : 'current work'
|
|
35
|
+
} else {
|
|
36
|
+
featureName = 'current work'
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
out.spin(`shipping ${featureName}...`)
|
|
41
|
+
|
|
42
|
+
const lintResult = await this._runLint(projectPath)
|
|
43
|
+
|
|
44
|
+
out.spin('running tests...')
|
|
45
|
+
const testResult = await this._runTests(projectPath)
|
|
46
|
+
|
|
47
|
+
out.spin('updating version...')
|
|
48
|
+
const newVersion = await this._bumpVersion(projectPath)
|
|
49
|
+
await this._updateChangelog(featureName, newVersion, projectPath)
|
|
50
|
+
|
|
51
|
+
out.spin('committing...')
|
|
52
|
+
const commitResult = await this._createShipCommit(featureName, projectPath)
|
|
53
|
+
|
|
54
|
+
if (commitResult.success) {
|
|
55
|
+
out.spin('pushing...')
|
|
56
|
+
await this._gitPush(projectPath)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const context = await contextBuilder.build(projectPath) as Context
|
|
60
|
+
const shippedContent =
|
|
61
|
+
(await toolRegistry.get('Read')!(context.paths.shipped) as string) || '# SHIPPED 🚀\n\n'
|
|
62
|
+
const shippedEntry = `\n## ${featureName}\n\nShipped: ${new Date().toLocaleString()}\nVersion: ${newVersion}\n`
|
|
63
|
+
await toolRegistry.get('Write')!(context.paths.shipped, shippedContent + shippedEntry)
|
|
64
|
+
|
|
65
|
+
await this.logToMemory(projectPath, 'feature_shipped', {
|
|
66
|
+
feature: featureName,
|
|
67
|
+
version: newVersion,
|
|
68
|
+
timestamp: dateHelper.getTimestamp(),
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const config = await configManager.readConfig(projectPath)
|
|
72
|
+
const projectId = config!.projectId
|
|
73
|
+
|
|
74
|
+
await memorySystem.learnDecision(projectId, 'commit_footer', 'prjct', 'ship')
|
|
75
|
+
|
|
76
|
+
if (testResult.success) {
|
|
77
|
+
await memorySystem.recordDecision(projectId, 'test_before_ship', 'true', 'ship')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const isQuickShip = !lintResult.success || !testResult.success
|
|
81
|
+
if (isQuickShip) {
|
|
82
|
+
await memorySystem.recordWorkflow(projectId, 'quick_ship', {
|
|
83
|
+
description: 'Ship without full checks',
|
|
84
|
+
feature_type: featureName.toLowerCase().includes('doc') ? 'docs' : 'other'
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
out.done(`v${newVersion} shipped`)
|
|
89
|
+
|
|
90
|
+
return { success: true, feature: featureName, version: newVersion }
|
|
91
|
+
} catch (error) {
|
|
92
|
+
out.fail((error as Error).message)
|
|
93
|
+
return { success: false, error: (error as Error).message }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Run lint checks
|
|
99
|
+
*/
|
|
100
|
+
async _runLint(_projectPath: string): Promise<{ success: boolean; message: string }> {
|
|
101
|
+
try {
|
|
102
|
+
const result = await toolRegistry.get('Bash')!('npm run lint 2>&1 || true') as { stdout: string; stderr: string }
|
|
103
|
+
return { success: !result.stderr.includes('error'), message: 'passed' }
|
|
104
|
+
} catch {
|
|
105
|
+
return { success: false, message: 'no lint script (skipped)' }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Run tests
|
|
111
|
+
*/
|
|
112
|
+
async _runTests(_projectPath: string): Promise<{ success: boolean; message: string }> {
|
|
113
|
+
try {
|
|
114
|
+
const result = await toolRegistry.get('Bash')!(
|
|
115
|
+
'npm test -- --passWithNoTests 2>&1 || true'
|
|
116
|
+
) as { stdout: string; stderr: string }
|
|
117
|
+
return { success: !result.stderr.includes('FAIL'), message: 'passed' }
|
|
118
|
+
} catch {
|
|
119
|
+
return { success: false, message: 'no test script (skipped)' }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Bump version
|
|
125
|
+
*/
|
|
126
|
+
async _bumpVersion(projectPath: string): Promise<string> {
|
|
127
|
+
try {
|
|
128
|
+
const pkgPath = path.join(projectPath, 'package.json')
|
|
129
|
+
const pkg = await fileHelper.readJson<{ version?: string }>(pkgPath, { version: '0.0.0' })
|
|
130
|
+
const oldVersion = pkg?.version || '0.0.0'
|
|
131
|
+
const [major, minor, patch] = oldVersion.split('.').map(Number)
|
|
132
|
+
const newVersion = `${major}.${minor}.${patch + 1}`
|
|
133
|
+
if (pkg) {
|
|
134
|
+
pkg.version = newVersion
|
|
135
|
+
await fileHelper.writeJson(pkgPath, pkg)
|
|
136
|
+
}
|
|
137
|
+
return newVersion
|
|
138
|
+
} catch {
|
|
139
|
+
return '0.0.1'
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Update CHANGELOG
|
|
145
|
+
*/
|
|
146
|
+
async _updateChangelog(feature: string, version: string, projectPath: string): Promise<void> {
|
|
147
|
+
try {
|
|
148
|
+
const changelogPath = path.join(projectPath, 'CHANGELOG.md')
|
|
149
|
+
const changelog = await fileHelper.readFile(changelogPath, '# Changelog\n\n')
|
|
150
|
+
|
|
151
|
+
const entry = `## [${version}] - ${dateHelper.formatDate(new Date())}\n\n### Added\n- ${feature}\n\n`
|
|
152
|
+
const updated = changelog.replace('# Changelog\n\n', `# Changelog\n\n${entry}`)
|
|
153
|
+
|
|
154
|
+
await fileHelper.writeFile(changelogPath, updated)
|
|
155
|
+
} catch {
|
|
156
|
+
console.error(' Warning: Could not update CHANGELOG')
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Create git commit for ship
|
|
162
|
+
*/
|
|
163
|
+
async _createShipCommit(feature: string, _projectPath: string): Promise<{ success: boolean; message: string }> {
|
|
164
|
+
try {
|
|
165
|
+
await toolRegistry.get('Bash')!('git add .')
|
|
166
|
+
|
|
167
|
+
const commitMsg = `feat: ${feature}\n\n🤖 Generated with [p/](https://www.prjct.app/)\nDesigned for [Claude](https://www.anthropic.com/claude)`
|
|
168
|
+
|
|
169
|
+
await toolRegistry.get('Bash')!(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`)
|
|
170
|
+
|
|
171
|
+
return { success: true, message: 'Committed' }
|
|
172
|
+
} catch {
|
|
173
|
+
return { success: false, message: 'No changes to commit' }
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Push to remote
|
|
179
|
+
*/
|
|
180
|
+
async _gitPush(_projectPath: string): Promise<{ success: boolean; message: string }> {
|
|
181
|
+
try {
|
|
182
|
+
await toolRegistry.get('Bash')!('git push')
|
|
183
|
+
return { success: true, message: 'Pushed to remote' }
|
|
184
|
+
} catch {
|
|
185
|
+
return { success: false, message: 'Push failed (no remote or auth issue)' }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Commands module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports common types from core/types and defines command-specific types.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Re-export commonly used types from core/types
|
|
8
|
+
export type {
|
|
9
|
+
ContextPaths as Paths,
|
|
10
|
+
ProjectContext as Context,
|
|
11
|
+
CommandParams,
|
|
12
|
+
CommandResult as BaseCommandResult,
|
|
13
|
+
} from '../types'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Command execution result with optional extra data.
|
|
17
|
+
* Extends BaseCommandResult with command-specific fields.
|
|
18
|
+
*/
|
|
19
|
+
export interface CommandResult {
|
|
20
|
+
success: boolean
|
|
21
|
+
message?: string
|
|
22
|
+
error?: string
|
|
23
|
+
/** Duration of command execution */
|
|
24
|
+
duration?: string
|
|
25
|
+
/** Task that was affected */
|
|
26
|
+
task?: string
|
|
27
|
+
/** Feature that was affected */
|
|
28
|
+
feature?: string
|
|
29
|
+
/** Files that were modified */
|
|
30
|
+
filesModified?: string[]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Agent types
|
|
34
|
+
export interface AgentInfo {
|
|
35
|
+
isSupported: boolean
|
|
36
|
+
type: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface Author {
|
|
40
|
+
name: string | null
|
|
41
|
+
email: string | null
|
|
42
|
+
github?: string | null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface AgentAssignmentResult {
|
|
46
|
+
agent: { name: string; domain?: string } | null
|
|
47
|
+
routing: {
|
|
48
|
+
confidence: number
|
|
49
|
+
reason: string
|
|
50
|
+
availableAgents?: string[]
|
|
51
|
+
}
|
|
52
|
+
_agenticNote?: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Analysis types
|
|
56
|
+
export interface ComplexityResult {
|
|
57
|
+
level: 'low' | 'medium' | 'high'
|
|
58
|
+
hours: number
|
|
59
|
+
type: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface HealthResult {
|
|
63
|
+
score: number
|
|
64
|
+
message: string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Options for the design command.
|
|
69
|
+
*/
|
|
70
|
+
export interface DesignOptions {
|
|
71
|
+
/** Type of design (e.g., 'system', 'component', 'api') */
|
|
72
|
+
type?: 'system' | 'component' | 'api' | 'database'
|
|
73
|
+
/** Output format */
|
|
74
|
+
format?: 'markdown' | 'mermaid'
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Options for the cleanup command.
|
|
79
|
+
*/
|
|
80
|
+
export interface CleanupOptions {
|
|
81
|
+
/** Clean up memory/history */
|
|
82
|
+
memory?: boolean
|
|
83
|
+
/** Type of cleanup */
|
|
84
|
+
type?: 'all' | 'memory' | 'sessions' | 'cache'
|
|
85
|
+
/** Dry run without making changes */
|
|
86
|
+
dryRun?: boolean
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Options for the setup command.
|
|
91
|
+
*/
|
|
92
|
+
export interface SetupOptions {
|
|
93
|
+
/** Force re-setup even if already configured */
|
|
94
|
+
force?: boolean
|
|
95
|
+
/** Skip interactive prompts */
|
|
96
|
+
nonInteractive?: boolean
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Options for the migrate-all command.
|
|
101
|
+
*/
|
|
102
|
+
export interface MigrateOptions {
|
|
103
|
+
/** Perform deep scan for legacy installations */
|
|
104
|
+
deepScan?: boolean
|
|
105
|
+
/** Remove legacy installations after migration */
|
|
106
|
+
removeLegacy?: boolean
|
|
107
|
+
/** Dry run without making changes */
|
|
108
|
+
dryRun?: boolean
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Options for the analyze command.
|
|
113
|
+
*/
|
|
114
|
+
export interface AnalyzeOptions {
|
|
115
|
+
/** Force re-analysis even if cached */
|
|
116
|
+
force?: boolean
|
|
117
|
+
/** Analysis depth */
|
|
118
|
+
depth?: 'quick' | 'normal' | 'deep'
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Result from project migration.
|
|
123
|
+
*/
|
|
124
|
+
export interface MigrationResult {
|
|
125
|
+
success: boolean
|
|
126
|
+
projectId: string | null
|
|
127
|
+
filesCopied?: number
|
|
128
|
+
layerCounts: LayerCounts
|
|
129
|
+
config: MigrationConfig | null
|
|
130
|
+
author: Author | null
|
|
131
|
+
issues: string[]
|
|
132
|
+
dryRun: boolean
|
|
133
|
+
legacyRemoved?: boolean
|
|
134
|
+
legacyCleaned?: boolean
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface LayerCounts {
|
|
138
|
+
core: number
|
|
139
|
+
progress: number
|
|
140
|
+
planning: number
|
|
141
|
+
analysis: number
|
|
142
|
+
memory: number
|
|
143
|
+
other: number
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface MigrationConfig {
|
|
147
|
+
projectId: string
|
|
148
|
+
version: string
|
|
149
|
+
migratedAt: string
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Type-safe command method names (for dynamic invocation)
|
|
153
|
+
export type CommandMethodName =
|
|
154
|
+
| 'now' | 'done' | 'next' | 'build'
|
|
155
|
+
| 'init' | 'feature' | 'bug' | 'architect'
|
|
156
|
+
| 'ship'
|
|
157
|
+
| 'context' | 'recap' | 'stuck' | 'progress' | 'roadmap' | 'status'
|
|
158
|
+
| 'cleanup' | 'design'
|
|
159
|
+
| 'analyze' | 'sync'
|
|
160
|
+
| 'start' | 'setup' | 'migrateAll'
|
|
161
|
+
|
|
162
|
+
// Function signature for standard command methods
|
|
163
|
+
export type StandardCommandFn = (param: string | null, projectPath?: string) => Promise<CommandResult>
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Global configuration for prjct.
|
|
167
|
+
*/
|
|
168
|
+
export interface GlobalConfig {
|
|
169
|
+
projectId: string
|
|
170
|
+
projectPath?: string
|
|
171
|
+
authors: AuthorEntry[]
|
|
172
|
+
version: string
|
|
173
|
+
created?: string
|
|
174
|
+
lastSync: string
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface AuthorEntry {
|
|
178
|
+
name: string
|
|
179
|
+
email: string
|
|
180
|
+
github: string
|
|
181
|
+
firstContribution?: string
|
|
182
|
+
lastActivity?: string
|
|
183
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Commands: now, done, next, build
|
|
3
|
+
* Core task management
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { CommandResult, Context } from './types'
|
|
7
|
+
import {
|
|
8
|
+
PrjctCommandsBase,
|
|
9
|
+
contextBuilder,
|
|
10
|
+
toolRegistry,
|
|
11
|
+
dateHelper,
|
|
12
|
+
out
|
|
13
|
+
} from './base'
|
|
14
|
+
|
|
15
|
+
export class WorkflowCommands extends PrjctCommandsBase {
|
|
16
|
+
/**
|
|
17
|
+
* /p:now - Set or show current task
|
|
18
|
+
*/
|
|
19
|
+
async now(task: string | null = null, projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
20
|
+
try {
|
|
21
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
22
|
+
if (!initResult.success) return initResult
|
|
23
|
+
|
|
24
|
+
const context = await contextBuilder.build(projectPath, { task }) as Context
|
|
25
|
+
|
|
26
|
+
if (task) {
|
|
27
|
+
const agentResult = await this._assignAgentForTask(task, projectPath, context)
|
|
28
|
+
const agent = agentResult.agent?.name || 'generalist'
|
|
29
|
+
const confidence = agentResult.routing?.confidence || 0.5
|
|
30
|
+
|
|
31
|
+
const nowContent = `# NOW\n\n**${task}**\n\nStarted: ${new Date().toLocaleString()}\nAgent: ${agent} (${Math.round(confidence * 100)}% confidence)\n`
|
|
32
|
+
await toolRegistry.get('Write')!(context.paths.now, nowContent)
|
|
33
|
+
|
|
34
|
+
out.done(`${task} [${agent}]`)
|
|
35
|
+
|
|
36
|
+
await this.logToMemory(projectPath, 'task_started', {
|
|
37
|
+
task,
|
|
38
|
+
agent,
|
|
39
|
+
confidence,
|
|
40
|
+
timestamp: dateHelper.getTimestamp(),
|
|
41
|
+
})
|
|
42
|
+
return { success: true, task, agent }
|
|
43
|
+
} else {
|
|
44
|
+
const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
|
|
45
|
+
|
|
46
|
+
if (!nowContent || nowContent.includes('No current task')) {
|
|
47
|
+
out.warn('no active task')
|
|
48
|
+
return { success: true, message: 'No active task' }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
|
|
52
|
+
const agentMatch = nowContent.match(/Agent: ([^\s(]+)/)
|
|
53
|
+
const currentTask = taskMatch ? taskMatch[1] : 'unknown'
|
|
54
|
+
const currentAgent = agentMatch ? agentMatch[1] : ''
|
|
55
|
+
out.done(`working on: ${currentTask}${currentAgent ? ` [${currentAgent}]` : ''}`)
|
|
56
|
+
return { success: true, content: nowContent }
|
|
57
|
+
}
|
|
58
|
+
} catch (error) {
|
|
59
|
+
out.fail((error as Error).message)
|
|
60
|
+
return { success: false, error: (error as Error).message }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* /p:done - Complete current task
|
|
66
|
+
*/
|
|
67
|
+
async done(projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
68
|
+
try {
|
|
69
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
70
|
+
if (!initResult.success) return initResult
|
|
71
|
+
|
|
72
|
+
const context = await contextBuilder.build(projectPath) as Context
|
|
73
|
+
const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
|
|
74
|
+
|
|
75
|
+
if (!nowContent || nowContent.includes('No current task') || nowContent.trim() === '# NOW') {
|
|
76
|
+
out.warn('no active task')
|
|
77
|
+
return { success: true, message: 'No active task to complete' }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
|
|
81
|
+
const task = taskMatch ? taskMatch[1] : 'task'
|
|
82
|
+
|
|
83
|
+
const startedMatch = nowContent.match(/Started: (.+)/)
|
|
84
|
+
let duration = ''
|
|
85
|
+
if (startedMatch) {
|
|
86
|
+
const started = new Date(startedMatch[1])
|
|
87
|
+
duration = dateHelper.calculateDuration(started)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const emptyNow = '# NOW\n\nNo current task. Use `/p:now` to set focus.\n'
|
|
91
|
+
await toolRegistry.get('Write')!(context.paths.now, emptyNow)
|
|
92
|
+
|
|
93
|
+
out.done(`${task}${duration ? ` (${duration})` : ''}`)
|
|
94
|
+
|
|
95
|
+
await this.logToMemory(projectPath, 'task_completed', {
|
|
96
|
+
task,
|
|
97
|
+
duration,
|
|
98
|
+
timestamp: dateHelper.getTimestamp(),
|
|
99
|
+
})
|
|
100
|
+
return { success: true, task, duration }
|
|
101
|
+
} catch (error) {
|
|
102
|
+
out.fail((error as Error).message)
|
|
103
|
+
return { success: false, error: (error as Error).message }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* /p:next - Show priority queue
|
|
109
|
+
*/
|
|
110
|
+
async next(projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
111
|
+
try {
|
|
112
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
113
|
+
if (!initResult.success) return initResult
|
|
114
|
+
|
|
115
|
+
const context = await contextBuilder.build(projectPath) as Context
|
|
116
|
+
const nextContent = await toolRegistry.get('Read')!(context.paths.next) as string
|
|
117
|
+
|
|
118
|
+
if (!nextContent || nextContent.trim() === '# NEXT\n\n## Priority Queue') {
|
|
119
|
+
out.warn('queue empty')
|
|
120
|
+
return { success: true, message: 'Queue is empty' }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const taskCount = (nextContent.match(/^- \[/gm) || []).length
|
|
124
|
+
out.done(`${taskCount} task${taskCount !== 1 ? 's' : ''} queued`)
|
|
125
|
+
|
|
126
|
+
return { success: true, content: nextContent }
|
|
127
|
+
} catch (error) {
|
|
128
|
+
out.fail((error as Error).message)
|
|
129
|
+
return { success: false, error: (error as Error).message }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* /p:build - Start task with agent assignment
|
|
135
|
+
*/
|
|
136
|
+
async build(taskOrNumber: string, projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
137
|
+
try {
|
|
138
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
139
|
+
if (!initResult.success) return initResult
|
|
140
|
+
|
|
141
|
+
const context = await contextBuilder.build(projectPath, { task: taskOrNumber }) as Context
|
|
142
|
+
|
|
143
|
+
const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
|
|
144
|
+
if (nowContent && !nowContent.includes('No current task')) {
|
|
145
|
+
console.log('⚠️ Already working on a task!')
|
|
146
|
+
console.log(' Complete it with /p:done first\n')
|
|
147
|
+
const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
|
|
148
|
+
const currentTask = taskMatch ? taskMatch[1] : 'current task'
|
|
149
|
+
console.log(` Current: ${currentTask}`)
|
|
150
|
+
return { success: false, message: 'Task already active' }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
let task = taskOrNumber
|
|
154
|
+
|
|
155
|
+
if (!isNaN(Number(taskOrNumber))) {
|
|
156
|
+
const nextContent = await toolRegistry.get('Read')!(context.paths.next) as string
|
|
157
|
+
const tasks = nextContent
|
|
158
|
+
.split('\n')
|
|
159
|
+
.filter((line) => line.trim().match(/^\d+\./) || line.includes('[ ]'))
|
|
160
|
+
|
|
161
|
+
const index = parseInt(taskOrNumber) - 1
|
|
162
|
+
if (index >= 0 && index < tasks.length) {
|
|
163
|
+
task = tasks[index].replace(/^\d+\.\s*\[.\]\s*/, '').trim()
|
|
164
|
+
console.log(`📋 Selected from queue: ${task}\n`)
|
|
165
|
+
} else {
|
|
166
|
+
console.log(`❌ Invalid task number. Queue has ${tasks.length} tasks.`)
|
|
167
|
+
console.log(' Use /p:next to see queue')
|
|
168
|
+
return { success: false, error: 'Invalid task number' }
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (!task) {
|
|
173
|
+
console.log('❌ Task description required')
|
|
174
|
+
console.log('Usage: /p:build "task description"')
|
|
175
|
+
console.log(' or: /p:build 1 (select from queue)')
|
|
176
|
+
return { success: false, error: 'Task required' }
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
console.log(`🏗️ Building: ${task}\n`)
|
|
180
|
+
|
|
181
|
+
const complexity = this._detectComplexity(task)
|
|
182
|
+
const estimate = complexity.hours
|
|
183
|
+
|
|
184
|
+
console.log('📊 Analysis:')
|
|
185
|
+
console.log(` Complexity: ${complexity.level}`)
|
|
186
|
+
console.log(` Estimated: ${estimate}h`)
|
|
187
|
+
console.log(` Type: ${complexity.type}\n`)
|
|
188
|
+
|
|
189
|
+
const agentResult = await this._assignAgentForTask(task, projectPath, context)
|
|
190
|
+
const agent = agentResult.agent?.name || 'generalist'
|
|
191
|
+
const confidence = agentResult.routing?.confidence || 0.5
|
|
192
|
+
console.log(`🤖 Agent: ${agent} (${Math.round(confidence * 100)}% confidence)\n`)
|
|
193
|
+
|
|
194
|
+
const nowContentNew = `# NOW
|
|
195
|
+
|
|
196
|
+
**${task}**
|
|
197
|
+
|
|
198
|
+
Started: ${new Date().toLocaleString()}
|
|
199
|
+
Estimated: ${estimate}h
|
|
200
|
+
Complexity: ${complexity.level}
|
|
201
|
+
Agent: ${agent} (${Math.round(confidence * 100)}% confidence)
|
|
202
|
+
`
|
|
203
|
+
await toolRegistry.get('Write')!(context.paths.now, nowContentNew)
|
|
204
|
+
|
|
205
|
+
console.log('✅ Task started!\n')
|
|
206
|
+
console.log('💡 Next steps:')
|
|
207
|
+
console.log('• Start coding')
|
|
208
|
+
console.log('• /p:done → Mark complete')
|
|
209
|
+
console.log('• /p:stuck → Get help if needed')
|
|
210
|
+
|
|
211
|
+
await this.logToMemory(projectPath, 'task_built', {
|
|
212
|
+
task,
|
|
213
|
+
complexity: complexity.level,
|
|
214
|
+
estimate,
|
|
215
|
+
agent,
|
|
216
|
+
confidence,
|
|
217
|
+
timestamp: dateHelper.getTimestamp(),
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
return { success: true, task, complexity, estimate, agent }
|
|
221
|
+
} catch (error) {
|
|
222
|
+
console.error('❌ Error:', (error as Error).message)
|
|
223
|
+
return { success: false, error: (error as Error).message }
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
package/core/commands.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic Commands Handler for prjct CLI
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from modular commands/ directory.
|
|
5
|
+
* See commands/index.ts for implementation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import instance, { PrjctCommands } from './commands/index'
|
|
9
|
+
|
|
10
|
+
export default instance
|
|
11
|
+
export { PrjctCommands }
|