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
|
@@ -1,546 +0,0 @@
|
|
|
1
|
-
const fs = require('fs').promises
|
|
2
|
-
const path = require('path')
|
|
3
|
-
const os = require('os')
|
|
4
|
-
const { execSync } = require('child_process')
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Legacy Installer Detector
|
|
8
|
-
*
|
|
9
|
-
* Detects and cleans up legacy curl-based installations from ~/.prjct-cli/
|
|
10
|
-
* These were installed via curl install.sh before v0.8.2 (npm migration)
|
|
11
|
-
*
|
|
12
|
-
* What it does:
|
|
13
|
-
* 1. Detects ~/.prjct-cli/ directory (legacy curl install location)
|
|
14
|
-
* 2. Checks if it's a git repository (legacy indicator)
|
|
15
|
-
* 3. Backs up global projects data to new npm location
|
|
16
|
-
* 4. Removes legacy installation files
|
|
17
|
-
* 5. Preserves user data (projects/ directory)
|
|
18
|
-
* 6. Cleans up legacy PATH entries and symlinks
|
|
19
|
-
*
|
|
20
|
-
* @version 0.8.8
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
// Colors
|
|
24
|
-
const CYAN = '\x1b[36m'
|
|
25
|
-
const GREEN = '\x1b[32m'
|
|
26
|
-
const YELLOW = '\x1b[33m'
|
|
27
|
-
const RED = '\x1b[31m'
|
|
28
|
-
const DIM = '\x1b[2m'
|
|
29
|
-
const NC = '\x1b[0m'
|
|
30
|
-
|
|
31
|
-
class LegacyInstallerDetector {
|
|
32
|
-
constructor() {
|
|
33
|
-
this.legacyInstallDir = path.join(os.homedir(), '.prjct-cli')
|
|
34
|
-
this.npmGlobalProjectsDir = path.join(os.homedir(), '.prjct-cli', 'projects')
|
|
35
|
-
this.isWindows = process.platform === 'win32'
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Check if legacy curl installation exists
|
|
40
|
-
* @returns {Promise<boolean>}
|
|
41
|
-
*/
|
|
42
|
-
async hasLegacyInstallation() {
|
|
43
|
-
try {
|
|
44
|
-
const stat = await fs.stat(this.legacyInstallDir)
|
|
45
|
-
if (!stat.isDirectory()) return false
|
|
46
|
-
|
|
47
|
-
// Check for .git directory (indicates curl install)
|
|
48
|
-
try {
|
|
49
|
-
await fs.access(path.join(this.legacyInstallDir, '.git'))
|
|
50
|
-
return true // Definitely a git clone from curl install
|
|
51
|
-
} catch {
|
|
52
|
-
// No .git, check for other legacy indicators
|
|
53
|
-
const entries = await fs.readdir(this.legacyInstallDir)
|
|
54
|
-
|
|
55
|
-
// Legacy has: bin/, core/, templates/, scripts/, package.json
|
|
56
|
-
const legacyFiles = ['bin', 'core', 'templates', 'scripts', 'package.json']
|
|
57
|
-
const hasLegacyFiles = legacyFiles.every(file => entries.includes(file))
|
|
58
|
-
|
|
59
|
-
if (hasLegacyFiles) {
|
|
60
|
-
return true // Has legacy structure
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Only has projects/ and config/ = already migrated
|
|
64
|
-
const onlyDataDirs = entries.every(entry => ['projects', 'config'].includes(entry))
|
|
65
|
-
return !onlyDataDirs
|
|
66
|
-
}
|
|
67
|
-
} catch {
|
|
68
|
-
return false
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Get npm global installation path
|
|
74
|
-
* @returns {string}
|
|
75
|
-
*/
|
|
76
|
-
getNpmGlobalPath() {
|
|
77
|
-
try {
|
|
78
|
-
const npmRoot = execSync('npm root -g', { encoding: 'utf8' }).trim()
|
|
79
|
-
return path.join(npmRoot, 'prjct-cli')
|
|
80
|
-
} catch {
|
|
81
|
-
// Fallback to common locations
|
|
82
|
-
const nodePath = process.execPath
|
|
83
|
-
const nodeDir = path.dirname(path.dirname(nodePath))
|
|
84
|
-
return path.join(nodeDir, 'lib', 'node_modules', 'prjct-cli')
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Check if user has npm global installation
|
|
90
|
-
* @returns {Promise<boolean>}
|
|
91
|
-
*/
|
|
92
|
-
async hasNpmInstallation() {
|
|
93
|
-
try {
|
|
94
|
-
execSync('npm list -g prjct-cli', { stdio: 'ignore' })
|
|
95
|
-
return true
|
|
96
|
-
} catch {
|
|
97
|
-
return false
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Get version of legacy installation
|
|
103
|
-
* @returns {Promise<string|null>}
|
|
104
|
-
*/
|
|
105
|
-
async getLegacyVersion() {
|
|
106
|
-
try {
|
|
107
|
-
const packageJsonPath = path.join(this.legacyInstallDir, 'package.json')
|
|
108
|
-
const content = await fs.readFile(packageJsonPath, 'utf8')
|
|
109
|
-
const pkg = JSON.parse(content)
|
|
110
|
-
return pkg.version || 'unknown'
|
|
111
|
-
} catch {
|
|
112
|
-
return null
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Migrate projects data from legacy location to npm location
|
|
118
|
-
* Only migrates if projects/ directory exists in legacy location
|
|
119
|
-
* @returns {Promise<{success: boolean, projectsMigrated: number, message: string}>}
|
|
120
|
-
*/
|
|
121
|
-
async migrateProjectsData() {
|
|
122
|
-
const result = {
|
|
123
|
-
success: false,
|
|
124
|
-
projectsMigrated: 0,
|
|
125
|
-
message: ''
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
try {
|
|
129
|
-
const legacyProjectsDir = path.join(this.legacyInstallDir, 'projects')
|
|
130
|
-
|
|
131
|
-
// Check if legacy projects directory exists
|
|
132
|
-
try {
|
|
133
|
-
await fs.access(legacyProjectsDir)
|
|
134
|
-
} catch {
|
|
135
|
-
result.success = true
|
|
136
|
-
result.message = 'No projects data to migrate'
|
|
137
|
-
return result
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Ensure npm global projects directory exists
|
|
141
|
-
await fs.mkdir(this.npmGlobalProjectsDir, { recursive: true })
|
|
142
|
-
|
|
143
|
-
// Read all project directories
|
|
144
|
-
const projectDirs = await fs.readdir(legacyProjectsDir, { withFileTypes: true })
|
|
145
|
-
|
|
146
|
-
for (const entry of projectDirs) {
|
|
147
|
-
if (!entry.isDirectory()) continue
|
|
148
|
-
|
|
149
|
-
const legacyProjectPath = path.join(legacyProjectsDir, entry.name)
|
|
150
|
-
const npmProjectPath = path.join(this.npmGlobalProjectsDir, entry.name)
|
|
151
|
-
|
|
152
|
-
// Check if project already exists in npm location
|
|
153
|
-
try {
|
|
154
|
-
await fs.access(npmProjectPath)
|
|
155
|
-
// Already exists, skip
|
|
156
|
-
continue
|
|
157
|
-
} catch {
|
|
158
|
-
// Doesn't exist, copy it
|
|
159
|
-
await this.copyDirectory(legacyProjectPath, npmProjectPath)
|
|
160
|
-
result.projectsMigrated++
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
result.success = true
|
|
165
|
-
result.message = result.projectsMigrated > 0
|
|
166
|
-
? `Migrated ${result.projectsMigrated} project(s) to npm global location`
|
|
167
|
-
: 'All projects already in npm location'
|
|
168
|
-
|
|
169
|
-
return result
|
|
170
|
-
} catch (error) {
|
|
171
|
-
result.message = `Migration failed: ${error.message}`
|
|
172
|
-
return result
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Copy directory recursively
|
|
178
|
-
* @private
|
|
179
|
-
*/
|
|
180
|
-
async copyDirectory(source, destination) {
|
|
181
|
-
await fs.mkdir(destination, { recursive: true })
|
|
182
|
-
|
|
183
|
-
const entries = await fs.readdir(source, { withFileTypes: true })
|
|
184
|
-
|
|
185
|
-
for (const entry of entries) {
|
|
186
|
-
const sourcePath = path.join(source, entry.name)
|
|
187
|
-
const destPath = path.join(destination, entry.name)
|
|
188
|
-
|
|
189
|
-
if (entry.isDirectory()) {
|
|
190
|
-
await this.copyDirectory(sourcePath, destPath)
|
|
191
|
-
} else {
|
|
192
|
-
await fs.copyFile(sourcePath, destPath)
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Remove legacy installation files (keep projects data)
|
|
199
|
-
* @returns {Promise<{success: boolean, message: string}>}
|
|
200
|
-
*/
|
|
201
|
-
async cleanupLegacyInstallation() {
|
|
202
|
-
const result = {
|
|
203
|
-
success: false,
|
|
204
|
-
message: ''
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
// Directories to remove (everything except projects and config)
|
|
209
|
-
const dirsToRemove = ['bin', 'core', 'templates', 'scripts', 'node_modules', '.git', '__tests__', 'website', 'docs', '.github']
|
|
210
|
-
const filesToRemove = [
|
|
211
|
-
'package.json',
|
|
212
|
-
'package-lock.json',
|
|
213
|
-
'README.md',
|
|
214
|
-
'LICENSE',
|
|
215
|
-
'CHANGELOG.md',
|
|
216
|
-
'CLAUDE.md',
|
|
217
|
-
'CONTRIBUTING.md',
|
|
218
|
-
'MIGRATION.md',
|
|
219
|
-
'TESTING.md',
|
|
220
|
-
'.gitignore',
|
|
221
|
-
'.eslintrc.js',
|
|
222
|
-
'.prettierrc',
|
|
223
|
-
'vitest.config.js',
|
|
224
|
-
'vitest.workspace.js'
|
|
225
|
-
]
|
|
226
|
-
|
|
227
|
-
let removedItems = 0
|
|
228
|
-
|
|
229
|
-
// Remove directories
|
|
230
|
-
for (const dir of dirsToRemove) {
|
|
231
|
-
const dirPath = path.join(this.legacyInstallDir, dir)
|
|
232
|
-
try {
|
|
233
|
-
await fs.rm(dirPath, { recursive: true, force: true })
|
|
234
|
-
removedItems++
|
|
235
|
-
} catch {
|
|
236
|
-
// Directory doesn't exist, skip
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Remove files
|
|
241
|
-
for (const file of filesToRemove) {
|
|
242
|
-
const filePath = path.join(this.legacyInstallDir, file)
|
|
243
|
-
try {
|
|
244
|
-
await fs.unlink(filePath)
|
|
245
|
-
removedItems++
|
|
246
|
-
} catch {
|
|
247
|
-
// File doesn't exist, skip
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
result.success = true
|
|
252
|
-
result.message = `Removed ${removedItems} legacy installation items`
|
|
253
|
-
return result
|
|
254
|
-
} catch (error) {
|
|
255
|
-
result.message = `Cleanup failed: ${error.message}`
|
|
256
|
-
return result
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Get platform-specific shell config files
|
|
262
|
-
* @returns {string[]}
|
|
263
|
-
*/
|
|
264
|
-
getShellConfigFiles() {
|
|
265
|
-
if (this.isWindows) {
|
|
266
|
-
// Windows PowerShell profiles
|
|
267
|
-
const profilePaths = []
|
|
268
|
-
|
|
269
|
-
// PowerShell 7+ profile
|
|
270
|
-
if (process.env.USERPROFILE) {
|
|
271
|
-
profilePaths.push(
|
|
272
|
-
path.join(process.env.USERPROFILE, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1'),
|
|
273
|
-
path.join(process.env.USERPROFILE, 'Documents', 'WindowsPowerShell', 'Microsoft.PowerShell_profile.ps1')
|
|
274
|
-
)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return profilePaths
|
|
278
|
-
} else {
|
|
279
|
-
// Unix/Linux/macOS shell configs
|
|
280
|
-
return [
|
|
281
|
-
path.join(os.homedir(), '.zshrc'),
|
|
282
|
-
path.join(os.homedir(), '.bashrc'),
|
|
283
|
-
path.join(os.homedir(), '.profile'),
|
|
284
|
-
path.join(os.homedir(), '.bash_profile')
|
|
285
|
-
]
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Clean up legacy PATH entries from shell config files
|
|
291
|
-
* @returns {Promise<{success: boolean, message: string, filesModified: number}>}
|
|
292
|
-
*/
|
|
293
|
-
async cleanupLegacyPATH() {
|
|
294
|
-
const result = {
|
|
295
|
-
success: false,
|
|
296
|
-
message: '',
|
|
297
|
-
filesModified: 0
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
try {
|
|
301
|
-
const shellConfigs = this.getShellConfigFiles()
|
|
302
|
-
|
|
303
|
-
for (const configFile of shellConfigs) {
|
|
304
|
-
try {
|
|
305
|
-
const content = await fs.readFile(configFile, 'utf8')
|
|
306
|
-
|
|
307
|
-
// Check if file contains legacy PATH entry
|
|
308
|
-
if (!content.includes('.prjct-cli/bin')) {
|
|
309
|
-
continue
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Remove lines containing .prjct-cli/bin
|
|
313
|
-
const lines = content.split('\n')
|
|
314
|
-
const filteredLines = lines.filter(line => {
|
|
315
|
-
return !line.includes('.prjct-cli/bin') && !line.includes('# prjct/cli')
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
// Remove consecutive empty lines
|
|
319
|
-
const cleanedLines = []
|
|
320
|
-
for (let i = 0; i < filteredLines.length; i++) {
|
|
321
|
-
const line = filteredLines[i]
|
|
322
|
-
const prevLine = filteredLines[i - 1]
|
|
323
|
-
|
|
324
|
-
// Skip if both current and previous lines are empty
|
|
325
|
-
if (line.trim() === '' && prevLine && prevLine.trim() === '') {
|
|
326
|
-
continue
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
cleanedLines.push(line)
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Write back
|
|
333
|
-
await fs.writeFile(configFile, cleanedLines.join('\n'), 'utf8')
|
|
334
|
-
result.filesModified++
|
|
335
|
-
} catch {
|
|
336
|
-
// File doesn't exist or can't read, skip
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
result.success = true
|
|
341
|
-
result.message = result.filesModified > 0
|
|
342
|
-
? `Cleaned PATH from ${result.filesModified} shell config(s)`
|
|
343
|
-
: 'No legacy PATH entries found'
|
|
344
|
-
|
|
345
|
-
return result
|
|
346
|
-
} catch (error) {
|
|
347
|
-
result.message = `PATH cleanup failed: ${error.message}`
|
|
348
|
-
return result
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Clean up legacy symlinks
|
|
354
|
-
* @returns {Promise<{success: boolean, message: string}>}
|
|
355
|
-
*/
|
|
356
|
-
async cleanupLegacySymlinks() {
|
|
357
|
-
const result = {
|
|
358
|
-
success: false,
|
|
359
|
-
message: ''
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// Skip on Windows (no .local/bin)
|
|
363
|
-
if (this.isWindows) {
|
|
364
|
-
result.success = true
|
|
365
|
-
result.message = 'No symlinks on Windows'
|
|
366
|
-
return result
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
try {
|
|
370
|
-
const symlinkPath = path.join(os.homedir(), '.local', 'bin', 'prjct')
|
|
371
|
-
|
|
372
|
-
try {
|
|
373
|
-
const stat = await fs.lstat(symlinkPath)
|
|
374
|
-
|
|
375
|
-
if (stat.isSymbolicLink()) {
|
|
376
|
-
const target = await fs.readlink(symlinkPath)
|
|
377
|
-
|
|
378
|
-
// Only remove if it points to legacy location
|
|
379
|
-
if (target.includes('.prjct-cli')) {
|
|
380
|
-
await fs.unlink(symlinkPath)
|
|
381
|
-
result.success = true
|
|
382
|
-
result.message = 'Removed legacy symlink'
|
|
383
|
-
return result
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
} catch {
|
|
387
|
-
// Symlink doesn't exist
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
result.success = true
|
|
391
|
-
result.message = 'No legacy symlinks found'
|
|
392
|
-
return result
|
|
393
|
-
} catch (error) {
|
|
394
|
-
result.message = `Symlink cleanup failed: ${error.message}`
|
|
395
|
-
return result
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Perform complete legacy cleanup
|
|
401
|
-
* @param {Object} options
|
|
402
|
-
* @param {boolean} options.verbose - Show detailed output
|
|
403
|
-
* @returns {Promise<Object>}
|
|
404
|
-
*/
|
|
405
|
-
async performCleanup(options = {}) {
|
|
406
|
-
const { verbose = true } = options
|
|
407
|
-
|
|
408
|
-
const report = {
|
|
409
|
-
success: false,
|
|
410
|
-
legacyVersion: null,
|
|
411
|
-
hasNpm: false,
|
|
412
|
-
steps: {
|
|
413
|
-
projectsMigrated: 0,
|
|
414
|
-
installationCleaned: false,
|
|
415
|
-
pathCleaned: false,
|
|
416
|
-
symlinksCleaned: false
|
|
417
|
-
},
|
|
418
|
-
messages: []
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
try {
|
|
422
|
-
// Check prerequisites
|
|
423
|
-
const hasLegacy = await this.hasLegacyInstallation()
|
|
424
|
-
|
|
425
|
-
if (!hasLegacy) {
|
|
426
|
-
report.success = true
|
|
427
|
-
report.messages.push('No legacy installation found')
|
|
428
|
-
return report
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
report.legacyVersion = await this.getLegacyVersion()
|
|
432
|
-
report.hasNpm = await this.hasNpmInstallation()
|
|
433
|
-
|
|
434
|
-
if (verbose) {
|
|
435
|
-
console.log('')
|
|
436
|
-
console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
|
|
437
|
-
console.log(`${YELLOW}⚠️ Legacy curl installation detected${NC}`)
|
|
438
|
-
console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
|
|
439
|
-
console.log('')
|
|
440
|
-
console.log(` ${DIM}Version: ${report.legacyVersion || 'unknown'}${NC}`)
|
|
441
|
-
console.log(` ${DIM}Location: ~/.prjct-cli/${NC}`)
|
|
442
|
-
console.log('')
|
|
443
|
-
|
|
444
|
-
if (!report.hasNpm) {
|
|
445
|
-
console.log(`${RED}❌ npm global installation not found${NC}`)
|
|
446
|
-
console.log('')
|
|
447
|
-
console.log(`${CYAN}Install prjct-cli via npm first:${NC}`)
|
|
448
|
-
console.log(` ${GREEN}npm install -g prjct-cli${NC}`)
|
|
449
|
-
console.log('')
|
|
450
|
-
return report
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
console.log(`${CYAN}🔄 Migrating to npm installation...${NC}`)
|
|
454
|
-
console.log('')
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
// Step 1: Migrate projects data
|
|
458
|
-
if (verbose) console.log(` ${DIM}Migrating projects data...${NC}`)
|
|
459
|
-
const projectsMigration = await this.migrateProjectsData()
|
|
460
|
-
report.steps.projectsMigrated = projectsMigration.projectsMigrated
|
|
461
|
-
report.messages.push(projectsMigration.message)
|
|
462
|
-
if (verbose) {
|
|
463
|
-
if (projectsMigration.success) {
|
|
464
|
-
console.log(` ${GREEN}✓${NC} ${projectsMigration.message}`)
|
|
465
|
-
} else {
|
|
466
|
-
console.log(` ${RED}✗${NC} ${projectsMigration.message}`)
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Step 2: Clean legacy installation
|
|
471
|
-
if (verbose) console.log(` ${DIM}Removing legacy files...${NC}`)
|
|
472
|
-
const installCleanup = await this.cleanupLegacyInstallation()
|
|
473
|
-
report.steps.installationCleaned = installCleanup.success
|
|
474
|
-
report.messages.push(installCleanup.message)
|
|
475
|
-
if (verbose) {
|
|
476
|
-
if (installCleanup.success) {
|
|
477
|
-
console.log(` ${GREEN}✓${NC} ${installCleanup.message}`)
|
|
478
|
-
} else {
|
|
479
|
-
console.log(` ${RED}✗${NC} ${installCleanup.message}`)
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
// Step 3: Clean PATH entries
|
|
484
|
-
if (verbose) console.log(` ${DIM}Cleaning shell PATH...${NC}`)
|
|
485
|
-
const pathCleanup = await this.cleanupLegacyPATH()
|
|
486
|
-
report.steps.pathCleaned = pathCleanup.success
|
|
487
|
-
report.messages.push(pathCleanup.message)
|
|
488
|
-
if (verbose) {
|
|
489
|
-
if (pathCleanup.success) {
|
|
490
|
-
console.log(` ${GREEN}✓${NC} ${pathCleanup.message}`)
|
|
491
|
-
} else {
|
|
492
|
-
console.log(` ${RED}✗${NC} ${pathCleanup.message}`)
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// Step 4: Clean symlinks
|
|
497
|
-
if (verbose) console.log(` ${DIM}Cleaning symlinks...${NC}`)
|
|
498
|
-
const symlinkCleanup = await this.cleanupLegacySymlinks()
|
|
499
|
-
report.steps.symlinksCleaned = symlinkCleanup.success
|
|
500
|
-
report.messages.push(symlinkCleanup.message)
|
|
501
|
-
if (verbose) {
|
|
502
|
-
if (symlinkCleanup.success) {
|
|
503
|
-
console.log(` ${GREEN}✓${NC} ${symlinkCleanup.message}`)
|
|
504
|
-
} else {
|
|
505
|
-
console.log(` ${RED}✗${NC} ${symlinkCleanup.message}`)
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
if (verbose) {
|
|
510
|
-
console.log('')
|
|
511
|
-
console.log(`${GREEN}✨ Migration complete!${NC}`)
|
|
512
|
-
console.log('')
|
|
513
|
-
console.log(`${DIM}Next steps:${NC}`)
|
|
514
|
-
if (pathCleanup.filesModified > 0) {
|
|
515
|
-
console.log(` ${CYAN}1. Reload your shell:${NC}`)
|
|
516
|
-
console.log(` source ~/.zshrc ${DIM}(or ~/.bashrc)${NC}`)
|
|
517
|
-
console.log('')
|
|
518
|
-
}
|
|
519
|
-
console.log(` ${CYAN}${pathCleanup.filesModified > 0 ? '2' : '1'}. Verify installation:${NC}`)
|
|
520
|
-
console.log(` which prjct ${DIM}(should show npm path)${NC}`)
|
|
521
|
-
console.log(` prjct --version`)
|
|
522
|
-
console.log('')
|
|
523
|
-
console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
|
|
524
|
-
console.log('')
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
report.success = true
|
|
528
|
-
return report
|
|
529
|
-
} catch (error) {
|
|
530
|
-
report.messages.push(`Cleanup failed: ${error.message}`)
|
|
531
|
-
return report
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* Quick check - silent, returns true if cleanup needed
|
|
537
|
-
* @returns {Promise<boolean>}
|
|
538
|
-
*/
|
|
539
|
-
async needsCleanup() {
|
|
540
|
-
const hasLegacy = await this.hasLegacyInstallation()
|
|
541
|
-
const hasNpm = await this.hasNpmInstallation()
|
|
542
|
-
return hasLegacy && hasNpm
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
module.exports = new LegacyInstallerDetector()
|