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
@@ -1,32 +0,0 @@
1
- # Technology Stack
2
-
3
- **Languages**: Markdown, JSON, Python
4
-
5
- ## Languages
6
- - Markdown
7
- - JSON
8
- - Python
9
-
10
- ## Frameworks
11
- - None detected
12
-
13
- ## Key Libraries
14
- - None detected
15
-
16
- ## Development Tools
17
- - None detected
18
-
19
- ## Package Managers
20
- - None detected
21
-
22
- ## Testing
23
- - None detected
24
-
25
- ## Linters
26
- - None detected
27
-
28
- ## Formatters
29
- - None detected
30
-
31
- ---
32
- *Generated by ai-first*
@@ -1,10 +0,0 @@
1
- {
2
- "compatibleAgents": [
3
- "ai-first-bridge",
4
- "opencode",
5
- "cursor",
6
- "windsurf",
7
- "cline"
8
- ],
9
- "schemaVersion": "1.0"
10
- }
@@ -1,118 +0,0 @@
1
- # FastAPI Blog
2
-
3
- A modern, fast blog API built with FastAPI, SQLAlchemy, and Pydantic.
4
-
5
- ## Features
6
-
7
- - **High Performance**: Built on FastAPI (one of the fastest Python frameworks)
8
- - **Automatic API Documentation**: Interactive docs at `/docs` (Swagger UI) and `/redoc` (ReDoc)
9
- - **Type Safety**: Full type hints with Pydantic models
10
- - **Authentication**: JWT token-based authentication
11
- - **Database**: SQLAlchemy ORM with SQLite (easily switchable to PostgreSQL)
12
- - **Modern Python**: Python 3.9+ with async support
13
-
14
- ## Project Structure
15
-
16
- ```
17
- fastapi-app/
18
- ├── app/
19
- │ ├── __init__.py
20
- │ ├── main.py # FastAPI application entry point
21
- │ ├── database.py # Database configuration
22
- │ ├── models.py # SQLAlchemy models
23
- │ ├── schemas.py # Pydantic schemas
24
- │ ├── dependencies.py # Authentication & dependencies
25
- │ └── routers/
26
- │ ├── __init__.py
27
- │ ├── auth.py # Authentication endpoints
28
- │ └── posts.py # Blog post endpoints
29
- ├── tests/
30
- └── requirements.txt
31
- ```
32
-
33
- ## Models
34
-
35
- ### User
36
- - Authentication with JWT tokens
37
- - Profile information (bio, full_name)
38
- - Relationships: posts, comments
39
-
40
- ### Post
41
- - Blog posts with title, content, slug
42
- - Publishing workflow (draft → published)
43
- - Categories and tags
44
- - View counter
45
-
46
- ### Comment
47
- - Nested comments (replies)
48
- - Approval system
49
-
50
- ### Category
51
- - Post categorization
52
- - URL-friendly slugs
53
-
54
- ### Tag
55
- - Post tagging system
56
- - Many-to-many relationship with posts
57
-
58
- ## API Endpoints
59
-
60
- ### Authentication
61
- - `POST /api/v1/auth/register` - Register new user
62
- - `POST /api/v1/auth/token` - Login and get token
63
- - `GET /api/v1/auth/me` - Get current user
64
- - `PUT /api/v1/auth/me` - Update profile
65
- - `POST /api/v1/auth/change-password` - Change password
66
-
67
- ### Posts
68
- - `GET /api/v1/posts/` - List posts (with filters)
69
- - `POST /api/v1/posts/` - Create post
70
- - `GET /api/v1/posts/{slug}` - Get single post
71
- - `PUT /api/v1/posts/{post_id}` - Update post
72
- - `DELETE /api/v1/posts/{post_id}` - Delete post
73
- - `POST /api/v1/posts/{post_id}/publish` - Publish post
74
- - `GET /api/v1/posts/my/posts` - Get my posts
75
-
76
- ### Filters Available
77
- - `category_slug` - Filter by category
78
- - `tag_slug` - Filter by tag
79
- - `search` - Search in title/content
80
- - `published_only` - Show only published (default: true)
81
-
82
- ## Setup
83
-
84
- ```bash
85
- # Install dependencies
86
- pip install -r requirements.txt
87
-
88
- # Run the application
89
- python -m app.main
90
-
91
- # Or using uvicorn directly
92
- uvicorn app.main:app --reload
93
-
94
- # Access API documentation
95
- # OpenAPI (Swagger UI): http://localhost:8000/docs
96
- # ReDoc: http://localhost:8000/redoc
97
- ```
98
-
99
- ## Testing with ai-first
100
-
101
- ```bash
102
- # Generate AI context
103
- ai-first init --root fastapi-app
104
-
105
- # Generate repository map
106
- ai-first map --root fastapi-app
107
-
108
- # Generate SQLite index
109
- ai-first index --root fastapi-app
110
- ```
111
-
112
- ## Key Features
113
-
114
- - **Pydantic v2**: Latest version with better performance
115
- - **SQLAlchemy 2.0**: Modern ORM syntax
116
- - **Dependency Injection**: FastAPI's powerful DI system
117
- - **Automatic Validation**: Request/response validation out of the box
118
- - **Type Hints**: Full IDE support with autocomplete
@@ -1,21 +0,0 @@
1
- from sqlalchemy import create_engine
2
- from sqlalchemy.ext.declarative import declarative_base
3
- from sqlalchemy.orm import sessionmaker
4
-
5
- SQLALCHEMY_DATABASE_URL = "sqlite:///./fastapi_app.db"
6
-
7
- engine = create_engine(
8
- SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
9
- )
10
- SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
11
-
12
- Base = declarative_base()
13
-
14
-
15
- def get_db():
16
- """Dependency to get database session."""
17
- db = SessionLocal()
18
- try:
19
- yield db
20
- finally:
21
- db.close()
@@ -1,107 +0,0 @@
1
- from datetime import datetime, timedelta
2
- from typing import Optional
3
- from jose import JWTError, jwt
4
- from passlib.context import CryptContext
5
- from sqlalchemy.orm import Session
6
- from fastapi import Depends, HTTPException, status
7
- from fastapi.security import OAuth2PasswordBearer
8
- from app import models, schemas
9
- from app.database import get_db
10
-
11
- # Security configuration
12
- SECRET_KEY = "your-secret-key-here-change-in-production"
13
- ALGORITHM = "HS256"
14
- ACCESS_TOKEN_EXPIRE_MINUTES = 30
15
-
16
- pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
17
- oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/v1/auth/token")
18
-
19
-
20
- def verify_password(plain_password: str, hashed_password: str) -> bool:
21
- """Verify a password against its hash."""
22
- return pwd_context.verify(plain_password, hashed_password)
23
-
24
-
25
- def get_password_hash(password: str) -> str:
26
- """Hash a password."""
27
- return pwd_context.hash(password)
28
-
29
-
30
- def get_user(db: Session, username: str) -> Optional[models.User]:
31
- """Get user by username."""
32
- return db.query(models.User).filter(models.User.username == username).first()
33
-
34
-
35
- def get_user_by_email(db: Session, email: str) -> Optional[models.User]:
36
- """Get user by email."""
37
- return db.query(models.User).filter(models.User.email == email).first()
38
-
39
-
40
- def authenticate_user(
41
- db: Session, username: str, password: str
42
- ) -> Optional[models.User]:
43
- """Authenticate a user."""
44
- user = get_user(db, username)
45
- if not user:
46
- return None
47
- if not verify_password(password, user.hashed_password):
48
- return None
49
- return user
50
-
51
-
52
- def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
53
- """Create JWT access token."""
54
- to_encode = data.copy()
55
- if expires_delta:
56
- expire = datetime.utcnow() + expires_delta
57
- else:
58
- expire = datetime.utcnow() + timedelta(minutes=15)
59
- to_encode.update({"exp": expire})
60
- encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
61
- return encoded_jwt
62
-
63
-
64
- async def get_current_user(
65
- token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)
66
- ) -> models.User:
67
- """Get current authenticated user."""
68
- credentials_exception = HTTPException(
69
- status_code=status.HTTP_401_UNAUTHORIZED,
70
- detail="Could not validate credentials",
71
- headers={"WWW-Authenticate": "Bearer"},
72
- )
73
-
74
- try:
75
- payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
76
- username: str = payload.get("sub")
77
- if username is None:
78
- raise credentials_exception
79
- token_data = schemas.TokenData(username=username)
80
- except JWTError:
81
- raise credentials_exception
82
-
83
- user = get_user(db, username=token_data.username)
84
- if user is None:
85
- raise credentials_exception
86
-
87
- return user
88
-
89
-
90
- async def get_current_active_user(
91
- current_user: models.User = Depends(get_current_user),
92
- ) -> models.User:
93
- """Get current active user."""
94
- if not current_user.is_active:
95
- raise HTTPException(status_code=400, detail="Inactive user")
96
- return current_user
97
-
98
-
99
- async def get_current_superuser(
100
- current_user: models.User = Depends(get_current_active_user),
101
- ) -> models.User:
102
- """Get current superuser."""
103
- if not current_user.is_superuser:
104
- raise HTTPException(
105
- status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions"
106
- )
107
- return current_user
@@ -1,47 +0,0 @@
1
- from fastapi import FastAPI
2
- from fastapi.middleware.cors import CORSMiddleware
3
- from app.database import engine, Base
4
- from app.routers import auth, posts
5
-
6
- # Create database tables
7
- Base.metadata.create_all(bind=engine)
8
-
9
- # Create FastAPI app
10
- app = FastAPI(
11
- title="FastAPI Blog",
12
- description="A modern blog API built with FastAPI",
13
- version="1.0.0",
14
- docs_url="/docs",
15
- redoc_url="/redoc",
16
- )
17
-
18
- # Add CORS middleware
19
- app.add_middleware(
20
- CORSMiddleware,
21
- allow_origins=["*"],
22
- allow_credentials=True,
23
- allow_methods=["*"],
24
- allow_headers=["*"],
25
- )
26
-
27
- # Include routers
28
- app.include_router(auth.router, prefix="/api/v1")
29
- app.include_router(posts.router, prefix="/api/v1")
30
-
31
-
32
- @app.get("/")
33
- def read_root():
34
- """Root endpoint."""
35
- return {"message": "Welcome to FastAPI Blog", "docs": "/docs", "version": "1.0.0"}
36
-
37
-
38
- @app.get("/health")
39
- def health_check():
40
- """Health check endpoint."""
41
- return {"status": "healthy"}
42
-
43
-
44
- if __name__ == "__main__":
45
- import uvicorn
46
-
47
- uvicorn.run(app, host="0.0.0.0", port=8000)
@@ -1,149 +0,0 @@
1
- from sqlalchemy import (
2
- Column,
3
- Integer,
4
- String,
5
- Boolean,
6
- DateTime,
7
- ForeignKey,
8
- Text,
9
- Table,
10
- )
11
- from sqlalchemy.orm import relationship
12
- from sqlalchemy.sql import func
13
- from app.database import Base
14
-
15
- # Association table for many-to-many relationship
16
- post_tags = Table(
17
- "post_tags",
18
- Base.metadata,
19
- Column("post_id", Integer, ForeignKey("posts.id")),
20
- Column("tag_id", Integer, ForeignKey("tags.id")),
21
- )
22
-
23
-
24
- class User(Base):
25
- """User model for authentication and posts."""
26
-
27
- __tablename__ = "users"
28
-
29
- id = Column(Integer, primary_key=True, index=True)
30
- email = Column(String, unique=True, index=True, nullable=False)
31
- username = Column(String, unique=True, index=True, nullable=False)
32
- hashed_password = Column(String, nullable=False)
33
- full_name = Column(String)
34
- bio = Column(Text)
35
- is_active = Column(Boolean, default=True)
36
- is_superuser = Column(Boolean, default=False)
37
- created_at = Column(DateTime(timezone=True), server_default=func.now())
38
- updated_at = Column(DateTime(timezone=True), onupdate=func.now())
39
-
40
- # Relationships
41
- posts = relationship("Post", back_populates="author", cascade="all, delete-orphan")
42
- comments = relationship(
43
- "Comment", back_populates="author", cascade="all, delete-orphan"
44
- )
45
-
46
- def __repr__(self):
47
- return f"<User(username='{self.username}', email='{self.email}')>"
48
-
49
-
50
- class Post(Base):
51
- """Blog post model."""
52
-
53
- __tablename__ = "posts"
54
-
55
- id = Column(Integer, primary_key=True, index=True)
56
- title = Column(String(255), nullable=False)
57
- slug = Column(String(255), unique=True, index=True, nullable=False)
58
- content = Column(Text, nullable=False)
59
- summary = Column(String(500))
60
- is_published = Column(Boolean, default=False)
61
- published_at = Column(DateTime(timezone=True))
62
- view_count = Column(Integer, default=0)
63
- created_at = Column(DateTime(timezone=True), server_default=func.now())
64
- updated_at = Column(DateTime(timezone=True), onupdate=func.now())
65
- author_id = Column(Integer, ForeignKey("users.id"), nullable=False)
66
-
67
- # Relationships
68
- author = relationship("User", back_populates="posts")
69
- comments = relationship(
70
- "Comment", back_populates="post", cascade="all, delete-orphan"
71
- )
72
- tags = relationship("Tag", secondary=post_tags, back_populates="posts")
73
- category_id = Column(Integer, ForeignKey("categories.id"))
74
- category = relationship("Category", back_populates="posts")
75
-
76
- def __repr__(self):
77
- return f"<Post(title='{self.title}', slug='{self.slug}')>"
78
-
79
- def publish(self):
80
- """Publish the post."""
81
- from datetime import datetime
82
-
83
- self.is_published = True
84
- self.published_at = datetime.utcnow()
85
-
86
- def unpublish(self):
87
- """Unpublish the post."""
88
- self.is_published = False
89
- self.published_at = None
90
-
91
-
92
- class Comment(Base):
93
- """Comment model for blog posts."""
94
-
95
- __tablename__ = "comments"
96
-
97
- id = Column(Integer, primary_key=True, index=True)
98
- content = Column(Text, nullable=False)
99
- is_approved = Column(Boolean, default=False)
100
- created_at = Column(DateTime(timezone=True), server_default=func.now())
101
- updated_at = Column(DateTime(timezone=True), onupdate=func.now())
102
-
103
- # Foreign keys
104
- post_id = Column(Integer, ForeignKey("posts.id"), nullable=False)
105
- author_id = Column(Integer, ForeignKey("users.id"), nullable=False)
106
- parent_id = Column(Integer, ForeignKey("comments.id"), nullable=True)
107
-
108
- # Relationships
109
- post = relationship("Post", back_populates="comments")
110
- author = relationship("User", back_populates="comments")
111
- replies = relationship("Comment", backref="parent", remote_side=[id])
112
-
113
- def __repr__(self):
114
- return f"<Comment(id={self.id}, post_id={self.post_id})>"
115
-
116
-
117
- class Category(Base):
118
- """Category model for organizing posts."""
119
-
120
- __tablename__ = "categories"
121
-
122
- id = Column(Integer, primary_key=True, index=True)
123
- name = Column(String(100), unique=True, nullable=False)
124
- slug = Column(String(100), unique=True, index=True, nullable=False)
125
- description = Column(Text)
126
- created_at = Column(DateTime(timezone=True), server_default=func.now())
127
-
128
- # Relationships
129
- posts = relationship("Post", back_populates="category")
130
-
131
- def __repr__(self):
132
- return f"<Category(name='{self.name}')>"
133
-
134
-
135
- class Tag(Base):
136
- """Tag model for posts."""
137
-
138
- __tablename__ = "tags"
139
-
140
- id = Column(Integer, primary_key=True, index=True)
141
- name = Column(String(50), unique=True, nullable=False)
142
- slug = Column(String(50), unique=True, index=True, nullable=False)
143
- created_at = Column(DateTime(timezone=True), server_default=func.now())
144
-
145
- # Relationships
146
- posts = relationship("Post", secondary=post_tags, back_populates="tags")
147
-
148
- def __repr__(self):
149
- return f"<Tag(name='{self.name}')>"
@@ -1,117 +0,0 @@
1
- from datetime import timedelta
2
- from typing import List
3
- from fastapi import APIRouter, Depends, HTTPException, status
4
- from sqlalchemy.orm import Session
5
- from app import models, schemas
6
- from app.database import get_db
7
- from app.dependencies import (
8
- authenticate_user,
9
- create_access_token,
10
- get_current_active_user,
11
- get_password_hash,
12
- ACCESS_TOKEN_EXPIRE_MINUTES,
13
- get_user,
14
- get_user_by_email,
15
- )
16
-
17
- router = APIRouter(prefix="/auth", tags=["authentication"])
18
-
19
-
20
- @router.post(
21
- "/register", response_model=schemas.User, status_code=status.HTTP_201_CREATED
22
- )
23
- def register(user: schemas.UserCreate, db: Session = Depends(get_db)):
24
- """Register a new user."""
25
- # Check if username exists
26
- db_user = get_user(db, username=user.username)
27
- if db_user:
28
- raise HTTPException(
29
- status_code=status.HTTP_400_BAD_REQUEST,
30
- detail="Username already registered",
31
- )
32
-
33
- # Check if email exists
34
- db_user = get_user_by_email(db, email=user.email)
35
- if db_user:
36
- raise HTTPException(
37
- status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered"
38
- )
39
-
40
- # Create new user
41
- hashed_password = get_password_hash(user.password)
42
- db_user = models.User(
43
- email=user.email,
44
- username=user.username,
45
- hashed_password=hashed_password,
46
- full_name=user.full_name,
47
- bio=user.bio,
48
- )
49
- db.add(db_user)
50
- db.commit()
51
- db.refresh(db_user)
52
-
53
- return db_user
54
-
55
-
56
- @router.post("/token", response_model=schemas.Token)
57
- def login(form_data: schemas.LoginRequest, db: Session = Depends(get_db)):
58
- """Login and get access token."""
59
- user = authenticate_user(db, form_data.username, form_data.password)
60
- if not user:
61
- raise HTTPException(
62
- status_code=status.HTTP_401_UNAUTHORIZED,
63
- detail="Incorrect username or password",
64
- headers={"WWW-Authenticate": "Bearer"},
65
- )
66
-
67
- access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
68
- access_token = create_access_token(
69
- data={"sub": user.username}, expires_delta=access_token_expires
70
- )
71
-
72
- return {"access_token": access_token, "token_type": "bearer"}
73
-
74
-
75
- @router.get("/me", response_model=schemas.User)
76
- def read_users_me(current_user: models.User = Depends(get_current_active_user)):
77
- """Get current user information."""
78
- return current_user
79
-
80
-
81
- @router.put("/me", response_model=schemas.User)
82
- def update_user_me(
83
- user_update: schemas.UserUpdate,
84
- current_user: models.User = Depends(get_current_active_user),
85
- db: Session = Depends(get_db),
86
- ):
87
- """Update current user."""
88
- update_data = user_update.model_dump(exclude_unset=True)
89
-
90
- for field, value in update_data.items():
91
- setattr(current_user, field, value)
92
-
93
- db.commit()
94
- db.refresh(current_user)
95
-
96
- return current_user
97
-
98
-
99
- @router.post("/change-password")
100
- def change_password(
101
- old_password: str,
102
- new_password: str,
103
- current_user: models.User = Depends(get_current_active_user),
104
- db: Session = Depends(get_db),
105
- ):
106
- """Change user password."""
107
- from app.dependencies import verify_password, get_password_hash
108
-
109
- if not verify_password(old_password, current_user.hashed_password):
110
- raise HTTPException(
111
- status_code=status.HTTP_400_BAD_REQUEST, detail="Incorrect password"
112
- )
113
-
114
- current_user.hashed_password = get_password_hash(new_password)
115
- db.commit()
116
-
117
- return {"message": "Password updated successfully"}