prjct-cli 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +81 -25
- package/bin/dev.js +1 -1
- package/bin/generate-views.js +209 -0
- package/bin/migrate-to-json.js +742 -0
- package/bin/prjct +5 -5
- package/bin/serve.js +226 -50
- package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
- package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
- package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
- package/core/__tests__/utils/{date-helper.test.js → date-helper.test.ts} +19 -30
- package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
- package/core/agentic/agent-router.ts +137 -0
- package/core/agentic/chain-of-thought.ts +228 -0
- package/core/agentic/command-executor/command-executor.ts +384 -0
- package/core/agentic/command-executor/index.ts +16 -0
- package/core/agentic/command-executor/status-signal.ts +38 -0
- package/core/agentic/command-executor/types.ts +79 -0
- package/core/agentic/command-executor.ts +8 -0
- package/core/agentic/{context-builder.js → context-builder.ts} +92 -81
- package/core/agentic/context-filter.ts +365 -0
- package/core/agentic/ground-truth/index.ts +76 -0
- package/core/agentic/ground-truth/types.ts +33 -0
- package/core/agentic/ground-truth/utils.ts +48 -0
- package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
- package/core/agentic/ground-truth/verifiers/done.ts +75 -0
- package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
- package/core/agentic/ground-truth/verifiers/index.ts +37 -0
- package/core/agentic/ground-truth/verifiers/init.ts +52 -0
- package/core/agentic/ground-truth/verifiers/now.ts +57 -0
- package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
- package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
- package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
- package/core/agentic/ground-truth/verifiers.ts +6 -0
- package/core/agentic/ground-truth.ts +8 -0
- package/core/agentic/loop-detector/error-analysis.ts +97 -0
- package/core/agentic/loop-detector/hallucination.ts +71 -0
- package/core/agentic/loop-detector/index.ts +41 -0
- package/core/agentic/loop-detector/loop-detector.ts +222 -0
- package/core/agentic/loop-detector/types.ts +66 -0
- package/core/agentic/loop-detector.ts +8 -0
- package/core/agentic/memory-system/history.ts +53 -0
- package/core/agentic/memory-system/index.ts +192 -0
- package/core/agentic/memory-system/patterns.ts +156 -0
- package/core/agentic/memory-system/semantic-memories.ts +277 -0
- package/core/agentic/memory-system/session.ts +21 -0
- package/core/agentic/memory-system/types.ts +159 -0
- package/core/agentic/memory-system.ts +8 -0
- package/core/agentic/parallel-tools.ts +165 -0
- package/core/agentic/plan-mode/approval.ts +57 -0
- package/core/agentic/plan-mode/constants.ts +44 -0
- package/core/agentic/plan-mode/index.ts +28 -0
- package/core/agentic/plan-mode/plan-mode.ts +406 -0
- package/core/agentic/plan-mode/types.ts +193 -0
- package/core/agentic/plan-mode.ts +8 -0
- package/core/agentic/prompt-builder.ts +566 -0
- package/core/agentic/response-templates.ts +164 -0
- package/core/agentic/semantic-compression.ts +273 -0
- package/core/agentic/services.ts +206 -0
- package/core/agentic/smart-context.ts +476 -0
- package/core/agentic/{template-loader.js → template-loader.ts} +27 -16
- package/core/agentic/think-blocks.ts +202 -0
- package/core/agentic/tool-registry.ts +119 -0
- package/core/agentic/validation-rules.ts +313 -0
- package/core/agents/index.ts +28 -0
- package/core/agents/performance.ts +444 -0
- package/core/agents/types.ts +126 -0
- package/core/bus/{index.js → index.ts} +57 -61
- package/core/command-registry/categories.ts +23 -0
- package/core/command-registry/commands.ts +15 -0
- package/core/command-registry/core-commands.ts +319 -0
- package/core/command-registry/index.ts +158 -0
- package/core/command-registry/optional-commands.ts +119 -0
- package/core/command-registry/setup-commands.ts +53 -0
- package/core/command-registry/types.ts +59 -0
- package/core/command-registry.ts +9 -0
- package/core/commands/analysis.ts +298 -0
- package/core/commands/analytics.ts +288 -0
- package/core/commands/base.ts +273 -0
- package/core/commands/index.ts +211 -0
- package/core/commands/maintenance.ts +226 -0
- package/core/commands/planning.ts +311 -0
- package/core/commands/setup.ts +309 -0
- package/core/commands/shipping.ts +188 -0
- package/core/commands/types.ts +183 -0
- package/core/commands/workflow.ts +226 -0
- package/core/commands.ts +11 -0
- package/core/constants/formats.ts +187 -0
- package/core/constants/index.ts +7 -0
- package/core/{context-sync.js → context-sync.ts} +59 -26
- package/core/data/agents-manager.ts +76 -0
- package/core/data/analysis-manager.ts +83 -0
- package/core/data/base-manager.ts +156 -0
- package/core/data/ideas-manager.ts +81 -0
- package/core/data/index.ts +32 -0
- package/core/data/outcomes-manager.ts +96 -0
- package/core/data/project-manager.ts +75 -0
- package/core/data/roadmap-manager.ts +118 -0
- package/core/data/shipped-manager.ts +65 -0
- package/core/data/state-manager.ts +214 -0
- package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
- package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
- package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
- package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
- package/core/domain/{analyzer.js → analyzer.ts} +91 -85
- package/core/domain/{architect-session.js → architect-session.ts} +49 -34
- package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
- package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
- package/core/domain/{product-standards.js → product-standards.ts} +40 -26
- package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
- package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
- package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
- package/core/domain/task-stack/index.ts +19 -0
- package/core/domain/task-stack/parser.ts +86 -0
- package/core/domain/task-stack/storage.ts +123 -0
- package/core/domain/task-stack/task-stack.ts +340 -0
- package/core/domain/task-stack/types.ts +51 -0
- package/core/domain/task-stack.ts +8 -0
- package/core/{index.js → index.ts} +61 -18
- package/core/infrastructure/{agent-detector.js → agent-detector.ts} +55 -19
- package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
- package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
- package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
- package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
- package/core/infrastructure/command-installer/global-config.ts +106 -0
- package/core/infrastructure/command-installer/index.ts +25 -0
- package/core/infrastructure/command-installer/types.ts +41 -0
- package/core/infrastructure/command-installer.ts +8 -0
- package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
- package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
- package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
- package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
- package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
- package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
- package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
- package/core/infrastructure/legacy-installer-detector.ts +7 -0
- package/core/infrastructure/migrator/file-operations.ts +125 -0
- package/core/infrastructure/migrator/index.ts +288 -0
- package/core/infrastructure/migrator/project-scanner.ts +89 -0
- package/core/infrastructure/migrator/reports.ts +117 -0
- package/core/infrastructure/migrator/types.ts +124 -0
- package/core/infrastructure/migrator/validation.ts +94 -0
- package/core/infrastructure/migrator/version-migration.ts +117 -0
- package/core/infrastructure/migrator.ts +10 -0
- package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
- package/core/infrastructure/session-manager/index.ts +23 -0
- package/core/infrastructure/session-manager/migration.ts +88 -0
- package/core/infrastructure/session-manager/session-manager.ts +307 -0
- package/core/infrastructure/session-manager/types.ts +45 -0
- package/core/infrastructure/session-manager.ts +8 -0
- package/core/infrastructure/{setup.js → setup.ts} +29 -21
- package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
- package/core/outcomes/analyzer.ts +333 -0
- package/core/outcomes/index.ts +34 -0
- package/core/outcomes/recorder.ts +194 -0
- package/core/outcomes/types.ts +145 -0
- package/core/plugin/{hooks.js → hooks.ts} +56 -58
- package/core/plugin/{index.js → index.ts} +19 -8
- package/core/plugin/{loader.js → loader.ts} +87 -69
- package/core/plugin/{registry.js → registry.ts} +49 -45
- package/core/plugins/{webhook.js → webhook.ts} +43 -27
- package/core/schemas/agents.ts +27 -0
- package/core/schemas/analysis.ts +41 -0
- package/core/schemas/ideas.ts +83 -0
- package/core/schemas/index.ts +73 -0
- package/core/schemas/outcomes.ts +22 -0
- package/core/schemas/project.ts +26 -0
- package/core/schemas/roadmap.ts +90 -0
- package/core/schemas/shipped.ts +82 -0
- package/core/schemas/state.ts +107 -0
- package/core/session/index.ts +17 -0
- package/core/session/{metrics.js → metrics.ts} +64 -46
- package/core/session/{index.js → session-manager.ts} +51 -117
- package/core/session/types.ts +29 -0
- package/core/session/utils.ts +57 -0
- package/core/state/index.ts +25 -0
- package/core/state/manager.ts +376 -0
- package/core/state/types.ts +185 -0
- package/core/tsconfig.json +22 -0
- package/core/types/index.ts +506 -0
- package/core/utils/{animations.js → animations.ts} +74 -28
- package/core/utils/{branding.js → branding.ts} +29 -4
- package/core/utils/{date-helper.js → date-helper.ts} +31 -74
- package/core/utils/file-helper.ts +262 -0
- package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
- package/core/utils/{logger.js → logger.ts} +24 -12
- package/core/utils/{output.js → output.ts} +25 -13
- package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
- package/core/utils/{session-helper.js → session-helper.ts} +79 -66
- package/core/utils/{version.js → version.ts} +23 -31
- package/core/view-generator.ts +536 -0
- package/package.json +23 -17
- package/packages/shared/.turbo/turbo-build.log +14 -0
- package/packages/shared/dist/index.d.ts +8 -613
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +4110 -118
- package/packages/shared/dist/schemas.d.ts +408 -0
- package/packages/shared/dist/schemas.d.ts.map +1 -0
- package/packages/shared/dist/types.d.ts +144 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/unified.d.ts +139 -0
- package/packages/shared/dist/unified.d.ts.map +1 -0
- package/packages/shared/dist/utils.d.ts +60 -0
- package/packages/shared/dist/utils.d.ts.map +1 -0
- package/packages/shared/package.json +4 -4
- package/packages/shared/src/index.ts +1 -0
- package/packages/shared/src/unified.ts +174 -0
- package/packages/web/app/api/claude/sessions/route.ts +1 -1
- package/packages/web/app/api/claude/status/route.ts +1 -1
- package/packages/web/app/api/migrate/route.ts +46 -0
- package/packages/web/app/api/projects/[id]/route.ts +1 -1
- package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
- package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
- package/packages/web/app/api/projects/route.ts +1 -1
- package/packages/web/app/api/settings/route.ts +97 -0
- package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
- package/packages/web/app/globals.css +38 -0
- package/packages/web/app/layout.tsx +10 -2
- package/packages/web/app/page.tsx +9 -224
- package/packages/web/app/project/[id]/page.tsx +191 -63
- package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
- package/packages/web/app/project/[id]/stats/page.tsx +204 -163
- package/packages/web/app/settings/page.tsx +222 -2
- package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
- package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
- package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
- package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
- package/packages/web/components/ActivityTimeline/index.ts +2 -0
- package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
- package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
- package/packages/web/components/AgentsCard/index.ts +2 -0
- package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
- package/packages/web/components/AppSidebar/index.ts +1 -0
- package/packages/web/components/BackLink/BackLink.tsx +18 -0
- package/packages/web/components/BackLink/BackLink.types.ts +5 -0
- package/packages/web/components/BackLink/index.ts +2 -0
- package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
- package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
- package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
- package/packages/web/components/BentoCard/index.ts +2 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
- package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
- package/packages/web/components/{stats → BentoGrid}/BentoGrid.tsx +4 -8
- package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
- package/packages/web/components/BentoGrid/index.ts +2 -0
- package/packages/web/components/CommandButton/index.ts +1 -0
- package/packages/web/components/ConnectionStatus/index.ts +1 -0
- package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
- package/packages/web/components/DashboardContent/index.ts +1 -0
- package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
- package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
- package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
- package/packages/web/components/DateGroup/index.ts +2 -0
- package/packages/web/components/{stats → EmptyState}/EmptyState.tsx +1 -10
- package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
- package/packages/web/components/EmptyState/index.ts +2 -0
- package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
- package/packages/web/components/EventRow/EventRow.tsx +49 -0
- package/packages/web/components/EventRow/EventRow.types.ts +7 -0
- package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
- package/packages/web/components/EventRow/index.ts +2 -0
- package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
- package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
- package/packages/web/components/ExpandButton/index.ts +2 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
- package/packages/web/components/HealthGradientBackground/index.ts +2 -0
- package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
- package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
- package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
- package/packages/web/components/HeroSection/hooks/index.ts +2 -0
- package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
- package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
- package/packages/web/components/HeroSection/index.ts +2 -0
- package/packages/web/components/{stats → IdeasCard}/IdeasCard.tsx +3 -14
- package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
- package/packages/web/components/IdeasCard/index.ts +2 -0
- package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
- package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
- package/packages/web/components/InsightMessage/index.ts +2 -0
- package/packages/web/components/Logo/index.ts +1 -0
- package/packages/web/components/MarkdownContent/index.ts +1 -0
- package/packages/web/components/NowCard/NowCard.tsx +93 -0
- package/packages/web/components/NowCard/NowCard.types.ts +15 -0
- package/packages/web/components/NowCard/index.ts +2 -0
- package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
- package/packages/web/components/{stats → ProgressRing}/ProgressRing.tsx +4 -27
- package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
- package/packages/web/components/ProgressRing/index.ts +2 -0
- package/packages/web/components/ProjectAvatar/index.ts +1 -0
- package/packages/web/components/Providers/index.ts +1 -0
- package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
- package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
- package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
- package/packages/web/components/QueueCard/index.ts +2 -0
- package/packages/web/components/{stats → RoadmapCard}/RoadmapCard.tsx +3 -23
- package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
- package/packages/web/components/RoadmapCard/index.ts +2 -0
- package/packages/web/components/{stats → ShipsCard}/ShipsCard.tsx +4 -22
- package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
- package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
- package/packages/web/components/ShipsCard/index.ts +2 -0
- package/packages/web/components/{stats → SparklineChart}/SparklineChart.tsx +1 -7
- package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
- package/packages/web/components/SparklineChart/index.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
- package/packages/web/components/{stats → StreakCard}/StreakCard.tsx +5 -11
- package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
- package/packages/web/components/StreakCard/index.ts +2 -0
- package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
- package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
- package/packages/web/components/TasksCounter/index.ts +2 -0
- package/packages/web/components/TechStackBadges/index.ts +1 -0
- package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
- package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
- package/packages/web/components/TerminalTabs/index.ts +1 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
- package/packages/web/components/VelocityBadge/index.ts +2 -0
- package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
- package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
- package/packages/web/components/VelocityCard/index.ts +2 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
- package/packages/web/components/WeeklySparkline/index.ts +2 -0
- package/packages/web/components/ui/input.tsx +21 -0
- package/packages/web/context/TerminalTabsContext.tsx +46 -1
- package/packages/web/hooks/useClaudeTerminal.ts +71 -21
- package/packages/web/hooks/useProjectStats.ts +55 -0
- package/packages/web/hooks/useProjects.ts +6 -6
- package/packages/web/lib/actions/projects.ts +15 -0
- package/packages/web/lib/json-loader.ts +630 -0
- package/packages/web/lib/services/index.ts +9 -0
- package/packages/web/lib/services/migration.server.ts +598 -0
- package/packages/web/lib/services/projects.server.ts +52 -0
- package/packages/web/lib/services/stats.server.ts +264 -0
- package/packages/web/lib/unified-loader.ts +396 -0
- package/packages/web/package.json +10 -7
- package/packages/web/server.ts +36 -6
- package/templates/commands/done.md +76 -32
- package/templates/commands/feature.md +121 -47
- package/templates/commands/idea.md +81 -8
- package/templates/commands/now.md +41 -17
- package/templates/commands/ship.md +64 -25
- package/templates/commands/sync.md +28 -3
- package/core/agentic/agent-router.js +0 -140
- package/core/agentic/chain-of-thought.js +0 -578
- package/core/agentic/command-executor.js +0 -417
- package/core/agentic/context-filter.js +0 -354
- package/core/agentic/ground-truth.js +0 -591
- package/core/agentic/loop-detector.js +0 -406
- package/core/agentic/memory-system.js +0 -845
- package/core/agentic/parallel-tools.js +0 -366
- package/core/agentic/plan-mode.js +0 -572
- package/core/agentic/prompt-builder.js +0 -352
- package/core/agentic/response-templates.js +0 -290
- package/core/agentic/semantic-compression.js +0 -517
- package/core/agentic/think-blocks.js +0 -657
- package/core/agentic/tool-registry.js +0 -184
- package/core/agentic/validation-rules.js +0 -380
- package/core/command-registry.js +0 -698
- package/core/commands.js +0 -2237
- package/core/domain/task-stack.js +0 -497
- package/core/infrastructure/legacy-installer-detector.js +0 -546
- package/core/infrastructure/migrator.js +0 -796
- package/core/infrastructure/session-manager.js +0 -390
- package/core/utils/file-helper.js +0 -329
- package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
- package/packages/web/app/api/stats/route.ts +0 -38
- package/packages/web/components/AppSidebar.tsx +0 -113
- package/packages/web/components/stats/ActivityTimeline.tsx +0 -201
- package/packages/web/components/stats/AgentsCard.tsx +0 -56
- package/packages/web/components/stats/BentoCard.tsx +0 -88
- package/packages/web/components/stats/HeroSection.tsx +0 -172
- package/packages/web/components/stats/NowCard.tsx +0 -71
- package/packages/web/components/stats/QueueCard.tsx +0 -58
- package/packages/web/components/stats/VelocityCard.tsx +0 -60
- package/packages/web/components/stats/index.ts +0 -17
- package/packages/web/hooks/useStats.ts +0 -28
- /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
- /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
- /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
- /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
- /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
- /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
- /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
|
@@ -1,29 +1,31 @@
|
|
|
1
|
-
const fs = require('fs').promises
|
|
2
|
-
const path = require('path')
|
|
3
|
-
const os = require('os')
|
|
4
|
-
|
|
5
1
|
/**
|
|
6
|
-
* CommandInstaller
|
|
7
|
-
*
|
|
8
|
-
* 100% Claude-focused architecture
|
|
9
|
-
* Handles installation and synchronization of /p:* commands
|
|
10
|
-
* to Claude's native slash command system
|
|
11
|
-
*
|
|
12
|
-
* @version 0.5.0
|
|
2
|
+
* CommandInstaller Class
|
|
3
|
+
* Installs prjct commands to Claude (Code + Desktop)
|
|
13
4
|
*/
|
|
14
|
-
|
|
5
|
+
|
|
6
|
+
import fs from 'fs/promises'
|
|
7
|
+
import path from 'path'
|
|
8
|
+
import os from 'os'
|
|
9
|
+
import type { InstallResult, UninstallResult, CheckResult, SyncResult, GlobalConfigResult } from './types'
|
|
10
|
+
import { installGlobalConfig } from './global-config'
|
|
11
|
+
|
|
12
|
+
export class CommandInstaller {
|
|
13
|
+
homeDir: string
|
|
14
|
+
claudeCommandsPath: string
|
|
15
|
+
claudeConfigPath: string
|
|
16
|
+
templatesDir: string
|
|
17
|
+
|
|
15
18
|
constructor() {
|
|
16
19
|
this.homeDir = os.homedir()
|
|
17
20
|
this.claudeCommandsPath = path.join(this.homeDir, '.claude', 'commands', 'p')
|
|
18
21
|
this.claudeConfigPath = path.join(this.homeDir, '.claude')
|
|
19
|
-
this.templatesDir = path.join(__dirname, '..', '..', 'templates', 'commands')
|
|
22
|
+
this.templatesDir = path.join(__dirname, '..', '..', '..', 'templates', 'commands')
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
/**
|
|
23
26
|
* Detect if Claude is installed
|
|
24
|
-
* @returns {Promise<boolean>} True if Claude directory exists
|
|
25
27
|
*/
|
|
26
|
-
async detectClaude() {
|
|
28
|
+
async detectClaude(): Promise<boolean> {
|
|
27
29
|
try {
|
|
28
30
|
await fs.access(this.claudeConfigPath)
|
|
29
31
|
return true
|
|
@@ -34,13 +36,12 @@ class CommandInstaller {
|
|
|
34
36
|
|
|
35
37
|
/**
|
|
36
38
|
* Get list of command files to install
|
|
37
|
-
* @returns {Promise<string[]>} Array of command filenames
|
|
38
39
|
*/
|
|
39
|
-
async getCommandFiles() {
|
|
40
|
+
async getCommandFiles(): Promise<string[]> {
|
|
40
41
|
try {
|
|
41
42
|
const files = await fs.readdir(this.templatesDir)
|
|
42
43
|
return files.filter((f) => f.endsWith('.md'))
|
|
43
|
-
} catch
|
|
44
|
+
} catch {
|
|
44
45
|
// Fallback to core commands if template directory not accessible
|
|
45
46
|
return [
|
|
46
47
|
'init.md',
|
|
@@ -68,9 +69,8 @@ class CommandInstaller {
|
|
|
68
69
|
|
|
69
70
|
/**
|
|
70
71
|
* Install commands to Claude
|
|
71
|
-
* @returns {Promise<Object>} Installation results
|
|
72
72
|
*/
|
|
73
|
-
async installCommands() {
|
|
73
|
+
async installCommands(): Promise<InstallResult> {
|
|
74
74
|
const claudeDetected = await this.detectClaude()
|
|
75
75
|
|
|
76
76
|
if (!claudeDetected) {
|
|
@@ -85,8 +85,8 @@ class CommandInstaller {
|
|
|
85
85
|
await fs.mkdir(this.claudeCommandsPath, { recursive: true })
|
|
86
86
|
|
|
87
87
|
const commandFiles = await this.getCommandFiles()
|
|
88
|
-
const installed = []
|
|
89
|
-
const errors = []
|
|
88
|
+
const installed: string[] = []
|
|
89
|
+
const errors: Array<{ file: string; error: string }> = []
|
|
90
90
|
|
|
91
91
|
for (const file of commandFiles) {
|
|
92
92
|
try {
|
|
@@ -98,7 +98,7 @@ class CommandInstaller {
|
|
|
98
98
|
|
|
99
99
|
installed.push(file.replace('.md', ''))
|
|
100
100
|
} catch (error) {
|
|
101
|
-
errors.push({ file, error: error.message })
|
|
101
|
+
errors.push({ file, error: (error as Error).message })
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
@@ -111,20 +111,19 @@ class CommandInstaller {
|
|
|
111
111
|
} catch (error) {
|
|
112
112
|
return {
|
|
113
113
|
success: false,
|
|
114
|
-
error: error.message,
|
|
114
|
+
error: (error as Error).message,
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
120
|
* Uninstall commands from Claude
|
|
121
|
-
* @returns {Promise<Object>} Uninstallation results
|
|
122
121
|
*/
|
|
123
|
-
async uninstallCommands() {
|
|
122
|
+
async uninstallCommands(): Promise<UninstallResult> {
|
|
124
123
|
try {
|
|
125
124
|
const commandFiles = await this.getCommandFiles()
|
|
126
|
-
const uninstalled = []
|
|
127
|
-
const errors = []
|
|
125
|
+
const uninstalled: string[] = []
|
|
126
|
+
const errors: Array<{ file: string; error: string }> = []
|
|
128
127
|
|
|
129
128
|
for (const file of commandFiles) {
|
|
130
129
|
try {
|
|
@@ -132,8 +131,8 @@ class CommandInstaller {
|
|
|
132
131
|
await fs.unlink(filePath)
|
|
133
132
|
uninstalled.push(file.replace('.md', ''))
|
|
134
133
|
} catch (error) {
|
|
135
|
-
if (error.code !== 'ENOENT') {
|
|
136
|
-
errors.push({ file, error: error.message })
|
|
134
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {
|
|
135
|
+
errors.push({ file, error: (error as Error).message })
|
|
137
136
|
}
|
|
138
137
|
}
|
|
139
138
|
}
|
|
@@ -153,16 +152,15 @@ class CommandInstaller {
|
|
|
153
152
|
} catch (error) {
|
|
154
153
|
return {
|
|
155
154
|
success: false,
|
|
156
|
-
error: error.message,
|
|
155
|
+
error: (error as Error).message,
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
}
|
|
160
159
|
|
|
161
160
|
/**
|
|
162
161
|
* Check if commands are already installed
|
|
163
|
-
* @returns {Promise<Object>} Installation status
|
|
164
162
|
*/
|
|
165
|
-
async checkInstallation() {
|
|
163
|
+
async checkInstallation(): Promise<CheckResult> {
|
|
166
164
|
const claudeDetected = await this.detectClaude()
|
|
167
165
|
|
|
168
166
|
if (!claudeDetected) {
|
|
@@ -196,13 +194,12 @@ class CommandInstaller {
|
|
|
196
194
|
|
|
197
195
|
/**
|
|
198
196
|
* Update commands (reinstall with latest templates)
|
|
199
|
-
* @returns {Promise<Object>} Update results
|
|
200
197
|
*/
|
|
201
|
-
async updateCommands() {
|
|
198
|
+
async updateCommands(): Promise<InstallResult> {
|
|
202
199
|
// Simply reinstall - will overwrite with latest templates
|
|
203
200
|
console.log('🔄 Updating commands with latest templates...')
|
|
204
201
|
const result = await this.installCommands()
|
|
205
|
-
if (result.success) {
|
|
202
|
+
if (result.success && result.installed) {
|
|
206
203
|
console.log(`✅ Updated ${result.installed.length} commands`)
|
|
207
204
|
}
|
|
208
205
|
return result
|
|
@@ -210,26 +207,22 @@ class CommandInstaller {
|
|
|
210
207
|
|
|
211
208
|
/**
|
|
212
209
|
* Install to all detected editors (alias for installCommands)
|
|
213
|
-
* @returns {Promise<Object>} Installation results
|
|
214
210
|
*/
|
|
215
|
-
async installToAll() {
|
|
211
|
+
async installToAll(): Promise<InstallResult> {
|
|
216
212
|
return await this.installCommands()
|
|
217
213
|
}
|
|
218
214
|
|
|
219
215
|
/**
|
|
220
216
|
* Get installation path for Claude commands
|
|
221
|
-
* @returns {string} Path to Claude commands directory
|
|
222
217
|
*/
|
|
223
|
-
getInstallPath() {
|
|
218
|
+
getInstallPath(): string {
|
|
224
219
|
return this.claudeCommandsPath
|
|
225
220
|
}
|
|
226
221
|
|
|
227
222
|
/**
|
|
228
223
|
* Verify command template exists
|
|
229
|
-
* @param {string} commandName - Command name (without .md extension)
|
|
230
|
-
* @returns {Promise<boolean>} True if template exists
|
|
231
224
|
*/
|
|
232
|
-
async verifyTemplate(commandName) {
|
|
225
|
+
async verifyTemplate(commandName: string): Promise<boolean> {
|
|
233
226
|
try {
|
|
234
227
|
const templatePath = path.join(this.templatesDir, `${commandName}.md`)
|
|
235
228
|
await fs.access(templatePath)
|
|
@@ -241,9 +234,8 @@ class CommandInstaller {
|
|
|
241
234
|
|
|
242
235
|
/**
|
|
243
236
|
* Sync commands - intelligent update that detects and removes orphans
|
|
244
|
-
* @returns {Promise<Object>} Sync results with added, updated, removed counts
|
|
245
237
|
*/
|
|
246
|
-
async syncCommands() {
|
|
238
|
+
async syncCommands(): Promise<SyncResult> {
|
|
247
239
|
const claudeDetected = await this.detectClaude()
|
|
248
240
|
|
|
249
241
|
if (!claudeDetected) {
|
|
@@ -262,7 +254,7 @@ class CommandInstaller {
|
|
|
262
254
|
|
|
263
255
|
// Get current state
|
|
264
256
|
const templateFiles = await this.getCommandFiles()
|
|
265
|
-
let installedFiles = []
|
|
257
|
+
let installedFiles: string[] = []
|
|
266
258
|
|
|
267
259
|
try {
|
|
268
260
|
installedFiles = await fs.readdir(this.claudeCommandsPath)
|
|
@@ -272,7 +264,7 @@ class CommandInstaller {
|
|
|
272
264
|
installedFiles = []
|
|
273
265
|
}
|
|
274
266
|
|
|
275
|
-
const results = {
|
|
267
|
+
const results: SyncResult = {
|
|
276
268
|
success: true,
|
|
277
269
|
added: 0,
|
|
278
270
|
updated: 0,
|
|
@@ -299,7 +291,7 @@ class CommandInstaller {
|
|
|
299
291
|
results.updated++
|
|
300
292
|
}
|
|
301
293
|
} catch (error) {
|
|
302
|
-
results.errors
|
|
294
|
+
results.errors!.push({ file, error: (error as Error).message })
|
|
303
295
|
}
|
|
304
296
|
}
|
|
305
297
|
|
|
@@ -311,7 +303,7 @@ class CommandInstaller {
|
|
|
311
303
|
} catch (error) {
|
|
312
304
|
return {
|
|
313
305
|
success: false,
|
|
314
|
-
error: error.message,
|
|
306
|
+
error: (error as Error).message,
|
|
315
307
|
added: 0,
|
|
316
308
|
updated: 0,
|
|
317
309
|
removed: 0,
|
|
@@ -321,101 +313,8 @@ class CommandInstaller {
|
|
|
321
313
|
|
|
322
314
|
/**
|
|
323
315
|
* Install or update global CLAUDE.md configuration
|
|
324
|
-
* @returns {Promise<Object>} Result with success status and action taken
|
|
325
316
|
*/
|
|
326
|
-
async installGlobalConfig() {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
if (!claudeDetected) {
|
|
330
|
-
return {
|
|
331
|
-
success: false,
|
|
332
|
-
error: 'Claude not detected',
|
|
333
|
-
action: 'skipped',
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
try {
|
|
338
|
-
// Ensure ~/.claude directory exists
|
|
339
|
-
const claudeDir = path.join(require('os').homedir(), '.claude')
|
|
340
|
-
await fs.mkdir(claudeDir, { recursive: true })
|
|
341
|
-
|
|
342
|
-
const globalConfigPath = path.join(claudeDir, 'CLAUDE.md')
|
|
343
|
-
const templatePath = path.join(__dirname, '../../templates/global/CLAUDE.md')
|
|
344
|
-
|
|
345
|
-
// Read template content
|
|
346
|
-
const templateContent = await fs.readFile(templatePath, 'utf-8')
|
|
347
|
-
|
|
348
|
-
// Check if global config already exists
|
|
349
|
-
let existingContent = ''
|
|
350
|
-
let fileExists = false
|
|
351
|
-
|
|
352
|
-
try {
|
|
353
|
-
existingContent = await fs.readFile(globalConfigPath, 'utf-8')
|
|
354
|
-
fileExists = true
|
|
355
|
-
} catch {
|
|
356
|
-
// File doesn't exist, will create new
|
|
357
|
-
fileExists = false
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
if (!fileExists) {
|
|
361
|
-
// Create new file with full template
|
|
362
|
-
await fs.writeFile(globalConfigPath, templateContent, 'utf-8')
|
|
363
|
-
return {
|
|
364
|
-
success: true,
|
|
365
|
-
action: 'created',
|
|
366
|
-
path: globalConfigPath,
|
|
367
|
-
}
|
|
368
|
-
} else {
|
|
369
|
-
// File exists - perform intelligent merge
|
|
370
|
-
const startMarker = '<!-- prjct:start - DO NOT REMOVE THIS MARKER -->'
|
|
371
|
-
const endMarker = '<!-- prjct:end - DO NOT REMOVE THIS MARKER -->'
|
|
372
|
-
|
|
373
|
-
// Check if markers exist in existing file
|
|
374
|
-
const hasMarkers =
|
|
375
|
-
existingContent.includes(startMarker) && existingContent.includes(endMarker)
|
|
376
|
-
|
|
377
|
-
if (!hasMarkers) {
|
|
378
|
-
// No markers - append prjct section at the end
|
|
379
|
-
const updatedContent = existingContent + '\n\n' + templateContent
|
|
380
|
-
await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
|
|
381
|
-
return {
|
|
382
|
-
success: true,
|
|
383
|
-
action: 'appended',
|
|
384
|
-
path: globalConfigPath,
|
|
385
|
-
}
|
|
386
|
-
} else {
|
|
387
|
-
// Markers exist - replace content between markers
|
|
388
|
-
const beforeMarker = existingContent.substring(
|
|
389
|
-
0,
|
|
390
|
-
existingContent.indexOf(startMarker)
|
|
391
|
-
)
|
|
392
|
-
const afterMarker = existingContent.substring(
|
|
393
|
-
existingContent.indexOf(endMarker) + endMarker.length
|
|
394
|
-
)
|
|
395
|
-
|
|
396
|
-
// Extract prjct section from template
|
|
397
|
-
const prjctSection = templateContent.substring(
|
|
398
|
-
templateContent.indexOf(startMarker),
|
|
399
|
-
templateContent.indexOf(endMarker) + endMarker.length
|
|
400
|
-
)
|
|
401
|
-
|
|
402
|
-
const updatedContent = beforeMarker + prjctSection + afterMarker
|
|
403
|
-
await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
|
|
404
|
-
return {
|
|
405
|
-
success: true,
|
|
406
|
-
action: 'updated',
|
|
407
|
-
path: globalConfigPath,
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
} catch (error) {
|
|
412
|
-
return {
|
|
413
|
-
success: false,
|
|
414
|
-
error: error.message,
|
|
415
|
-
action: 'failed',
|
|
416
|
-
}
|
|
417
|
-
}
|
|
317
|
+
async installGlobalConfig(): Promise<GlobalConfigResult> {
|
|
318
|
+
return installGlobalConfig(this.claudeConfigPath, () => this.detectClaude())
|
|
418
319
|
}
|
|
419
320
|
}
|
|
420
|
-
|
|
421
|
-
module.exports = new CommandInstaller()
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Config Operations
|
|
3
|
+
* Install/update global CLAUDE.md configuration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from 'fs/promises'
|
|
7
|
+
import path from 'path'
|
|
8
|
+
import os from 'os'
|
|
9
|
+
import type { GlobalConfigResult } from './types'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Install or update global CLAUDE.md configuration
|
|
13
|
+
*/
|
|
14
|
+
export async function installGlobalConfig(
|
|
15
|
+
claudeConfigPath: string,
|
|
16
|
+
detectClaude: () => Promise<boolean>
|
|
17
|
+
): Promise<GlobalConfigResult> {
|
|
18
|
+
const claudeDetected = await detectClaude()
|
|
19
|
+
|
|
20
|
+
if (!claudeDetected) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: 'Claude not detected',
|
|
24
|
+
action: 'skipped',
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
// Ensure ~/.claude directory exists
|
|
30
|
+
const claudeDir = path.join(os.homedir(), '.claude')
|
|
31
|
+
await fs.mkdir(claudeDir, { recursive: true })
|
|
32
|
+
|
|
33
|
+
const globalConfigPath = path.join(claudeDir, 'CLAUDE.md')
|
|
34
|
+
const templatePath = path.join(__dirname, '../../../templates/global/CLAUDE.md')
|
|
35
|
+
|
|
36
|
+
// Read template content
|
|
37
|
+
const templateContent = await fs.readFile(templatePath, 'utf-8')
|
|
38
|
+
|
|
39
|
+
// Check if global config already exists
|
|
40
|
+
let existingContent = ''
|
|
41
|
+
let fileExists = false
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
existingContent = await fs.readFile(globalConfigPath, 'utf-8')
|
|
45
|
+
fileExists = true
|
|
46
|
+
} catch {
|
|
47
|
+
// File doesn't exist, will create new
|
|
48
|
+
fileExists = false
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!fileExists) {
|
|
52
|
+
// Create new file with full template
|
|
53
|
+
await fs.writeFile(globalConfigPath, templateContent, 'utf-8')
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
action: 'created',
|
|
57
|
+
path: globalConfigPath,
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
// File exists - perform intelligent merge
|
|
61
|
+
const startMarker = '<!-- prjct:start - DO NOT REMOVE THIS MARKER -->'
|
|
62
|
+
const endMarker = '<!-- prjct:end - DO NOT REMOVE THIS MARKER -->'
|
|
63
|
+
|
|
64
|
+
// Check if markers exist in existing file
|
|
65
|
+
const hasMarkers =
|
|
66
|
+
existingContent.includes(startMarker) && existingContent.includes(endMarker)
|
|
67
|
+
|
|
68
|
+
if (!hasMarkers) {
|
|
69
|
+
// No markers - append prjct section at the end
|
|
70
|
+
const updatedContent = existingContent + '\n\n' + templateContent
|
|
71
|
+
await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
|
|
72
|
+
return {
|
|
73
|
+
success: true,
|
|
74
|
+
action: 'appended',
|
|
75
|
+
path: globalConfigPath,
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
// Markers exist - replace content between markers
|
|
79
|
+
const beforeMarker = existingContent.substring(0, existingContent.indexOf(startMarker))
|
|
80
|
+
const afterMarker = existingContent.substring(
|
|
81
|
+
existingContent.indexOf(endMarker) + endMarker.length
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
// Extract prjct section from template
|
|
85
|
+
const prjctSection = templateContent.substring(
|
|
86
|
+
templateContent.indexOf(startMarker),
|
|
87
|
+
templateContent.indexOf(endMarker) + endMarker.length
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
const updatedContent = beforeMarker + prjctSection + afterMarker
|
|
91
|
+
await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
|
|
92
|
+
return {
|
|
93
|
+
success: true,
|
|
94
|
+
action: 'updated',
|
|
95
|
+
path: globalConfigPath,
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
error: (error as Error).message,
|
|
103
|
+
action: 'failed',
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandInstaller - Installs prjct commands to Claude (Code + Desktop)
|
|
3
|
+
*
|
|
4
|
+
* 100% Claude-focused architecture
|
|
5
|
+
* Handles installation and synchronization of /p:* commands
|
|
6
|
+
* to Claude's native slash command system
|
|
7
|
+
*
|
|
8
|
+
* @version 0.5.0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export type {
|
|
12
|
+
InstallResult,
|
|
13
|
+
UninstallResult,
|
|
14
|
+
CheckResult,
|
|
15
|
+
SyncResult,
|
|
16
|
+
GlobalConfigResult,
|
|
17
|
+
} from './types'
|
|
18
|
+
|
|
19
|
+
export { installGlobalConfig } from './global-config'
|
|
20
|
+
export { CommandInstaller } from './command-installer'
|
|
21
|
+
|
|
22
|
+
import { CommandInstaller } from './command-installer'
|
|
23
|
+
|
|
24
|
+
const commandInstaller = new CommandInstaller()
|
|
25
|
+
export default commandInstaller
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Installer Types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface InstallResult {
|
|
6
|
+
success: boolean
|
|
7
|
+
installed?: string[]
|
|
8
|
+
errors?: Array<{ file: string; error: string }>
|
|
9
|
+
path?: string
|
|
10
|
+
error?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UninstallResult {
|
|
14
|
+
success: boolean
|
|
15
|
+
uninstalled?: string[]
|
|
16
|
+
errors?: Array<{ file: string; error: string }>
|
|
17
|
+
error?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CheckResult {
|
|
21
|
+
installed: boolean
|
|
22
|
+
claudeDetected: boolean
|
|
23
|
+
commands?: string[]
|
|
24
|
+
path?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface SyncResult {
|
|
28
|
+
success: boolean
|
|
29
|
+
added: number
|
|
30
|
+
updated: number
|
|
31
|
+
removed: number
|
|
32
|
+
errors?: Array<{ file: string; error: string }>
|
|
33
|
+
error?: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface GlobalConfigResult {
|
|
37
|
+
success: boolean
|
|
38
|
+
action: string
|
|
39
|
+
path?: string
|
|
40
|
+
error?: string
|
|
41
|
+
}
|