prjct-cli 0.11.5 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +58 -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 +226 -50
  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.js → date-helper.test.ts} +19 -30
  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} +92 -81
  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} +27 -16
  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} +55 -19
  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 +204 -163
  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 +190 -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/{stats → BentoGrid}/BentoGrid.tsx +4 -8
  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/{stats → EmptyState}/EmptyState.tsx +1 -10
  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/{stats → IdeasCard}/IdeasCard.tsx +3 -14
  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/{stats → ProgressRing}/ProgressRing.tsx +4 -27
  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/{stats → RoadmapCard}/RoadmapCard.tsx +3 -23
  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/{stats → ShipsCard}/ShipsCard.tsx +4 -22
  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/{stats → SparklineChart}/SparklineChart.tsx +1 -7
  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/{stats → StreakCard}/StreakCard.tsx +5 -11
  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/context/TerminalTabsContext.tsx +46 -1
  333. package/packages/web/hooks/useClaudeTerminal.ts +71 -21
  334. package/packages/web/hooks/useProjectStats.ts +55 -0
  335. package/packages/web/hooks/useProjects.ts +6 -6
  336. package/packages/web/lib/actions/projects.ts +15 -0
  337. package/packages/web/lib/json-loader.ts +630 -0
  338. package/packages/web/lib/services/index.ts +9 -0
  339. package/packages/web/lib/services/migration.server.ts +600 -0
  340. package/packages/web/lib/services/projects.server.ts +52 -0
  341. package/packages/web/lib/services/stats.server.ts +264 -0
  342. package/packages/web/lib/unified-loader.ts +396 -0
  343. package/packages/web/package.json +10 -7
  344. package/packages/web/server.ts +58 -8
  345. package/templates/commands/done.md +76 -32
  346. package/templates/commands/feature.md +121 -47
  347. package/templates/commands/idea.md +81 -8
  348. package/templates/commands/now.md +41 -17
  349. package/templates/commands/ship.md +64 -25
  350. package/templates/commands/sync.md +28 -3
  351. package/core/agentic/agent-router.js +0 -140
  352. package/core/agentic/chain-of-thought.js +0 -578
  353. package/core/agentic/command-executor.js +0 -417
  354. package/core/agentic/context-filter.js +0 -354
  355. package/core/agentic/ground-truth.js +0 -591
  356. package/core/agentic/loop-detector.js +0 -406
  357. package/core/agentic/memory-system.js +0 -845
  358. package/core/agentic/parallel-tools.js +0 -366
  359. package/core/agentic/plan-mode.js +0 -572
  360. package/core/agentic/prompt-builder.js +0 -352
  361. package/core/agentic/response-templates.js +0 -290
  362. package/core/agentic/semantic-compression.js +0 -517
  363. package/core/agentic/think-blocks.js +0 -657
  364. package/core/agentic/tool-registry.js +0 -184
  365. package/core/agentic/validation-rules.js +0 -380
  366. package/core/command-registry.js +0 -698
  367. package/core/commands.js +0 -2237
  368. package/core/domain/task-stack.js +0 -497
  369. package/core/infrastructure/legacy-installer-detector.js +0 -546
  370. package/core/infrastructure/migrator.js +0 -796
  371. package/core/infrastructure/session-manager.js +0 -390
  372. package/core/utils/file-helper.js +0 -329
  373. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  374. package/packages/web/app/api/stats/route.ts +0 -38
  375. package/packages/web/components/AppSidebar.tsx +0 -113
  376. package/packages/web/components/stats/ActivityTimeline.tsx +0 -201
  377. package/packages/web/components/stats/AgentsCard.tsx +0 -56
  378. package/packages/web/components/stats/BentoCard.tsx +0 -88
  379. package/packages/web/components/stats/HeroSection.tsx +0 -172
  380. package/packages/web/components/stats/NowCard.tsx +0 -71
  381. package/packages/web/components/stats/QueueCard.tsx +0 -58
  382. package/packages/web/components/stats/VelocityCard.tsx +0 -60
  383. package/packages/web/components/stats/index.ts +0 -17
  384. package/packages/web/hooks/useStats.ts +0 -28
  385. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  386. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  387. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  388. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  389. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  390. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  391. /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
