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.
Files changed (385) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +81 -25
  3. package/bin/dev.js +1 -1
  4. package/bin/generate-views.js +209 -0
  5. package/bin/migrate-to-json.js +742 -0
  6. package/bin/prjct +5 -5
  7. package/bin/serve.js +246 -54
  8. package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
  9. package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
  10. package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
  11. package/core/__tests__/utils/date-helper.test.ts +405 -0
  12. package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
  13. package/core/agentic/agent-router.ts +137 -0
  14. package/core/agentic/chain-of-thought.ts +228 -0
  15. package/core/agentic/command-executor/command-executor.ts +384 -0
  16. package/core/agentic/command-executor/index.ts +16 -0
  17. package/core/agentic/command-executor/status-signal.ts +38 -0
  18. package/core/agentic/command-executor/types.ts +79 -0
  19. package/core/agentic/command-executor.ts +8 -0
  20. package/core/agentic/{context-builder.js → context-builder.ts} +99 -89
  21. package/core/agentic/context-filter.ts +365 -0
  22. package/core/agentic/ground-truth/index.ts +76 -0
  23. package/core/agentic/ground-truth/types.ts +33 -0
  24. package/core/agentic/ground-truth/utils.ts +48 -0
  25. package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
  26. package/core/agentic/ground-truth/verifiers/done.ts +75 -0
  27. package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
  28. package/core/agentic/ground-truth/verifiers/index.ts +37 -0
  29. package/core/agentic/ground-truth/verifiers/init.ts +52 -0
  30. package/core/agentic/ground-truth/verifiers/now.ts +57 -0
  31. package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
  32. package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
  33. package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
  34. package/core/agentic/ground-truth/verifiers.ts +6 -0
  35. package/core/agentic/ground-truth.ts +8 -0
  36. package/core/agentic/loop-detector/error-analysis.ts +97 -0
  37. package/core/agentic/loop-detector/hallucination.ts +71 -0
  38. package/core/agentic/loop-detector/index.ts +41 -0
  39. package/core/agentic/loop-detector/loop-detector.ts +222 -0
  40. package/core/agentic/loop-detector/types.ts +66 -0
  41. package/core/agentic/loop-detector.ts +8 -0
  42. package/core/agentic/memory-system/history.ts +53 -0
  43. package/core/agentic/memory-system/index.ts +192 -0
  44. package/core/agentic/memory-system/patterns.ts +156 -0
  45. package/core/agentic/memory-system/semantic-memories.ts +277 -0
  46. package/core/agentic/memory-system/session.ts +21 -0
  47. package/core/agentic/memory-system/types.ts +159 -0
  48. package/core/agentic/memory-system.ts +8 -0
  49. package/core/agentic/parallel-tools.ts +165 -0
  50. package/core/agentic/plan-mode/approval.ts +57 -0
  51. package/core/agentic/plan-mode/constants.ts +44 -0
  52. package/core/agentic/plan-mode/index.ts +28 -0
  53. package/core/agentic/plan-mode/plan-mode.ts +406 -0
  54. package/core/agentic/plan-mode/types.ts +193 -0
  55. package/core/agentic/plan-mode.ts +8 -0
  56. package/core/agentic/prompt-builder.ts +566 -0
  57. package/core/agentic/response-templates.ts +164 -0
  58. package/core/agentic/semantic-compression.ts +273 -0
  59. package/core/agentic/services.ts +206 -0
  60. package/core/agentic/smart-context.ts +476 -0
  61. package/core/agentic/{template-loader.js → template-loader.ts} +35 -18
  62. package/core/agentic/think-blocks.ts +202 -0
  63. package/core/agentic/tool-registry.ts +119 -0
  64. package/core/agentic/validation-rules.ts +313 -0
  65. package/core/agents/index.ts +28 -0
  66. package/core/agents/performance.ts +444 -0
  67. package/core/agents/types.ts +126 -0
  68. package/core/bus/{index.js → index.ts} +57 -61
  69. package/core/command-registry/categories.ts +23 -0
  70. package/core/command-registry/commands.ts +15 -0
  71. package/core/command-registry/core-commands.ts +319 -0
  72. package/core/command-registry/index.ts +158 -0
  73. package/core/command-registry/optional-commands.ts +119 -0
  74. package/core/command-registry/setup-commands.ts +53 -0
  75. package/core/command-registry/types.ts +59 -0
  76. package/core/command-registry.ts +9 -0
  77. package/core/commands/analysis.ts +298 -0
  78. package/core/commands/analytics.ts +288 -0
  79. package/core/commands/base.ts +273 -0
  80. package/core/commands/index.ts +211 -0
  81. package/core/commands/maintenance.ts +226 -0
  82. package/core/commands/planning.ts +311 -0
  83. package/core/commands/setup.ts +309 -0
  84. package/core/commands/shipping.ts +188 -0
  85. package/core/commands/types.ts +183 -0
  86. package/core/commands/workflow.ts +226 -0
  87. package/core/commands.ts +11 -0
  88. package/core/constants/formats.ts +187 -0
  89. package/core/constants/index.ts +7 -0
  90. package/core/{context-sync.js → context-sync.ts} +59 -26
  91. package/core/data/agents-manager.ts +76 -0
  92. package/core/data/analysis-manager.ts +83 -0
  93. package/core/data/base-manager.ts +156 -0
  94. package/core/data/ideas-manager.ts +81 -0
  95. package/core/data/index.ts +32 -0
  96. package/core/data/outcomes-manager.ts +96 -0
  97. package/core/data/project-manager.ts +75 -0
  98. package/core/data/roadmap-manager.ts +118 -0
  99. package/core/data/shipped-manager.ts +65 -0
  100. package/core/data/state-manager.ts +214 -0
  101. package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
  102. package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
  103. package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
  104. package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
  105. package/core/domain/{analyzer.js → analyzer.ts} +91 -85
  106. package/core/domain/{architect-session.js → architect-session.ts} +49 -34
  107. package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
  108. package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
  109. package/core/domain/{product-standards.js → product-standards.ts} +40 -26
  110. package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
  111. package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
  112. package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
  113. package/core/domain/task-stack/index.ts +19 -0
  114. package/core/domain/task-stack/parser.ts +86 -0
  115. package/core/domain/task-stack/storage.ts +123 -0
  116. package/core/domain/task-stack/task-stack.ts +340 -0
  117. package/core/domain/task-stack/types.ts +51 -0
  118. package/core/domain/task-stack.ts +8 -0
  119. package/core/{index.js → index.ts} +61 -18
  120. package/core/infrastructure/{agent-detector.js → agent-detector.ts} +62 -23
  121. package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
  122. package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
  123. package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
  124. package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
  125. package/core/infrastructure/command-installer/global-config.ts +106 -0
  126. package/core/infrastructure/command-installer/index.ts +25 -0
  127. package/core/infrastructure/command-installer/types.ts +41 -0
  128. package/core/infrastructure/command-installer.ts +8 -0
  129. package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
  130. package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
  131. package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
  132. package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
  133. package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
  134. package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
  135. package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
  136. package/core/infrastructure/legacy-installer-detector.ts +7 -0
  137. package/core/infrastructure/migrator/file-operations.ts +125 -0
  138. package/core/infrastructure/migrator/index.ts +288 -0
  139. package/core/infrastructure/migrator/project-scanner.ts +89 -0
  140. package/core/infrastructure/migrator/reports.ts +117 -0
  141. package/core/infrastructure/migrator/types.ts +124 -0
  142. package/core/infrastructure/migrator/validation.ts +94 -0
  143. package/core/infrastructure/migrator/version-migration.ts +117 -0
  144. package/core/infrastructure/migrator.ts +10 -0
  145. package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
  146. package/core/infrastructure/session-manager/index.ts +23 -0
  147. package/core/infrastructure/session-manager/migration.ts +88 -0
  148. package/core/infrastructure/session-manager/session-manager.ts +307 -0
  149. package/core/infrastructure/session-manager/types.ts +45 -0
  150. package/core/infrastructure/session-manager.ts +8 -0
  151. package/core/infrastructure/{setup.js → setup.ts} +29 -21
  152. package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
  153. package/core/outcomes/analyzer.ts +333 -0
  154. package/core/outcomes/index.ts +34 -0
  155. package/core/outcomes/recorder.ts +194 -0
  156. package/core/outcomes/types.ts +145 -0
  157. package/core/plugin/{hooks.js → hooks.ts} +56 -58
  158. package/core/plugin/{index.js → index.ts} +19 -8
  159. package/core/plugin/{loader.js → loader.ts} +87 -69
  160. package/core/plugin/{registry.js → registry.ts} +49 -45
  161. package/core/plugins/{webhook.js → webhook.ts} +43 -27
  162. package/core/schemas/agents.ts +27 -0
  163. package/core/schemas/analysis.ts +41 -0
  164. package/core/schemas/ideas.ts +83 -0
  165. package/core/schemas/index.ts +73 -0
  166. package/core/schemas/outcomes.ts +22 -0
  167. package/core/schemas/project.ts +26 -0
  168. package/core/schemas/roadmap.ts +90 -0
  169. package/core/schemas/shipped.ts +82 -0
  170. package/core/schemas/state.ts +107 -0
  171. package/core/session/index.ts +17 -0
  172. package/core/session/{metrics.js → metrics.ts} +64 -46
  173. package/core/session/{index.js → session-manager.ts} +51 -117
  174. package/core/session/types.ts +29 -0
  175. package/core/session/utils.ts +57 -0
  176. package/core/state/index.ts +25 -0
  177. package/core/state/manager.ts +376 -0
  178. package/core/state/types.ts +185 -0
  179. package/core/tsconfig.json +22 -0
  180. package/core/types/index.ts +506 -0
  181. package/core/utils/{animations.js → animations.ts} +74 -28
  182. package/core/utils/{branding.js → branding.ts} +29 -4
  183. package/core/utils/{date-helper.js → date-helper.ts} +31 -74
  184. package/core/utils/file-helper.ts +262 -0
  185. package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
  186. package/core/utils/{logger.js → logger.ts} +24 -12
  187. package/core/utils/{output.js → output.ts} +25 -13
  188. package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
  189. package/core/utils/{session-helper.js → session-helper.ts} +79 -66
  190. package/core/utils/{version.js → version.ts} +23 -31
  191. package/core/view-generator.ts +536 -0
  192. package/package.json +23 -17
  193. package/packages/shared/.turbo/turbo-build.log +14 -0
  194. package/packages/shared/dist/index.d.ts +8 -613
  195. package/packages/shared/dist/index.d.ts.map +1 -0
  196. package/packages/shared/dist/index.js +4110 -118
  197. package/packages/shared/dist/schemas.d.ts +408 -0
  198. package/packages/shared/dist/schemas.d.ts.map +1 -0
  199. package/packages/shared/dist/types.d.ts +144 -0
  200. package/packages/shared/dist/types.d.ts.map +1 -0
  201. package/packages/shared/dist/unified.d.ts +139 -0
  202. package/packages/shared/dist/unified.d.ts.map +1 -0
  203. package/packages/shared/dist/utils.d.ts +60 -0
  204. package/packages/shared/dist/utils.d.ts.map +1 -0
  205. package/packages/shared/package.json +4 -4
  206. package/packages/shared/src/index.ts +1 -0
  207. package/packages/shared/src/unified.ts +174 -0
  208. package/packages/web/app/api/claude/sessions/route.ts +1 -1
  209. package/packages/web/app/api/claude/status/route.ts +1 -1
  210. package/packages/web/app/api/migrate/route.ts +46 -0
  211. package/packages/web/app/api/projects/[id]/route.ts +1 -1
  212. package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
  213. package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
  214. package/packages/web/app/api/projects/route.ts +1 -1
  215. package/packages/web/app/api/settings/route.ts +97 -0
  216. package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
  217. package/packages/web/app/globals.css +38 -0
  218. package/packages/web/app/layout.tsx +10 -2
  219. package/packages/web/app/page.tsx +9 -224
  220. package/packages/web/app/project/[id]/page.tsx +191 -63
  221. package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
  222. package/packages/web/app/project/[id]/stats/page.tsx +203 -403
  223. package/packages/web/app/settings/page.tsx +222 -2
  224. package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
  225. package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
  226. package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
  227. package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
  228. package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
  229. package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
  230. package/packages/web/components/ActivityTimeline/index.ts +2 -0
  231. package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
  232. package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
  233. package/packages/web/components/AgentsCard/index.ts +2 -0
  234. package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
  235. package/packages/web/components/AppSidebar/index.ts +1 -0
  236. package/packages/web/components/BackLink/BackLink.tsx +18 -0
  237. package/packages/web/components/BackLink/BackLink.types.ts +5 -0
  238. package/packages/web/components/BackLink/index.ts +2 -0
  239. package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
  240. package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
  241. package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
  242. package/packages/web/components/BentoCard/index.ts +2 -0
  243. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
  244. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
  245. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
  246. package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
  247. package/packages/web/components/BentoGrid/BentoGrid.tsx +18 -0
  248. package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
  249. package/packages/web/components/BentoGrid/index.ts +2 -0
  250. package/packages/web/components/CommandButton/index.ts +1 -0
  251. package/packages/web/components/ConnectionStatus/index.ts +1 -0
  252. package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
  253. package/packages/web/components/DashboardContent/index.ts +1 -0
  254. package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
  255. package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
  256. package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
  257. package/packages/web/components/DateGroup/index.ts +2 -0
  258. package/packages/web/components/EmptyState/EmptyState.tsx +58 -0
  259. package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
  260. package/packages/web/components/EmptyState/index.ts +2 -0
  261. package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
  262. package/packages/web/components/EventRow/EventRow.tsx +49 -0
  263. package/packages/web/components/EventRow/EventRow.types.ts +7 -0
  264. package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
  265. package/packages/web/components/EventRow/index.ts +2 -0
  266. package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
  267. package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
  268. package/packages/web/components/ExpandButton/index.ts +2 -0
  269. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
  270. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
  271. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
  272. package/packages/web/components/HealthGradientBackground/index.ts +2 -0
  273. package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
  274. package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
  275. package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
  276. package/packages/web/components/HeroSection/hooks/index.ts +2 -0
  277. package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
  278. package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
  279. package/packages/web/components/HeroSection/index.ts +2 -0
  280. package/packages/web/components/IdeasCard/IdeasCard.tsx +48 -0
  281. package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
  282. package/packages/web/components/IdeasCard/index.ts +2 -0
  283. package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
  284. package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
  285. package/packages/web/components/InsightMessage/index.ts +2 -0
  286. package/packages/web/components/Logo/index.ts +1 -0
  287. package/packages/web/components/MarkdownContent/index.ts +1 -0
  288. package/packages/web/components/NowCard/NowCard.tsx +93 -0
  289. package/packages/web/components/NowCard/NowCard.types.ts +15 -0
  290. package/packages/web/components/NowCard/index.ts +2 -0
  291. package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
  292. package/packages/web/components/ProgressRing/ProgressRing.tsx +51 -0
  293. package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
  294. package/packages/web/components/ProgressRing/index.ts +2 -0
  295. package/packages/web/components/ProjectAvatar/index.ts +1 -0
  296. package/packages/web/components/Providers/index.ts +1 -0
  297. package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
  298. package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
  299. package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
  300. package/packages/web/components/QueueCard/index.ts +2 -0
  301. package/packages/web/components/RoadmapCard/RoadmapCard.tsx +77 -0
  302. package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
  303. package/packages/web/components/RoadmapCard/index.ts +2 -0
  304. package/packages/web/components/ShipsCard/ShipsCard.tsx +52 -0
  305. package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
  306. package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
  307. package/packages/web/components/ShipsCard/index.ts +2 -0
  308. package/packages/web/components/SparklineChart/SparklineChart.tsx +38 -0
  309. package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
  310. package/packages/web/components/SparklineChart/index.ts +2 -0
  311. package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
  312. package/packages/web/components/StreakCard/StreakCard.tsx +53 -0
  313. package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
  314. package/packages/web/components/StreakCard/index.ts +2 -0
  315. package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
  316. package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
  317. package/packages/web/components/TasksCounter/index.ts +2 -0
  318. package/packages/web/components/TechStackBadges/index.ts +1 -0
  319. package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
  320. package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
  321. package/packages/web/components/TerminalTabs/index.ts +1 -0
  322. package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
  323. package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
  324. package/packages/web/components/VelocityBadge/index.ts +2 -0
  325. package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
  326. package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
  327. package/packages/web/components/VelocityCard/index.ts +2 -0
  328. package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
  329. package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
  330. package/packages/web/components/WeeklySparkline/index.ts +2 -0
  331. package/packages/web/components/ui/input.tsx +21 -0
  332. package/packages/web/components/ui/tooltip.tsx +2 -2
  333. package/packages/web/context/TerminalTabsContext.tsx +46 -1
  334. package/packages/web/hooks/useClaudeTerminal.ts +71 -21
  335. package/packages/web/hooks/useProjectStats.ts +55 -0
  336. package/packages/web/hooks/useProjects.ts +6 -6
  337. package/packages/web/lib/actions/projects.ts +15 -0
  338. package/packages/web/lib/json-loader.ts +630 -0
  339. package/packages/web/lib/services/index.ts +9 -0
  340. package/packages/web/lib/services/migration.server.ts +598 -0
  341. package/packages/web/lib/services/projects.server.ts +52 -0
  342. package/packages/web/lib/services/stats.server.ts +264 -0
  343. package/packages/web/lib/unified-loader.ts +396 -0
  344. package/packages/web/next-env.d.ts +1 -1
  345. package/packages/web/package.json +10 -6
  346. package/packages/web/server.ts +36 -6
  347. package/templates/commands/done.md +76 -32
  348. package/templates/commands/feature.md +121 -47
  349. package/templates/commands/idea.md +81 -8
  350. package/templates/commands/now.md +41 -17
  351. package/templates/commands/ship.md +64 -25
  352. package/templates/commands/sync.md +28 -3
  353. package/core/agentic/agent-router.js +0 -128
  354. package/core/agentic/chain-of-thought.js +0 -578
  355. package/core/agentic/command-executor.js +0 -421
  356. package/core/agentic/context-filter.js +0 -354
  357. package/core/agentic/ground-truth.js +0 -591
  358. package/core/agentic/loop-detector.js +0 -406
  359. package/core/agentic/memory-system.js +0 -850
  360. package/core/agentic/parallel-tools.js +0 -366
  361. package/core/agentic/plan-mode.js +0 -572
  362. package/core/agentic/prompt-builder.js +0 -338
  363. package/core/agentic/response-templates.js +0 -290
  364. package/core/agentic/semantic-compression.js +0 -517
  365. package/core/agentic/think-blocks.js +0 -657
  366. package/core/agentic/tool-registry.js +0 -184
  367. package/core/agentic/validation-rules.js +0 -380
  368. package/core/command-registry.js +0 -698
  369. package/core/commands.js +0 -2237
  370. package/core/domain/task-stack.js +0 -497
  371. package/core/infrastructure/legacy-installer-detector.js +0 -546
  372. package/core/infrastructure/migrator.js +0 -799
  373. package/core/infrastructure/session-manager.js +0 -390
  374. package/core/utils/file-helper.js +0 -329
  375. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  376. package/packages/web/app/api/stats/route.ts +0 -38
  377. package/packages/web/components/AppSidebar.tsx +0 -113
  378. package/packages/web/hooks/useStats.ts +0 -28
  379. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  380. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  381. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  382. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  383. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  384. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  385. /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
+ }