ai-first-cli 1.3.0 → 1.3.5

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 (527) hide show
  1. package/.ai-dev/index.db +0 -0
  2. package/.github/workflows/publish.yml +4 -1
  3. package/BETA_EVALUATION_REPORT.md +151 -0
  4. package/CHANGELOG.md +178 -0
  5. package/PHASE1_USER_SIMULATION.md +56 -0
  6. package/PHASE2_USER_SIMULATION.md +81 -0
  7. package/PHASE3_USER_SIMULATION.md +176 -0
  8. package/README.es.md +18 -0
  9. package/README.md +80 -1
  10. package/ai/graph/knowledge-graph.json +10 -0
  11. package/ai-context/ai_context.md +130 -0
  12. package/{test-projects/react-app/.ai-dev → ai-context}/ai_rules.md +10 -5
  13. package/ai-context/architecture.md +136 -0
  14. package/ai-context/context/features/src.json +69 -0
  15. package/ai-context/context/features/test-projects.json +69 -0
  16. package/ai-context/context/flows/App.json +17 -0
  17. package/ai-context/context/flows/DashboardPage.json +14 -0
  18. package/ai-context/context/flows/LoginPage.json +14 -0
  19. package/ai-context/context/flows/admin.json +10 -0
  20. package/ai-context/context/flows/ai-first.json +9 -0
  21. package/ai-context/context/flows/androidresources.json +11 -0
  22. package/ai-context/context/flows/auth.json +13 -0
  23. package/ai-context/context/flows/authController.json +14 -0
  24. package/ai-context/context/flows/doctor.json +9 -0
  25. package/ai-context/context/flows/entrypoints.json +9 -0
  26. package/ai-context/context/flows/explore.json +9 -0
  27. package/ai-context/context/flows/fastapiAdapter.json +14 -0
  28. package/ai-context/context/flows/fastapiadapter.json +11 -0
  29. package/ai-context/context/flows/index.json +19 -0
  30. package/ai-context/context/flows/indexer.json +9 -0
  31. package/ai-context/context/flows/indexstate.json +9 -0
  32. package/ai-context/context/flows/init.json +22 -0
  33. package/ai-context/context/flows/main.json +18 -0
  34. package/ai-context/context/flows/mainactivity.json +9 -0
  35. package/ai-context/context/flows/models.json +15 -0
  36. package/ai-context/context/flows/posts.json +15 -0
  37. package/ai-context/context/flows/repoMapper.json +20 -0
  38. package/ai-context/context/flows/repomapper.json +11 -0
  39. package/ai-context/context/flows/routes.json +15 -0
  40. package/ai-context/context/flows/serializers.json +10 -0
  41. package/ai-context/context/flows/user.json +23 -0
  42. package/ai-context/context/flows/views.json +12 -0
  43. package/{test-projects/react-app/.ai-dev → ai-context}/conventions.md +3 -2
  44. package/ai-context/dependencies.json +3360 -0
  45. package/ai-context/entrypoints.md +45 -0
  46. package/ai-context/index-state.json +196 -0
  47. package/ai-context/modules.json +901 -0
  48. package/ai-context/project.json +33 -0
  49. package/ai-context/repo_map.json +8857 -0
  50. package/ai-context/repo_map.md +2002 -0
  51. package/{test-projects/flask-app/.ai-dev → ai-context}/schema.json +1 -1
  52. package/ai-context/summary.md +46 -0
  53. package/ai-context/symbols.json +82467 -0
  54. package/{test-projects/react-app/.ai-dev → ai-context}/tech_stack.md +15 -7
  55. package/ai-context-evaluation-report-1774223059505.md +206 -0
  56. package/dist/analyzers/architecture.d.ts.map +1 -1
  57. package/dist/analyzers/architecture.js +6 -0
  58. package/dist/analyzers/architecture.js.map +1 -1
  59. package/dist/analyzers/entrypoints.d.ts.map +1 -1
  60. package/dist/analyzers/entrypoints.js +105 -0
  61. package/dist/analyzers/entrypoints.js.map +1 -1
  62. package/dist/analyzers/symbols.d.ts.map +1 -1
  63. package/dist/analyzers/symbols.js +72 -1
  64. package/dist/analyzers/symbols.js.map +1 -1
  65. package/dist/analyzers/techStack.d.ts +8 -0
  66. package/dist/analyzers/techStack.d.ts.map +1 -1
  67. package/dist/analyzers/techStack.js +75 -0
  68. package/dist/analyzers/techStack.js.map +1 -1
  69. package/dist/scripts/ai-context-evaluator.js +367 -0
  70. package/package.json +1 -1
  71. package/quick-evaluation-report-1774396002305.md +64 -0
  72. package/quick-evaluator.ts +200 -0
  73. package/scripts/ai-context-evaluator.ts +440 -0
  74. package/src/analyzers/architecture.ts +8 -0
  75. package/src/analyzers/entrypoints.ts +115 -0
  76. package/src/analyzers/symbols.ts +77 -1
  77. package/src/analyzers/techStack.ts +93 -0
  78. package/test_adapters.mjs +11 -11
  79. package/tests/apex-parser.test.ts +193 -0
  80. package/tests/cli-commands-batch1.test.ts +808 -0
  81. package/tests/cli-commands-batch2.test.ts +1113 -0
  82. package/tests/cli-commands-batch3.test.ts +1128 -0
  83. package/tests/cli-index.test.ts +1007 -0
  84. package/tests/cli-init.test.ts +761 -0
  85. package/tests/salesforce-apex-classes.test.ts +713 -0
  86. package/tests/salesforce-apex-triggers.test.ts +871 -0
  87. package/tests/salesforce-custom-objects.test.ts +918 -0
  88. package/tests/salesforce-flows.test.ts +710 -0
  89. package/tests/salesforce-lwc.test.ts +963 -0
  90. package/tests/salesforce-sfdx-integration.test.ts +1125 -0
  91. package/CONTRIBUTING.md +0 -89
  92. package/FLOW.md +0 -129
  93. package/install.sh +0 -188
  94. package/run-all-tests.sh +0 -184
  95. package/test-projects/django-app/.ai-dev/ai_context.md +0 -92
  96. package/test-projects/django-app/.ai-dev/ai_rules.md +0 -47
  97. package/test-projects/django-app/.ai-dev/architecture.md +0 -57
  98. package/test-projects/django-app/.ai-dev/cache.json +0 -169
  99. package/test-projects/django-app/.ai-dev/context/flows/views.json +0 -10
  100. package/test-projects/django-app/.ai-dev/conventions.md +0 -51
  101. package/test-projects/django-app/.ai-dev/dependencies.json +0 -312
  102. package/test-projects/django-app/.ai-dev/entrypoints.md +0 -4
  103. package/test-projects/django-app/.ai-dev/files.json +0 -209
  104. package/test-projects/django-app/.ai-dev/graph/knowledge-graph.json +0 -36
  105. package/test-projects/django-app/.ai-dev/graph/module-graph.json +0 -145
  106. package/test-projects/django-app/.ai-dev/graph/symbol-graph.json +0 -1488
  107. package/test-projects/django-app/.ai-dev/graph/symbol-references.json +0 -1
  108. package/test-projects/django-app/.ai-dev/index-state.json +0 -294
  109. package/test-projects/django-app/.ai-dev/modules.json +0 -35
  110. package/test-projects/django-app/.ai-dev/project.json +0 -11
  111. package/test-projects/django-app/.ai-dev/repo_map.json +0 -412
  112. package/test-projects/django-app/.ai-dev/repo_map.md +0 -105
  113. package/test-projects/django-app/.ai-dev/schema.json +0 -5
  114. package/test-projects/django-app/.ai-dev/summary.md +0 -15
  115. package/test-projects/django-app/.ai-dev/symbols.json +0 -1
  116. package/test-projects/django-app/.ai-dev/tech_stack.md +0 -32
  117. package/test-projects/django-app/README.md +0 -91
  118. package/test-projects/django-app/blog/__init__.py +0 -0
  119. package/test-projects/django-app/blog/admin.py +0 -31
  120. package/test-projects/django-app/blog/models.py +0 -55
  121. package/test-projects/django-app/blog/serializers.py +0 -69
  122. package/test-projects/django-app/blog/urls.py +0 -14
  123. package/test-projects/django-app/blog/views.py +0 -96
  124. package/test-projects/django-app/django_app/__init__.py +0 -0
  125. package/test-projects/django-app/django_app/settings.py +0 -90
  126. package/test-projects/django-app/django_app/urls.py +0 -11
  127. package/test-projects/django-app/django_app/wsgi.py +0 -9
  128. package/test-projects/django-app/manage.py +0 -23
  129. package/test-projects/django-app/requirements.txt +0 -3
  130. package/test-projects/django-app/users/__init__.py +0 -0
  131. package/test-projects/django-app/users/admin.py +0 -42
  132. package/test-projects/django-app/users/models.py +0 -54
  133. package/test-projects/django-app/users/serializers.py +0 -113
  134. package/test-projects/django-app/users/urls.py +0 -13
  135. package/test-projects/django-app/users/views.py +0 -135
  136. package/test-projects/express-api/.ai-dev/ai_context.md +0 -112
  137. package/test-projects/express-api/.ai-dev/ai_rules.md +0 -50
  138. package/test-projects/express-api/.ai-dev/architecture.md +0 -62
  139. package/test-projects/express-api/.ai-dev/context/features/controllers.json +0 -13
  140. package/test-projects/express-api/.ai-dev/context/features/services.json +0 -13
  141. package/test-projects/express-api/.ai-dev/context/flows/auth.json +0 -12
  142. package/test-projects/express-api/.ai-dev/context/flows/user.json +0 -13
  143. package/test-projects/express-api/.ai-dev/conventions.md +0 -51
  144. package/test-projects/express-api/.ai-dev/dependencies.json +0 -54
  145. package/test-projects/express-api/.ai-dev/entrypoints.md +0 -17
  146. package/test-projects/express-api/.ai-dev/modules.json +0 -30
  147. package/test-projects/express-api/.ai-dev/project.json +0 -15
  148. package/test-projects/express-api/.ai-dev/repo_map.json +0 -100
  149. package/test-projects/express-api/.ai-dev/repo_map.md +0 -36
  150. package/test-projects/express-api/.ai-dev/schema.json +0 -5
  151. package/test-projects/express-api/.ai-dev/summary.md +0 -14
  152. package/test-projects/express-api/.ai-dev/symbols.json +0 -7
  153. package/test-projects/express-api/.ai-dev/tech_stack.md +0 -38
  154. package/test-projects/express-api/.ai-dev/tools.json +0 -10
  155. package/test-projects/express-api/controllers/authController.js +0 -32
  156. package/test-projects/express-api/controllers/userController.js +0 -51
  157. package/test-projects/express-api/index.js +0 -30
  158. package/test-projects/express-api/middleware/authMiddleware.js +0 -30
  159. package/test-projects/express-api/models/userRepository.js +0 -25
  160. package/test-projects/express-api/package.json +0 -18
  161. package/test-projects/express-api/services/authService.js +0 -17
  162. package/test-projects/express-api/services/userService.js +0 -28
  163. package/test-projects/fastapi-app/.ai-dev/ai_context.md +0 -89
  164. package/test-projects/fastapi-app/.ai-dev/ai_rules.md +0 -47
  165. package/test-projects/fastapi-app/.ai-dev/architecture.md +0 -39
  166. package/test-projects/fastapi-app/.ai-dev/cache.json +0 -125
  167. package/test-projects/fastapi-app/.ai-dev/conventions.md +0 -51
  168. package/test-projects/fastapi-app/.ai-dev/dependencies.json +0 -244
  169. package/test-projects/fastapi-app/.ai-dev/entrypoints.md +0 -4
  170. package/test-projects/fastapi-app/.ai-dev/files.json +0 -154
  171. package/test-projects/fastapi-app/.ai-dev/graph/knowledge-graph.json +0 -15
  172. package/test-projects/fastapi-app/.ai-dev/graph/module-graph.json +0 -78
  173. package/test-projects/fastapi-app/.ai-dev/graph/symbol-graph.json +0 -1724
  174. package/test-projects/fastapi-app/.ai-dev/graph/symbol-references.json +0 -51
  175. package/test-projects/fastapi-app/.ai-dev/index-state.json +0 -217
  176. package/test-projects/fastapi-app/.ai-dev/modules.json +0 -16
  177. package/test-projects/fastapi-app/.ai-dev/project.json +0 -9
  178. package/test-projects/fastapi-app/.ai-dev/repo_map.json +0 -298
  179. package/test-projects/fastapi-app/.ai-dev/repo_map.md +0 -74
  180. package/test-projects/fastapi-app/.ai-dev/schema.json +0 -5
  181. package/test-projects/fastapi-app/.ai-dev/summary.md +0 -12
  182. package/test-projects/fastapi-app/.ai-dev/symbols.json +0 -1
  183. package/test-projects/fastapi-app/.ai-dev/tech_stack.md +0 -32
  184. package/test-projects/fastapi-app/.ai-dev/tools.json +0 -10
  185. package/test-projects/fastapi-app/README.md +0 -118
  186. package/test-projects/fastapi-app/app/database.py +0 -21
  187. package/test-projects/fastapi-app/app/dependencies.py +0 -107
  188. package/test-projects/fastapi-app/app/main.py +0 -47
  189. package/test-projects/fastapi-app/app/models.py +0 -149
  190. package/test-projects/fastapi-app/app/routers/auth.py +0 -117
  191. package/test-projects/fastapi-app/app/routers/posts.py +0 -272
  192. package/test-projects/fastapi-app/app/schemas.py +0 -191
  193. package/test-projects/fastapi-app/requirements.txt +0 -10
  194. package/test-projects/flask-app/.ai-dev/ai_context.md +0 -94
  195. package/test-projects/flask-app/.ai-dev/ai_rules.md +0 -47
  196. package/test-projects/flask-app/.ai-dev/architecture.md +0 -49
  197. package/test-projects/flask-app/.ai-dev/cache.json +0 -157
  198. package/test-projects/flask-app/.ai-dev/context/features/app.json +0 -25
  199. package/test-projects/flask-app/.ai-dev/context/flows/routes.json +0 -14
  200. package/test-projects/flask-app/.ai-dev/conventions.md +0 -51
  201. package/test-projects/flask-app/.ai-dev/dependencies.json +0 -298
  202. package/test-projects/flask-app/.ai-dev/entrypoints.md +0 -4
  203. package/test-projects/flask-app/.ai-dev/files.json +0 -194
  204. package/test-projects/flask-app/.ai-dev/graph/knowledge-graph.json +0 -60
  205. package/test-projects/flask-app/.ai-dev/graph/module-graph.json +0 -95
  206. package/test-projects/flask-app/.ai-dev/graph/symbol-graph.json +0 -1448
  207. package/test-projects/flask-app/.ai-dev/graph/symbol-references.json +0 -45
  208. package/test-projects/flask-app/.ai-dev/index-state.json +0 -273
  209. package/test-projects/flask-app/.ai-dev/modules.json +0 -21
  210. package/test-projects/flask-app/.ai-dev/project.json +0 -13
  211. package/test-projects/flask-app/.ai-dev/repo_map.json +0 -400
  212. package/test-projects/flask-app/.ai-dev/repo_map.md +0 -98
  213. package/test-projects/flask-app/.ai-dev/summary.md +0 -13
  214. package/test-projects/flask-app/.ai-dev/symbols.json +0 -1
  215. package/test-projects/flask-app/.ai-dev/tech_stack.md +0 -32
  216. package/test-projects/flask-app/.ai-dev/tools.json +0 -10
  217. package/test-projects/flask-app/README.md +0 -129
  218. package/test-projects/flask-app/app/__init__.py +0 -46
  219. package/test-projects/flask-app/app/api/__init__.py +0 -7
  220. package/test-projects/flask-app/app/api/routes.py +0 -122
  221. package/test-projects/flask-app/app/auth/__init__.py +0 -7
  222. package/test-projects/flask-app/app/auth/forms.py +0 -52
  223. package/test-projects/flask-app/app/auth/routes.py +0 -68
  224. package/test-projects/flask-app/app/blog/__init__.py +0 -7
  225. package/test-projects/flask-app/app/blog/forms.py +0 -35
  226. package/test-projects/flask-app/app/blog/routes.py +0 -140
  227. package/test-projects/flask-app/app/main/__init__.py +0 -7
  228. package/test-projects/flask-app/app/main/routes.py +0 -88
  229. package/test-projects/flask-app/app/models.py +0 -177
  230. package/test-projects/flask-app/config.py +0 -64
  231. package/test-projects/flask-app/requirements.txt +0 -10
  232. package/test-projects/laravel-app/.ai-dev/ai_context.md +0 -97
  233. package/test-projects/laravel-app/.ai-dev/ai_rules.md +0 -47
  234. package/test-projects/laravel-app/.ai-dev/architecture.md +0 -60
  235. package/test-projects/laravel-app/.ai-dev/cache.json +0 -161
  236. package/test-projects/laravel-app/.ai-dev/context/features/app.json +0 -21
  237. package/test-projects/laravel-app/.ai-dev/context/flows/.json +0 -9
  238. package/test-projects/laravel-app/.ai-dev/context/flows/category.json +0 -12
  239. package/test-projects/laravel-app/.ai-dev/context/flows/comment.json +0 -12
  240. package/test-projects/laravel-app/.ai-dev/context/flows/post.json +0 -12
  241. package/test-projects/laravel-app/.ai-dev/context/flows/unnamed.json +0 -9
  242. package/test-projects/laravel-app/.ai-dev/conventions.md +0 -51
  243. package/test-projects/laravel-app/.ai-dev/dependencies.json +0 -6
  244. package/test-projects/laravel-app/.ai-dev/entrypoints.md +0 -4
  245. package/test-projects/laravel-app/.ai-dev/files.json +0 -199
  246. package/test-projects/laravel-app/.ai-dev/graph/knowledge-graph.json +0 -98
  247. package/test-projects/laravel-app/.ai-dev/graph/module-graph.json +0 -30
  248. package/test-projects/laravel-app/.ai-dev/graph/symbol-graph.json +0 -5
  249. package/test-projects/laravel-app/.ai-dev/graph/symbol-references.json +0 -1
  250. package/test-projects/laravel-app/.ai-dev/index-state.json +0 -280
  251. package/test-projects/laravel-app/.ai-dev/modules.json +0 -29
  252. package/test-projects/laravel-app/.ai-dev/project.json +0 -17
  253. package/test-projects/laravel-app/.ai-dev/repo_map.json +0 -419
  254. package/test-projects/laravel-app/.ai-dev/repo_map.md +0 -106
  255. package/test-projects/laravel-app/.ai-dev/schema.json +0 -5
  256. package/test-projects/laravel-app/.ai-dev/summary.md +0 -15
  257. package/test-projects/laravel-app/.ai-dev/symbols.json +0 -1
  258. package/test-projects/laravel-app/.ai-dev/tech_stack.md +0 -34
  259. package/test-projects/laravel-app/.ai-dev/tools.json +0 -10
  260. package/test-projects/laravel-app/README.md +0 -107
  261. package/test-projects/laravel-app/app/Http/Controllers/Api/CategoryController.php +0 -88
  262. package/test-projects/laravel-app/app/Http/Controllers/Api/CommentController.php +0 -56
  263. package/test-projects/laravel-app/app/Http/Controllers/Api/PostController.php +0 -174
  264. package/test-projects/laravel-app/app/Http/Controllers/Controller.php +0 -12
  265. package/test-projects/laravel-app/app/Models/Category.php +0 -34
  266. package/test-projects/laravel-app/app/Models/Comment.php +0 -51
  267. package/test-projects/laravel-app/app/Models/Post.php +0 -108
  268. package/test-projects/laravel-app/app/Models/User.php +0 -85
  269. package/test-projects/laravel-app/bootstrap/app.php +0 -25
  270. package/test-projects/laravel-app/composer.json +0 -35
  271. package/test-projects/laravel-app/routes/api.php +0 -40
  272. package/test-projects/nestjs-backend/.ai-dev/ai_context.md +0 -111
  273. package/test-projects/nestjs-backend/.ai-dev/ai_rules.md +0 -52
  274. package/test-projects/nestjs-backend/.ai-dev/architecture.md +0 -49
  275. package/test-projects/nestjs-backend/.ai-dev/cache.json +0 -169
  276. package/test-projects/nestjs-backend/.ai-dev/context/features/src.json +0 -23
  277. package/test-projects/nestjs-backend/.ai-dev/context/flows/auth.controller.json +0 -14
  278. package/test-projects/nestjs-backend/.ai-dev/context/flows/auth.json +0 -10
  279. package/test-projects/nestjs-backend/.ai-dev/context/flows/users..json +0 -10
  280. package/test-projects/nestjs-backend/.ai-dev/context/flows/users.controller.json +0 -14
  281. package/test-projects/nestjs-backend/.ai-dev/context/flows/users.json +0 -10
  282. package/test-projects/nestjs-backend/.ai-dev/conventions.md +0 -52
  283. package/test-projects/nestjs-backend/.ai-dev/dependencies.json +0 -152
  284. package/test-projects/nestjs-backend/.ai-dev/entrypoints.md +0 -18
  285. package/test-projects/nestjs-backend/.ai-dev/files.json +0 -209
  286. package/test-projects/nestjs-backend/.ai-dev/graph/knowledge-graph.json +0 -132
  287. package/test-projects/nestjs-backend/.ai-dev/graph/module-graph.json +0 -29
  288. package/test-projects/nestjs-backend/.ai-dev/graph/symbol-graph.json +0 -304
  289. package/test-projects/nestjs-backend/.ai-dev/graph/symbol-references.json +0 -5
  290. package/test-projects/nestjs-backend/.ai-dev/index-state.json +0 -294
  291. package/test-projects/nestjs-backend/.ai-dev/modules.json +0 -19
  292. package/test-projects/nestjs-backend/.ai-dev/project.json +0 -18
  293. package/test-projects/nestjs-backend/.ai-dev/repo_map.json +0 -427
  294. package/test-projects/nestjs-backend/.ai-dev/repo_map.md +0 -104
  295. package/test-projects/nestjs-backend/.ai-dev/schema.json +0 -5
  296. package/test-projects/nestjs-backend/.ai-dev/summary.md +0 -13
  297. package/test-projects/nestjs-backend/.ai-dev/symbols.json +0 -1
  298. package/test-projects/nestjs-backend/.ai-dev/tech_stack.md +0 -38
  299. package/test-projects/nestjs-backend/.ai-dev/tools.json +0 -10
  300. package/test-projects/nestjs-backend/package.json +0 -22
  301. package/test-projects/nestjs-backend/src/app.module.ts +0 -8
  302. package/test-projects/nestjs-backend/src/auth/auth.controller.ts +0 -22
  303. package/test-projects/nestjs-backend/src/auth/auth.module.ts +0 -11
  304. package/test-projects/nestjs-backend/src/auth/auth.service.ts +0 -28
  305. package/test-projects/nestjs-backend/src/auth/dto/login.dto.ts +0 -4
  306. package/test-projects/nestjs-backend/src/auth/strategies/jwt.strategy.ts +0 -18
  307. package/test-projects/nestjs-backend/src/main.ts +0 -9
  308. package/test-projects/nestjs-backend/src/users/users.controller.ts +0 -32
  309. package/test-projects/nestjs-backend/src/users/users.module.ts +0 -10
  310. package/test-projects/nestjs-backend/src/users/users.service.ts +0 -42
  311. package/test-projects/nestjs-backend/tsconfig.json +0 -21
  312. package/test-projects/python-cli/.ai-dev/ai_context.md +0 -95
  313. package/test-projects/python-cli/.ai-dev/ai_rules.md +0 -47
  314. package/test-projects/python-cli/.ai-dev/architecture.md +0 -55
  315. package/test-projects/python-cli/.ai-dev/cache.json +0 -149
  316. package/test-projects/python-cli/.ai-dev/context/features/cli.json +0 -16
  317. package/test-projects/python-cli/.ai-dev/context/flows/list_.json +0 -9
  318. package/test-projects/python-cli/.ai-dev/context/flows/remove_.json +0 -9
  319. package/test-projects/python-cli/.ai-dev/conventions.md +0 -51
  320. package/test-projects/python-cli/.ai-dev/dependencies.json +0 -66
  321. package/test-projects/python-cli/.ai-dev/entrypoints.md +0 -4
  322. package/test-projects/python-cli/.ai-dev/files.json +0 -184
  323. package/test-projects/python-cli/.ai-dev/graph/knowledge-graph.json +0 -83
  324. package/test-projects/python-cli/.ai-dev/graph/module-graph.json +0 -31
  325. package/test-projects/python-cli/.ai-dev/graph/symbol-graph.json +0 -358
  326. package/test-projects/python-cli/.ai-dev/graph/symbol-references.json +0 -11
  327. package/test-projects/python-cli/.ai-dev/index-state.json +0 -259
  328. package/test-projects/python-cli/.ai-dev/modules.json +0 -21
  329. package/test-projects/python-cli/.ai-dev/project.json +0 -15
  330. package/test-projects/python-cli/.ai-dev/repo_map.json +0 -367
  331. package/test-projects/python-cli/.ai-dev/repo_map.md +0 -93
  332. package/test-projects/python-cli/.ai-dev/schema.json +0 -5
  333. package/test-projects/python-cli/.ai-dev/summary.md +0 -14
  334. package/test-projects/python-cli/.ai-dev/symbols.json +0 -1
  335. package/test-projects/python-cli/.ai-dev/tech_stack.md +0 -32
  336. package/test-projects/python-cli/.ai-dev/tools.json +0 -10
  337. package/test-projects/python-cli/__init__.py +0 -1
  338. package/test-projects/python-cli/cli/__init__.py +0 -1
  339. package/test-projects/python-cli/cli/add_command.py +0 -6
  340. package/test-projects/python-cli/cli/list_command.py +0 -7
  341. package/test-projects/python-cli/cli/remove_command.py +0 -6
  342. package/test-projects/python-cli/main.py +0 -34
  343. package/test-projects/python-cli/models/__init__.py +0 -2
  344. package/test-projects/python-cli/models/task.py +0 -19
  345. package/test-projects/python-cli/models/task_repository.py +0 -44
  346. package/test-projects/rails-app/.ai-dev/ai_context.md +0 -94
  347. package/test-projects/rails-app/.ai-dev/ai_rules.md +0 -47
  348. package/test-projects/rails-app/.ai-dev/architecture.md +0 -49
  349. package/test-projects/rails-app/.ai-dev/cache.json +0 -193
  350. package/test-projects/rails-app/.ai-dev/context/features/app.json +0 -24
  351. package/test-projects/rails-app/.ai-dev/context/features/config.json +0 -13
  352. package/test-projects/rails-app/.ai-dev/context/flows/application.json +0 -9
  353. package/test-projects/rails-app/.ai-dev/context/flows/application_.json +0 -9
  354. package/test-projects/rails-app/.ai-dev/context/flows/comments.json +0 -11
  355. package/test-projects/rails-app/.ai-dev/context/flows/comments_.json +0 -11
  356. package/test-projects/rails-app/.ai-dev/context/flows/posts.json +0 -11
  357. package/test-projects/rails-app/.ai-dev/context/flows/posts_.json +0 -11
  358. package/test-projects/rails-app/.ai-dev/context/flows/routes.json +0 -9
  359. package/test-projects/rails-app/.ai-dev/context/flows/users.json +0 -11
  360. package/test-projects/rails-app/.ai-dev/context/flows/users_.json +0 -11
  361. package/test-projects/rails-app/.ai-dev/conventions.md +0 -51
  362. package/test-projects/rails-app/.ai-dev/dependencies.json +0 -6
  363. package/test-projects/rails-app/.ai-dev/entrypoints.md +0 -4
  364. package/test-projects/rails-app/.ai-dev/files.json +0 -239
  365. package/test-projects/rails-app/.ai-dev/graph/knowledge-graph.json +0 -130
  366. package/test-projects/rails-app/.ai-dev/graph/module-graph.json +0 -27
  367. package/test-projects/rails-app/.ai-dev/graph/symbol-graph.json +0 -5
  368. package/test-projects/rails-app/.ai-dev/graph/symbol-references.json +0 -1
  369. package/test-projects/rails-app/.ai-dev/index-state.json +0 -336
  370. package/test-projects/rails-app/.ai-dev/modules.json +0 -26
  371. package/test-projects/rails-app/.ai-dev/project.json +0 -22
  372. package/test-projects/rails-app/.ai-dev/repo_map.json +0 -486
  373. package/test-projects/rails-app/.ai-dev/repo_map.md +0 -117
  374. package/test-projects/rails-app/.ai-dev/schema.json +0 -5
  375. package/test-projects/rails-app/.ai-dev/summary.md +0 -13
  376. package/test-projects/rails-app/.ai-dev/symbols.json +0 -1
  377. package/test-projects/rails-app/.ai-dev/tech_stack.md +0 -32
  378. package/test-projects/rails-app/.ai-dev/tools.json +0 -10
  379. package/test-projects/rails-app/Gemfile +0 -38
  380. package/test-projects/rails-app/README.md +0 -140
  381. package/test-projects/rails-app/Rakefile +0 -8
  382. package/test-projects/rails-app/app/controllers/api/comments_controller.rb +0 -75
  383. package/test-projects/rails-app/app/controllers/api/posts_controller.rb +0 -68
  384. package/test-projects/rails-app/app/controllers/api/users_controller.rb +0 -54
  385. package/test-projects/rails-app/app/controllers/application_controller.rb +0 -31
  386. package/test-projects/rails-app/app/models/comment.rb +0 -34
  387. package/test-projects/rails-app/app/models/post.rb +0 -36
  388. package/test-projects/rails-app/app/models/user.rb +0 -28
  389. package/test-projects/rails-app/app/services/post_service.rb +0 -92
  390. package/test-projects/rails-app/app/services/user_service.rb +0 -76
  391. package/test-projects/rails-app/config/application.rb +0 -27
  392. package/test-projects/rails-app/config/environment.rb +0 -7
  393. package/test-projects/rails-app/config/routes.rb +0 -15
  394. package/test-projects/react-app/.ai-dev/ai_context.md +0 -96
  395. package/test-projects/react-app/.ai-dev/architecture.md +0 -39
  396. package/test-projects/react-app/.ai-dev/cache.json +0 -153
  397. package/test-projects/react-app/.ai-dev/context/features/src.json +0 -18
  398. package/test-projects/react-app/.ai-dev/context/flows/UsersPage.json +0 -14
  399. package/test-projects/react-app/.ai-dev/context/flows/dashboard.json +0 -9
  400. package/test-projects/react-app/.ai-dev/context/flows/login.json +0 -9
  401. package/test-projects/react-app/.ai-dev/context/flows/users.json +0 -9
  402. package/test-projects/react-app/.ai-dev/dependencies.json +0 -128
  403. package/test-projects/react-app/.ai-dev/entrypoints.md +0 -4
  404. package/test-projects/react-app/.ai-dev/files.json +0 -189
  405. package/test-projects/react-app/.ai-dev/graph/knowledge-graph.json +0 -112
  406. package/test-projects/react-app/.ai-dev/graph/module-graph.json +0 -31
  407. package/test-projects/react-app/.ai-dev/graph/symbol-graph.json +0 -868
  408. package/test-projects/react-app/.ai-dev/graph/symbol-references.json +0 -31
  409. package/test-projects/react-app/.ai-dev/index-state.json +0 -266
  410. package/test-projects/react-app/.ai-dev/modules.json +0 -17
  411. package/test-projects/react-app/.ai-dev/project.json +0 -16
  412. package/test-projects/react-app/.ai-dev/repo_map.json +0 -391
  413. package/test-projects/react-app/.ai-dev/repo_map.md +0 -94
  414. package/test-projects/react-app/.ai-dev/schema.json +0 -5
  415. package/test-projects/react-app/.ai-dev/summary.md +0 -13
  416. package/test-projects/react-app/.ai-dev/symbols.json +0 -1
  417. package/test-projects/react-app/.ai-dev/tools.json +0 -10
  418. package/test-projects/react-app/package.json +0 -16
  419. package/test-projects/react-app/src/App.tsx +0 -21
  420. package/test-projects/react-app/src/context/AuthContext.tsx +0 -41
  421. package/test-projects/react-app/src/hooks/useAuth.ts +0 -10
  422. package/test-projects/react-app/src/main.tsx +0 -10
  423. package/test-projects/react-app/src/pages/DashboardPage.tsx +0 -17
  424. package/test-projects/react-app/src/pages/LoginPage.tsx +0 -41
  425. package/test-projects/react-app/src/pages/UsersPage.tsx +0 -36
  426. package/test-projects/react-app/src/services/userService.ts +0 -37
  427. package/test-projects/salesforce-cli/.ai-dev/ai_context.md +0 -89
  428. package/test-projects/salesforce-cli/.ai-dev/ai_rules.md +0 -47
  429. package/test-projects/salesforce-cli/.ai-dev/architecture.md +0 -39
  430. package/test-projects/salesforce-cli/.ai-dev/cache.json +0 -125
  431. package/test-projects/salesforce-cli/.ai-dev/context/features/force-app.json +0 -14
  432. package/test-projects/salesforce-cli/.ai-dev/context/flows/account.json +0 -9
  433. package/test-projects/salesforce-cli/.ai-dev/context/flows/opportunity.json +0 -9
  434. package/test-projects/salesforce-cli/.ai-dev/conventions.md +0 -51
  435. package/test-projects/salesforce-cli/.ai-dev/dependencies.json +0 -6
  436. package/test-projects/salesforce-cli/.ai-dev/entrypoints.md +0 -4
  437. package/test-projects/salesforce-cli/.ai-dev/files.json +0 -154
  438. package/test-projects/salesforce-cli/.ai-dev/graph/knowledge-graph.json +0 -64
  439. package/test-projects/salesforce-cli/.ai-dev/graph/module-graph.json +0 -13
  440. package/test-projects/salesforce-cli/.ai-dev/graph/symbol-graph.json +0 -148
  441. package/test-projects/salesforce-cli/.ai-dev/graph/symbol-references.json +0 -1
  442. package/test-projects/salesforce-cli/.ai-dev/index-state.json +0 -217
  443. package/test-projects/salesforce-cli/.ai-dev/modules.json +0 -12
  444. package/test-projects/salesforce-cli/.ai-dev/project.json +0 -14
  445. package/test-projects/salesforce-cli/.ai-dev/repo_map.json +0 -328
  446. package/test-projects/salesforce-cli/.ai-dev/repo_map.md +0 -80
  447. package/test-projects/salesforce-cli/.ai-dev/schema.json +0 -5
  448. package/test-projects/salesforce-cli/.ai-dev/summary.md +0 -13
  449. package/test-projects/salesforce-cli/.ai-dev/symbols.json +0 -1
  450. package/test-projects/salesforce-cli/.ai-dev/tech_stack.md +0 -31
  451. package/test-projects/salesforce-cli/.ai-dev/tools.json +0 -10
  452. package/test-projects/salesforce-cli/.forceignore +0 -27
  453. package/test-projects/salesforce-cli/force-app/main/default/classes/AccountController.cls +0 -24
  454. package/test-projects/salesforce-cli/force-app/main/default/classes/OpportunityController.cls +0 -25
  455. package/test-projects/salesforce-cli/force-app/main/default/objects/Project__c.object.xml +0 -45
  456. package/test-projects/salesforce-cli/force-app/main/default/triggers/AccountTrigger.trigger +0 -33
  457. package/test-projects/salesforce-cli/sfdx-project.json +0 -11
  458. package/test-projects/spring-boot-app/.ai-dev/ai_context.md +0 -91
  459. package/test-projects/spring-boot-app/.ai-dev/ai_rules.md +0 -48
  460. package/test-projects/spring-boot-app/.ai-dev/architecture.md +0 -39
  461. package/test-projects/spring-boot-app/.ai-dev/cache.json +0 -173
  462. package/test-projects/spring-boot-app/.ai-dev/context/features/src.json +0 -26
  463. package/test-projects/spring-boot-app/.ai-dev/context/flows/PostController.json +0 -19
  464. package/test-projects/spring-boot-app/.ai-dev/context/flows/UserController.json +0 -19
  465. package/test-projects/spring-boot-app/.ai-dev/context/flows/comment.json +0 -11
  466. package/test-projects/spring-boot-app/.ai-dev/context/flows/post.json +0 -14
  467. package/test-projects/spring-boot-app/.ai-dev/context/flows/user.json +0 -14
  468. package/test-projects/spring-boot-app/.ai-dev/conventions.md +0 -52
  469. package/test-projects/spring-boot-app/.ai-dev/dependencies.json +0 -326
  470. package/test-projects/spring-boot-app/.ai-dev/entrypoints.md +0 -4
  471. package/test-projects/spring-boot-app/.ai-dev/files.json +0 -214
  472. package/test-projects/spring-boot-app/.ai-dev/graph/knowledge-graph.json +0 -231
  473. package/test-projects/spring-boot-app/.ai-dev/graph/module-graph.json +0 -22
  474. package/test-projects/spring-boot-app/.ai-dev/graph/symbol-graph.json +0 -794
  475. package/test-projects/spring-boot-app/.ai-dev/graph/symbol-references.json +0 -70
  476. package/test-projects/spring-boot-app/.ai-dev/index-state.json +0 -301
  477. package/test-projects/spring-boot-app/.ai-dev/modules.json +0 -21
  478. package/test-projects/spring-boot-app/.ai-dev/project.json +0 -17
  479. package/test-projects/spring-boot-app/.ai-dev/repo_map.json +0 -461
  480. package/test-projects/spring-boot-app/.ai-dev/repo_map.md +0 -109
  481. package/test-projects/spring-boot-app/.ai-dev/schema.json +0 -5
  482. package/test-projects/spring-boot-app/.ai-dev/summary.md +0 -12
  483. package/test-projects/spring-boot-app/.ai-dev/symbols.json +0 -1
  484. package/test-projects/spring-boot-app/.ai-dev/tech_stack.md +0 -32
  485. package/test-projects/spring-boot-app/.ai-dev/tools.json +0 -10
  486. package/test-projects/spring-boot-app/.classpath +0 -57
  487. package/test-projects/spring-boot-app/.factorypath +0 -69
  488. package/test-projects/spring-boot-app/.project +0 -34
  489. package/test-projects/spring-boot-app/.settings/org.eclipse.core.resources.prefs +0 -4
  490. package/test-projects/spring-boot-app/.settings/org.eclipse.jdt.apt.core.prefs +0 -4
  491. package/test-projects/spring-boot-app/.settings/org.eclipse.jdt.core.prefs +0 -10
  492. package/test-projects/spring-boot-app/.settings/org.eclipse.m2e.core.prefs +0 -4
  493. package/test-projects/spring-boot-app/README.md +0 -122
  494. package/test-projects/spring-boot-app/pom.xml +0 -79
  495. package/test-projects/spring-boot-app/src/main/java/com/example/demo/DemoApplication.java +0 -12
  496. package/test-projects/spring-boot-app/src/main/java/com/example/demo/controllers/CommentController.java +0 -89
  497. package/test-projects/spring-boot-app/src/main/java/com/example/demo/controllers/PostController.java +0 -92
  498. package/test-projects/spring-boot-app/src/main/java/com/example/demo/controllers/UserController.java +0 -84
  499. package/test-projects/spring-boot-app/src/main/java/com/example/demo/models/Comment.java +0 -38
  500. package/test-projects/spring-boot-app/src/main/java/com/example/demo/models/Post.java +0 -56
  501. package/test-projects/spring-boot-app/src/main/java/com/example/demo/models/User.java +0 -44
  502. package/test-projects/spring-boot-app/src/main/java/com/example/demo/repositories/CommentRepository.java +0 -21
  503. package/test-projects/spring-boot-app/src/main/java/com/example/demo/repositories/PostRepository.java +0 -18
  504. package/test-projects/spring-boot-app/src/main/java/com/example/demo/repositories/UserRepository.java +0 -15
  505. package/test-projects/spring-boot-app/src/main/java/com/example/demo/services/PostService.java +0 -83
  506. package/test-projects/spring-boot-app/src/main/java/com/example/demo/services/UserService.java +0 -62
  507. package/test-projects/spring-boot-app/src/main/resources/application.properties +0 -22
  508. package/test-projects/spring-boot-app/target/classes/com/example/demo/DemoApplication.class +0 -0
  509. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/CommentController$CommentCreateRequest.class +0 -0
  510. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/CommentController$CommentUpdateRequest.class +0 -0
  511. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/CommentController.class +0 -0
  512. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/PostController$PostCreateRequest.class +0 -0
  513. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/PostController$PostUpdateRequest.class +0 -0
  514. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/PostController.class +0 -0
  515. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/UserController$UserCreateRequest.class +0 -0
  516. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/UserController$UserUpdateRequest.class +0 -0
  517. package/test-projects/spring-boot-app/target/classes/com/example/demo/controllers/UserController.class +0 -0
  518. package/test-projects/spring-boot-app/target/classes/com/example/demo/models/Comment.class +0 -0
  519. package/test-projects/spring-boot-app/target/classes/com/example/demo/models/Post.class +0 -0
  520. package/test-projects/spring-boot-app/target/classes/com/example/demo/models/User.class +0 -0
  521. package/test-projects/spring-boot-app/target/classes/com/example/demo/repositories/CommentRepository.class +0 -0
  522. package/test-projects/spring-boot-app/target/classes/com/example/demo/repositories/PostRepository.class +0 -0
  523. package/test-projects/spring-boot-app/target/classes/com/example/demo/repositories/UserRepository.class +0 -0
  524. package/test-projects/spring-boot-app/target/classes/com/example/demo/services/PostService.class +0 -0
  525. package/test-projects/spring-boot-app/target/classes/com/example/demo/services/UserService.class +0 -0
  526. package/tests/e2e/run-e2e.sh +0 -88
  527. /package/{test-projects/django-app/.ai-dev → ai-context}/tools.json +0 -0