@@ -1,406 +0,0 @@
1
- /**
2
- * Loop Detection & User Escalation
3
- *
4
- * Detects when commands are failing repeatedly and escalates to user
5
- * instead of continuing in infinite loops.
6
- *
7
- * OPTIMIZATION (P2.4): Loop Detection
8
- * - Track attempt counts per command/error type
9
- * - Auto-escalate after 3 failed attempts
10
- * - Provide specific help based on error patterns
11
- *
12
- * ANTI-HALLUCINATION: Detects contradictory/impossible outputs
13
- * - Patterns that indicate Claude is hallucinating (saying file exists when it doesn't)
14
- * - Contradictory statements in same response
15
- * - Completing tasks that were never started
16
- *
17
- * Source: Augment Code pattern
18
- * "If you notice yourself going around in circles... ask the user for help"
19
- */
20
-
21
- /**
22
- * ANTI-HALLUCINATION: Patterns that indicate Claude may be hallucinating
23
- * These patterns detect contradictory or impossible statements
24
- */
25
- const HALLUCINATION_PATTERNS = [
26
- // Contradictory file operations
27
- { pattern: /file.*not found.*created/i, type: 'contradiction', description: 'Claims file created but also not found' },
28
- { pattern: /created.*but.*error/i, type: 'contradiction', description: 'Claims success but also error' },
29
- { pattern: /successfully.*failed/i, type: 'contradiction', description: 'Contradictory success/failure' },
30
-
31
- // Impossible task states
32
- { pattern: /already.*completed.*completing/i, type: 'state', description: 'Completing already-completed task' },
33
- { pattern: /no task.*marking complete/i, type: 'state', description: 'Completing non-existent task' },
34
- { pattern: /no.*active.*done with/i, type: 'state', description: 'Finishing task that doesnt exist' },
35
-
36
- // Invented data
37
- { pattern: /version.*updated.*no package/i, type: 'invented', description: 'Version update without package.json' },
38
- { pattern: /committed.*nothing to commit/i, type: 'invented', description: 'Commit without changes' },
39
- { pattern: /pushed.*no remote/i, type: 'invented', description: 'Push without remote' }
40
- ]
41
-
42
- class LoopDetector {
43
- constructor() {
44
- // Track attempts per command session
45
- this._attempts = new Map()
46
-
47
- // Track error patterns
48
- this._errorPatterns = new Map()
49
-
50
- // Configuration
51
- this.maxAttempts = 3
52
- this.sessionTimeout = 5 * 60 * 1000 // 5 minutes
53
- }
54
-
55
- /**
56
- * Generate a unique key for tracking attempts
57
- * @param {string} command - Command name
58
- * @param {string} context - Additional context (e.g., file path, task)
59
- * @returns {string}
60
- */
61
- _getKey(command, context = '') {
62
- return `${command}:${context}`.toLowerCase()
63
- }
64
-
65
- /**
66
- * Record an attempt for a command
67
- * @param {string} command - Command name
68
- * @param {string} context - Additional context
69
- * @param {Object} result - Result of the attempt
70
- * @returns {Object} Attempt tracking info
71
- */
72
- recordAttempt(command, context = '', result = {}) {
73
- const key = this._getKey(command, context)
74
- const now = Date.now()
75
-
76
- // Get or create attempt record
77
- let record = this._attempts.get(key)
78
-
79
- if (!record || (now - record.lastAttempt) > this.sessionTimeout) {
80
- // New session or timed out
81
- record = {
82
- command,
83
- context,
84
- attempts: 0,
85
- errors: [],
86
- firstAttempt: now,
87
- lastAttempt: now,
88
- success: false
89
- }
90
- }
91
-
92
- // Update record
93
- record.attempts++
94
- record.lastAttempt = now
95
- record.success = result.success || false
96
-
97
- if (result.error) {
98
- record.errors.push({
99
- message: result.error,
100
- timestamp: now
101
- })
102
- }
103
-
104
- this._attempts.set(key, record)
105
-
106
- return {
107
- attemptNumber: record.attempts,
108
- isLooping: this.isLooping(command, context),
109
- shouldEscalate: this.shouldEscalate(command, context)
110
- }
111
- }
112
-
113
- /**
114
- * Check if a command is in a loop (repeated failures)
115
- * @param {string} command - Command name
116
- * @param {string} context - Additional context
117
- * @returns {boolean}
118
- */
119
- isLooping(command, context = '') {
120
- const key = this._getKey(command, context)
121
- const record = this._attempts.get(key)
122
-
123
- if (!record) return false
124
-
125
- // Check if multiple failures with same error
126
- if (record.attempts >= 2 && !record.success) {
127
- const recentErrors = record.errors.slice(-3)
128
- if (recentErrors.length >= 2) {
129
- // Check if errors are similar
130
- const firstError = recentErrors[0]?.message || ''
131
- const sameError = recentErrors.every(e =>
132
- this._isSimilarError(e.message, firstError)
133
- )
134
- return sameError
135
- }
136
- }
137
-
138
- return false
139
- }
140
-
141
- /**
142
- * Check if we should escalate to user
143
- * @param {string} command - Command name
144
- * @param {string} context - Additional context
145
- * @returns {boolean}
146
- */
147
- shouldEscalate(command, context = '') {
148
- const key = this._getKey(command, context)
149
- const record = this._attempts.get(key)
150
-
151
- if (!record) return false
152
-
153
- // Escalate after max attempts without success
154
- return record.attempts >= this.maxAttempts && !record.success
155
- }
156
-
157
- /**
158
- * Get escalation message for user
159
- * @param {string} command - Command name
160
- * @param {string} context - Additional context
161
- * @returns {Object} Escalation info
162
- */
163
- getEscalationInfo(command, context = '') {
164
- const key = this._getKey(command, context)
165
- const record = this._attempts.get(key)
166
-
167
- if (!record) {
168
- return null
169
- }
170
-
171
- // Analyze error pattern
172
- const errorPattern = this._analyzeErrorPattern(record.errors)
173
-
174
- return {
175
- status: 'BLOCKED',
176
- command,
177
- context,
178
- attempts: record.attempts,
179
- duration: record.lastAttempt - record.firstAttempt,
180
- errorPattern,
181
- message: this._generateEscalationMessage(command, errorPattern),
182
- suggestion: this._generateSuggestion(command, errorPattern),
183
- lastError: record.errors[record.errors.length - 1]?.message || null
184
- }
185
- }
186
-
187
- /**
188
- * Check if two errors are similar
189
- * @private
190
- */
191
- _isSimilarError(error1, error2) {
192
- if (!error1 || !error2) return false
193
-
194
- // Normalize errors
195
- const normalize = (e) => e.toLowerCase()
196
- .replace(/[0-9]+/g, 'N') // Replace numbers
197
- .replace(/['"`]/g, '') // Remove quotes
198
- .replace(/\s+/g, ' ') // Normalize whitespace
199
- .trim()
200
-
201
- return normalize(error1) === normalize(error2)
202
- }
203
-
204
- /**
205
- * Analyze error pattern from history
206
- * @private
207
- */
208
- _analyzeErrorPattern(errors) {
209
- if (!errors || errors.length === 0) {
210
- return { type: 'unknown', description: 'No error information' }
211
- }
212
-
213
- const lastError = errors[errors.length - 1]?.message?.toLowerCase() || ''
214
-
215
- // Detect common patterns (ORDER MATTERS - more specific patterns first)
216
- if (lastError.includes('permission') || lastError.includes('access denied')) {
217
- return { type: 'permission', description: 'File or directory permission issue' }
218
- }
219
- if (lastError.includes('not found') || lastError.includes('no such file')) {
220
- return { type: 'not_found', description: 'File or resource not found' }
221
- }
222
- if (lastError.includes('syntax') || lastError.includes('parse')) {
223
- return { type: 'syntax', description: 'Syntax or parsing error' }
224
- }
225
- if (lastError.includes('timeout') || lastError.includes('timed out')) {
226
- return { type: 'timeout', description: 'Operation timed out' }
227
- }
228
- if (lastError.includes('network') || lastError.includes('connection')) {
229
- return { type: 'network', description: 'Network or connection issue' }
230
- }
231
- // Config pattern MUST be checked before validation (since "invalid config" contains both)
232
- if (lastError.includes('config') || lastError.includes('configuration')) {
233
- return { type: 'config', description: 'Configuration issue' }
234
- }
235
- if (lastError.includes('validation') || lastError.includes('invalid')) {
236
- return { type: 'validation', description: 'Validation failed' }
237
- }
238
-
239
- return { type: 'unknown', description: 'Unrecognized error pattern' }
240
- }
241
-
242
- /**
243
- * Generate user-friendly escalation message
244
- * @private
245
- */
246
- _generateEscalationMessage(command, errorPattern) {
247
- const messages = {
248
- permission: `I've tried ${command} ${this.maxAttempts} times but keep hitting permission issues.`,
249
- not_found: `After ${this.maxAttempts} attempts, I still can't find the required file or resource.`,
250
- syntax: `I'm encountering repeated syntax errors with ${command}.`,
251
- timeout: `The operation keeps timing out after ${this.maxAttempts} attempts.`,
252
- network: `Network issues are preventing ${command} from completing.`,
253
- validation: `Validation keeps failing for ${command}.`,
254
- config: `There seems to be a configuration issue affecting ${command}.`,
255
- unknown: `I've tried ${command} ${this.maxAttempts} times without success.`
256
- }
257
-
258
- return messages[errorPattern.type] || messages.unknown
259
- }
260
-
261
- /**
262
- * Generate actionable suggestion based on error pattern
263
- * @private
264
- */
265
- _generateSuggestion(command, errorPattern) {
266
- const suggestions = {
267
- permission: 'Check file permissions. Try: chmod -R u+w ~/.prjct-cli/',
268
- not_found: 'Verify the file path exists. Run /p:init if project not initialized.',
269
- syntax: 'Check the file format. There may be invalid JSON or markdown.',
270
- timeout: 'Check your network connection or try again in a moment.',
271
- network: 'Verify internet connection and try again.',
272
- validation: 'Review the input parameters and try with different values.',
273
- config: 'Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.',
274
- unknown: 'Can you check the issue manually and provide more context?'
275
- }
276
-
277
- return suggestions[errorPattern.type] || suggestions.unknown
278
- }
279
-
280
- /**
281
- * Mark a command as successful (resets tracking)
282
- * @param {string} command - Command name
283
- * @param {string} context - Additional context
284
- */
285
- recordSuccess(command, context = '') {
286
- const key = this._getKey(command, context)
287
- const record = this._attempts.get(key)
288
-
289
- if (record) {
290
- record.success = true
291
- record.attempts = 0
292
- record.errors = []
293
- this._attempts.set(key, record)
294
- }
295
- }
296
-
297
- /**
298
- * Clear all tracking for a command
299
- * @param {string} command - Command name
300
- * @param {string} context - Additional context
301
- */
302
- clearTracking(command, context = '') {
303
- const key = this._getKey(command, context)
304
- this._attempts.delete(key)
305
- }
306
-
307
- /**
308
- * Clear all tracking data
309
- */
310
- clearAll() {
311
- this._attempts.clear()
312
- this._errorPatterns.clear()
313
- }
314
-
315
- /**
316
- * Get statistics for debugging
317
- * @returns {Object}
318
- */
319
- getStats() {
320
- const stats = {
321
- activeTracking: this._attempts.size,
322
- commands: {}
323
- }
324
-
325
- for (const [key, record] of this._attempts) {
326
- stats.commands[key] = {
327
- attempts: record.attempts,
328
- success: record.success,
329
- errorCount: record.errors.length
330
- }
331
- }
332
-
333
- return stats
334
- }
335
-
336
- /**
337
- * ANTI-HALLUCINATION: Detect potential hallucination patterns in output
338
- *
339
- * @param {string} output - The output text to analyze
340
- * @returns {Object} Detection result
341
- */
342
- detectHallucination(output) {
343
- if (!output || typeof output !== 'string') {
344
- return { detected: false }
345
- }
346
-
347
- for (const { pattern, type, description } of HALLUCINATION_PATTERNS) {
348
- if (pattern.test(output)) {
349
- return {
350
- detected: true,
351
- type,
352
- pattern: pattern.source,
353
- description,
354
- message: `Potential hallucination detected: ${description}`,
355
- suggestion: this._getHallucinationSuggestion(type)
356
- }
357
- }
358
- }
359
-
360
- return { detected: false }
361
- }
362
-
363
- /**
364
- * Get suggestion for handling detected hallucination
365
- * @private
366
- */
367
- _getHallucinationSuggestion(type) {
368
- const suggestions = {
369
- contradiction: 'Verify file/resource state before reporting. Use Read tool to check actual state.',
370
- state: 'Check current task state from now.md before assuming completion.',
371
- invented: 'Verify prerequisites exist (package.json, git remote) before claiming actions.'
372
- }
373
- return suggestions[type] || 'Verify actual state before proceeding.'
374
- }
375
-
376
- /**
377
- * Analyze output and record if hallucination detected
378
- * @param {string} command - Command name
379
- * @param {string} output - Command output
380
- * @returns {Object} Analysis result
381
- */
382
- analyzeOutput(command, output) {
383
- const hallucination = this.detectHallucination(output)
384
-
385
- if (hallucination.detected) {
386
- // Record as a special type of error
387
- this.recordAttempt(command, 'hallucination', {
388
- success: false,
389
- error: `HALLUCINATION: ${hallucination.description}`
390
- })
391
-
392
- return {
393
- ...hallucination,
394
- shouldBlock: true,
395
- action: 'VERIFY_STATE'
396
- }
397
- }
398
-
399
- return { detected: false, shouldBlock: false }
400
- }
401
- }
402
-
403
- // Singleton instance
404
- const loopDetector = new LoopDetector()
405
-
406
- module.exports = loopDetector