aios-core 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/.aios-core/.session/current-session.json +14 -0
  2. package/.aios-core/cli/commands/generate/index.js +222 -0
  3. package/.aios-core/cli/commands/manifest/index.js +46 -0
  4. package/.aios-core/cli/commands/manifest/regenerate.js +96 -0
  5. package/.aios-core/cli/commands/manifest/validate.js +66 -0
  6. package/.aios-core/cli/commands/mcp/add.js +234 -0
  7. package/.aios-core/cli/commands/mcp/index.js +76 -0
  8. package/.aios-core/cli/commands/mcp/link.js +217 -0
  9. package/.aios-core/cli/commands/mcp/setup.js +164 -0
  10. package/.aios-core/cli/commands/mcp/status.js +183 -0
  11. package/.aios-core/cli/commands/metrics/cleanup.js +91 -0
  12. package/.aios-core/cli/commands/metrics/index.js +65 -0
  13. package/.aios-core/cli/commands/metrics/record.js +154 -0
  14. package/.aios-core/cli/commands/metrics/seed.js +126 -0
  15. package/.aios-core/cli/commands/metrics/show.js +209 -0
  16. package/.aios-core/cli/commands/migrate/analyze.js +353 -0
  17. package/.aios-core/cli/commands/migrate/backup.js +352 -0
  18. package/.aios-core/cli/commands/migrate/execute.js +292 -0
  19. package/.aios-core/cli/commands/migrate/index.js +441 -0
  20. package/.aios-core/cli/commands/migrate/rollback.js +323 -0
  21. package/.aios-core/cli/commands/migrate/update-imports.js +396 -0
  22. package/.aios-core/cli/commands/migrate/validate.js +452 -0
  23. package/.aios-core/cli/commands/qa/index.js +56 -0
  24. package/.aios-core/cli/commands/qa/run.js +163 -0
  25. package/.aios-core/cli/commands/qa/status.js +195 -0
  26. package/.aios-core/cli/commands/workers/formatters/info-formatter.js +274 -0
  27. package/.aios-core/cli/commands/workers/formatters/list-table.js +265 -0
  28. package/.aios-core/cli/commands/workers/formatters/list-tree.js +159 -0
  29. package/.aios-core/cli/commands/workers/index.js +56 -0
  30. package/.aios-core/cli/commands/workers/info.js +194 -0
  31. package/.aios-core/cli/commands/workers/list.js +214 -0
  32. package/.aios-core/cli/commands/workers/search-filters.js +185 -0
  33. package/.aios-core/cli/commands/workers/search-keyword.js +310 -0
  34. package/.aios-core/cli/commands/workers/search-semantic.js +293 -0
  35. package/.aios-core/cli/commands/workers/search.js +154 -0
  36. package/.aios-core/cli/commands/workers/utils/pagination.js +102 -0
  37. package/.aios-core/cli/index.js +128 -0
  38. package/.aios-core/cli/utils/output-formatter-cli.js +232 -0
  39. package/.aios-core/cli/utils/score-calculator.js +221 -0
  40. package/.aios-core/core/README.md +229 -0
  41. package/.aios-core/core/config/config-cache.js +233 -0
  42. package/.aios-core/core/config/config-loader.js +277 -0
  43. package/.aios-core/core/data/agent-config-requirements.yaml +368 -0
  44. package/.aios-core/core/data/aios-kb.md +924 -0
  45. package/.aios-core/core/data/workflow-patterns.yaml +267 -0
  46. package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
  47. package/.aios-core/core/docs/component-creation-guide.md +458 -0
  48. package/.aios-core/core/docs/session-update-pattern.md +307 -0
  49. package/.aios-core/core/docs/template-syntax.md +267 -0
  50. package/.aios-core/core/docs/troubleshooting-guide.md +625 -0
  51. package/.aios-core/core/elicitation/agent-elicitation.js +272 -0
  52. package/.aios-core/core/elicitation/elicitation-engine.js +479 -0
  53. package/.aios-core/core/elicitation/session-manager.js +320 -0
  54. package/.aios-core/core/elicitation/task-elicitation.js +281 -0
  55. package/.aios-core/core/elicitation/workflow-elicitation.js +315 -0
  56. package/.aios-core/core/index.esm.js +42 -0
  57. package/.aios-core/core/index.js +76 -0
  58. package/.aios-core/core/manifest/manifest-generator.js +386 -0
  59. package/.aios-core/core/manifest/manifest-validator.js +429 -0
  60. package/.aios-core/core/mcp/config-migrator.js +340 -0
  61. package/.aios-core/core/mcp/global-config-manager.js +369 -0
  62. package/.aios-core/core/mcp/index.js +34 -0
  63. package/.aios-core/core/mcp/os-detector.js +188 -0
  64. package/.aios-core/core/mcp/symlink-manager.js +413 -0
  65. package/.aios-core/core/migration/migration-config.yaml +83 -0
  66. package/.aios-core/core/migration/module-mapping.yaml +89 -0
  67. package/.aios-core/core/quality-gates/base-layer.js +134 -0
  68. package/.aios-core/core/quality-gates/checklist-generator.js +329 -0
  69. package/.aios-core/core/quality-gates/focus-area-recommender.js +359 -0
  70. package/.aios-core/core/quality-gates/human-review-orchestrator.js +529 -0
  71. package/.aios-core/core/quality-gates/layer1-precommit.js +336 -0
  72. package/.aios-core/core/quality-gates/layer2-pr-automation.js +324 -0
  73. package/.aios-core/core/quality-gates/layer3-human-review.js +348 -0
  74. package/.aios-core/core/quality-gates/notification-manager.js +550 -0
  75. package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -0
  76. package/.aios-core/core/quality-gates/quality-gate-manager.js +601 -0
  77. package/.aios-core/core/registry/README.md +179 -0
  78. package/.aios-core/core/registry/build-registry.js +452 -0
  79. package/.aios-core/core/registry/registry-loader.js +330 -0
  80. package/.aios-core/core/registry/registry-schema.json +166 -0
  81. package/.aios-core/core/registry/service-registry.json +6586 -0
  82. package/.aios-core/core/registry/validate-registry.js +340 -0
  83. package/.aios-core/core/session/context-detector.js +229 -0
  84. package/.aios-core/core/session/context-loader.js +288 -0
  85. package/.aios-core/core/utils/output-formatter.js +298 -0
  86. package/.aios-core/core/utils/security-utils.js +333 -0
  87. package/.aios-core/core/utils/yaml-validator.js +419 -0
  88. package/.aios-core/core-config.yaml +382 -0
  89. package/.aios-core/data/agent-config-requirements.yaml +368 -0
  90. package/.aios-core/data/aios-kb.md +924 -0
  91. package/.aios-core/data/technical-preferences.md +4 -0
  92. package/.aios-core/data/workflow-patterns.yaml +267 -0
  93. package/.aios-core/development/README.md +142 -0
  94. package/.aios-core/development/agent-teams/team-all.yaml +15 -0
  95. package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -0
  96. package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -0
  97. package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -0
  98. package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -0
  99. package/.aios-core/development/agents/aios-master.md +339 -0
  100. package/.aios-core/development/agents/analyst.md +195 -0
  101. package/.aios-core/development/agents/architect.md +359 -0
  102. package/.aios-core/development/agents/data-engineer.md +468 -0
  103. package/.aios-core/development/agents/dev.md +390 -0
  104. package/.aios-core/development/agents/devops.md +398 -0
  105. package/.aios-core/development/agents/pm.md +198 -0
  106. package/.aios-core/development/agents/po.md +256 -0
  107. package/.aios-core/development/agents/qa.md +312 -0
  108. package/.aios-core/development/agents/sm.md +220 -0
  109. package/.aios-core/development/agents/ux-design-expert.md +451 -0
  110. package/.aios-core/development/scripts/agent-assignment-resolver.js +231 -0
  111. package/.aios-core/development/scripts/agent-config-loader.js +624 -0
  112. package/.aios-core/development/scripts/agent-exit-hooks.js +96 -0
  113. package/.aios-core/development/scripts/apply-inline-greeting-all-agents.js +146 -0
  114. package/.aios-core/development/scripts/audit-agent-config.js +380 -0
  115. package/.aios-core/development/scripts/backlog-manager.js +404 -0
  116. package/.aios-core/development/scripts/batch-update-agents-session-context.js +95 -0
  117. package/.aios-core/development/scripts/decision-context.js +228 -0
  118. package/.aios-core/development/scripts/decision-log-generator.js +293 -0
  119. package/.aios-core/development/scripts/decision-log-indexer.js +284 -0
  120. package/.aios-core/development/scripts/decision-recorder.js +168 -0
  121. package/.aios-core/development/scripts/dev-context-loader.js +297 -0
  122. package/.aios-core/development/scripts/generate-greeting.js +160 -0
  123. package/.aios-core/development/scripts/greeting-builder.js +866 -0
  124. package/.aios-core/development/scripts/greeting-config-cli.js +85 -0
  125. package/.aios-core/development/scripts/greeting-preference-manager.js +145 -0
  126. package/.aios-core/development/scripts/migrate-task-to-v2.js +377 -0
  127. package/.aios-core/development/scripts/story-index-generator.js +337 -0
  128. package/.aios-core/development/scripts/story-manager.js +375 -0
  129. package/.aios-core/development/scripts/story-update-hook.js +259 -0
  130. package/.aios-core/development/scripts/task-identifier-resolver.js +145 -0
  131. package/.aios-core/development/scripts/test-greeting-system.js +142 -0
  132. package/.aios-core/development/scripts/validate-task-v2.js +319 -0
  133. package/.aios-core/development/scripts/workflow-navigator.js +214 -0
  134. package/.aios-core/development/tasks/add-mcp.md +319 -0
  135. package/.aios-core/development/tasks/advanced-elicitation.md +319 -0
  136. package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +342 -0
  137. package/.aios-core/development/tasks/analyze-framework.md +697 -0
  138. package/.aios-core/development/tasks/analyze-performance.md +637 -0
  139. package/.aios-core/development/tasks/apply-qa-fixes.md +340 -0
  140. package/.aios-core/development/tasks/architect-analyze-impact.md +827 -0
  141. package/.aios-core/development/tasks/audit-codebase.md +429 -0
  142. package/.aios-core/development/tasks/audit-tailwind-config.md +270 -0
  143. package/.aios-core/development/tasks/audit-utilities.md +358 -0
  144. package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -0
  145. package/.aios-core/development/tasks/brownfield-create-epic.md +486 -0
  146. package/.aios-core/development/tasks/brownfield-create-story.md +357 -0
  147. package/.aios-core/development/tasks/build-component.md +478 -0
  148. package/.aios-core/development/tasks/calculate-roi.md +455 -0
  149. package/.aios-core/development/tasks/ci-cd-configuration.md +764 -0
  150. package/.aios-core/development/tasks/cleanup-utilities.md +670 -0
  151. package/.aios-core/development/tasks/collaborative-edit.md +1109 -0
  152. package/.aios-core/development/tasks/compose-molecule.md +284 -0
  153. package/.aios-core/development/tasks/consolidate-patterns.md +414 -0
  154. package/.aios-core/development/tasks/correct-course.md +280 -0
  155. package/.aios-core/development/tasks/create-agent.md +322 -0
  156. package/.aios-core/development/tasks/create-brownfield-story.md +727 -0
  157. package/.aios-core/development/tasks/create-deep-research-prompt.md +499 -0
  158. package/.aios-core/development/tasks/create-doc.md +316 -0
  159. package/.aios-core/development/tasks/create-next-story.md +774 -0
  160. package/.aios-core/development/tasks/create-suite.md +284 -0
  161. package/.aios-core/development/tasks/create-task.md +372 -0
  162. package/.aios-core/development/tasks/create-workflow.md +371 -0
  163. package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -0
  164. package/.aios-core/development/tasks/db-apply-migration.md +381 -0
  165. package/.aios-core/development/tasks/db-bootstrap.md +642 -0
  166. package/.aios-core/development/tasks/db-domain-modeling.md +693 -0
  167. package/.aios-core/development/tasks/db-dry-run.md +293 -0
  168. package/.aios-core/development/tasks/db-env-check.md +260 -0
  169. package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -0
  170. package/.aios-core/development/tasks/db-explain.md +631 -0
  171. package/.aios-core/development/tasks/db-impersonate.md +495 -0
  172. package/.aios-core/development/tasks/db-load-csv.md +593 -0
  173. package/.aios-core/development/tasks/db-policy-apply.md +653 -0
  174. package/.aios-core/development/tasks/db-rls-audit.md +411 -0
  175. package/.aios-core/development/tasks/db-rollback.md +739 -0
  176. package/.aios-core/development/tasks/db-run-sql.md +613 -0
  177. package/.aios-core/development/tasks/db-schema-audit.md +1011 -0
  178. package/.aios-core/development/tasks/db-seed.md +390 -0
  179. package/.aios-core/development/tasks/db-smoke-test.md +351 -0
  180. package/.aios-core/development/tasks/db-snapshot.md +569 -0
  181. package/.aios-core/development/tasks/db-supabase-setup.md +712 -0
  182. package/.aios-core/development/tasks/db-verify-order.md +515 -0
  183. package/.aios-core/development/tasks/deprecate-component.md +957 -0
  184. package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -0
  185. package/.aios-core/development/tasks/dev-backlog-debt.md +469 -0
  186. package/.aios-core/development/tasks/dev-develop-story.md +846 -0
  187. package/.aios-core/development/tasks/dev-improve-code-quality.md +873 -0
  188. package/.aios-core/development/tasks/dev-optimize-performance.md +1034 -0
  189. package/.aios-core/development/tasks/dev-suggest-refactoring.md +871 -0
  190. package/.aios-core/development/tasks/dev-validate-next-story.md +349 -0
  191. package/.aios-core/development/tasks/document-project.md +553 -0
  192. package/.aios-core/development/tasks/environment-bootstrap.md +1311 -0
  193. package/.aios-core/development/tasks/execute-checklist.md +301 -0
  194. package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -0
  195. package/.aios-core/development/tasks/extend-pattern.md +269 -0
  196. package/.aios-core/development/tasks/extract-tokens.md +467 -0
  197. package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -0
  198. package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +261 -0
  199. package/.aios-core/development/tasks/generate-documentation.md +284 -0
  200. package/.aios-core/development/tasks/generate-migration-strategy.md +522 -0
  201. package/.aios-core/development/tasks/generate-shock-report.md +501 -0
  202. package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -0
  203. package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -0
  204. package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -0
  205. package/.aios-core/development/tasks/github-devops-version-management.md +483 -0
  206. package/.aios-core/development/tasks/improve-self.md +823 -0
  207. package/.aios-core/development/tasks/index-docs.md +388 -0
  208. package/.aios-core/development/tasks/init-project-status.md +506 -0
  209. package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -0
  210. package/.aios-core/development/tasks/kb-mode-interaction.md +284 -0
  211. package/.aios-core/development/tasks/learn-patterns.md +901 -0
  212. package/.aios-core/development/tasks/mcp-workflow.md +437 -0
  213. package/.aios-core/development/tasks/modify-agent.md +382 -0
  214. package/.aios-core/development/tasks/modify-task.md +425 -0
  215. package/.aios-core/development/tasks/modify-workflow.md +466 -0
  216. package/.aios-core/development/tasks/po-backlog-add.md +370 -0
  217. package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -0
  218. package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -0
  219. package/.aios-core/development/tasks/po-pull-story.md +316 -0
  220. package/.aios-core/development/tasks/po-stories-index.md +351 -0
  221. package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -0
  222. package/.aios-core/development/tasks/po-sync-story.md +303 -0
  223. package/.aios-core/development/tasks/pr-automation.md +701 -0
  224. package/.aios-core/development/tasks/propose-modification.md +843 -0
  225. package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -0
  226. package/.aios-core/development/tasks/qa-gate.md +374 -0
  227. package/.aios-core/development/tasks/qa-generate-tests.md +1175 -0
  228. package/.aios-core/development/tasks/qa-nfr-assess.md +558 -0
  229. package/.aios-core/development/tasks/qa-review-proposal.md +1158 -0
  230. package/.aios-core/development/tasks/qa-review-story.md +683 -0
  231. package/.aios-core/development/tasks/qa-risk-profile.md +567 -0
  232. package/.aios-core/development/tasks/qa-run-tests.md +277 -0
  233. package/.aios-core/development/tasks/qa-test-design.md +388 -0
  234. package/.aios-core/development/tasks/qa-trace-requirements.md +477 -0
  235. package/.aios-core/development/tasks/release-management.md +723 -0
  236. package/.aios-core/development/tasks/security-audit.md +554 -0
  237. package/.aios-core/development/tasks/security-scan.md +790 -0
  238. package/.aios-core/development/tasks/setup-database.md +741 -0
  239. package/.aios-core/development/tasks/setup-design-system.md +462 -0
  240. package/.aios-core/development/tasks/setup-github.md +874 -0
  241. package/.aios-core/development/tasks/setup-llm-routing.md +229 -0
  242. package/.aios-core/development/tasks/setup-mcp-docker.md +584 -0
  243. package/.aios-core/development/tasks/shard-doc.md +538 -0
  244. package/.aios-core/development/tasks/sm-create-next-story.md +480 -0
  245. package/.aios-core/development/tasks/sync-documentation.md +865 -0
  246. package/.aios-core/development/tasks/tailwind-upgrade.md +294 -0
  247. package/.aios-core/development/tasks/test-as-user.md +621 -0
  248. package/.aios-core/development/tasks/test-validation-task.md +171 -0
  249. package/.aios-core/development/tasks/undo-last.md +347 -0
  250. package/.aios-core/development/tasks/update-manifest.md +410 -0
  251. package/.aios-core/development/tasks/ux-create-wireframe.md +617 -0
  252. package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -0
  253. package/.aios-core/development/tasks/ux-user-research.md +559 -0
  254. package/.aios-core/development/tasks/validate-next-story.md +423 -0
  255. package/.aios-core/development/tasks/validate-structure.md +243 -0
  256. package/.aios-core/development/workflows/README.md +84 -0
  257. package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -0
  258. package/.aios-core/development/workflows/brownfield-service.yaml +187 -0
  259. package/.aios-core/development/workflows/brownfield-ui.yaml +197 -0
  260. package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -0
  261. package/.aios-core/development/workflows/greenfield-service.yaml +206 -0
  262. package/.aios-core/development/workflows/greenfield-ui.yaml +235 -0
  263. package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
  264. package/.aios-core/docs/component-creation-guide.md +458 -0
  265. package/.aios-core/docs/session-update-pattern.md +307 -0
  266. package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -0
  267. package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -0
  268. package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -0
  269. package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -0
  270. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -0
  271. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -0
  272. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -0
  273. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -0
  274. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -0
  275. package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -0
  276. package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -0
  277. package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -0
  278. package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -0
  279. package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -0
  280. package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -0
  281. package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -0
  282. package/.aios-core/docs/template-syntax.md +267 -0
  283. package/.aios-core/docs/troubleshooting-guide.md +625 -0
  284. package/.aios-core/elicitation/agent-elicitation.js +272 -0
  285. package/.aios-core/elicitation/task-elicitation.js +281 -0
  286. package/.aios-core/elicitation/workflow-elicitation.js +315 -0
  287. package/.aios-core/index.d.ts +8 -0
  288. package/.aios-core/index.esm.js +16 -0
  289. package/.aios-core/index.js +16 -0
  290. package/.aios-core/infrastructure/README.md +126 -0
  291. package/.aios-core/infrastructure/index.js +199 -0
  292. package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -0
  293. package/.aios-core/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
  294. package/.aios-core/infrastructure/integrations/pm-adapters/github-adapter.js +392 -0
  295. package/.aios-core/infrastructure/integrations/pm-adapters/jira-adapter.js +448 -0
  296. package/.aios-core/infrastructure/integrations/pm-adapters/local-adapter.js +175 -0
  297. package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +122 -0
  298. package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +89 -0
  299. package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +780 -0
  300. package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +950 -0
  301. package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +425 -0
  302. package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +132 -0
  303. package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +381 -0
  304. package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +203 -0
  305. package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +24 -0
  306. package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +51 -0
  307. package/.aios-core/infrastructure/scripts/aios-validator.js +294 -0
  308. package/.aios-core/infrastructure/scripts/approval-workflow.js +643 -0
  309. package/.aios-core/infrastructure/scripts/atomic-layer-classifier.js +308 -0
  310. package/.aios-core/infrastructure/scripts/backup-manager.js +607 -0
  311. package/.aios-core/infrastructure/scripts/batch-creator.js +608 -0
  312. package/.aios-core/infrastructure/scripts/branch-manager.js +391 -0
  313. package/.aios-core/infrastructure/scripts/capability-analyzer.js +535 -0
  314. package/.aios-core/infrastructure/scripts/clickup-helpers.js +226 -0
  315. package/.aios-core/infrastructure/scripts/code-quality-improver.js +1312 -0
  316. package/.aios-core/infrastructure/scripts/commit-message-generator.js +850 -0
  317. package/.aios-core/infrastructure/scripts/component-generator.js +738 -0
  318. package/.aios-core/infrastructure/scripts/component-metadata.js +627 -0
  319. package/.aios-core/infrastructure/scripts/component-search.js +277 -0
  320. package/.aios-core/infrastructure/scripts/config-cache.js +322 -0
  321. package/.aios-core/infrastructure/scripts/config-loader.js +349 -0
  322. package/.aios-core/infrastructure/scripts/conflict-resolver.js +675 -0
  323. package/.aios-core/infrastructure/scripts/coverage-analyzer.js +882 -0
  324. package/.aios-core/infrastructure/scripts/dependency-analyzer.js +638 -0
  325. package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +703 -0
  326. package/.aios-core/infrastructure/scripts/diff-generator.js +129 -0
  327. package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
  328. package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +329 -0
  329. package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +282 -0
  330. package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
  331. package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +313 -0
  332. package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
  333. package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +358 -0
  334. package/.aios-core/infrastructure/scripts/documentation-synchronizer.js +1432 -0
  335. package/.aios-core/infrastructure/scripts/framework-analyzer.js +746 -0
  336. package/.aios-core/infrastructure/scripts/git-config-detector.js +293 -0
  337. package/.aios-core/infrastructure/scripts/git-wrapper.js +443 -0
  338. package/.aios-core/infrastructure/scripts/improvement-engine.js +758 -0
  339. package/.aios-core/infrastructure/scripts/improvement-validator.js +710 -0
  340. package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +267 -0
  341. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
  342. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
  343. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
  344. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
  345. package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +970 -0
  346. package/.aios-core/infrastructure/scripts/modification-validator.js +555 -0
  347. package/.aios-core/infrastructure/scripts/output-formatter.js +297 -0
  348. package/.aios-core/infrastructure/scripts/performance-analyzer.js +758 -0
  349. package/.aios-core/infrastructure/scripts/performance-and-error-resolver.js +258 -0
  350. package/.aios-core/infrastructure/scripts/performance-optimizer.js +1902 -0
  351. package/.aios-core/infrastructure/scripts/performance-tracker.js +452 -0
  352. package/.aios-core/infrastructure/scripts/pm-adapter-factory.js +181 -0
  353. package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -0
  354. package/.aios-core/infrastructure/scripts/project-status-loader.js +445 -0
  355. package/.aios-core/infrastructure/scripts/refactoring-suggester.js +1139 -0
  356. package/.aios-core/infrastructure/scripts/repository-detector.js +64 -0
  357. package/.aios-core/infrastructure/scripts/sandbox-tester.js +618 -0
  358. package/.aios-core/infrastructure/scripts/security-checker.js +359 -0
  359. package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +375 -0
  360. package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +410 -0
  361. package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +285 -0
  362. package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +262 -0
  363. package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +468 -0
  364. package/.aios-core/infrastructure/scripts/spot-check-validator.js +149 -0
  365. package/.aios-core/infrastructure/scripts/status-mapper.js +115 -0
  366. package/.aios-core/infrastructure/scripts/template-engine.js +240 -0
  367. package/.aios-core/infrastructure/scripts/template-validator.js +279 -0
  368. package/.aios-core/infrastructure/scripts/test-generator.js +844 -0
  369. package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1081 -0
  370. package/.aios-core/infrastructure/scripts/test-utilities-fast.js +126 -0
  371. package/.aios-core/infrastructure/scripts/test-utilities.js +200 -0
  372. package/.aios-core/infrastructure/scripts/tool-resolver.js +360 -0
  373. package/.aios-core/infrastructure/scripts/transaction-manager.js +590 -0
  374. package/.aios-core/infrastructure/scripts/usage-analytics.js +634 -0
  375. package/.aios-core/infrastructure/scripts/validate-output-pattern.js +213 -0
  376. package/.aios-core/infrastructure/scripts/visual-impact-generator.js +1056 -0
  377. package/.aios-core/infrastructure/scripts/yaml-validator.js +397 -0
  378. package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -0
  379. package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +182 -0
  380. package/.aios-core/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +127 -0
  381. package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -0
  382. package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -0
  383. package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -0
  384. package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -0
  385. package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -0
  386. package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -0
  387. package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -0
  388. package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -0
  389. package/.aios-core/infrastructure/templates/project-docs/coding-standards-tmpl.md +346 -0
  390. package/.aios-core/infrastructure/templates/project-docs/source-tree-tmpl.md +177 -0
  391. package/.aios-core/infrastructure/templates/project-docs/tech-stack-tmpl.md +267 -0
  392. package/.aios-core/infrastructure/tests/project-status-loader.test.js +394 -0
  393. package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -0
  394. package/.aios-core/infrastructure/tests/utilities-audit-results.json +501 -0
  395. package/.aios-core/infrastructure/tests/validate-module.js +97 -0
  396. package/.aios-core/infrastructure/tools/README.md +222 -0
  397. package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -0
  398. package/.aios-core/infrastructure/tools/cli/llm-routing.yaml +126 -0
  399. package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -0
  400. package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -0
  401. package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -0
  402. package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
  403. package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -0
  404. package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -0
  405. package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -0
  406. package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
  407. package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -0
  408. package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -0
  409. package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -0
  410. package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -0
  411. package/.aios-core/install-manifest.yaml +347 -0
  412. package/.aios-core/manifests/agents.csv +1 -0
  413. package/.aios-core/manifests/schema/manifest-schema.json +190 -0
  414. package/.aios-core/manifests/tasks.csv +121 -0
  415. package/.aios-core/manifests/workers.csv +204 -0
  416. package/.aios-core/package.json +103 -0
  417. package/.aios-core/product/README.md +56 -0
  418. package/.aios-core/product/checklists/architect-checklist.md +444 -0
  419. package/.aios-core/product/checklists/change-checklist.md +183 -0
  420. package/.aios-core/product/checklists/database-design-checklist.md +119 -0
  421. package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -0
  422. package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -0
  423. package/.aios-core/product/checklists/pm-checklist.md +376 -0
  424. package/.aios-core/product/checklists/po-master-checklist.md +442 -0
  425. package/.aios-core/product/checklists/pre-push-checklist.md +108 -0
  426. package/.aios-core/product/checklists/release-checklist.md +122 -0
  427. package/.aios-core/product/checklists/story-dod-checklist.md +102 -0
  428. package/.aios-core/product/checklists/story-draft-checklist.md +216 -0
  429. package/.aios-core/product/data/brainstorming-techniques.md +37 -0
  430. package/.aios-core/product/data/elicitation-methods.md +135 -0
  431. package/.aios-core/product/data/mode-selection-best-practices.md +471 -0
  432. package/.aios-core/product/data/test-levels-framework.md +149 -0
  433. package/.aios-core/product/data/test-priorities-matrix.md +175 -0
  434. package/.aios-core/product/templates/1mcp-config.yaml +225 -0
  435. package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -0
  436. package/.aios-core/product/templates/activation-instructions-template.md +258 -0
  437. package/.aios-core/product/templates/adr.hbs +125 -0
  438. package/.aios-core/product/templates/agent-template.yaml +121 -0
  439. package/.aios-core/product/templates/architecture-tmpl.yaml +651 -0
  440. package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +156 -0
  441. package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +476 -0
  442. package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +280 -0
  443. package/.aios-core/product/templates/changelog-template.md +134 -0
  444. package/.aios-core/product/templates/command-rationalization-matrix.md +152 -0
  445. package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +293 -0
  446. package/.aios-core/product/templates/component-react-tmpl.tsx +98 -0
  447. package/.aios-core/product/templates/dbdr.hbs +241 -0
  448. package/.aios-core/product/templates/design-story-tmpl.yaml +587 -0
  449. package/.aios-core/product/templates/ds-artifact-analysis.md +70 -0
  450. package/.aios-core/product/templates/engine/elicitation.js +298 -0
  451. package/.aios-core/product/templates/engine/index.js +308 -0
  452. package/.aios-core/product/templates/engine/loader.js +231 -0
  453. package/.aios-core/product/templates/engine/renderer.js +343 -0
  454. package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -0
  455. package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -0
  456. package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -0
  457. package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -0
  458. package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -0
  459. package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -0
  460. package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -0
  461. package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -0
  462. package/.aios-core/product/templates/engine/validator.js +294 -0
  463. package/.aios-core/product/templates/epic.hbs +212 -0
  464. package/.aios-core/product/templates/eslintrc-security.json +32 -0
  465. package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +206 -0
  466. package/.aios-core/product/templates/front-end-spec-tmpl.yaml +349 -0
  467. package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +805 -0
  468. package/.aios-core/product/templates/github-actions-cd.yml +212 -0
  469. package/.aios-core/product/templates/github-actions-ci.yml +172 -0
  470. package/.aios-core/product/templates/github-pr-template.md +67 -0
  471. package/.aios-core/product/templates/gordon-mcp.yaml +140 -0
  472. package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -0
  473. package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -0
  474. package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -0
  475. package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -0
  476. package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -0
  477. package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -0
  478. package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -0
  479. package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -0
  480. package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -0
  481. package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -0
  482. package/.aios-core/product/templates/market-research-tmpl.yaml +252 -0
  483. package/.aios-core/product/templates/mcp-workflow.js +271 -0
  484. package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -0
  485. package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -0
  486. package/.aios-core/product/templates/personalized-agent-template.md +258 -0
  487. package/.aios-core/product/templates/personalized-checklist-template.md +340 -0
  488. package/.aios-core/product/templates/personalized-task-template-v2.md +905 -0
  489. package/.aios-core/product/templates/personalized-task-template.md +344 -0
  490. package/.aios-core/product/templates/personalized-template-file.yaml +322 -0
  491. package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -0
  492. package/.aios-core/product/templates/pmdr.hbs +186 -0
  493. package/.aios-core/product/templates/prd-tmpl.yaml +202 -0
  494. package/.aios-core/product/templates/prd-v2.0.hbs +216 -0
  495. package/.aios-core/product/templates/prd.hbs +201 -0
  496. package/.aios-core/product/templates/project-brief-tmpl.yaml +221 -0
  497. package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -0
  498. package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -0
  499. package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -0
  500. package/.aios-core/product/templates/shock-report-tmpl.html +502 -0
  501. package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -0
  502. package/.aios-core/product/templates/story-tmpl.yaml +332 -0
  503. package/.aios-core/product/templates/story.hbs +263 -0
  504. package/.aios-core/product/templates/task-execution-report.md +495 -0
  505. package/.aios-core/product/templates/task-template.md +123 -0
  506. package/.aios-core/product/templates/task.hbs +170 -0
  507. package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -0
  508. package/.aios-core/product/templates/tmpl-migration-script.sql +91 -0
  509. package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -0
  510. package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -0
  511. package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -0
  512. package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -0
  513. package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -0
  514. package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -0
  515. package/.aios-core/product/templates/tmpl-seed-data.sql +140 -0
  516. package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -0
  517. package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -0
  518. package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -0
  519. package/.aios-core/product/templates/tmpl-trigger.sql +152 -0
  520. package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -0
  521. package/.aios-core/product/templates/tmpl-view.sql +177 -0
  522. package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -0
  523. package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -0
  524. package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -0
  525. package/.aios-core/product/templates/workflow-template.yaml +134 -0
  526. package/.aios-core/quality/metrics-collector.js +572 -0
  527. package/.aios-core/quality/metrics-hook.js +260 -0
  528. package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -0
  529. package/.aios-core/quality/seed-metrics.js +336 -0
  530. package/.aios-core/scripts/README.md +354 -0
  531. package/.aios-core/scripts/aios-doc-template.md +325 -0
  532. package/.aios-core/scripts/batch-migrate-phase1.ps1 +36 -0
  533. package/.aios-core/scripts/batch-migrate-phase2.ps1 +88 -0
  534. package/.aios-core/scripts/batch-migrate-phase3.ps1 +45 -0
  535. package/.aios-core/scripts/command-execution-hook.js +201 -0
  536. package/.aios-core/scripts/context-detector.js +226 -0
  537. package/.aios-core/scripts/elicitation-engine.js +385 -0
  538. package/.aios-core/scripts/elicitation-session-manager.js +300 -0
  539. package/.aios-core/scripts/migrate-framework-docs.sh +300 -0
  540. package/.aios-core/scripts/session-context-loader.js +286 -0
  541. package/.aios-core/scripts/test-template-system.js +941 -0
  542. package/.aios-core/scripts/validate-phase1.ps1 +35 -0
  543. package/.aios-core/scripts/workflow-management.md +69 -0
  544. package/.aios-core/tasks/find-component.md.legacy +391 -0
  545. package/.aios-core/tasks/generate-commit-message.md.legacy +426 -0
  546. package/.aios-core/tasks/generate-migration.md.legacy +382 -0
  547. package/.aios-core/tasks/rollback-modification.md.legacy +307 -0
  548. package/.aios-core/tasks/update-tests.md.legacy +283 -0
  549. package/.aios-core/user-guide.md +1413 -0
  550. package/.aios-core/working-in-the-brownfield.md +361 -0
  551. package/.claude/CLAUDE.md +221 -0
  552. package/LICENSE +48 -0
  553. package/README.md +703 -0
  554. package/bin/aios-init-old.js +532 -0
  555. package/bin/aios-init-v4.js +390 -0
  556. package/bin/aios-init.backup-v1.1.4.js +352 -0
  557. package/bin/aios-init.js +736 -0
  558. package/bin/aios-minimal.js +26 -0
  559. package/bin/aios.js +279 -0
  560. package/bin/migrate-pm-config.js +219 -0
  561. package/bin/modules/env-config.js +436 -0
  562. package/bin/modules/mcp-installer.js +383 -0
  563. package/bin/utils/install-errors.js +339 -0
  564. package/bin/utils/install-transaction.js +445 -0
  565. package/index.d.ts +19 -0
  566. package/index.esm.js +21 -0
  567. package/index.js +94 -0
  568. package/package.json +161 -0
  569. package/packages/installer/package.json +39 -0
  570. package/packages/installer/src/config/configure-environment.js +312 -0
  571. package/packages/installer/src/config/templates/core-config-template.js +183 -0
  572. package/packages/installer/src/config/templates/env-template.js +127 -0
  573. package/packages/installer/src/config/validation/config-validator.js +243 -0
  574. package/packages/installer/src/detection/detect-project-type.js +81 -0
  575. package/packages/installer/src/wizard/wizard.js +244 -0
  576. package/packages/installer/tests/integration/environment-configuration.test.js +328 -0
  577. package/packages/installer/tests/integration/wizard-detection.test.js +349 -0
  578. package/packages/installer/tests/unit/config-validator.test.js +315 -0
  579. package/packages/installer/tests/unit/detection/detect-project-type.test.js +401 -0
  580. package/packages/installer/tests/unit/env-template.test.js +185 -0
  581. package/src/config/ide-configs.js +189 -0
  582. package/src/installer/aios-core-installer.js +319 -0
  583. package/src/installer/dependency-installer.js +335 -0
  584. package/src/utils/aios-colors.js +234 -0
  585. package/src/wizard/feedback.js +218 -0
  586. package/src/wizard/ide-config-generator.js +488 -0
  587. package/src/wizard/ide-selector.js +84 -0
  588. package/src/wizard/index.js +589 -0
  589. package/src/wizard/questions.js +249 -0
  590. package/src/wizard/validation/index.js +120 -0
  591. package/src/wizard/validation/report-generator.js +269 -0
  592. package/src/wizard/validation/troubleshooting-system.js +346 -0
  593. package/src/wizard/validation/validators/config-validator.js +362 -0
  594. package/src/wizard/validation/validators/dependency-validator.js +333 -0
  595. package/src/wizard/validation/validators/file-structure-validator.js +181 -0
  596. package/src/wizard/validation/validators/mcp-health-checker.js +310 -0
  597. package/src/wizard/validators.js +274 -0
  598. package/templates/squad/LICENSE +21 -0
  599. package/templates/squad/README.md +37 -0
  600. package/templates/squad/agents/example-agent.yaml +36 -0
  601. package/templates/squad/package.json +19 -0
  602. package/templates/squad/squad.yaml +25 -0
  603. package/templates/squad/tasks/example-task.yaml +46 -0
  604. package/templates/squad/templates/example-template.md +24 -0
  605. package/templates/squad/tests/example-agent.test.js +53 -0
  606. package/templates/squad/workflows/example-workflow.yaml +54 -0
  607. package/tools/package-builder.js +35 -0