@@ -0,0 +1,761 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import os from "os";
5
+ import { exec, spawn } from "child_process";
6
+ import { promisify } from "util";
7
+
8
+ const execAsync = promisify(exec);
9
+
10
+ const PROJECT_ROOT = process.cwd();
11
+ const CLI_PATH = path.join(PROJECT_ROOT, "dist/commands/ai-first.js");
12
+ const EXPRESS_API_PATH = path.join(PROJECT_ROOT, "test-projects/express-api");
13
+
14
+ /**
15
+ * Creates a temporary project directory with some source files
16
+ */
17
+ function createTempProjectDir(files: Record<string, string>): string {
18
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cli-init-test-"));
19
+ for (const [filePath, content] of Object.entries(files)) {
20
+ const fullPath = path.join(tempDir, filePath);
21
+ const dir = path.dirname(fullPath);
22
+ if (!fs.existsSync(dir)) {
23
+ fs.mkdirSync(dir, { recursive: true });
24
+ }
25
+ fs.writeFileSync(fullPath, content);
26
+ }
27
+ return tempDir;
28
+ }
29
+
30
+ /**
31
+ * Run the CLI init command
32
+ */
33
+ async function runInitCommand(
34
+ args: string[],
35
+ cwd: string = process.cwd()
36
+ ): Promise<{ stdout: string; stderr: string; exitCode: number }> {
37
+ return new Promise((resolve) => {
38
+ const cliArgs = ["node", CLI_PATH, "init", ...args];
39
+ const child = spawn("node", [CLI_PATH, "init", ...args], {
40
+ cwd,
41
+ stdio: "pipe",
42
+ });
43
+
44
+ let stdout = "";
45
+ let stderr = "";
46
+
47
+ child.stdout?.on("data", (data) => {
48
+ stdout += data.toString();
49
+ });
50
+
51
+ child.stderr?.on("data", (data) => {
52
+ stderr += data.toString();
53
+ });
54
+
55
+ child.on("close", (code) => {
56
+ resolve({
57
+ stdout,
58
+ stderr,
59
+ exitCode: code ?? 0,
60
+ });
61
+ });
62
+
63
+ child.on("error", (err) => {
64
+ stderr += err.message;
65
+ resolve({ stdout, stderr, exitCode: 1 });
66
+ });
67
+
68
+ // Timeout after 60 seconds
69
+ setTimeout(() => {
70
+ child.kill();
71
+ resolve({ stdout, stderr, exitCode: 124 });
72
+ }, 60000);
73
+ });
74
+ }
75
+
76
+ describe("CLI Init Command", () => {
77
+ let tempDir: string;
78
+ const tempDirs: string[] = [];
79
+
80
+ beforeAll(() => {
81
+ // Ensure dist is built
82
+ if (!fs.existsSync(CLI_PATH)) {
83
+ throw new Error(
84
+ `CLI not found at ${CLI_PATH}. Run 'npm run build' first.`
85
+ );
86
+ }
87
+ });
88
+
89
+ beforeEach(() => {
90
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cli-init-test-"));
91
+ tempDirs.push(tempDir);
92
+ });
93
+
94
+ afterAll(() => {
95
+ // Clean up all temp directories
96
+ for (const dir of tempDirs) {
97
+ fs.rmSync(dir, { recursive: true, force: true });
98
+ }
99
+ });
100
+
101
+ // =========================================================================
102
+ // DEFAULT OPTIONS TESTS
103
+ // =========================================================================
104
+
105
+ describe("Default Options", () => {
106
+ it("should run init command successfully on express-api project", async () => {
107
+ const result = await runInitCommand([], EXPRESS_API_PATH);
108
+
109
+ expect(result.exitCode).toBe(0);
110
+ expect(result.stdout).toContain("Created");
111
+ });
112
+
113
+ it("should create ai-context directory with default options", async () => {
114
+ const aiContextDir = path.join(EXPRESS_API_PATH, "ai-context");
115
+
116
+ // Clean up if exists
117
+ if (fs.existsSync(aiContextDir)) {
118
+ fs.rmSync(aiContextDir, { recursive: true, force: true });
119
+ }
120
+
121
+ const result = await runInitCommand([], EXPRESS_API_PATH);
122
+
123
+ expect(result.exitCode).toBe(0);
124
+ expect(fs.existsSync(aiContextDir)).toBe(true);
125
+ });
126
+
127
+ it("should create all expected context files", async () => {
128
+ const testProject = createTempProjectDir({
129
+ "index.js": "const app = require('./app');",
130
+ "package.json": '{"name": "test", "version": "1.0.0"}',
131
+ "src/main.ts": "export const main = () => {};",
132
+ });
133
+ tempDirs.push(testProject);
134
+
135
+ const aiContextDir = path.join(testProject, "ai-context");
136
+
137
+ const result = await runInitCommand([], testProject);
138
+
139
+ expect(result.exitCode).toBe(0);
140
+ expect(fs.existsSync(aiContextDir)).toBe(true);
141
+
142
+ // Check for expected files
143
+ const expectedFiles = [
144
+ "ai_context.md",
145
+ "repo_map.md",
146
+ "repo_map.json",
147
+ "summary.md",
148
+ "architecture.md",
149
+ "tech_stack.md",
150
+ "entrypoints.md",
151
+ "conventions.md",
152
+ "symbols.json",
153
+ "dependencies.json",
154
+ ];
155
+
156
+ for (const file of expectedFiles) {
157
+ const filePath = path.join(aiContextDir, file);
158
+ expect(fs.existsSync(filePath), `Expected ${file} to exist`).toBe(true);
159
+ }
160
+ });
161
+
162
+ it("should generate non-empty file content", async () => {
163
+ const testProject = createTempProjectDir({
164
+ "index.js": "const app = require('./app');",
165
+ "package.json": '{"name": "test", "version": "1.0.0"}',
166
+ "src/main.ts": "export const main = () => {};",
167
+ });
168
+ tempDirs.push(testProject);
169
+
170
+ const aiContextDir = path.join(testProject, "ai-context");
171
+
172
+ await runInitCommand([], testProject);
173
+
174
+ // Check that files have content
175
+ const aiContextPath = path.join(aiContextDir, "ai_context.md");
176
+ const symbolsPath = path.join(aiContextDir, "symbols.json");
177
+
178
+ expect(fs.existsSync(aiContextPath)).toBe(true);
179
+ expect(fs.existsSync(symbolsPath)).toBe(true);
180
+
181
+ const aiContextContent = fs.readFileSync(aiContextPath, "utf-8");
182
+ expect(aiContextContent.length).toBeGreaterThan(100);
183
+
184
+ const symbolsContent = fs.readFileSync(symbolsPath, "utf-8");
185
+ const symbols = JSON.parse(symbolsContent);
186
+ expect(symbols).toBeDefined();
187
+ });
188
+ });
189
+
190
+ // =========================================================================
191
+ // --root FLAG TESTS
192
+ // =========================================================================
193
+
194
+ describe("--root Flag", () => {
195
+ it("should scan different directory with --root flag", async () => {
196
+ const testProject = createTempProjectDir({
197
+ "README.md": "# Test Project",
198
+ "src/index.ts": "export const test = 1;",
199
+ });
200
+ tempDirs.push(testProject);
201
+
202
+ const result = await runInitCommand(["--root", testProject]);
203
+
204
+ expect(result.exitCode).toBe(0);
205
+ expect(result.stdout).toContain(testProject);
206
+ });
207
+
208
+ it("should handle --root with short flag -r", async () => {
209
+ const testProject = createTempProjectDir({
210
+ "README.md": "# Test Project",
211
+ "src/index.ts": "export const test = 1;",
212
+ });
213
+ tempDirs.push(testProject);
214
+
215
+ const result = await runInitCommand(["-r", testProject]);
216
+
217
+ expect(result.exitCode).toBe(0);
218
+ });
219
+
220
+ it("should error on non-existent root directory", async () => {
221
+ const nonExistentPath = path.join(os.tmpdir(), "non-existent-dir-12345");
222
+
223
+ const result = await runInitCommand(["--root", nonExistentPath]);
224
+
225
+ // Should complete but may have issues with the directory
226
+ // The CLI should handle this gracefully
227
+ expect(result).toBeDefined();
228
+ });
229
+
230
+ it("should scan nested project structure with --root", async () => {
231
+ const testProject = createTempProjectDir({
232
+ "package.json": '{"name": "nested-test"}',
233
+ "src/api/routes.ts": "export const routes = [];",
234
+ "src/services/user.ts": "export const userService = {};",
235
+ });
236
+ tempDirs.push(testProject);
237
+
238
+ const result = await runInitCommand(["--root", testProject]);
239
+
240
+ expect(result.exitCode).toBe(0);
241
+ expect(result.stdout).toContain("Found 3 files");
242
+ });
243
+ });
244
+
245
+ // =========================================================================
246
+ // --output FLAG TESTS
247
+ // =========================================================================
248
+
249
+ describe("--output Flag", () => {
250
+ it("should create custom output directory with --output flag", async () => {
251
+ const testProject = createTempProjectDir({
252
+ "index.js": "const app = require('./app');",
253
+ "package.json": '{"name": "test"}',
254
+ });
255
+ tempDirs.push(testProject);
256
+
257
+ const customOutput = path.join(testProject, "custom-ai-context");
258
+
259
+ const result = await runInitCommand(["--output", customOutput], testProject);
260
+
261
+ expect(result.exitCode).toBe(0);
262
+ expect(fs.existsSync(customOutput)).toBe(true);
263
+ });
264
+
265
+ it("should create files in custom output directory", async () => {
266
+ const testProject = createTempProjectDir({
267
+ "index.js": "const app = require('./app');",
268
+ "package.json": '{"name": "test"}',
269
+ });
270
+ tempDirs.push(testProject);
271
+
272
+ const customOutput = path.join(testProject, "my-context");
273
+
274
+ await runInitCommand(["--output", customOutput], testProject);
275
+
276
+ // Check expected files exist in custom output
277
+ expect(fs.existsSync(path.join(customOutput, "ai_context.md"))).toBe(true);
278
+ expect(fs.existsSync(path.join(customOutput, "repo_map.md"))).toBe(true);
279
+ expect(fs.existsSync(path.join(customOutput, "symbols.json"))).toBe(true);
280
+ });
281
+
282
+ it("should handle --output with short flag -o", async () => {
283
+ const testProject = createTempProjectDir({
284
+ "index.js": "const app = require('./app');",
285
+ "package.json": '{"name": "test"}',
286
+ });
287
+ tempDirs.push(testProject);
288
+
289
+ const customOutput = path.join(testProject, "my-context");
290
+
291
+ const result = await runInitCommand(["-o", customOutput], testProject);
292
+
293
+ expect(result.exitCode).toBe(0);
294
+ expect(fs.existsSync(customOutput)).toBe(true);
295
+ });
296
+
297
+ it("should work with both --root and --output combined", async () => {
298
+ const sourceProject = createTempProjectDir({
299
+ "src/index.ts": "export const main = () => {};",
300
+ "package.json": '{"name": "source"}',
301
+ });
302
+ const outputProject = createTempProjectDir({});
303
+ tempDirs.push(sourceProject);
304
+ tempDirs.push(outputProject);
305
+
306
+ const customOutput = path.join(outputProject, "ai-output");
307
+
308
+ const result = await runInitCommand(
309
+ ["--root", sourceProject, "--output", customOutput],
310
+ sourceProject
311
+ );
312
+
313
+ expect(result.exitCode).toBe(0);
314
+ expect(fs.existsSync(customOutput)).toBe(true);
315
+ });
316
+ });
317
+
318
+ // =========================================================================
319
+ // OVERWRITE BEHAVIOR TESTS
320
+ // =========================================================================
321
+
322
+ describe("Overwrite Behavior", () => {
323
+ it("should overwrite existing ai-context files", async () => {
324
+ const testProject = createTempProjectDir({
325
+ "index.js": "const app = require('./app');",
326
+ "package.json": '{"name": "test"}',
327
+ });
328
+ tempDirs.push(testProject);
329
+
330
+ const aiContextDir = path.join(testProject, "ai-context");
331
+ fs.mkdirSync(aiContextDir, { recursive: true });
332
+
333
+ // Create existing file
334
+ const existingFile = path.join(aiContextDir, "repo_map.md");
335
+ fs.writeFileSync(existingFile, "Old content");
336
+
337
+ // Run init again
338
+ const result = await runInitCommand([], testProject);
339
+
340
+ expect(result.exitCode).toBe(0);
341
+
342
+ // File should be overwritten with new content
343
+ const content = fs.readFileSync(existingFile, "utf-8");
344
+ expect(content).not.toBe("Old content");
345
+ expect(content.length).toBeGreaterThan(0);
346
+ });
347
+
348
+ it("should handle existing custom output directory", async () => {
349
+ const testProject = createTempProjectDir({
350
+ "index.js": "const app = require('./app');",
351
+ "package.json": '{"name": "test"}',
352
+ });
353
+ tempDirs.push(testProject);
354
+
355
+ const customOutput = path.join(testProject, "my-context");
356
+ fs.mkdirSync(customOutput, { recursive: true });
357
+
358
+ // Create existing file in custom output
359
+ const existingFile = path.join(customOutput, "existing.txt");
360
+ fs.writeFileSync(existingFile, "Old content");
361
+
362
+ const result = await runInitCommand(["--output", customOutput], testProject);
363
+
364
+ expect(result.exitCode).toBe(0);
365
+ expect(fs.existsSync(existingFile)).toBe(true);
366
+ });
367
+ });
368
+
369
+ // =========================================================================
370
+ // ERROR HANDLING TESTS
371
+ // =========================================================================
372
+
373
+ describe("Error Handling", () => {
374
+ it("should handle permission errors gracefully", async () => {
375
+ // Create a directory without write permissions
376
+ const testProject = createTempProjectDir({
377
+ "index.js": "const app = require('./app');",
378
+ "package.json": '{"name": "test"}',
379
+ });
380
+ tempDirs.push(testProject);
381
+
382
+ // Make the directory read-only (remove write permissions)
383
+ // Note: This might not work on Windows, so we skip if not possible
384
+ try {
385
+ fs.chmodSync(testProject, 0o555);
386
+ } catch {
387
+ // Skip if we can't change permissions
388
+ return;
389
+ }
390
+
391
+ try {
392
+ const result = await runInitCommand([], testProject);
393
+ // Should either succeed or fail gracefully
394
+ expect(result).toBeDefined();
395
+ } finally {
396
+ // Restore permissions so cleanup can work
397
+ try {
398
+ fs.chmodSync(testProject, 0o755);
399
+ } catch {
400
+ // Ignore
401
+ }
402
+ }
403
+ });
404
+
405
+ it("should handle invalid output path characters", async () => {
406
+ const testProject = createTempProjectDir({
407
+ "index.js": "const app = require('./app');",
408
+ "package.json": '{"name": "test"}',
409
+ });
410
+ tempDirs.push(testProject);
411
+
412
+ // Use a path that might cause issues
413
+ const invalidOutput = path.join(testProject, "valid-dir");
414
+ fs.mkdirSync(invalidOutput, { recursive: true });
415
+
416
+ const result = await runInitCommand(["--output", invalidOutput], testProject);
417
+
418
+ // Should complete without crashing
419
+ expect(result).toBeDefined();
420
+ });
421
+
422
+ it("should handle empty project directory", async () => {
423
+ const emptyProject = fs.mkdtempSync(path.join(os.tmpdir(), "empty-project-"));
424
+ tempDirs.push(emptyProject);
425
+
426
+ const result = await runInitCommand([], emptyProject);
427
+
428
+ // Should complete even with empty project
429
+ expect(result).toBeDefined();
430
+ // ai-context directory should be created
431
+ expect(fs.existsSync(path.join(emptyProject, "ai-context"))).toBe(true);
432
+ });
433
+
434
+ it("should handle project with only hidden files", async () => {
435
+ const hiddenFilesProject = createTempProjectDir({
436
+ ".gitignore": "node_modules",
437
+ ".env": "SECRET=123",
438
+ ".npmrc": "registry=https://registry.npmjs.org/",
439
+ });
440
+ tempDirs.push(hiddenFilesProject);
441
+
442
+ const result = await runInitCommand([], hiddenFilesProject);
443
+
444
+ // Should complete
445
+ expect(result).toBeDefined();
446
+ });
447
+ });
448
+
449
+ // =========================================================================
450
+ // CONTENT VALIDATION TESTS
451
+ // =========================================================================
452
+
453
+ describe("Content Validation", () => {
454
+ it("should generate valid JSON in symbols.json", async () => {
455
+ const testProject = createTempProjectDir({
456
+ "index.js": "const app = require('./app');",
457
+ "package.json": '{"name": "test"}',
458
+ "src/main.ts": "export const main = () => {};",
459
+ });
460
+ tempDirs.push(testProject);
461
+
462
+ await runInitCommand([], testProject);
463
+
464
+ const symbolsPath = path.join(testProject, "ai-context", "symbols.json");
465
+ expect(fs.existsSync(symbolsPath)).toBe(true);
466
+
467
+ const content = fs.readFileSync(symbolsPath, "utf-8");
468
+ expect(() => JSON.parse(content)).not.toThrow();
469
+ });
470
+
471
+ it("should generate valid JSON in dependencies.json", async () => {
472
+ const testProject = createTempProjectDir({
473
+ "index.js": "const app = require('./app');",
474
+ "package.json": '{"name": "test"}',
475
+ });
476
+ tempDirs.push(testProject);
477
+
478
+ await runInitCommand([], testProject);
479
+
480
+ const depsPath = path.join(testProject, "ai-context", "dependencies.json");
481
+ expect(fs.existsSync(depsPath)).toBe(true);
482
+
483
+ const content = fs.readFileSync(depsPath, "utf-8");
484
+ expect(() => JSON.parse(content)).not.toThrow();
485
+ });
486
+
487
+ it("should generate valid JSON in repo_map.json", async () => {
488
+ const testProject = createTempProjectDir({
489
+ "index.js": "const app = require('./app');",
490
+ "package.json": '{"name": "test"}',
491
+ });
492
+ tempDirs.push(testProject);
493
+
494
+ await runInitCommand([], testProject);
495
+
496
+ const repoMapPath = path.join(testProject, "ai-context", "repo_map.json");
497
+ expect(fs.existsSync(repoMapPath)).toBe(true);
498
+
499
+ const content = fs.readFileSync(repoMapPath, "utf-8");
500
+ expect(() => JSON.parse(content)).not.toThrow();
501
+ });
502
+
503
+ it("should generate markdown files with content", async () => {
504
+ const testProject = createTempProjectDir({
505
+ "index.js": "const app = require('./app');",
506
+ "package.json": '{"name": "test"}',
507
+ });
508
+ tempDirs.push(testProject);
509
+
510
+ await runInitCommand([], testProject);
511
+
512
+ const markdownFiles = ["summary.md", "architecture.md", "tech_stack.md"];
513
+
514
+ for (const file of markdownFiles) {
515
+ const filePath = path.join(testProject, "ai-context", file);
516
+ expect(fs.existsSync(filePath), `Expected ${file} to exist`).toBe(true);
517
+
518
+ const content = fs.readFileSync(filePath, "utf-8");
519
+ expect(content.length).toBeGreaterThan(10);
520
+ }
521
+ });
522
+
523
+ it("should include project name in ai_context.md", async () => {
524
+ const testProject = createTempProjectDir({
525
+ "index.js": "const app = require('./app');",
526
+ "package.json": '{"name": "my-test-project", "version": "1.0.0"}',
527
+ });
528
+ tempDirs.push(testProject);
529
+
530
+ await runInitCommand([], testProject);
531
+
532
+ const aiContextPath = path.join(testProject, "ai-context", "ai_context.md");
533
+ const content = fs.readFileSync(aiContextPath, "utf-8");
534
+
535
+ // Should mention AI context or repository
536
+ expect(
537
+ content.toLowerCase().includes("ai context") ||
538
+ content.toLowerCase().includes("repository") ||
539
+ content.toLowerCase().includes("project")
540
+ ).toBe(true);
541
+ });
542
+ });
543
+
544
+ // =========================================================================
545
+ // MULTI-LANGUAGE PROJECT TESTS
546
+ // =========================================================================
547
+
548
+ describe("Multi-Language Projects", () => {
549
+ it("should handle TypeScript project", async () => {
550
+ const tsProject = createTempProjectDir({
551
+ "package.json": '{"name": "ts-project"}',
552
+ "tsconfig.json": '{"compilerOptions": {}}',
553
+ "src/index.ts": "export const main = (): void => {};",
554
+ "src/app.ts": "export class App {}",
555
+ });
556
+ tempDirs.push(tsProject);
557
+
558
+ const result = await runInitCommand([], tsProject);
559
+
560
+ expect(result.exitCode).toBe(0);
561
+
562
+ const symbolsPath = path.join(tsProject, "ai-context", "symbols.json");
563
+ expect(fs.existsSync(symbolsPath)).toBe(true);
564
+ });
565
+
566
+ it("should handle Python project", async () => {
567
+ const pyProject = createTempProjectDir({
568
+ "main.py": "def main(): pass",
569
+ "requirements.txt": "flask==2.0.0",
570
+ });
571
+ tempDirs.push(pyProject);
572
+
573
+ const result = await runInitCommand([], pyProject);
574
+
575
+ expect(result.exitCode).toBe(0);
576
+
577
+ const techStackPath = path.join(pyProject, "ai-context", "tech_stack.md");
578
+ expect(fs.existsSync(techStackPath)).toBe(true);
579
+ });
580
+
581
+ it("should handle mixed language project", async () => {
582
+ const mixedProject = createTempProjectDir({
583
+ "package.json": '{"name": "mixed"}',
584
+ "index.js": "const express = require('express');",
585
+ "src/main.ts": "export const app = {};",
586
+ "src/utils.py": "def helper(): pass",
587
+ "src/data.java": "public class Data {}",
588
+ });
589
+ tempDirs.push(mixedProject);
590
+
591
+ const result = await runInitCommand([], mixedProject);
592
+
593
+ expect(result.exitCode).toBe(0);
594
+
595
+ const techStackPath = path.join(mixedProject, "ai-context", "tech_stack.md");
596
+ const content = fs.readFileSync(techStackPath, "utf-8");
597
+
598
+ // Should detect multiple languages
599
+ expect(content).toBeDefined();
600
+ });
601
+ });
602
+
603
+ // =========================================================================
604
+ // EDGE CASES
605
+ // =========================================================================
606
+
607
+ describe("Edge Cases", () => {
608
+ it("should handle project with very long paths", async () => {
609
+ const deepDir = path.join(
610
+ os.tmpdir(),
611
+ "very-long-directory-name-test",
612
+ "another-long-directory-name",
613
+ "yet-another-long-name",
614
+ "final-long-directory-name"
615
+ );
616
+
617
+ fs.mkdirSync(deepDir, { recursive: true });
618
+ tempDirs.push(deepDir);
619
+
620
+ fs.writeFileSync(path.join(deepDir, "index.js"), "const x = 1;");
621
+ fs.writeFileSync(
622
+ path.join(deepDir, "package.json"),
623
+ '{"name": "deep"}'
624
+ );
625
+
626
+ const result = await runInitCommand([], deepDir);
627
+
628
+ expect(result).toBeDefined();
629
+ // Should complete without crashing
630
+ });
631
+
632
+ it("should handle project with special characters in file names", async () => {
633
+ const specialProject = createTempProjectDir({
634
+ "index.js": "const app = require('./app');",
635
+ "package.json": '{"name": "test"}',
636
+ "src/file-with-dashes.js": "const x = 1;",
637
+ "src/file_with_underscores.js": "const y = 2;",
638
+ });
639
+ tempDirs.push(specialProject);
640
+
641
+ const result = await runInitCommand([], specialProject);
642
+
643
+ expect(result.exitCode).toBe(0);
644
+ });
645
+
646
+ it("should handle project with large number of files", async () => {
647
+ const largeProject = fs.mkdtempSync(path.join(os.tmpdir(), "large-project-"));
648
+ tempDirs.push(largeProject);
649
+
650
+ fs.writeFileSync(path.join(largeProject, "package.json"), '{"name": "large"}');
651
+
652
+ // Create 50 files
653
+ for (let i = 0; i < 50; i++) {
654
+ fs.writeFileSync(
655
+ path.join(largeProject, `file${i}.js`),
656
+ `const x${i} = ${i};`
657
+ );
658
+ }
659
+
660
+ const result = await runInitCommand([], largeProject);
661
+
662
+ expect(result.exitCode).toBe(0);
663
+
664
+ const repoMapPath = path.join(largeProject, "ai-context", "repo_map.json");
665
+ const content = fs.readFileSync(repoMapPath, "utf-8");
666
+ const data = JSON.parse(content);
667
+
668
+ expect(data.totalFiles).toBeGreaterThanOrEqual(50);
669
+ });
670
+
671
+ it("should handle project with symlinks", async () => {
672
+ const symlinkProject = createTempProjectDir({
673
+ "index.js": "const app = require('./app');",
674
+ "package.json": '{"name": "symlink-test"}',
675
+ });
676
+ tempDirs.push(symlinkProject);
677
+
678
+ // Create a symlink to a directory
679
+ const targetDir = path.join(symlinkProject, "target-dir");
680
+ fs.mkdirSync(targetDir);
681
+ fs.writeFileSync(path.join(targetDir, "target.js"), "const y = 1;");
682
+
683
+ const symlinkDir = path.join(symlinkProject, "linked-dir");
684
+ fs.symlinkSync(targetDir, symlinkDir);
685
+
686
+ const result = await runInitCommand([], symlinkProject);
687
+
688
+ // Should complete without crashing
689
+ expect(result).toBeDefined();
690
+ });
691
+ });
692
+
693
+ // =========================================================================
694
+ // FILE STRUCTURE VALIDATION
695
+ // =========================================================================
696
+
697
+ describe("File Structure Validation", () => {
698
+ it("should create proper directory structure in ai-context", async () => {
699
+ const testProject = createTempProjectDir({
700
+ "index.js": "const app = require('./app');",
701
+ "package.json": '{"name": "test"}',
702
+ });
703
+ tempDirs.push(testProject);
704
+
705
+ await runInitCommand([], testProject);
706
+
707
+ const aiContextDir = path.join(testProject, "ai-context");
708
+ const entries = fs.readdirSync(aiContextDir, { withFileTypes: true });
709
+
710
+ // Should have multiple files
711
+ const files = entries.filter((e) => e.isFile());
712
+ expect(files.length).toBeGreaterThan(5);
713
+
714
+ // Should have context subdirectory
715
+ const hasContextDir = entries.some(
716
+ (e) => e.isDirectory() && e.name === "context"
717
+ );
718
+ // context subdirectory might not always be created depending on the project
719
+ });
720
+
721
+ it("should create modules.json with proper structure", async () => {
722
+ const testProject = createTempProjectDir({
723
+ "package.json": '{"name": "module-test"}',
724
+ "src/index.ts": "export const main = () => {};",
725
+ "src/api/routes.ts": "export const routes = [];",
726
+ "src/services/user.ts": "export const userService = {};",
727
+ });
728
+ tempDirs.push(testProject);
729
+
730
+ await runInitCommand([], testProject);
731
+
732
+ const modulesPath = path.join(testProject, "ai-context", "modules.json");
733
+ expect(fs.existsSync(modulesPath)).toBe(true);
734
+
735
+ const content = fs.readFileSync(modulesPath, "utf-8");
736
+ const data = JSON.parse(content);
737
+
738
+ expect(data.modules).toBeDefined();
739
+ expect(typeof data.modules).toBe("object");
740
+ });
741
+
742
+ it("should include context subdirectory files when generated", async () => {
743
+ const testProject = createTempProjectDir({
744
+ "package.json": '{"name": "context-test"}',
745
+ "index.js": "const app = require('./app');",
746
+ });
747
+ tempDirs.push(testProject);
748
+
749
+ await runInitCommand([], testProject);
750
+
751
+ const contextDir = path.join(testProject, "ai-context", "context");
752
+
753
+ // Context directory should exist
754
+ if (fs.existsSync(contextDir)) {
755
+ const entries = fs.readdirSync(contextDir, { withFileTypes: true });
756
+ // Just verify the directory can be read
757
+ expect(entries).toBeDefined();
758
+ }
759
+ });
760
+ });
761
+ });