prjct-cli 0.11.4 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -0
- package/README.md +81 -25
- package/bin/dev.js +1 -1
- package/bin/generate-views.js +209 -0
- package/bin/migrate-to-json.js +742 -0
- package/bin/prjct +5 -5
- package/bin/serve.js +246 -54
- package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
- package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
- package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
- package/core/__tests__/utils/date-helper.test.ts +405 -0
- package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
- package/core/agentic/agent-router.ts +137 -0
- package/core/agentic/chain-of-thought.ts +228 -0
- package/core/agentic/command-executor/command-executor.ts +384 -0
- package/core/agentic/command-executor/index.ts +16 -0
- package/core/agentic/command-executor/status-signal.ts +38 -0
- package/core/agentic/command-executor/types.ts +79 -0
- package/core/agentic/command-executor.ts +8 -0
- package/core/agentic/{context-builder.js → context-builder.ts} +99 -89
- package/core/agentic/context-filter.ts +365 -0
- package/core/agentic/ground-truth/index.ts +76 -0
- package/core/agentic/ground-truth/types.ts +33 -0
- package/core/agentic/ground-truth/utils.ts +48 -0
- package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
- package/core/agentic/ground-truth/verifiers/done.ts +75 -0
- package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
- package/core/agentic/ground-truth/verifiers/index.ts +37 -0
- package/core/agentic/ground-truth/verifiers/init.ts +52 -0
- package/core/agentic/ground-truth/verifiers/now.ts +57 -0
- package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
- package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
- package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
- package/core/agentic/ground-truth/verifiers.ts +6 -0
- package/core/agentic/ground-truth.ts +8 -0
- package/core/agentic/loop-detector/error-analysis.ts +97 -0
- package/core/agentic/loop-detector/hallucination.ts +71 -0
- package/core/agentic/loop-detector/index.ts +41 -0
- package/core/agentic/loop-detector/loop-detector.ts +222 -0
- package/core/agentic/loop-detector/types.ts +66 -0
- package/core/agentic/loop-detector.ts +8 -0
- package/core/agentic/memory-system/history.ts +53 -0
- package/core/agentic/memory-system/index.ts +192 -0
- package/core/agentic/memory-system/patterns.ts +156 -0
- package/core/agentic/memory-system/semantic-memories.ts +277 -0
- package/core/agentic/memory-system/session.ts +21 -0
- package/core/agentic/memory-system/types.ts +159 -0
- package/core/agentic/memory-system.ts +8 -0
- package/core/agentic/parallel-tools.ts +165 -0
- package/core/agentic/plan-mode/approval.ts +57 -0
- package/core/agentic/plan-mode/constants.ts +44 -0
- package/core/agentic/plan-mode/index.ts +28 -0
- package/core/agentic/plan-mode/plan-mode.ts +406 -0
- package/core/agentic/plan-mode/types.ts +193 -0
- package/core/agentic/plan-mode.ts +8 -0
- package/core/agentic/prompt-builder.ts +566 -0
- package/core/agentic/response-templates.ts +164 -0
- package/core/agentic/semantic-compression.ts +273 -0
- package/core/agentic/services.ts +206 -0
- package/core/agentic/smart-context.ts +476 -0
- package/core/agentic/{template-loader.js → template-loader.ts} +35 -18
- package/core/agentic/think-blocks.ts +202 -0
- package/core/agentic/tool-registry.ts +119 -0
- package/core/agentic/validation-rules.ts +313 -0
- package/core/agents/index.ts +28 -0
- package/core/agents/performance.ts +444 -0
- package/core/agents/types.ts +126 -0
- package/core/bus/{index.js → index.ts} +57 -61
- package/core/command-registry/categories.ts +23 -0
- package/core/command-registry/commands.ts +15 -0
- package/core/command-registry/core-commands.ts +319 -0
- package/core/command-registry/index.ts +158 -0
- package/core/command-registry/optional-commands.ts +119 -0
- package/core/command-registry/setup-commands.ts +53 -0
- package/core/command-registry/types.ts +59 -0
- package/core/command-registry.ts +9 -0
- package/core/commands/analysis.ts +298 -0
- package/core/commands/analytics.ts +288 -0
- package/core/commands/base.ts +273 -0
- package/core/commands/index.ts +211 -0
- package/core/commands/maintenance.ts +226 -0
- package/core/commands/planning.ts +311 -0
- package/core/commands/setup.ts +309 -0
- package/core/commands/shipping.ts +188 -0
- package/core/commands/types.ts +183 -0
- package/core/commands/workflow.ts +226 -0
- package/core/commands.ts +11 -0
- package/core/constants/formats.ts +187 -0
- package/core/constants/index.ts +7 -0
- package/core/{context-sync.js → context-sync.ts} +59 -26
- package/core/data/agents-manager.ts +76 -0
- package/core/data/analysis-manager.ts +83 -0
- package/core/data/base-manager.ts +156 -0
- package/core/data/ideas-manager.ts +81 -0
- package/core/data/index.ts +32 -0
- package/core/data/outcomes-manager.ts +96 -0
- package/core/data/project-manager.ts +75 -0
- package/core/data/roadmap-manager.ts +118 -0
- package/core/data/shipped-manager.ts +65 -0
- package/core/data/state-manager.ts +214 -0
- package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
- package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
- package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
- package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
- package/core/domain/{analyzer.js → analyzer.ts} +91 -85
- package/core/domain/{architect-session.js → architect-session.ts} +49 -34
- package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
- package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
- package/core/domain/{product-standards.js → product-standards.ts} +40 -26
- package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
- package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
- package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
- package/core/domain/task-stack/index.ts +19 -0
- package/core/domain/task-stack/parser.ts +86 -0
- package/core/domain/task-stack/storage.ts +123 -0
- package/core/domain/task-stack/task-stack.ts +340 -0
- package/core/domain/task-stack/types.ts +51 -0
- package/core/domain/task-stack.ts +8 -0
- package/core/{index.js → index.ts} +61 -18
- package/core/infrastructure/{agent-detector.js → agent-detector.ts} +62 -23
- package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
- package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
- package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
- package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
- package/core/infrastructure/command-installer/global-config.ts +106 -0
- package/core/infrastructure/command-installer/index.ts +25 -0
- package/core/infrastructure/command-installer/types.ts +41 -0
- package/core/infrastructure/command-installer.ts +8 -0
- package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
- package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
- package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
- package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
- package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
- package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
- package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
- package/core/infrastructure/legacy-installer-detector.ts +7 -0
- package/core/infrastructure/migrator/file-operations.ts +125 -0
- package/core/infrastructure/migrator/index.ts +288 -0
- package/core/infrastructure/migrator/project-scanner.ts +89 -0
- package/core/infrastructure/migrator/reports.ts +117 -0
- package/core/infrastructure/migrator/types.ts +124 -0
- package/core/infrastructure/migrator/validation.ts +94 -0
- package/core/infrastructure/migrator/version-migration.ts +117 -0
- package/core/infrastructure/migrator.ts +10 -0
- package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
- package/core/infrastructure/session-manager/index.ts +23 -0
- package/core/infrastructure/session-manager/migration.ts +88 -0
- package/core/infrastructure/session-manager/session-manager.ts +307 -0
- package/core/infrastructure/session-manager/types.ts +45 -0
- package/core/infrastructure/session-manager.ts +8 -0
- package/core/infrastructure/{setup.js → setup.ts} +29 -21
- package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
- package/core/outcomes/analyzer.ts +333 -0
- package/core/outcomes/index.ts +34 -0
- package/core/outcomes/recorder.ts +194 -0
- package/core/outcomes/types.ts +145 -0
- package/core/plugin/{hooks.js → hooks.ts} +56 -58
- package/core/plugin/{index.js → index.ts} +19 -8
- package/core/plugin/{loader.js → loader.ts} +87 -69
- package/core/plugin/{registry.js → registry.ts} +49 -45
- package/core/plugins/{webhook.js → webhook.ts} +43 -27
- package/core/schemas/agents.ts +27 -0
- package/core/schemas/analysis.ts +41 -0
- package/core/schemas/ideas.ts +83 -0
- package/core/schemas/index.ts +73 -0
- package/core/schemas/outcomes.ts +22 -0
- package/core/schemas/project.ts +26 -0
- package/core/schemas/roadmap.ts +90 -0
- package/core/schemas/shipped.ts +82 -0
- package/core/schemas/state.ts +107 -0
- package/core/session/index.ts +17 -0
- package/core/session/{metrics.js → metrics.ts} +64 -46
- package/core/session/{index.js → session-manager.ts} +51 -117
- package/core/session/types.ts +29 -0
- package/core/session/utils.ts +57 -0
- package/core/state/index.ts +25 -0
- package/core/state/manager.ts +376 -0
- package/core/state/types.ts +185 -0
- package/core/tsconfig.json +22 -0
- package/core/types/index.ts +506 -0
- package/core/utils/{animations.js → animations.ts} +74 -28
- package/core/utils/{branding.js → branding.ts} +29 -4
- package/core/utils/{date-helper.js → date-helper.ts} +31 -74
- package/core/utils/file-helper.ts +262 -0
- package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
- package/core/utils/{logger.js → logger.ts} +24 -12
- package/core/utils/{output.js → output.ts} +25 -13
- package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
- package/core/utils/{session-helper.js → session-helper.ts} +79 -66
- package/core/utils/{version.js → version.ts} +23 -31
- package/core/view-generator.ts +536 -0
- package/package.json +23 -17
- package/packages/shared/.turbo/turbo-build.log +14 -0
- package/packages/shared/dist/index.d.ts +8 -613
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +4110 -118
- package/packages/shared/dist/schemas.d.ts +408 -0
- package/packages/shared/dist/schemas.d.ts.map +1 -0
- package/packages/shared/dist/types.d.ts +144 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/unified.d.ts +139 -0
- package/packages/shared/dist/unified.d.ts.map +1 -0
- package/packages/shared/dist/utils.d.ts +60 -0
- package/packages/shared/dist/utils.d.ts.map +1 -0
- package/packages/shared/package.json +4 -4
- package/packages/shared/src/index.ts +1 -0
- package/packages/shared/src/unified.ts +174 -0
- package/packages/web/app/api/claude/sessions/route.ts +1 -1
- package/packages/web/app/api/claude/status/route.ts +1 -1
- package/packages/web/app/api/migrate/route.ts +46 -0
- package/packages/web/app/api/projects/[id]/route.ts +1 -1
- package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
- package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
- package/packages/web/app/api/projects/route.ts +1 -1
- package/packages/web/app/api/settings/route.ts +97 -0
- package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
- package/packages/web/app/globals.css +38 -0
- package/packages/web/app/layout.tsx +10 -2
- package/packages/web/app/page.tsx +9 -224
- package/packages/web/app/project/[id]/page.tsx +191 -63
- package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
- package/packages/web/app/project/[id]/stats/page.tsx +203 -403
- package/packages/web/app/settings/page.tsx +222 -2
- package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
- package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
- package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
- package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
- package/packages/web/components/ActivityTimeline/index.ts +2 -0
- package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
- package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
- package/packages/web/components/AgentsCard/index.ts +2 -0
- package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
- package/packages/web/components/AppSidebar/index.ts +1 -0
- package/packages/web/components/BackLink/BackLink.tsx +18 -0
- package/packages/web/components/BackLink/BackLink.types.ts +5 -0
- package/packages/web/components/BackLink/index.ts +2 -0
- package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
- package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
- package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
- package/packages/web/components/BentoCard/index.ts +2 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
- package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
- package/packages/web/components/BentoGrid/BentoGrid.tsx +18 -0
- package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
- package/packages/web/components/BentoGrid/index.ts +2 -0
- package/packages/web/components/CommandButton/index.ts +1 -0
- package/packages/web/components/ConnectionStatus/index.ts +1 -0
- package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
- package/packages/web/components/DashboardContent/index.ts +1 -0
- package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
- package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
- package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
- package/packages/web/components/DateGroup/index.ts +2 -0
- package/packages/web/components/EmptyState/EmptyState.tsx +58 -0
- package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
- package/packages/web/components/EmptyState/index.ts +2 -0
- package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
- package/packages/web/components/EventRow/EventRow.tsx +49 -0
- package/packages/web/components/EventRow/EventRow.types.ts +7 -0
- package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
- package/packages/web/components/EventRow/index.ts +2 -0
- package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
- package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
- package/packages/web/components/ExpandButton/index.ts +2 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
- package/packages/web/components/HealthGradientBackground/index.ts +2 -0
- package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
- package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
- package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
- package/packages/web/components/HeroSection/hooks/index.ts +2 -0
- package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
- package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
- package/packages/web/components/HeroSection/index.ts +2 -0
- package/packages/web/components/IdeasCard/IdeasCard.tsx +48 -0
- package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
- package/packages/web/components/IdeasCard/index.ts +2 -0
- package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
- package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
- package/packages/web/components/InsightMessage/index.ts +2 -0
- package/packages/web/components/Logo/index.ts +1 -0
- package/packages/web/components/MarkdownContent/index.ts +1 -0
- package/packages/web/components/NowCard/NowCard.tsx +93 -0
- package/packages/web/components/NowCard/NowCard.types.ts +15 -0
- package/packages/web/components/NowCard/index.ts +2 -0
- package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
- package/packages/web/components/ProgressRing/ProgressRing.tsx +51 -0
- package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
- package/packages/web/components/ProgressRing/index.ts +2 -0
- package/packages/web/components/ProjectAvatar/index.ts +1 -0
- package/packages/web/components/Providers/index.ts +1 -0
- package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
- package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
- package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
- package/packages/web/components/QueueCard/index.ts +2 -0
- package/packages/web/components/RoadmapCard/RoadmapCard.tsx +77 -0
- package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
- package/packages/web/components/RoadmapCard/index.ts +2 -0
- package/packages/web/components/ShipsCard/ShipsCard.tsx +52 -0
- package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
- package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
- package/packages/web/components/ShipsCard/index.ts +2 -0
- package/packages/web/components/SparklineChart/SparklineChart.tsx +38 -0
- package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
- package/packages/web/components/SparklineChart/index.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.tsx +53 -0
- package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
- package/packages/web/components/StreakCard/index.ts +2 -0
- package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
- package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
- package/packages/web/components/TasksCounter/index.ts +2 -0
- package/packages/web/components/TechStackBadges/index.ts +1 -0
- package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
- package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
- package/packages/web/components/TerminalTabs/index.ts +1 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
- package/packages/web/components/VelocityBadge/index.ts +2 -0
- package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
- package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
- package/packages/web/components/VelocityCard/index.ts +2 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
- package/packages/web/components/WeeklySparkline/index.ts +2 -0
- package/packages/web/components/ui/input.tsx +21 -0
- package/packages/web/components/ui/tooltip.tsx +2 -2
- package/packages/web/context/TerminalTabsContext.tsx +46 -1
- package/packages/web/hooks/useClaudeTerminal.ts +71 -21
- package/packages/web/hooks/useProjectStats.ts +55 -0
- package/packages/web/hooks/useProjects.ts +6 -6
- package/packages/web/lib/actions/projects.ts +15 -0
- package/packages/web/lib/json-loader.ts +630 -0
- package/packages/web/lib/services/index.ts +9 -0
- package/packages/web/lib/services/migration.server.ts +598 -0
- package/packages/web/lib/services/projects.server.ts +52 -0
- package/packages/web/lib/services/stats.server.ts +264 -0
- package/packages/web/lib/unified-loader.ts +396 -0
- package/packages/web/next-env.d.ts +1 -1
- package/packages/web/package.json +10 -6
- package/packages/web/server.ts +36 -6
- package/templates/commands/done.md +76 -32
- package/templates/commands/feature.md +121 -47
- package/templates/commands/idea.md +81 -8
- package/templates/commands/now.md +41 -17
- package/templates/commands/ship.md +64 -25
- package/templates/commands/sync.md +28 -3
- package/core/agentic/agent-router.js +0 -128
- package/core/agentic/chain-of-thought.js +0 -578
- package/core/agentic/command-executor.js +0 -421
- package/core/agentic/context-filter.js +0 -354
- package/core/agentic/ground-truth.js +0 -591
- package/core/agentic/loop-detector.js +0 -406
- package/core/agentic/memory-system.js +0 -850
- package/core/agentic/parallel-tools.js +0 -366
- package/core/agentic/plan-mode.js +0 -572
- package/core/agentic/prompt-builder.js +0 -338
- package/core/agentic/response-templates.js +0 -290
- package/core/agentic/semantic-compression.js +0 -517
- package/core/agentic/think-blocks.js +0 -657
- package/core/agentic/tool-registry.js +0 -184
- package/core/agentic/validation-rules.js +0 -380
- package/core/command-registry.js +0 -698
- package/core/commands.js +0 -2237
- package/core/domain/task-stack.js +0 -497
- package/core/infrastructure/legacy-installer-detector.js +0 -546
- package/core/infrastructure/migrator.js +0 -799
- package/core/infrastructure/session-manager.js +0 -390
- package/core/utils/file-helper.js +0 -329
- package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
- package/packages/web/app/api/stats/route.ts +0 -38
- package/packages/web/components/AppSidebar.tsx +0 -113
- package/packages/web/hooks/useStats.ts +0 -28
- /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
- /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
- /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
- /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
- /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
- /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
- /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* All prjct commands are defined here with metadata.
|
|
5
|
+
* This registry is used by:
|
|
6
|
+
* - bin/prjct (terminal CLI)
|
|
7
|
+
* - website/Commands.tsx (documentation site)
|
|
8
|
+
* - CLAUDE.md (AI assistant instructions)
|
|
9
|
+
* - scripts/validate-commands.js (validation)
|
|
10
|
+
*
|
|
11
|
+
* @version 0.9.0 - Simplified commands with pause/resume and intelligent idea development
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
Command,
|
|
16
|
+
CategoryInfo,
|
|
17
|
+
Categories,
|
|
18
|
+
RegistryStats,
|
|
19
|
+
ValidationResult
|
|
20
|
+
} from './types'
|
|
21
|
+
export type { Command, CategoryInfo, Categories, RegistryStats, ValidationResult } from './types'
|
|
22
|
+
import { COMMANDS } from './commands'
|
|
23
|
+
import { CATEGORIES } from './categories'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Registry helper functions
|
|
27
|
+
*/
|
|
28
|
+
const registry = {
|
|
29
|
+
/**
|
|
30
|
+
* Get all commands
|
|
31
|
+
*/
|
|
32
|
+
getAll: (): Command[] => COMMANDS,
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get command by name
|
|
36
|
+
*/
|
|
37
|
+
getByName: (name: string): Command | undefined => COMMANDS.find((c) => c.name === name),
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get commands by category
|
|
41
|
+
*/
|
|
42
|
+
getByCategory: (category: string): Command[] => COMMANDS.filter((c) => c.category === category),
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Get all implemented commands
|
|
46
|
+
*/
|
|
47
|
+
getAllImplemented: (): Command[] => COMMANDS.filter((c) => c.implemented),
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get all commands with templates
|
|
51
|
+
*/
|
|
52
|
+
getAllWithTemplates: (): Command[] => COMMANDS.filter((c) => c.hasTemplate),
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get commands available in Claude Code
|
|
56
|
+
*/
|
|
57
|
+
getClaudeCommands: (): Command[] => COMMANDS.filter((c) => c.usage.claude !== null),
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get commands available in terminal
|
|
61
|
+
*/
|
|
62
|
+
getTerminalCommands: (): Command[] => COMMANDS.filter((c) => c.usage.terminal !== null),
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get all categories
|
|
66
|
+
*/
|
|
67
|
+
getCategories: (): Categories => CATEGORIES,
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get category metadata
|
|
71
|
+
*/
|
|
72
|
+
getCategory: (category: string): CategoryInfo | undefined => CATEGORIES[category],
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Validate command registry
|
|
76
|
+
*/
|
|
77
|
+
validate: (): ValidationResult => {
|
|
78
|
+
const issues: string[] = []
|
|
79
|
+
|
|
80
|
+
// Check for duplicate names
|
|
81
|
+
const names = COMMANDS.map((c) => c.name)
|
|
82
|
+
const duplicates = names.filter((name, index) => names.indexOf(name) !== index)
|
|
83
|
+
if (duplicates.length > 0) {
|
|
84
|
+
issues.push(`Duplicate command names: ${duplicates.join(', ')}`)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Check for commands with templates but not implemented
|
|
88
|
+
const notImplemented = COMMANDS.filter((c) => c.hasTemplate && !c.implemented)
|
|
89
|
+
if (notImplemented.length > 0) {
|
|
90
|
+
issues.push(
|
|
91
|
+
`Commands with templates but not implemented: ${notImplemented.map((c) => c.name).join(', ')}`
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check for invalid categories
|
|
96
|
+
const validCategories = Object.keys(CATEGORIES)
|
|
97
|
+
const invalidCategories = COMMANDS.filter((c) => !validCategories.includes(c.category))
|
|
98
|
+
if (invalidCategories.length > 0) {
|
|
99
|
+
issues.push(
|
|
100
|
+
`Invalid categories: ${invalidCategories.map((c) => `${c.name}:${c.category}`).join(', ')}`
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
valid: issues.length === 0,
|
|
106
|
+
issues,
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get core commands only (13 essential)
|
|
112
|
+
*/
|
|
113
|
+
getCoreCommands: (): Command[] => COMMANDS.filter((c) => c.category === 'core'),
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get optional commands
|
|
117
|
+
*/
|
|
118
|
+
getOptionalCommands: (): Command[] => COMMANDS.filter((c) => c.category === 'optional'),
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get commands that require initialization
|
|
122
|
+
*/
|
|
123
|
+
getRequiresInit: (): Command[] => COMMANDS.filter((c) => c.requiresInit),
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get commands with blocking rules
|
|
127
|
+
* NOTE: Blocking rules are now handled by Claude reading templates, not deterministic code
|
|
128
|
+
*/
|
|
129
|
+
getWithBlockingRules: (): Command[] => COMMANDS.filter((c) => c.blockingRules !== null),
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get statistics
|
|
133
|
+
*/
|
|
134
|
+
getStats: (): RegistryStats => ({
|
|
135
|
+
total: COMMANDS.length,
|
|
136
|
+
core: COMMANDS.filter((c) => c.category === 'core').length,
|
|
137
|
+
optional: COMMANDS.filter((c) => c.category === 'optional').length,
|
|
138
|
+
setup: COMMANDS.filter((c) => c.category === 'setup').length,
|
|
139
|
+
implemented: COMMANDS.filter((c) => c.implemented).length,
|
|
140
|
+
withTemplates: COMMANDS.filter((c) => c.hasTemplate).length,
|
|
141
|
+
claudeOnly: COMMANDS.filter((c) => c.usage.claude && !c.usage.terminal).length,
|
|
142
|
+
terminalOnly: COMMANDS.filter((c) => !c.usage.claude && c.usage.terminal).length,
|
|
143
|
+
both: COMMANDS.filter((c) => c.usage.claude && c.usage.terminal).length,
|
|
144
|
+
requiresInit: COMMANDS.filter((c) => c.requiresInit).length,
|
|
145
|
+
withBlockingRules: COMMANDS.filter((c) => c.blockingRules !== null).length,
|
|
146
|
+
byCategory: Object.keys(CATEGORIES).reduce(
|
|
147
|
+
(acc, cat) => ({
|
|
148
|
+
...acc,
|
|
149
|
+
[cat]: COMMANDS.filter((c) => c.category === cat).length,
|
|
150
|
+
}),
|
|
151
|
+
{}
|
|
152
|
+
),
|
|
153
|
+
}),
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export default registry
|
|
157
|
+
export { COMMANDS } from './commands'
|
|
158
|
+
export { CATEGORIES } from './categories'
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional Commands
|
|
3
|
+
* Advanced features for specialized workflows.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Command } from './types'
|
|
7
|
+
|
|
8
|
+
export const OPTIONAL_COMMANDS: Command[] = [
|
|
9
|
+
{
|
|
10
|
+
name: 'design',
|
|
11
|
+
category: 'optional',
|
|
12
|
+
description: 'Design system architecture, APIs, and components',
|
|
13
|
+
usage: {
|
|
14
|
+
claude: '/p:design authentication --type architecture',
|
|
15
|
+
terminal: 'prjct design authentication --type architecture',
|
|
16
|
+
},
|
|
17
|
+
params: '[target] --type architecture|api|component|database|flow',
|
|
18
|
+
implemented: true,
|
|
19
|
+
hasTemplate: true,
|
|
20
|
+
requiresInit: true,
|
|
21
|
+
blockingRules: null,
|
|
22
|
+
isOptional: true,
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
{
|
|
26
|
+
name: 'cleanup',
|
|
27
|
+
category: 'optional',
|
|
28
|
+
description: 'Clean up temp files and old entries',
|
|
29
|
+
usage: {
|
|
30
|
+
claude: '/p:cleanup',
|
|
31
|
+
terminal: 'prjct cleanup',
|
|
32
|
+
},
|
|
33
|
+
params: null,
|
|
34
|
+
implemented: true,
|
|
35
|
+
hasTemplate: true,
|
|
36
|
+
requiresInit: true,
|
|
37
|
+
blockingRules: null,
|
|
38
|
+
isOptional: true,
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
{
|
|
42
|
+
name: 'analyze',
|
|
43
|
+
category: 'optional',
|
|
44
|
+
description: 'Analyze repository and sync tasks',
|
|
45
|
+
usage: {
|
|
46
|
+
claude: '/p:analyze',
|
|
47
|
+
terminal: 'prjct analyze',
|
|
48
|
+
},
|
|
49
|
+
params: null,
|
|
50
|
+
implemented: true,
|
|
51
|
+
hasTemplate: true,
|
|
52
|
+
requiresInit: true,
|
|
53
|
+
blockingRules: null,
|
|
54
|
+
isOptional: true,
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
{
|
|
58
|
+
name: 'undo',
|
|
59
|
+
category: 'optional',
|
|
60
|
+
description: 'Revert to previous snapshot',
|
|
61
|
+
usage: {
|
|
62
|
+
claude: '/p:undo',
|
|
63
|
+
terminal: 'prjct undo',
|
|
64
|
+
},
|
|
65
|
+
params: null,
|
|
66
|
+
implemented: true,
|
|
67
|
+
hasTemplate: true,
|
|
68
|
+
requiresInit: true,
|
|
69
|
+
blockingRules: null,
|
|
70
|
+
isOptional: true,
|
|
71
|
+
features: [
|
|
72
|
+
'Git-based snapshots',
|
|
73
|
+
'Preserves redo history',
|
|
74
|
+
'Non-destructive',
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
name: 'redo',
|
|
80
|
+
category: 'optional',
|
|
81
|
+
description: 'Redo previously undone changes',
|
|
82
|
+
usage: {
|
|
83
|
+
claude: '/p:redo',
|
|
84
|
+
terminal: 'prjct redo',
|
|
85
|
+
},
|
|
86
|
+
params: null,
|
|
87
|
+
implemented: true,
|
|
88
|
+
hasTemplate: true,
|
|
89
|
+
requiresInit: true,
|
|
90
|
+
blockingRules: null,
|
|
91
|
+
isOptional: true,
|
|
92
|
+
features: [
|
|
93
|
+
'Only available after undo',
|
|
94
|
+
'Restores undone state',
|
|
95
|
+
'Clears on new snapshot',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
{
|
|
100
|
+
name: 'history',
|
|
101
|
+
category: 'optional',
|
|
102
|
+
description: 'View snapshot history',
|
|
103
|
+
usage: {
|
|
104
|
+
claude: '/p:history',
|
|
105
|
+
terminal: 'prjct history',
|
|
106
|
+
},
|
|
107
|
+
params: null,
|
|
108
|
+
implemented: true,
|
|
109
|
+
hasTemplate: true,
|
|
110
|
+
requiresInit: true,
|
|
111
|
+
blockingRules: null,
|
|
112
|
+
isOptional: true,
|
|
113
|
+
features: [
|
|
114
|
+
'Shows all snapshots',
|
|
115
|
+
'Current position indicator',
|
|
116
|
+
'Redo availability count',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
]
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Commands
|
|
3
|
+
* Installation and configuration (not for daily use).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Command } from './types'
|
|
7
|
+
|
|
8
|
+
export const SETUP_COMMANDS: Command[] = [
|
|
9
|
+
{
|
|
10
|
+
name: 'start',
|
|
11
|
+
category: 'setup',
|
|
12
|
+
description: 'First-time setup (install commands to editors)',
|
|
13
|
+
usage: {
|
|
14
|
+
claude: null,
|
|
15
|
+
terminal: 'prjct start',
|
|
16
|
+
},
|
|
17
|
+
params: null,
|
|
18
|
+
implemented: true,
|
|
19
|
+
hasTemplate: false,
|
|
20
|
+
requiresInit: false,
|
|
21
|
+
blockingRules: null,
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
{
|
|
25
|
+
name: 'setup',
|
|
26
|
+
category: 'setup',
|
|
27
|
+
description: 'Reconfigure editor installations',
|
|
28
|
+
usage: {
|
|
29
|
+
claude: '/p:setup',
|
|
30
|
+
terminal: 'prjct setup [--force] [--editor <name>]',
|
|
31
|
+
},
|
|
32
|
+
params: '[--force] [--editor <name>]',
|
|
33
|
+
implemented: true,
|
|
34
|
+
hasTemplate: true,
|
|
35
|
+
requiresInit: false,
|
|
36
|
+
blockingRules: null,
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
{
|
|
40
|
+
name: 'migrate-all',
|
|
41
|
+
category: 'setup',
|
|
42
|
+
description: 'Migrate all legacy projects',
|
|
43
|
+
usage: {
|
|
44
|
+
claude: '/p:migrate-all',
|
|
45
|
+
terminal: 'prjct migrate-all [--deep-scan] [--remove-legacy] [--dry-run]',
|
|
46
|
+
},
|
|
47
|
+
params: '[--deep-scan] [--remove-legacy] [--dry-run]',
|
|
48
|
+
implemented: true,
|
|
49
|
+
hasTemplate: true,
|
|
50
|
+
requiresInit: false,
|
|
51
|
+
blockingRules: null,
|
|
52
|
+
},
|
|
53
|
+
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry Types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface CommandUsage {
|
|
6
|
+
claude: string | null
|
|
7
|
+
terminal: string | null
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface BlockingRules {
|
|
11
|
+
check: string
|
|
12
|
+
message: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface Command {
|
|
16
|
+
name: string
|
|
17
|
+
category: string
|
|
18
|
+
description: string
|
|
19
|
+
usage: CommandUsage
|
|
20
|
+
params: string | null
|
|
21
|
+
implemented: boolean
|
|
22
|
+
hasTemplate: boolean
|
|
23
|
+
requiresInit: boolean
|
|
24
|
+
blockingRules: BlockingRules | null
|
|
25
|
+
features?: string[]
|
|
26
|
+
isOptional?: boolean
|
|
27
|
+
deprecated?: boolean
|
|
28
|
+
replacedBy?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CategoryInfo {
|
|
32
|
+
title: string
|
|
33
|
+
description: string
|
|
34
|
+
order: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface Categories {
|
|
38
|
+
[key: string]: CategoryInfo
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface RegistryStats {
|
|
42
|
+
total: number
|
|
43
|
+
core: number
|
|
44
|
+
optional: number
|
|
45
|
+
setup: number
|
|
46
|
+
implemented: number
|
|
47
|
+
withTemplates: number
|
|
48
|
+
claudeOnly: number
|
|
49
|
+
terminalOnly: number
|
|
50
|
+
both: number
|
|
51
|
+
requiresInit: number
|
|
52
|
+
withBlockingRules: number
|
|
53
|
+
byCategory: Record<string, number>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ValidationResult {
|
|
57
|
+
valid: boolean
|
|
58
|
+
issues: string[]
|
|
59
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry
|
|
3
|
+
* Re-exports from command-registry/index.ts for backwards compatibility.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import registry from './command-registry/index'
|
|
7
|
+
export default registry
|
|
8
|
+
export type { Command, CategoryInfo, Categories, RegistryStats, ValidationResult } from './command-registry/index'
|
|
9
|
+
export { COMMANDS, CATEGORIES } from './command-registry/index'
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis Commands: analyze, sync, and related helpers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import path from 'path'
|
|
6
|
+
|
|
7
|
+
import type { CommandResult, AnalyzeOptions, Context } from './types'
|
|
8
|
+
import {
|
|
9
|
+
PrjctCommandsBase,
|
|
10
|
+
contextBuilder,
|
|
11
|
+
toolRegistry,
|
|
12
|
+
pathManager,
|
|
13
|
+
configManager,
|
|
14
|
+
dateHelper
|
|
15
|
+
} from './base'
|
|
16
|
+
|
|
17
|
+
export class AnalysisCommands extends PrjctCommandsBase {
|
|
18
|
+
/**
|
|
19
|
+
* /p:analyze - Analyze repository and generate summary
|
|
20
|
+
*/
|
|
21
|
+
async analyze(options: AnalyzeOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
22
|
+
try {
|
|
23
|
+
await this.initializeAgent()
|
|
24
|
+
|
|
25
|
+
console.log('🔍 Analyzing repository...\n')
|
|
26
|
+
|
|
27
|
+
const analyzer = require('../domain/analyzer')
|
|
28
|
+
analyzer.init(projectPath)
|
|
29
|
+
|
|
30
|
+
const context = await contextBuilder.build(projectPath, options) as Context
|
|
31
|
+
|
|
32
|
+
const analysisData = {
|
|
33
|
+
packageJson: await analyzer.readPackageJson(),
|
|
34
|
+
cargoToml: await analyzer.readCargoToml(),
|
|
35
|
+
goMod: await analyzer.readGoMod(),
|
|
36
|
+
requirements: await analyzer.readRequirements(),
|
|
37
|
+
directories: await analyzer.listDirectories(),
|
|
38
|
+
fileCount: await analyzer.countFiles(),
|
|
39
|
+
gitStats: await analyzer.getGitStats(),
|
|
40
|
+
gitLog: await analyzer.getGitLog(20),
|
|
41
|
+
hasDockerfile: await analyzer.fileExists('Dockerfile'),
|
|
42
|
+
hasDockerCompose: await analyzer.fileExists('docker-compose.yml'),
|
|
43
|
+
hasReadme: await analyzer.fileExists('README.md'),
|
|
44
|
+
hasTsconfig: await analyzer.fileExists('tsconfig.json'),
|
|
45
|
+
hasViteConfig:
|
|
46
|
+
(await analyzer.fileExists('vite.config.ts')) ||
|
|
47
|
+
(await analyzer.fileExists('vite.config.js')),
|
|
48
|
+
hasNextConfig:
|
|
49
|
+
(await analyzer.fileExists('next.config.js')) ||
|
|
50
|
+
(await analyzer.fileExists('next.config.mjs')),
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const summary = this._generateAnalysisSummary(analysisData, projectPath)
|
|
54
|
+
|
|
55
|
+
const projectId = await configManager.getProjectId(projectPath)
|
|
56
|
+
const summaryPath =
|
|
57
|
+
context.paths.analysis ||
|
|
58
|
+
pathManager.getFilePath(
|
|
59
|
+
projectId!,
|
|
60
|
+
'analysis',
|
|
61
|
+
'repo-summary.md'
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
await toolRegistry.get('Write')!(summaryPath, summary)
|
|
65
|
+
|
|
66
|
+
await this.logToMemory(projectPath, 'repository_analyzed', {
|
|
67
|
+
timestamp: dateHelper.getTimestamp(),
|
|
68
|
+
fileCount: analysisData.fileCount,
|
|
69
|
+
gitCommits: analysisData.gitStats.totalCommits,
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
const contextSync = require('../context-sync')
|
|
73
|
+
await contextSync.generateLocalContext(projectPath, projectId)
|
|
74
|
+
|
|
75
|
+
const commandInstaller = require('../infrastructure/command-installer')
|
|
76
|
+
const globalConfigResult = await commandInstaller.installGlobalConfig()
|
|
77
|
+
if (globalConfigResult.success) {
|
|
78
|
+
console.log('📝 Updated ~/.claude/CLAUDE.md')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
console.log('✅ Analysis complete!\n')
|
|
82
|
+
console.log('📄 Full report: analysis/repo-summary.md')
|
|
83
|
+
console.log('📝 Context: ~/.prjct-cli/projects/' + projectId + '/CLAUDE.md\n')
|
|
84
|
+
console.log('Next steps:')
|
|
85
|
+
console.log('• /p:sync → Generate agents based on stack')
|
|
86
|
+
console.log('• /p:feature → Add a new feature')
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
success: true,
|
|
90
|
+
summaryPath,
|
|
91
|
+
data: analysisData,
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('❌ Error:', (error as Error).message)
|
|
95
|
+
return { success: false, error: (error as Error).message }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Generate analysis summary from collected data
|
|
101
|
+
*/
|
|
102
|
+
_generateAnalysisSummary(data: Record<string, unknown>, projectPath: string): string {
|
|
103
|
+
const lines: string[] = []
|
|
104
|
+
|
|
105
|
+
lines.push('# Repository Analysis\n')
|
|
106
|
+
lines.push(`Generated: ${new Date().toLocaleString()}\n`)
|
|
107
|
+
|
|
108
|
+
const projectName = path.basename(projectPath)
|
|
109
|
+
lines.push(`## Project: ${projectName}\n`)
|
|
110
|
+
|
|
111
|
+
lines.push('## Stack Detected\n')
|
|
112
|
+
|
|
113
|
+
if (data.packageJson) {
|
|
114
|
+
const pkg = data.packageJson as { dependencies?: Record<string, string> }
|
|
115
|
+
lines.push('### JavaScript/TypeScript\n')
|
|
116
|
+
lines.push('- **Package Manager**: npm/yarn/pnpm')
|
|
117
|
+
if (pkg.dependencies) {
|
|
118
|
+
const deps = Object.keys(pkg.dependencies)
|
|
119
|
+
if (deps.length > 0) {
|
|
120
|
+
lines.push(
|
|
121
|
+
`- **Dependencies**: ${deps.slice(0, 10).join(', ')}${deps.length > 10 ? ` (+${deps.length - 10} more)` : ''}`
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (data.hasNextConfig) lines.push('- **Framework**: Next.js detected')
|
|
126
|
+
if (data.hasViteConfig) lines.push('- **Build Tool**: Vite detected')
|
|
127
|
+
if (data.hasTsconfig) lines.push('- **Language**: TypeScript')
|
|
128
|
+
lines.push('')
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (data.cargoToml) {
|
|
132
|
+
lines.push('### Rust\n')
|
|
133
|
+
lines.push('- **Package Manager**: Cargo')
|
|
134
|
+
lines.push('- **Language**: Rust\n')
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (data.goMod) {
|
|
138
|
+
lines.push('### Go\n')
|
|
139
|
+
lines.push('- **Package Manager**: Go modules')
|
|
140
|
+
lines.push('- **Language**: Go\n')
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (data.requirements) {
|
|
144
|
+
lines.push('### Python\n')
|
|
145
|
+
lines.push('- **Package Manager**: pip')
|
|
146
|
+
lines.push('- **Language**: Python\n')
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const directories = data.directories as string[] | undefined
|
|
150
|
+
lines.push('## Structure\n')
|
|
151
|
+
lines.push(`- **Total Files**: ${data.fileCount}`)
|
|
152
|
+
lines.push(
|
|
153
|
+
`- **Directories**: ${directories?.slice(0, 15).join(', ') || 'none'}${(directories?.length || 0) > 15 ? ` (+${(directories?.length || 0) - 15} more)` : ''}`
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
if (data.hasDockerfile) lines.push('- **Docker**: Detected')
|
|
157
|
+
if (data.hasDockerCompose) lines.push('- **Docker Compose**: Detected')
|
|
158
|
+
if (data.hasReadme) lines.push('- **Documentation**: README.md found')
|
|
159
|
+
lines.push('')
|
|
160
|
+
|
|
161
|
+
const gitStats = data.gitStats as { totalCommits?: number; contributors?: number; age?: string } | undefined
|
|
162
|
+
lines.push('## Git Statistics\n')
|
|
163
|
+
lines.push(`- **Total Commits**: ${gitStats?.totalCommits || 0}`)
|
|
164
|
+
lines.push(`- **Contributors**: ${gitStats?.contributors || 0}`)
|
|
165
|
+
lines.push(`- **Age**: ${gitStats?.age || 'unknown'}`)
|
|
166
|
+
lines.push('')
|
|
167
|
+
|
|
168
|
+
if (data.gitLog) {
|
|
169
|
+
lines.push('## Recent Activity\n')
|
|
170
|
+
const logLines = (data.gitLog as string).split('\n').slice(0, 5)
|
|
171
|
+
logLines.forEach((line) => {
|
|
172
|
+
if (line.trim()) {
|
|
173
|
+
const [hash, , time, msg] = line.split('|')
|
|
174
|
+
lines.push(`- \`${hash}\` ${msg} (${time})`)
|
|
175
|
+
}
|
|
176
|
+
})
|
|
177
|
+
lines.push('')
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
lines.push('## Recommendations\n')
|
|
181
|
+
lines.push('Based on detected stack, consider generating specialized agents using `/p:sync`.\n')
|
|
182
|
+
|
|
183
|
+
lines.push('---\n')
|
|
184
|
+
lines.push(
|
|
185
|
+
'*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n'
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return lines.join('\n')
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* /p:sync - Sync project state and generate dynamic agents
|
|
193
|
+
*/
|
|
194
|
+
async sync(projectPath: string = process.cwd()): Promise<CommandResult> {
|
|
195
|
+
try {
|
|
196
|
+
const initResult = await this.ensureProjectInit(projectPath)
|
|
197
|
+
if (!initResult.success) return initResult
|
|
198
|
+
|
|
199
|
+
await this.initializeAgent()
|
|
200
|
+
|
|
201
|
+
console.log('🔄 Syncing project state...\n')
|
|
202
|
+
|
|
203
|
+
const context = await contextBuilder.build(projectPath) as Context
|
|
204
|
+
|
|
205
|
+
console.log('📊 Running analysis...')
|
|
206
|
+
const analysisResult = await this.analyze({}, projectPath)
|
|
207
|
+
|
|
208
|
+
if (!analysisResult.success) {
|
|
209
|
+
console.error('❌ Analysis failed')
|
|
210
|
+
return analysisResult
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const summaryContent = (await toolRegistry.get('Read')!(context.paths.analysis)) as string | null
|
|
214
|
+
|
|
215
|
+
if (!summaryContent) {
|
|
216
|
+
console.error('❌ No analysis found. Run /p:analyze first.')
|
|
217
|
+
return { success: false, error: 'No analysis found' }
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
console.log('✅ Analysis loaded\n')
|
|
221
|
+
|
|
222
|
+
console.log('🤖 Generating specialized agents...\n')
|
|
223
|
+
|
|
224
|
+
const projectId = await configManager.getProjectId(projectPath)
|
|
225
|
+
const AgentGenerator = require('../domain/agent-generator')
|
|
226
|
+
const generator = new AgentGenerator(projectId)
|
|
227
|
+
|
|
228
|
+
const generatedAgents = await this._generateAgentsFromAnalysis(summaryContent, generator, projectPath)
|
|
229
|
+
|
|
230
|
+
await this.logToMemory(projectPath, 'agents_generated', {
|
|
231
|
+
timestamp: dateHelper.getTimestamp(),
|
|
232
|
+
agents: generatedAgents,
|
|
233
|
+
count: generatedAgents.length,
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
const contextSync = require('../context-sync')
|
|
237
|
+
await contextSync.generateLocalContext(projectPath, projectId)
|
|
238
|
+
|
|
239
|
+
const commandInstaller = require('../infrastructure/command-installer')
|
|
240
|
+
const globalConfigResult = await commandInstaller.installGlobalConfig()
|
|
241
|
+
if (globalConfigResult.success) {
|
|
242
|
+
console.log('📝 Updated ~/.claude/CLAUDE.md')
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
console.log('\n✅ Sync complete!\n')
|
|
246
|
+
console.log(`🤖 Agents Generated: ${generatedAgents.length}`)
|
|
247
|
+
generatedAgents.forEach((agent) => {
|
|
248
|
+
console.log(` • ${agent}`)
|
|
249
|
+
})
|
|
250
|
+
console.log('📝 Context: ~/.prjct-cli/projects/' + projectId + '/CLAUDE.md')
|
|
251
|
+
console.log('\n📋 Based on: analysis/repo-summary.md')
|
|
252
|
+
console.log('💡 See templates/agents/AGENTS.md for reference\n')
|
|
253
|
+
console.log('Next steps:')
|
|
254
|
+
console.log('• /p:context → View project state')
|
|
255
|
+
console.log('• /p:feature → Add a feature')
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
success: true,
|
|
259
|
+
agents: generatedAgents,
|
|
260
|
+
}
|
|
261
|
+
} catch (error) {
|
|
262
|
+
console.error('❌ Error:', (error as Error).message)
|
|
263
|
+
return { success: false, error: (error as Error).message }
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Generate agents dynamically from analysis summary
|
|
269
|
+
*/
|
|
270
|
+
async _generateAgentsFromAnalysis(summaryContent: string, generator: unknown, projectPath: string): Promise<string[]> {
|
|
271
|
+
const agents: string[] = []
|
|
272
|
+
|
|
273
|
+
const analyzer = require('../domain/analyzer')
|
|
274
|
+
analyzer.init(projectPath)
|
|
275
|
+
|
|
276
|
+
const projectData = {
|
|
277
|
+
packageJson: await analyzer.readPackageJson(),
|
|
278
|
+
extensions: await analyzer.getFileExtensions(),
|
|
279
|
+
directories: await analyzer.listDirectories(),
|
|
280
|
+
configFiles: await analyzer.listConfigFiles(),
|
|
281
|
+
analysisSummary: summaryContent,
|
|
282
|
+
projectPath
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const gen = generator as { generateAgentsFromTech: (data: unknown) => Promise<Array<{ name?: string } | string>> }
|
|
286
|
+
const generatedAgents = await gen.generateAgentsFromTech(projectData)
|
|
287
|
+
|
|
288
|
+
generatedAgents.forEach(agent => {
|
|
289
|
+
if (typeof agent === 'string') {
|
|
290
|
+
agents.push(agent)
|
|
291
|
+
} else if (agent.name) {
|
|
292
|
+
agents.push(agent.name)
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
|
|
296
|
+
return agents
|
|
297
|
+
}
|
|
298
|
+
}
|