@@ -0,0 +1,1312 @@
1
+ const fs = require('fs').promises;
2
+ const path = require('path');
3
+ const chalk = require('chalk');
4
+ const { ESLint } = require('eslint');
5
+ const prettier = require('prettier');
6
+ const jscodeshift = require('jscodeshift');
7
+
8
+ /**
9
+ * Automated code quality improvement system
10
+ * Applies automatic fixes and improvements to enhance code quality
11
+ */
12
+ class CodeQualityImprover {
13
+ constructor(options = {}) {
14
+ this.rootPath = options.rootPath || process.cwd();
15
+ this.improvements = [];
16
+ this.metrics = new Map();
17
+ this.eslint = null;
18
+ this.prettierConfig = null;
19
+ this.improvementPatterns = new Map();
20
+ this.initializePatterns();
21
+ }
22
+
23
+ /**
24
+ * Initialize improvement patterns
25
+ */
26
+ initializePatterns() {
27
+ // Code formatting improvements
28
+ this.improvementPatterns.set('formatting', {
29
+ name: 'Code Formatting',
30
+ description: 'Apply consistent code formatting',
31
+ improver: this.improveFormatting.bind(this),
32
+ priority: 'medium',
33
+ automatic: true,
34
+ });
35
+
36
+ // Linting fixes
37
+ this.improvementPatterns.set('linting', {
38
+ name: 'Linting Fixes',
39
+ description: 'Fix linting errors and warnings',
40
+ improver: this.improveLinting.bind(this),
41
+ priority: 'high',
42
+ automatic: true,
43
+ });
44
+
45
+ // Modern syntax upgrades
46
+ this.improvementPatterns.set('modern_syntax', {
47
+ name: 'Modern Syntax',
48
+ description: 'Upgrade to modern JavaScript syntax',
49
+ improver: this.upgradeToModernSyntax.bind(this),
50
+ priority: 'medium',
51
+ automatic: true,
52
+ });
53
+
54
+ // Import optimization
55
+ this.improvementPatterns.set('optimize_imports', {
56
+ name: 'Optimize Imports',
57
+ description: 'Organize and optimize import statements',
58
+ improver: this.optimizeImports.bind(this),
59
+ priority: 'low',
60
+ automatic: true,
61
+ });
62
+
63
+ // Dead code elimination
64
+ this.improvementPatterns.set('remove_unused', {
65
+ name: 'Remove Unused Code',
66
+ description: 'Remove unused variables and functions',
67
+ improver: this.removeUnusedCode.bind(this),
68
+ priority: 'high',
69
+ automatic: false,
70
+ });
71
+
72
+ // Consistent naming
73
+ this.improvementPatterns.set('naming_conventions', {
74
+ name: 'Naming Conventions',
75
+ description: 'Apply consistent naming conventions',
76
+ improver: this.improveNaming.bind(this),
77
+ priority: 'medium',
78
+ automatic: false,
79
+ });
80
+
81
+ // Error handling improvements
82
+ this.improvementPatterns.set('error_handling', {
83
+ name: 'Error Handling',
84
+ description: 'Improve error handling patterns',
85
+ improver: this.improveErrorHandling.bind(this),
86
+ priority: 'high',
87
+ automatic: false,
88
+ });
89
+
90
+ // Async/await conversion
91
+ this.improvementPatterns.set('async_await', {
92
+ name: 'Async/Await Conversion',
93
+ description: 'Convert promises to async/await',
94
+ improver: this.convertToAsyncAwait.bind(this),
95
+ priority: 'medium',
96
+ automatic: true,
97
+ });
98
+
99
+ // Type safety improvements
100
+ this.improvementPatterns.set('type_safety', {
101
+ name: 'Type Safety',
102
+ description: 'Add type checks and validations',
103
+ improver: this.improveTypeSafety.bind(this),
104
+ priority: 'high',
105
+ automatic: false,
106
+ });
107
+
108
+ // Documentation generation
109
+ this.improvementPatterns.set('documentation', {
110
+ name: 'Documentation',
111
+ description: 'Generate missing JSDoc comments',
112
+ improver: this.generateDocumentation.bind(this),
113
+ priority: 'medium',
114
+ automatic: false,
115
+ });
116
+ }
117
+
118
+ /**
119
+ * Initialize tools
120
+ */
121
+ async initialize() {
122
+ // Initialize ESLint
123
+ this.eslint = new ESLint({
124
+ fix: true,
125
+ baseConfig: await this.loadESLintConfig(),
126
+ useEslintrc: true,
127
+ });
128
+
129
+ // Load Prettier config
130
+ this.prettierConfig = await this.loadPrettierConfig();
131
+ }
132
+
133
+ /**
134
+ * Analyze and improve code quality
135
+ */
136
+ async improveCode(filePath, options = {}) {
137
+ console.log(chalk.blue(`🎯 Improving: ${filePath}`));
138
+
139
+ try {
140
+ const content = await fs.readFile(filePath, 'utf-8');
141
+ const fileType = path.extname(filePath);
142
+
143
+ if (!['.js', '.jsx', '.ts', '.tsx'].includes(fileType)) {
144
+ return {
145
+ filePath,
146
+ improvements: [],
147
+ error: 'Unsupported file type',
148
+ };
149
+ }
150
+
151
+ // Calculate initial metrics
152
+ const initialMetrics = await this.calculateMetrics(content, filePath);
153
+ this.metrics.set(filePath, { before: initialMetrics });
154
+
155
+ // Clear previous improvements
156
+ this.improvements = [];
157
+
158
+ let improvedContent = content;
159
+ const appliedImprovements = [];
160
+
161
+ // Apply improvement patterns
162
+ for (const [patternId, pattern] of this.improvementPatterns) {
163
+ if (options.patterns && !options.patterns.includes(patternId)) {
164
+ continue;
165
+ }
166
+
167
+ if (!options.manual && !pattern.automatic) {
168
+ continue; // Skip manual improvements in automatic mode
169
+ }
170
+
171
+ try {
172
+ const result = await pattern.improver(improvedContent, filePath, options);
173
+
174
+ if (result.improved) {
175
+ improvedContent = result.content;
176
+ appliedImprovements.push({
177
+ patternId,
178
+ pattern: pattern.name,
179
+ priority: pattern.priority,
180
+ changes: result.changes,
181
+ impact: result.impact || 'medium',
182
+ });
183
+
184
+ this.improvements.push(...result.improvements || []);
185
+ }
186
+ } catch (error) {
187
+ console.warn(chalk.yellow(`Failed to apply ${pattern.name}: ${error.message}`));
188
+ }
189
+ }
190
+
191
+ // Calculate final metrics
192
+ const finalMetrics = await this.calculateMetrics(improvedContent, filePath);
193
+ this.metrics.get(filePath).after = finalMetrics;
194
+
195
+ // Calculate improvement score
196
+ const improvementScore = this.calculateImprovementScore(initialMetrics, finalMetrics);
197
+
198
+ return {
199
+ filePath,
200
+ originalContent: content,
201
+ improvedContent,
202
+ improvements: appliedImprovements,
203
+ metrics: {
204
+ before: initialMetrics,
205
+ after: finalMetrics,
206
+ improvementScore,
207
+ },
208
+ changed: content !== improvedContent,
209
+ };
210
+
211
+ } catch (error) {
212
+ return {
213
+ filePath,
214
+ improvements: [],
215
+ error: error.message,
216
+ };
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Calculate code metrics
222
+ */
223
+ async calculateMetrics(content, filePath) {
224
+ const metrics = {
225
+ lines: content.split('\n').length,
226
+ complexity: 0,
227
+ maintainability: 0,
228
+ issues: 0,
229
+ coverage: 0,
230
+ };
231
+
232
+ try {
233
+ // Linting issues
234
+ const lintResults = await this.eslint.lintText(content, { filePath });
235
+ metrics.issues = lintResults[0]?.errorCount + lintResults[0]?.warningCount || 0;
236
+
237
+ // Cyclomatic complexity (simplified)
238
+ metrics.complexity = this.calculateCyclomaticComplexity(content);
239
+
240
+ // Maintainability index (simplified)
241
+ metrics.maintainability = this.calculateMaintainabilityIndex(content);
242
+
243
+ // Documentation coverage
244
+ metrics.coverage = this.calculateDocumentationCoverage(content);
245
+
246
+ } catch (error) {
247
+ // Metrics calculation failed, use defaults
248
+ }
249
+
250
+ return metrics;
251
+ }
252
+
253
+ // Improvement functions
254
+
255
+ async improveFormatting(content, filePath, options) {
256
+ try {
257
+ const formatted = await prettier.format(content, {
258
+ ...this.prettierConfig,
259
+ filepath: filePath,
260
+ });
261
+
262
+ return {
263
+ improved: formatted !== content,
264
+ content: formatted,
265
+ changes: formatted !== content ? ['Applied consistent formatting'] : [],
266
+ improvements: [{
267
+ type: 'formatting',
268
+ description: 'Applied Prettier formatting',
269
+ line: 0,
270
+ }],
271
+ };
272
+ } catch (error) {
273
+ return { improved: false, content, error: error.message };
274
+ }
275
+ }
276
+
277
+ async improveLinting(content, filePath, options) {
278
+ try {
279
+ const results = await this.eslint.lintText(content, { filePath });
280
+
281
+ if (results[0]?.output) {
282
+ return {
283
+ improved: true,
284
+ content: results[0].output,
285
+ changes: this.summarizeLintFixes(results[0]),
286
+ improvements: results[0].messages.map(msg => ({
287
+ type: 'linting',
288
+ description: msg.message,
289
+ line: msg.line,
290
+ severity: msg.severity === 2 ? 'error' : 'warning',
291
+ })),
292
+ };
293
+ }
294
+
295
+ return { improved: false, content };
296
+ } catch (error) {
297
+ return { improved: false, content, error: error.message };
298
+ }
299
+ }
300
+
301
+ async upgradeToModernSyntax(content, filePath, options) {
302
+ const j = jscodeshift;
303
+ let improved = false;
304
+ const changes = [];
305
+
306
+ try {
307
+ // Convert var to let/const
308
+ const ast = j(content);
309
+ const varToLetConst = ast
310
+ .find(j.VariableDeclaration, { kind: 'var' })
311
+ .forEach(path => {
312
+ const isReassigned = this.isVariableReassigned(j, path);
313
+ path.node.kind = isReassigned ? 'let' : 'const';
314
+ improved = true;
315
+ });
316
+
317
+ if (improved) {
318
+ changes.push('Converted var to let/const');
319
+ }
320
+
321
+ // Convert function expressions to arrow functions (where appropriate)
322
+ ast.find(j.FunctionExpression)
323
+ .filter(path => {
324
+ // Don't convert if it uses 'this' or 'arguments'
325
+ const usesThis = j(path).find(j.ThisExpression).length > 0;
326
+ const usesArguments = j(path).find(j.Identifier, { name: 'arguments' }).length > 0;
327
+ return !usesThis && !usesArguments && !path.node.id;
328
+ })
329
+ .forEach(path => {
330
+ const arrowFunction = j.arrowFunctionExpression(
331
+ path.node.params,
332
+ path.node.body,
333
+ path.node.body.type !== 'BlockStatement',
334
+ );
335
+ j(path).replaceWith(arrowFunction);
336
+ improved = true;
337
+ });
338
+
339
+ if (changes.length > 0) {
340
+ changes.push('Converted function expressions to arrow functions');
341
+ }
342
+
343
+ // Template literals
344
+ ast.find(j.BinaryExpression, { operator: '+' })
345
+ .filter(path => {
346
+ // Check if it's string concatenation
347
+ return path.node.left.type === 'Literal' || path.node.right.type === 'Literal';
348
+ })
349
+ .forEach(path => {
350
+ // Convert to template literal (simplified)
351
+ improved = true;
352
+ });
353
+
354
+ const result = ast.toSource();
355
+
356
+ return {
357
+ improved,
358
+ content: improved ? result : content,
359
+ changes,
360
+ improvements: changes.map(change => ({
361
+ type: 'modern_syntax',
362
+ description: change,
363
+ line: 0,
364
+ })),
365
+ };
366
+
367
+ } catch (error) {
368
+ return { improved: false, content, error: error.message };
369
+ }
370
+ }
371
+
372
+ async optimizeImports(content, filePath, options) {
373
+ const j = jscodeshift;
374
+ let improved = false;
375
+ const changes = [];
376
+
377
+ try {
378
+ const ast = j(content);
379
+
380
+ // Group imports by source
381
+ const imports = new Map();
382
+
383
+ ast.find(j.ImportDeclaration)
384
+ .forEach(path => {
385
+ const source = path.node.source.value;
386
+ if (!imports.has(source)) {
387
+ imports.set(source, []);
388
+ }
389
+ imports.get(source).push(path);
390
+ });
391
+
392
+ // Merge imports from same source
393
+ for (const [source, importPaths] of imports) {
394
+ if (importPaths.length > 1) {
395
+ // Merge specifiers
396
+ const allSpecifiers = [];
397
+ importPaths.forEach(path => {
398
+ allSpecifiers.push(...path.node.specifiers);
399
+ });
400
+
401
+ // Keep first import, remove others
402
+ importPaths[0].node.specifiers = allSpecifiers;
403
+ for (let i = 1; i < importPaths.length; i++) {
404
+ j(importPaths[i]).remove();
405
+ }
406
+
407
+ improved = true;
408
+ changes.push(`Merged imports from ${source}`);
409
+ }
410
+ }
411
+
412
+ // Sort imports
413
+ const importNodes = [];
414
+ ast.find(j.ImportDeclaration)
415
+ .forEach(path => {
416
+ importNodes.push(path.node);
417
+ j(path).remove();
418
+ });
419
+
420
+ if (importNodes.length > 0) {
421
+ // Sort by: external packages, internal absolute, internal relative
422
+ importNodes.sort((a, b) => {
423
+ const aSource = a.source.value;
424
+ const bSource = b.source.value;
425
+
426
+ const aExternal = !aSource.startsWith('.') && !aSource.startsWith('/');
427
+ const bExternal = !bSource.startsWith('.') && !bSource.startsWith('/');
428
+
429
+ if (aExternal && !bExternal) return -1;
430
+ if (!aExternal && bExternal) return 1;
431
+
432
+ return aSource.localeCompare(bSource);
433
+ });
434
+
435
+ // Re-insert sorted imports at the beginning
436
+ const program = ast.find(j.Program);
437
+ importNodes.reverse().forEach(node => {
438
+ program.get('body').unshift(node);
439
+ });
440
+
441
+ improved = true;
442
+ changes.push('Sorted imports');
443
+ }
444
+
445
+ const result = ast.toSource();
446
+
447
+ return {
448
+ improved,
449
+ content: improved ? result : content,
450
+ changes,
451
+ improvements: changes.map(change => ({
452
+ type: 'optimize_imports',
453
+ description: change,
454
+ line: 0,
455
+ })),
456
+ };
457
+
458
+ } catch (error) {
459
+ return { improved: false, content, error: error.message };
460
+ }
461
+ }
462
+
463
+ async removeUnusedCode(content, filePath, options) {
464
+ const j = jscodeshift;
465
+ let improved = false;
466
+ const changes = [];
467
+ const improvements = [];
468
+
469
+ try {
470
+ const ast = j(content);
471
+
472
+ // Find all variable declarations and their usage
473
+ const declaredVars = new Map();
474
+ const usedVars = new Set();
475
+
476
+ // Collect declarations
477
+ ast.find(j.VariableDeclarator)
478
+ .forEach(path => {
479
+ if (path.node.id.type === 'Identifier') {
480
+ declaredVars.set(path.node.id.name, path);
481
+ }
482
+ });
483
+
484
+ // Collect usage
485
+ ast.find(j.Identifier)
486
+ .filter(path => {
487
+ // Only count as used if it's not the declaration itself
488
+ const parent = path.parent.node;
489
+ return !(parent.type === 'VariableDeclarator' && parent.id === path.node);
490
+ })
491
+ .forEach(path => {
492
+ usedVars.add(path.node.name);
493
+ });
494
+
495
+ // Remove unused variables
496
+ for (const [varName, declaratorPath] of declaredVars) {
497
+ if (!usedVars.has(varName) && !this.isExported(declaratorPath)) {
498
+ const declaration = declaratorPath.parent;
499
+
500
+ if (declaration.node.declarations.length === 1) {
501
+ // Remove entire declaration
502
+ j(declaration).remove();
503
+ } else {
504
+ // Remove just this declarator
505
+ j(declaratorPath).remove();
506
+ }
507
+
508
+ improved = true;
509
+ changes.push(`Removed unused variable: ${varName}`);
510
+ improvements.push({
511
+ type: 'remove_unused',
512
+ description: `Removed unused variable: ${varName}`,
513
+ line: declaratorPath.node.loc?.start.line || 0,
514
+ });
515
+ }
516
+ }
517
+
518
+ // Find unused functions
519
+ const declaredFunctions = new Map();
520
+ const calledFunctions = new Set();
521
+
522
+ ast.find(j.FunctionDeclaration)
523
+ .forEach(path => {
524
+ if (path.node.id) {
525
+ declaredFunctions.set(path.node.id.name, path);
526
+ }
527
+ });
528
+
529
+ ast.find(j.CallExpression)
530
+ .forEach(path => {
531
+ if (path.node.callee.type === 'Identifier') {
532
+ calledFunctions.add(path.node.callee.name);
533
+ }
534
+ });
535
+
536
+ // Remove unused functions
537
+ for (const [funcName, funcPath] of declaredFunctions) {
538
+ if (!calledFunctions.has(funcName) && !this.isExported(funcPath)) {
539
+ j(funcPath).remove();
540
+ improved = true;
541
+ changes.push(`Removed unused function: ${funcName}`);
542
+ improvements.push({
543
+ type: 'remove_unused',
544
+ description: `Removed unused function: ${funcName}`,
545
+ line: funcPath.node.loc?.start.line || 0,
546
+ });
547
+ }
548
+ }
549
+
550
+ const result = ast.toSource();
551
+
552
+ return {
553
+ improved,
554
+ content: improved ? result : content,
555
+ changes,
556
+ improvements,
557
+ };
558
+
559
+ } catch (error) {
560
+ return { improved: false, content, error: error.message };
561
+ }
562
+ }
563
+
564
+ async improveNaming(content, filePath, options) {
565
+ const j = jscodeshift;
566
+ let improved = false;
567
+ const changes = [];
568
+ const improvements = [];
569
+
570
+ try {
571
+ const ast = j(content);
572
+
573
+ // Convert snake_case to camelCase for variables and functions
574
+ ast.find(j.Identifier)
575
+ .filter(path => {
576
+ const name = path.node.name;
577
+ return name.includes('_') &&
578
+ (path.parent.node.type === 'VariableDeclarator' ||
579
+ path.parent.node.type === 'FunctionDeclaration');
580
+ })
581
+ .forEach(path => {
582
+ const oldName = path.node.name;
583
+ const newName = this.snakeToCamel(oldName);
584
+
585
+ // Rename all occurrences
586
+ ast.find(j.Identifier, { name: oldName })
587
+ .forEach(p => {
588
+ p.node.name = newName;
589
+ });
590
+
591
+ improved = true;
592
+ changes.push(`Renamed ${oldName} to ${newName}`);
593
+ improvements.push({
594
+ type: 'naming_conventions',
595
+ description: `Renamed ${oldName} to ${newName}`,
596
+ line: path.node.loc?.start.line || 0,
597
+ });
598
+ });
599
+
600
+ // Ensure classes start with uppercase
601
+ ast.find(j.ClassDeclaration)
602
+ .filter(path => {
603
+ const name = path.node.id?.name;
604
+ return name && name[0] !== name[0].toUpperCase();
605
+ })
606
+ .forEach(path => {
607
+ const oldName = path.node.id.name;
608
+ const newName = oldName[0].toUpperCase() + oldName.slice(1);
609
+
610
+ // Rename all occurrences
611
+ ast.find(j.Identifier, { name: oldName })
612
+ .forEach(p => {
613
+ p.node.name = newName;
614
+ });
615
+
616
+ improved = true;
617
+ changes.push(`Renamed class ${oldName} to ${newName}`);
618
+ improvements.push({
619
+ type: 'naming_conventions',
620
+ description: `Renamed class ${oldName} to ${newName}`,
621
+ line: path.node.loc?.start.line || 0,
622
+ });
623
+ });
624
+
625
+ // Ensure constants are UPPER_SNAKE_CASE
626
+ ast.find(j.VariableDeclaration, { kind: 'const' })
627
+ .forEach(path => {
628
+ path.node.declarations.forEach(declarator => {
629
+ if (declarator.id.type === 'Identifier') {
630
+ const name = declarator.id.name;
631
+ // Check if it looks like a constant (all caps or should be)
632
+ if (this.shouldBeConstantCase(declarator) && !this.isConstantCase(name)) {
633
+ const oldName = name;
634
+ const newName = this.toConstantCase(name);
635
+
636
+ // Rename all occurrences
637
+ ast.find(j.Identifier, { name: oldName })
638
+ .forEach(p => {
639
+ p.node.name = newName;
640
+ });
641
+
642
+ improved = true;
643
+ changes.push(`Renamed constant ${oldName} to ${newName}`);
644
+ improvements.push({
645
+ type: 'naming_conventions',
646
+ description: `Renamed constant ${oldName} to ${newName}`,
647
+ line: declarator.loc?.start.line || 0,
648
+ });
649
+ }
650
+ }
651
+ });
652
+ });
653
+
654
+ const result = ast.toSource();
655
+
656
+ return {
657
+ improved,
658
+ content: improved ? result : content,
659
+ changes,
660
+ improvements,
661
+ };
662
+
663
+ } catch (error) {
664
+ return { improved: false, content, error: error.message };
665
+ }
666
+ }
667
+
668
+ async improveErrorHandling(content, filePath, options) {
669
+ const j = jscodeshift;
670
+ let improved = false;
671
+ const changes = [];
672
+ const improvements = [];
673
+
674
+ try {
675
+ const ast = j(content);
676
+
677
+ // Add try-catch to async functions without error handling
678
+ ast.find(j.FunctionDeclaration)
679
+ .filter(path => path.node.async)
680
+ .forEach(path => {
681
+ const hasErrorHandling = j(path).find(j.TryStatement).length > 0;
682
+
683
+ if (!hasErrorHandling && path.node.body.body.length > 0) {
684
+ // Wrap body in try-catch
685
+ const originalBody = path.node.body.body;
686
+ const tryStatement = j.tryStatement(
687
+ j.blockStatement(originalBody),
688
+ j.catchClause(
689
+ j.identifier('error'),
690
+ j.blockStatement([
691
+ j.expressionStatement(
692
+ j.callExpression(
693
+ j.memberExpression(
694
+ j.identifier('console'),
695
+ j.identifier('error'),
696
+ ),
697
+ [j.identifier('error')],
698
+ ),
699
+ ),
700
+ j.throwStatement(j.identifier('error')),
701
+ ]),
702
+ ),
703
+ );
704
+
705
+ path.node.body.body = [tryStatement];
706
+ improved = true;
707
+
708
+ const funcName = path.node.id?.name || 'anonymous';
709
+ changes.push(`Added error handling to ${funcName}`);
710
+ improvements.push({
711
+ type: 'error_handling',
712
+ description: `Added try-catch to async function ${funcName}`,
713
+ line: path.node.loc?.start.line || 0,
714
+ });
715
+ }
716
+ });
717
+
718
+ // Improve catch blocks that swallow errors
719
+ ast.find(j.CatchClause)
720
+ .filter(path => {
721
+ // Check if catch block is empty or only logs
722
+ const body = path.node.body.body;
723
+ return body.length === 0 ||
724
+ (body.length === 1 && this.isOnlyConsoleLog(body[0]));
725
+ })
726
+ .forEach(path => {
727
+ // Add proper error handling
728
+ const errorParam = path.node.param || j.identifier('error');
729
+
730
+ path.node.body.body = [
731
+ j.expressionStatement(
732
+ j.callExpression(
733
+ j.memberExpression(
734
+ j.identifier('console'),
735
+ j.identifier('error'),
736
+ ),
737
+ [j.literal('Error caught:'), errorParam],
738
+ ),
739
+ ),
740
+ j.throwStatement(errorParam),
741
+ ];
742
+
743
+ improved = true;
744
+ changes.push('Improved catch block to properly handle errors');
745
+ improvements.push({
746
+ type: 'error_handling',
747
+ description: 'Added proper error re-throwing in catch block',
748
+ line: path.node.loc?.start.line || 0,
749
+ });
750
+ });
751
+
752
+ const result = ast.toSource();
753
+
754
+ return {
755
+ improved,
756
+ content: improved ? result : content,
757
+ changes,
758
+ improvements,
759
+ };
760
+
761
+ } catch (error) {
762
+ return { improved: false, content, error: error.message };
763
+ }
764
+ }
765
+
766
+ async convertToAsyncAwait(content, filePath, options) {
767
+ const j = jscodeshift;
768
+ let improved = false;
769
+ const changes = [];
770
+ const improvements = [];
771
+
772
+ try {
773
+ const ast = j(content);
774
+
775
+ // Convert .then().catch() chains to async/await
776
+ ast.find(j.CallExpression)
777
+ .filter(path => {
778
+ return path.node.callee.type === 'MemberExpression' &&
779
+ path.node.callee.property.name === 'then';
780
+ })
781
+ .forEach(path => {
782
+ // Find the containing function
783
+ const containingFunction = j(path).closest(j.Function);
784
+
785
+ if (containingFunction.length > 0) {
786
+ const func = containingFunction.get();
787
+
788
+ // Make function async if not already
789
+ if (!func.node.async) {
790
+ func.node.async = true;
791
+ }
792
+
793
+ // Convert promise chain to await
794
+ // This is simplified - real implementation would be more complex
795
+ improved = true;
796
+ changes.push('Converted promise chain to async/await');
797
+ improvements.push({
798
+ type: 'async_await',
799
+ description: 'Converted .then() chain to async/await',
800
+ line: path.node.loc?.start.line || 0,
801
+ });
802
+ }
803
+ });
804
+
805
+ // Convert Promise callbacks to async functions
806
+ ast.find(j.NewExpression)
807
+ .filter(path => {
808
+ return path.node.callee.name === 'Promise' &&
809
+ path.node.arguments.length > 0 &&
810
+ path.node.arguments[0].type === 'FunctionExpression';
811
+ })
812
+ .forEach(path => {
813
+ const promiseCallback = path.node.arguments[0];
814
+
815
+ // Convert to async function
816
+ const asyncFunction = j.functionExpression(
817
+ promiseCallback.id,
818
+ promiseCallback.params,
819
+ promiseCallback.body,
820
+ promiseCallback.generator,
821
+ true, // async
822
+ );
823
+
824
+ path.node.arguments[0] = asyncFunction;
825
+ improved = true;
826
+ changes.push('Converted Promise constructor to async function');
827
+ improvements.push({
828
+ type: 'async_await',
829
+ description: 'Made Promise callback async',
830
+ line: path.node.loc?.start.line || 0,
831
+ });
832
+ });
833
+
834
+ const result = ast.toSource();
835
+
836
+ return {
837
+ improved,
838
+ content: improved ? result : content,
839
+ changes,
840
+ improvements,
841
+ };
842
+
843
+ } catch (error) {
844
+ return { improved: false, content, error: error.message };
845
+ }
846
+ }
847
+
848
+ async improveTypeSafety(content, filePath, options) {
849
+ const j = jscodeshift;
850
+ let improved = false;
851
+ const changes = [];
852
+ const improvements = [];
853
+
854
+ try {
855
+ const ast = j(content);
856
+
857
+ // Add parameter validation to functions
858
+ ast.find(j.FunctionDeclaration)
859
+ .forEach(path => {
860
+ const params = path.node.params;
861
+ if (params.length > 0) {
862
+ const validationStatements = [];
863
+
864
+ params.forEach(param => {
865
+ if (param.type === 'Identifier') {
866
+ // Add basic validation
867
+ validationStatements.push(
868
+ j.ifStatement(
869
+ j.binaryExpression(
870
+ '==',
871
+ param,
872
+ j.identifier('undefined'),
873
+ ),
874
+ j.throwStatement(
875
+ j.newExpression(
876
+ j.identifier('Error'),
877
+ [j.literal(`Parameter '${param.name}' is required`)],
878
+ ),
879
+ ),
880
+ ),
881
+ );
882
+ }
883
+ });
884
+
885
+ if (validationStatements.length > 0) {
886
+ // Insert at beginning of function body
887
+ path.node.body.body.unshift(...validationStatements);
888
+ improved = true;
889
+
890
+ const funcName = path.node.id?.name || 'anonymous';
891
+ changes.push(`Added parameter validation to ${funcName}`);
892
+ improvements.push({
893
+ type: 'type_safety',
894
+ description: `Added parameter validation to function ${funcName}`,
895
+ line: path.node.loc?.start.line || 0,
896
+ });
897
+ }
898
+ }
899
+ });
900
+
901
+ // Add null checks before property access
902
+ ast.find(j.MemberExpression)
903
+ .filter(path => {
904
+ // Check if it's a chain that could throw
905
+ return path.node.object.type === 'MemberExpression' ||
906
+ (path.node.object.type === 'Identifier' &&
907
+ !this.isKnownSafeObject(path.node.object.name));
908
+ })
909
+ .forEach(path => {
910
+ // Convert to optional chaining if not already
911
+ if (!path.node.optional) {
912
+ path.node.optional = true;
913
+ improved = true;
914
+ improvements.push({
915
+ type: 'type_safety',
916
+ description: 'Added optional chaining for safer property access',
917
+ line: path.node.loc?.start.line || 0,
918
+ });
919
+ }
920
+ });
921
+
922
+ if (improvements.length > 0) {
923
+ changes.push('Added type safety improvements');
924
+ }
925
+
926
+ const result = ast.toSource();
927
+
928
+ return {
929
+ improved,
930
+ content: improved ? result : content,
931
+ changes,
932
+ improvements,
933
+ };
934
+
935
+ } catch (error) {
936
+ return { improved: false, content, error: error.message };
937
+ }
938
+ }
939
+
940
+ async generateDocumentation(content, filePath, options) {
941
+ const j = jscodeshift;
942
+ let improved = false;
943
+ const changes = [];
944
+ const improvements = [];
945
+
946
+ try {
947
+ const ast = j(content);
948
+
949
+ // Add JSDoc to functions without documentation
950
+ ast.find(j.FunctionDeclaration)
951
+ .filter(path => {
952
+ // Check if function already has JSDoc
953
+ const comments = path.node.leadingComments || [];
954
+ return !comments.some(c => c.type === 'CommentBlock' && c.value.includes('*'));
955
+ })
956
+ .forEach(path => {
957
+ const funcName = path.node.id?.name || 'anonymous';
958
+ const params = path.node.params;
959
+ const isAsync = path.node.async;
960
+
961
+ // Generate JSDoc
962
+ let jsdoc = '/**\n';
963
+ jsdoc += ` * ${this.generateFunctionDescription(funcName)}\n`;
964
+
965
+ params.forEach(param => {
966
+ const paramName = param.type === 'Identifier' ? param.name : 'param';
967
+ jsdoc += ` * @param {*} ${paramName} - ${this.generateParamDescription(paramName)}\n`;
968
+ });
969
+
970
+ jsdoc += ` * @returns {${isAsync ? 'Promise<*>' : '*'}} ${this.generateReturnDescription(funcName)}\n`;
971
+ jsdoc += ' */';
972
+
973
+ // Add JSDoc comment
974
+ path.node.leadingComments = [
975
+ j.commentBlock(jsdoc.replace('/**', '*').replace('*/', ''), true),
976
+ ];
977
+
978
+ improved = true;
979
+ changes.push(`Added JSDoc to ${funcName}`);
980
+ improvements.push({
981
+ type: 'documentation',
982
+ description: `Generated JSDoc for function ${funcName}`,
983
+ line: path.node.loc?.start.line || 0,
984
+ });
985
+ });
986
+
987
+ // Add JSDoc to classes
988
+ ast.find(j.ClassDeclaration)
989
+ .filter(path => {
990
+ const comments = path.node.leadingComments || [];
991
+ return !comments.some(c => c.type === 'CommentBlock' && c.value.includes('*'));
992
+ })
993
+ .forEach(path => {
994
+ const className = path.node.id?.name || 'Class';
995
+
996
+ let jsdoc = '/**\n';
997
+ jsdoc += ` * ${this.generateClassDescription(className)}\n`;
998
+ jsdoc += ' */';
999
+
1000
+ path.node.leadingComments = [
1001
+ j.commentBlock(jsdoc.replace('/**', '*').replace('*/', ''), true),
1002
+ ];
1003
+
1004
+ improved = true;
1005
+ changes.push(`Added JSDoc to class ${className}`);
1006
+ improvements.push({
1007
+ type: 'documentation',
1008
+ description: `Generated JSDoc for class ${className}`,
1009
+ line: path.node.loc?.start.line || 0,
1010
+ });
1011
+ });
1012
+
1013
+ const result = ast.toSource();
1014
+
1015
+ return {
1016
+ improved,
1017
+ content: improved ? result : content,
1018
+ changes,
1019
+ improvements,
1020
+ };
1021
+
1022
+ } catch (error) {
1023
+ return { improved: false, content, error: error.message };
1024
+ }
1025
+ }
1026
+
1027
+ // Helper methods
1028
+
1029
+ async loadESLintConfig() {
1030
+ try {
1031
+ const configPath = path.join(this.rootPath, '.eslintrc.json');
1032
+ const content = await fs.readFile(configPath, 'utf-8');
1033
+ return JSON.parse(content);
1034
+ } catch (error) {
1035
+ // Return default config
1036
+ return {
1037
+ env: {
1038
+ es2021: true,
1039
+ node: true,
1040
+ },
1041
+ extends: ['eslint:recommended'],
1042
+ parserOptions: {
1043
+ ecmaVersion: 12,
1044
+ sourceType: 'module',
1045
+ },
1046
+ rules: {
1047
+ 'no-unused-vars': 'error',
1048
+ 'no-console': 'warn',
1049
+ 'semi': ['error', 'always'],
1050
+ 'quotes': ['error', 'single'],
1051
+ },
1052
+ };
1053
+ }
1054
+ }
1055
+
1056
+ async loadPrettierConfig() {
1057
+ try {
1058
+ const configPath = path.join(this.rootPath, '.prettierrc');
1059
+ const content = await fs.readFile(configPath, 'utf-8');
1060
+ return JSON.parse(content);
1061
+ } catch (error) {
1062
+ // Return default config
1063
+ return {
1064
+ semi: true,
1065
+ singleQuote: true,
1066
+ tabWidth: 2,
1067
+ trailingComma: 'es5',
1068
+ printWidth: 80,
1069
+ };
1070
+ }
1071
+ }
1072
+
1073
+ calculateCyclomaticComplexity(content) {
1074
+ // Simplified complexity calculation
1075
+ let complexity = 1;
1076
+
1077
+ const complexityPatterns = [
1078
+ /\bif\s*\(/g,
1079
+ /\belse\s+if\s*\(/g,
1080
+ /\bwhile\s*\(/g,
1081
+ /\bfor\s*\(/g,
1082
+ /\bcase\s+/g,
1083
+ /\bcatch\s*\(/g,
1084
+ /\?\s*[^:]+\s*:/g, // ternary
1085
+ /\|\|/g,
1086
+ /&&/g,
1087
+ ];
1088
+
1089
+ complexityPatterns.forEach(pattern => {
1090
+ const matches = content.match(pattern);
1091
+ if (matches) {
1092
+ complexity += matches.length;
1093
+ }
1094
+ });
1095
+
1096
+ return complexity;
1097
+ }
1098
+
1099
+ calculateMaintainabilityIndex(content) {
1100
+ // Simplified maintainability index (0-100)
1101
+ const lines = content.split('\n').length;
1102
+ const complexity = this.calculateCyclomaticComplexity(content);
1103
+ const comments = (content.match(/\/\//g) || []).length +
1104
+ (content.match(/\/\*/g) || []).length;
1105
+
1106
+ // Simple formula
1107
+ const commentRatio = comments / lines;
1108
+ const complexityRatio = complexity / lines;
1109
+
1110
+ const maintainability = Math.min(100, Math.max(0,
1111
+ 100 - (complexityRatio * 50) + (commentRatio * 20),
1112
+ ));
1113
+
1114
+ return Math.round(maintainability);
1115
+ }
1116
+
1117
+ calculateDocumentationCoverage(content) {
1118
+ // Calculate percentage of documented functions/classes
1119
+ const functionMatches = content.match(/function\s+\w+|class\s+\w+/g) || [];
1120
+ const jsdocMatches = content.match(/\/\*\*[\s\S]*?\*\//g) || [];
1121
+
1122
+ if (functionMatches.length === 0) return 100;
1123
+
1124
+ const coverage = (jsdocMatches.length / functionMatches.length) * 100;
1125
+ return Math.min(100, Math.round(coverage));
1126
+ }
1127
+
1128
+ calculateImprovementScore(before, after) {
1129
+ const improvements = {
1130
+ issues: Math.max(0, before.issues - after.issues),
1131
+ complexity: Math.max(0, before.complexity - after.complexity),
1132
+ maintainability: Math.max(0, after.maintainability - before.maintainability),
1133
+ coverage: Math.max(0, after.coverage - before.coverage),
1134
+ };
1135
+
1136
+ // Calculate weighted score
1137
+ const score = (
1138
+ improvements.issues * 3 +
1139
+ improvements.complexity * 2 +
1140
+ improvements.maintainability +
1141
+ improvements.coverage * 0.5
1142
+ ) / 6.5;
1143
+
1144
+ return Math.round(score * 10) / 10;
1145
+ }
1146
+
1147
+ summarizeLintFixes(lintResult) {
1148
+ const fixedRules = new Map();
1149
+
1150
+ lintResult.messages.forEach(message => {
1151
+ if (message.fix) {
1152
+ const count = fixedRules.get(message.ruleId) || 0;
1153
+ fixedRules.set(message.ruleId, count + 1);
1154
+ }
1155
+ });
1156
+
1157
+ return Array.from(fixedRules.entries()).map(([rule, count]) =>
1158
+ `Fixed ${count} ${rule} issue${count > 1 ? 's' : ''}`,
1159
+ );
1160
+ }
1161
+
1162
+ isVariableReassigned(j, variableDeclarator) {
1163
+ const varName = variableDeclarator.node.id.name;
1164
+ const scope = variableDeclarator.scope;
1165
+
1166
+ let reassigned = false;
1167
+
1168
+ j(scope.path).find(j.AssignmentExpression)
1169
+ .filter(path => {
1170
+ return path.node.left.type === 'Identifier' &&
1171
+ path.node.left.name === varName;
1172
+ })
1173
+ .forEach(() => {
1174
+ reassigned = true;
1175
+ });
1176
+
1177
+ return reassigned;
1178
+ }
1179
+
1180
+ isExported(path) {
1181
+ // Check if the declaration is exported
1182
+ const parent = path.parent;
1183
+
1184
+ return parent.node.type === 'ExportNamedDeclaration' ||
1185
+ parent.node.type === 'ExportDefaultDeclaration' ||
1186
+ (parent.node.type === 'AssignmentExpression' &&
1187
+ parent.node.left.type === 'MemberExpression' &&
1188
+ parent.node.left.object.name === 'module' &&
1189
+ parent.node.left.property.name === 'exports');
1190
+ }
1191
+
1192
+ isOnlyConsoleLog(statement) {
1193
+ return statement.type === 'ExpressionStatement' &&
1194
+ statement.expression.type === 'CallExpression' &&
1195
+ statement.expression.callee.type === 'MemberExpression' &&
1196
+ statement.expression.callee.object.name === 'console';
1197
+ }
1198
+
1199
+ isKnownSafeObject(name) {
1200
+ const safeObjects = ['console', 'Math', 'JSON', 'Object', 'Array', 'String', 'Number'];
1201
+ return safeObjects.includes(name);
1202
+ }
1203
+
1204
+ snakeToCamel(str) {
1205
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
1206
+ }
1207
+
1208
+ shouldBeConstantCase(declarator) {
1209
+ // Check if the value is a literal or simple value
1210
+ const init = declarator.init;
1211
+ if (!init) return false;
1212
+
1213
+ return init.type === 'Literal' ||
1214
+ init.type === 'UnaryExpression' ||
1215
+ (init.type === 'Identifier' && init.name === init.name.toUpperCase());
1216
+ }
1217
+
1218
+ isConstantCase(name) {
1219
+ return /^[A-Z_]+$/.test(name);
1220
+ }
1221
+
1222
+ toConstantCase(name) {
1223
+ // Convert camelCase or snake_case to CONSTANT_CASE
1224
+ return name
1225
+ .replace(/([a-z])([A-Z])/g, '$1_$2')
1226
+ .replace(/[_-]+/g, '_')
1227
+ .toUpperCase();
1228
+ }
1229
+
1230
+ generateFunctionDescription(funcName) {
1231
+ // Generate meaningful description based on function name
1232
+ const words = funcName.split(/(?=[A-Z])/);
1233
+ return words.map(w => w.toLowerCase()).join(' ').replace(/^\w/, c => c.toUpperCase());
1234
+ }
1235
+
1236
+ generateParamDescription(paramName) {
1237
+ // Generate parameter description
1238
+ return `The ${paramName} parameter`;
1239
+ }
1240
+
1241
+ generateReturnDescription(funcName) {
1242
+ // Generate return description
1243
+ if (funcName.startsWith('get')) return 'The requested value';
1244
+ if (funcName.startsWith('is')) return 'True if condition is met, false otherwise';
1245
+ if (funcName.startsWith('has')) return 'True if exists, false otherwise';
1246
+ return 'The result of the operation';
1247
+ }
1248
+
1249
+ generateClassDescription(className) {
1250
+ // Generate class description
1251
+ const words = className.split(/(?=[A-Z])/);
1252
+ return `${words.join(' ')} class`;
1253
+ }
1254
+
1255
+ /**
1256
+ * Apply improvements to file
1257
+ */
1258
+ async applyImprovements(filePath, improvedContent, backup = true) {
1259
+ try {
1260
+ if (backup) {
1261
+ // Create backup
1262
+ const backupPath = `${filePath}.backup.${Date.now()}`;
1263
+ const originalContent = await fs.readFile(filePath, 'utf-8');
1264
+ await fs.writeFile(backupPath, originalContent);
1265
+ console.log(chalk.gray(`Backup created: ${backupPath}`));
1266
+ }
1267
+
1268
+ // Write improved content
1269
+ await fs.writeFile(filePath, improvedContent);
1270
+ console.log(chalk.green(`✅ Improvements applied to: ${filePath}`));
1271
+
1272
+ return { success: true };
1273
+ } catch (error) {
1274
+ console.error(chalk.red(`Failed to apply improvements: ${error.message}`));
1275
+ return { success: false, error: error.message };
1276
+ }
1277
+ }
1278
+
1279
+ /**
1280
+ * Get improvement statistics
1281
+ */
1282
+ getStatistics() {
1283
+ const stats = {
1284
+ filesAnalyzed: this.metrics.size,
1285
+ totalImprovements: 0,
1286
+ byType: {},
1287
+ averageScore: 0,
1288
+ };
1289
+
1290
+ let totalScore = 0;
1291
+
1292
+ for (const [file, metrics] of this.metrics) {
1293
+ if (metrics.after) {
1294
+ const score = this.calculateImprovementScore(metrics.before, metrics.after);
1295
+ totalScore += score;
1296
+ }
1297
+ }
1298
+
1299
+ stats.averageScore = this.metrics.size > 0 ?
1300
+ (totalScore / this.metrics.size).toFixed(2) : 0;
1301
+
1302
+ // Count improvements by type
1303
+ for (const improvement of this.improvements) {
1304
+ stats.byType[improvement.type] = (stats.byType[improvement.type] || 0) + 1;
1305
+ stats.totalImprovements++;
1306
+ }
1307
+
1308
+ return stats;
1309
+ }
1310
+ }
1311
+
1312
+ module.exports = CodeQualityImprover;