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,417 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command Executor
|
|
3
|
-
* Orchestrates command execution with agentic delegation.
|
|
4
|
-
*
|
|
5
|
-
* @module agentic/command-executor
|
|
6
|
-
* @version 3.4
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const fs = require('fs')
|
|
10
|
-
const path = require('path')
|
|
11
|
-
const os = require('os')
|
|
12
|
-
const templateLoader = require('./template-loader')
|
|
13
|
-
const contextBuilder = require('./context-builder')
|
|
14
|
-
const promptBuilder = require('./prompt-builder')
|
|
15
|
-
const toolRegistry = require('./tool-registry')
|
|
16
|
-
// REMOVED: MandatoryAgentRouter, ContextFilter, ContextEstimator
|
|
17
|
-
// Agent assignment is 100% agentic - Claude decides via templates
|
|
18
|
-
const { validate, formatError } = require('./validation-rules')
|
|
19
|
-
const loopDetector = require('./loop-detector')
|
|
20
|
-
const chainOfThought = require('./chain-of-thought')
|
|
21
|
-
const semanticCompression = require('./semantic-compression')
|
|
22
|
-
const responseTemplates = require('./response-templates')
|
|
23
|
-
const memorySystem = require('./memory-system')
|
|
24
|
-
const groundTruth = require('./ground-truth')
|
|
25
|
-
const thinkBlocks = require('./think-blocks')
|
|
26
|
-
const parallelTools = require('./parallel-tools')
|
|
27
|
-
const planMode = require('./plan-mode')
|
|
28
|
-
|
|
29
|
-
// Running file for status line integration
|
|
30
|
-
const RUNNING_FILE = path.join(os.homedir(), '.prjct-cli', '.running')
|
|
31
|
-
// P3.5, P3.6, P3.7: DELEGATED TO CLAUDE CODE
|
|
32
|
-
// - semantic-search → Claude Code has Grep/Glob with semantic understanding
|
|
33
|
-
// - code-intelligence → Claude Code has native LSP integration
|
|
34
|
-
// - browser-preview → Claude Code can use Bash directly
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Orchestrates prjct command execution.
|
|
38
|
-
* Handles template loading, context building, validation, and agentic delegation.
|
|
39
|
-
*/
|
|
40
|
-
class CommandExecutor {
|
|
41
|
-
constructor() {}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Signal that a command is running (for status line)
|
|
45
|
-
*
|
|
46
|
-
* @param {string} commandName - Name of the running command
|
|
47
|
-
*/
|
|
48
|
-
signalStart(commandName) {
|
|
49
|
-
try {
|
|
50
|
-
const dir = path.dirname(RUNNING_FILE)
|
|
51
|
-
if (!fs.existsSync(dir)) {
|
|
52
|
-
fs.mkdirSync(dir, { recursive: true })
|
|
53
|
-
}
|
|
54
|
-
fs.writeFileSync(RUNNING_FILE, `/p:${commandName}`)
|
|
55
|
-
} catch {
|
|
56
|
-
// Silently ignore - status line is optional
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Signal that command has finished (for status line)
|
|
62
|
-
*/
|
|
63
|
-
signalEnd() {
|
|
64
|
-
try {
|
|
65
|
-
if (fs.existsSync(RUNNING_FILE)) {
|
|
66
|
-
fs.unlinkSync(RUNNING_FILE)
|
|
67
|
-
}
|
|
68
|
-
} catch {
|
|
69
|
-
// Silently ignore - status line is optional
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Execute a prjct command with full agentic delegation
|
|
75
|
-
*
|
|
76
|
-
* @param {string} commandName - Command to execute (e.g., 'now', 'ship')
|
|
77
|
-
* @param {Object} params - Command parameters
|
|
78
|
-
* @param {string} projectPath - Path to the project
|
|
79
|
-
* @returns {Promise<Object>} Execution result with prompt, context, helpers
|
|
80
|
-
*/
|
|
81
|
-
async execute(commandName, params, projectPath) {
|
|
82
|
-
// Signal start for status line
|
|
83
|
-
this.signalStart(commandName)
|
|
84
|
-
|
|
85
|
-
// Context for loop detection
|
|
86
|
-
const loopContext = params.task || params.description || ''
|
|
87
|
-
|
|
88
|
-
// Check if we're in a loop BEFORE attempting
|
|
89
|
-
if (loopDetector.shouldEscalate(commandName, loopContext)) {
|
|
90
|
-
const escalation = loopDetector.getEscalationInfo(commandName, loopContext)
|
|
91
|
-
this.signalEnd()
|
|
92
|
-
return {
|
|
93
|
-
success: false,
|
|
94
|
-
error: escalation.message,
|
|
95
|
-
escalation,
|
|
96
|
-
isLoopDetected: true,
|
|
97
|
-
suggestion: escalation.suggestion
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
// 1. Load template
|
|
103
|
-
const template = await templateLoader.load(commandName)
|
|
104
|
-
|
|
105
|
-
// 2. Build METADATA context only (lazy loading - no file reads yet)
|
|
106
|
-
const metadataContext = await contextBuilder.build(projectPath, params)
|
|
107
|
-
|
|
108
|
-
// 2.5. VALIDATE: Pre-flight checks with specific errors
|
|
109
|
-
const validation = await validate(commandName, metadataContext)
|
|
110
|
-
if (!validation.valid) {
|
|
111
|
-
this.signalEnd()
|
|
112
|
-
return {
|
|
113
|
-
success: false,
|
|
114
|
-
error: formatError(validation),
|
|
115
|
-
validation,
|
|
116
|
-
isValidationError: true
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// 2.55. P3.4 PLAN MODE: Check if command requires planning
|
|
121
|
-
const requiresPlanning = planMode.requiresPlanning(commandName)
|
|
122
|
-
const isDestructive = planMode.isDestructive(commandName)
|
|
123
|
-
const isInPlanningMode = planMode.isInPlanningMode(metadataContext.projectId)
|
|
124
|
-
|
|
125
|
-
// Start planning mode if required and not already in it
|
|
126
|
-
let activePlan = null
|
|
127
|
-
if (requiresPlanning && !isInPlanningMode && !params.skipPlanning) {
|
|
128
|
-
activePlan = planMode.startPlanning(metadataContext.projectId, commandName, params)
|
|
129
|
-
} else if (isInPlanningMode) {
|
|
130
|
-
activePlan = planMode.getActivePlan(metadataContext.projectId)
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// 2.6. GROUND TRUTH: Verify actual state before critical operations
|
|
134
|
-
let groundTruthResult = null
|
|
135
|
-
if (groundTruth.requiresVerification(commandName)) {
|
|
136
|
-
const preState = await contextBuilder.loadStateForCommand(metadataContext, commandName)
|
|
137
|
-
groundTruthResult = await groundTruth.verify(commandName, metadataContext, preState)
|
|
138
|
-
|
|
139
|
-
// Log warnings but don't block (user can override)
|
|
140
|
-
if (!groundTruthResult.verified && groundTruthResult.warnings.length > 0) {
|
|
141
|
-
console.log(groundTruth.formatWarnings(groundTruthResult))
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// 2.7. THINK BLOCKS (P3.1): Dynamic reasoning based on triggers
|
|
146
|
-
// ANTI-HALLUCINATION FIX: Load state BEFORE using it (was undefined)
|
|
147
|
-
let thinkBlock = null
|
|
148
|
-
const preThinkState = groundTruthResult?.actual || await contextBuilder.loadStateForCommand(metadataContext, commandName)
|
|
149
|
-
const thinkTrigger = thinkBlocks.detectTrigger(commandName, metadataContext, preThinkState)
|
|
150
|
-
if (thinkTrigger) {
|
|
151
|
-
thinkBlock = await thinkBlocks.generate(thinkTrigger, commandName, metadataContext, preThinkState)
|
|
152
|
-
|
|
153
|
-
// Log think block if in debug mode
|
|
154
|
-
if (process.env.PRJCT_DEBUG === 'true') {
|
|
155
|
-
console.log(thinkBlocks.format(thinkBlock, true))
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// 2.8. CHAIN OF THOUGHT: Reasoning for critical commands
|
|
160
|
-
let reasoning = null
|
|
161
|
-
if (chainOfThought.requiresReasoning(commandName)) {
|
|
162
|
-
// Load state for reasoning
|
|
163
|
-
const reasoningState = await contextBuilder.loadStateForCommand(metadataContext, commandName)
|
|
164
|
-
reasoning = await chainOfThought.reason(commandName, metadataContext, reasoningState)
|
|
165
|
-
|
|
166
|
-
// If reasoning shows critical issues, warn but continue
|
|
167
|
-
if (reasoning.reasoning && !reasoning.reasoning.allPassed) {
|
|
168
|
-
console.log('⚠️ Chain of Thought detected issues:')
|
|
169
|
-
console.log(chainOfThought.formatPlan(reasoning))
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// 3. AGENTIC: Claude decides agent assignment via templates
|
|
174
|
-
// NO if/else logic here - templates instruct Claude to use Task tool
|
|
175
|
-
// See templates/agentic/agent-routing.md for routing rules
|
|
176
|
-
let context = metadataContext
|
|
177
|
-
|
|
178
|
-
// Provide agent info to context so Claude can delegate
|
|
179
|
-
context = {
|
|
180
|
-
...context,
|
|
181
|
-
agentsPath: path.join(os.homedir(), '.prjct-cli', 'projects', metadataContext.projectId || '', 'agents'),
|
|
182
|
-
agentRoutingPath: path.join(__dirname, '..', '..', 'templates', 'agentic', 'agent-routing.md'),
|
|
183
|
-
// Flag: Claude must delegate to subagent via Task tool
|
|
184
|
-
agenticDelegation: true
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// 6. Load state with filtered context
|
|
188
|
-
const rawState = await contextBuilder.loadState(context)
|
|
189
|
-
|
|
190
|
-
// 6.5. SEMANTIC COMPRESSION: Compress state for reduced token usage
|
|
191
|
-
const compressedState = {}
|
|
192
|
-
for (const [key, content] of Object.entries(rawState)) {
|
|
193
|
-
if (content) {
|
|
194
|
-
const compressed = semanticCompression.compress(content, key)
|
|
195
|
-
compressedState[key] = {
|
|
196
|
-
raw: content,
|
|
197
|
-
summary: compressed.summary,
|
|
198
|
-
compressed
|
|
199
|
-
}
|
|
200
|
-
} else {
|
|
201
|
-
compressedState[key] = { raw: null, summary: 'Empty', compressed: null }
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Use compressed summaries for prompt, keep raw for tool execution
|
|
206
|
-
const state = {
|
|
207
|
-
...rawState,
|
|
208
|
-
_compressed: compressedState,
|
|
209
|
-
_compressionMetrics: semanticCompression.getMetrics()
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// 7. MEMORY: Load learned patterns AND relevant memories for this command
|
|
213
|
-
let learnedPatterns = null
|
|
214
|
-
let relevantMemories = null
|
|
215
|
-
if (context.projectId) {
|
|
216
|
-
learnedPatterns = {
|
|
217
|
-
commit_footer: await memorySystem.getSmartDecision(context.projectId, 'commit_footer'),
|
|
218
|
-
branch_naming: await memorySystem.getSmartDecision(context.projectId, 'branch_naming'),
|
|
219
|
-
test_before_ship: await memorySystem.getSmartDecision(context.projectId, 'test_before_ship'),
|
|
220
|
-
preferred_agent: await memorySystem.getSmartDecision(context.projectId, `preferred_agent_${commandName}`)
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// P3.3: Get relevant memories for context
|
|
224
|
-
relevantMemories = await memorySystem.getRelevantMemories(
|
|
225
|
-
context.projectId,
|
|
226
|
-
{ commandName, params },
|
|
227
|
-
5 // Top 5 relevant memories
|
|
228
|
-
)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// 9. Build prompt - NO agent assignment here, Claude decides via templates
|
|
232
|
-
const planInfo = {
|
|
233
|
-
isPlanning: requiresPlanning || isInPlanningMode,
|
|
234
|
-
requiresApproval: isDestructive && !params.approved,
|
|
235
|
-
active: activePlan,
|
|
236
|
-
allowedTools: planMode.getAllowedTools(
|
|
237
|
-
isInPlanningMode,
|
|
238
|
-
template.frontmatter['allowed-tools'] || []
|
|
239
|
-
)
|
|
240
|
-
}
|
|
241
|
-
// Agent is null - Claude assigns via Task tool using agent-routing.md
|
|
242
|
-
const prompt = promptBuilder.build(template, context, state, null, learnedPatterns, thinkBlock, relevantMemories, planInfo)
|
|
243
|
-
|
|
244
|
-
// Log agentic mode
|
|
245
|
-
console.log(`🤖 Agentic delegation enabled - Claude will assign agent via Task tool`)
|
|
246
|
-
|
|
247
|
-
// Record successful attempt
|
|
248
|
-
loopDetector.recordSuccess(commandName, loopContext)
|
|
249
|
-
|
|
250
|
-
// Signal end for status line
|
|
251
|
-
this.signalEnd()
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
success: true,
|
|
255
|
-
template,
|
|
256
|
-
context,
|
|
257
|
-
state,
|
|
258
|
-
prompt,
|
|
259
|
-
// AGENTIC: No pre-assigned agent - Claude delegates via Task tool
|
|
260
|
-
agenticDelegation: true,
|
|
261
|
-
agentsPath: context.agentsPath,
|
|
262
|
-
agentRoutingPath: context.agentRoutingPath,
|
|
263
|
-
reasoning, // Chain of thought results
|
|
264
|
-
thinkBlock, // Think blocks (P3.1)
|
|
265
|
-
groundTruth: groundTruthResult, // Ground truth verification (P1.3)
|
|
266
|
-
compressionMetrics: state._compressionMetrics,
|
|
267
|
-
learnedPatterns, // Memory system patterns
|
|
268
|
-
relevantMemories, // P3.3: Semantic memories
|
|
269
|
-
// Response formatter helper
|
|
270
|
-
formatResponse: (data) => responseTemplates.format(commandName, data),
|
|
271
|
-
// Think block formatter helper
|
|
272
|
-
formatThinkBlock: (verbose) => thinkBlocks.format(thinkBlock, verbose),
|
|
273
|
-
// P3.2: Parallel tools helper
|
|
274
|
-
parallel: {
|
|
275
|
-
execute: (toolCalls) => parallelTools.execute(toolCalls),
|
|
276
|
-
readAll: (paths) => parallelTools.readAll(paths),
|
|
277
|
-
canParallelize: (tools) => parallelTools.canParallelize(tools),
|
|
278
|
-
getMetrics: () => parallelTools.getMetrics()
|
|
279
|
-
},
|
|
280
|
-
// P3.3: Memory system helpers
|
|
281
|
-
memory: {
|
|
282
|
-
create: (memory) => memorySystem.createMemory(context.projectId, memory),
|
|
283
|
-
autoRemember: (type, value, ctx) => memorySystem.autoRemember(context.projectId, type, value, ctx),
|
|
284
|
-
search: (query) => memorySystem.searchMemories(context.projectId, query),
|
|
285
|
-
findByTags: (tags) => memorySystem.findByTags(context.projectId, tags),
|
|
286
|
-
getStats: () => memorySystem.getMemoryStats(context.projectId)
|
|
287
|
-
},
|
|
288
|
-
// P3.4: Plan Mode helpers
|
|
289
|
-
plan: {
|
|
290
|
-
active: activePlan,
|
|
291
|
-
isPlanning: requiresPlanning || isInPlanningMode,
|
|
292
|
-
isDestructive,
|
|
293
|
-
requiresApproval: isDestructive && !params.approved,
|
|
294
|
-
// Planning phase methods
|
|
295
|
-
recordInfo: (info) => planMode.recordGatheredInfo(context.projectId, info),
|
|
296
|
-
setAnalysis: (analysis) => planMode.setAnalysis(context.projectId, analysis),
|
|
297
|
-
propose: (plan) => planMode.proposePlan(context.projectId, plan),
|
|
298
|
-
// Approval methods
|
|
299
|
-
approve: (feedback) => planMode.approvePlan(context.projectId, feedback),
|
|
300
|
-
reject: (reason) => planMode.rejectPlan(context.projectId, reason),
|
|
301
|
-
getApprovalPrompt: () => planMode.generateApprovalPrompt(commandName, context),
|
|
302
|
-
// Execution methods
|
|
303
|
-
startExecution: () => planMode.startExecution(context.projectId),
|
|
304
|
-
getNextStep: () => planMode.getNextStep(context.projectId),
|
|
305
|
-
completeStep: (result) => planMode.completeStep(context.projectId, result),
|
|
306
|
-
failStep: (error) => planMode.failStep(context.projectId, error),
|
|
307
|
-
abort: (reason) => planMode.abortPlan(context.projectId, reason),
|
|
308
|
-
// Status
|
|
309
|
-
getStatus: () => planMode.formatStatus(context.projectId),
|
|
310
|
-
getAllowedTools: () => planMode.getAllowedTools(
|
|
311
|
-
isInPlanningMode,
|
|
312
|
-
template.frontmatter['allowed-tools'] || []
|
|
313
|
-
)
|
|
314
|
-
}
|
|
315
|
-
// P3.5, P3.6: DELEGATED TO CLAUDE CODE
|
|
316
|
-
// Use Claude Code's native tools instead:
|
|
317
|
-
// - Grep for semantic search
|
|
318
|
-
// - Glob for file patterns
|
|
319
|
-
// - Native LSP for code intelligence
|
|
320
|
-
}
|
|
321
|
-
} catch (error) {
|
|
322
|
-
// Signal end for status line
|
|
323
|
-
this.signalEnd()
|
|
324
|
-
|
|
325
|
-
// Record failed attempt for loop detection
|
|
326
|
-
const attemptInfo = loopDetector.recordAttempt(commandName, loopContext, {
|
|
327
|
-
success: false,
|
|
328
|
-
error: error.message
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
// Check if we should escalate after this failure
|
|
332
|
-
if (attemptInfo.shouldEscalate) {
|
|
333
|
-
const escalation = loopDetector.getEscalationInfo(commandName, loopContext)
|
|
334
|
-
return {
|
|
335
|
-
success: false,
|
|
336
|
-
error: escalation.message,
|
|
337
|
-
escalation,
|
|
338
|
-
isLoopDetected: true,
|
|
339
|
-
suggestion: escalation.suggestion
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return {
|
|
344
|
-
success: false,
|
|
345
|
-
error: error.message,
|
|
346
|
-
attemptNumber: attemptInfo.attemptNumber,
|
|
347
|
-
isLooping: attemptInfo.isLooping
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// REMOVED: isTaskCommand() and shouldUseAgent()
|
|
353
|
-
// Agent assignment is now 100% agentic - Claude decides via templates
|
|
354
|
-
// See templates/agentic/agent-routing.md
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Execute tool with permission check
|
|
358
|
-
* @param {string} toolName - Tool name
|
|
359
|
-
* @param {Array} args - Tool arguments
|
|
360
|
-
* @param {string[]} allowedTools - Allowed tools for this command
|
|
361
|
-
* @returns {Promise<any>}
|
|
362
|
-
*/
|
|
363
|
-
async executeTool(toolName, args, allowedTools) {
|
|
364
|
-
// Check if tool is allowed
|
|
365
|
-
if (!toolRegistry.isAllowed(toolName, allowedTools)) {
|
|
366
|
-
throw new Error(`Tool ${toolName} not allowed for this command`)
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// Get tool function
|
|
370
|
-
const tool = toolRegistry.get(toolName)
|
|
371
|
-
|
|
372
|
-
// Execute tool
|
|
373
|
-
return await tool(...args)
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* Simple execution for direct tool access (legacy migration helper)
|
|
378
|
-
*
|
|
379
|
-
* @param {string} commandName - Command name
|
|
380
|
-
* @param {Function} executionFn - Function receiving (tools, context)
|
|
381
|
-
* @param {string} projectPath - Project path
|
|
382
|
-
* @returns {Promise<Object>} Result with success flag
|
|
383
|
-
*/
|
|
384
|
-
async executeSimple(commandName, executionFn, projectPath) {
|
|
385
|
-
try {
|
|
386
|
-
// Load template to get allowed tools
|
|
387
|
-
const template = await templateLoader.load(commandName)
|
|
388
|
-
const allowedTools = template.frontmatter['allowed-tools'] || []
|
|
389
|
-
|
|
390
|
-
// Build context
|
|
391
|
-
const context = await contextBuilder.build(projectPath)
|
|
392
|
-
|
|
393
|
-
// Create tools proxy that checks permissions
|
|
394
|
-
const tools = {
|
|
395
|
-
read: async (filePath) => this.executeTool('Read', [filePath], allowedTools),
|
|
396
|
-
write: async (filePath, content) =>
|
|
397
|
-
this.executeTool('Write', [filePath, content], allowedTools),
|
|
398
|
-
bash: async (command) => this.executeTool('Bash', [command], allowedTools),
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Execute user function with tools
|
|
402
|
-
const result = await executionFn(tools, context)
|
|
403
|
-
|
|
404
|
-
return {
|
|
405
|
-
success: true,
|
|
406
|
-
result,
|
|
407
|
-
}
|
|
408
|
-
} catch (error) {
|
|
409
|
-
return {
|
|
410
|
-
success: false,
|
|
411
|
-
error: error.message,
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
module.exports = new CommandExecutor()
|