mcp-atlassian-multi 0.21.2__tar.gz

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 (426) hide show
  1. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/index-config.json +50 -0
  2. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/modules/root.md +17 -0
  3. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/README.md +47 -0
  4. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/__init__.py +1 -0
  5. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/config.py +46 -0
  6. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/detector.py +115 -0
  7. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/discovery.py +184 -0
  8. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/generator.py +76 -0
  9. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/main.py +147 -0
  10. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/parser.py +186 -0
  11. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/patterns.py +89 -0
  12. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/scanner.py +56 -0
  13. mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/utils.py +91 -0
  14. mcp_atlassian_multi-0.21.2/.claude/settings.json +11 -0
  15. mcp_atlassian_multi-0.21.2/.devcontainer/Dockerfile +3 -0
  16. mcp_atlassian_multi-0.21.2/.devcontainer/devcontainer.json +44 -0
  17. mcp_atlassian_multi-0.21.2/.devcontainer/post-create.sh +39 -0
  18. mcp_atlassian_multi-0.21.2/.devcontainer/post-start.sh +12 -0
  19. mcp_atlassian_multi-0.21.2/.dockerignore +53 -0
  20. mcp_atlassian_multi-0.21.2/.github/FUNDING.yml +1 -0
  21. mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/bug_report.yml +122 -0
  22. mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
  23. mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  24. mcp_atlassian_multi-0.21.2/.github/copilot-instructions.md +135 -0
  25. mcp_atlassian_multi-0.21.2/.github/pull_request_template.md +31 -0
  26. mcp_atlassian_multi-0.21.2/.github/workflows/claude.yml +36 -0
  27. mcp_atlassian_multi-0.21.2/.github/workflows/docker-publish.yml +77 -0
  28. mcp_atlassian_multi-0.21.2/.github/workflows/lint.yml +27 -0
  29. mcp_atlassian_multi-0.21.2/.github/workflows/publish.yml +153 -0
  30. mcp_atlassian_multi-0.21.2/.github/workflows/stale.yml +53 -0
  31. mcp_atlassian_multi-0.21.2/.github/workflows/tests.yml +42 -0
  32. mcp_atlassian_multi-0.21.2/.gitignore +82 -0
  33. mcp_atlassian_multi-0.21.2/.kiro/.sdlc-manifest.json +290 -0
  34. mcp_atlassian_multi-0.21.2/.kiro/agents/ba-agent.json +18 -0
  35. mcp_atlassian_multi-0.21.2/.kiro/agents/ba-agent.md +513 -0
  36. mcp_atlassian_multi-0.21.2/.kiro/agents/dev-agent.json +25 -0
  37. mcp_atlassian_multi-0.21.2/.kiro/agents/dev-agent.md +374 -0
  38. mcp_atlassian_multi-0.21.2/.kiro/agents/devops-agent.json +18 -0
  39. mcp_atlassian_multi-0.21.2/.kiro/agents/devops-agent.md +393 -0
  40. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ba-agent.md +503 -0
  41. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/dev-agent.md +365 -0
  42. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/devops-agent.md +441 -0
  43. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/qa-agent.md +697 -0
  44. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/sa-agent.md +472 -0
  45. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/scrum-master-agent.md +455 -0
  46. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/security-agent.md +492 -0
  47. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/sm-agent.md +1484 -0
  48. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ta-agent.md +286 -0
  49. mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ui-agent.md +417 -0
  50. mcp_atlassian_multi-0.21.2/.kiro/agents/qa-agent.json +18 -0
  51. mcp_atlassian_multi-0.21.2/.kiro/agents/qa-agent.md +706 -0
  52. mcp_atlassian_multi-0.21.2/.kiro/agents/sa-agent.json +18 -0
  53. mcp_atlassian_multi-0.21.2/.kiro/agents/sa-agent.md +481 -0
  54. mcp_atlassian_multi-0.21.2/.kiro/agents/scrum-master-agent.json +24 -0
  55. mcp_atlassian_multi-0.21.2/.kiro/agents/scrum-master-agent.md +454 -0
  56. mcp_atlassian_multi-0.21.2/.kiro/agents/security-agent.json +17 -0
  57. mcp_atlassian_multi-0.21.2/.kiro/agents/security-agent.md +503 -0
  58. mcp_atlassian_multi-0.21.2/.kiro/agents/sm-agent.json +25 -0
  59. mcp_atlassian_multi-0.21.2/.kiro/agents/sm-agent.md +1387 -0
  60. mcp_atlassian_multi-0.21.2/.kiro/agents/ta-agent.json +18 -0
  61. mcp_atlassian_multi-0.21.2/.kiro/agents/ta-agent.md +298 -0
  62. mcp_atlassian_multi-0.21.2/.kiro/agents/ui-agent.json +25 -0
  63. mcp_atlassian_multi-0.21.2/.kiro/agents/ui-agent.md +417 -0
  64. mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-create.json +33 -0
  65. mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-delete.json +33 -0
  66. mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-edit.json +33 -0
  67. mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-full.json +12 -0
  68. mcp_atlassian_multi-0.21.2/.kiro/hooks/file-watcher.sh +53 -0
  69. mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio-edit.kiro.hook +16 -0
  70. mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio-xml.kiro.hook +16 -0
  71. mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio.sh +28 -0
  72. mcp_atlassian_multi-0.21.2/.kiro/steering/agent-self-learning.md +45 -0
  73. mcp_atlassian_multi-0.21.2/.kiro/steering/backend-structure.md +183 -0
  74. mcp_atlassian_multi-0.21.2/.kiro/steering/code-intelligence.md +25 -0
  75. mcp_atlassian_multi-0.21.2/.kiro/steering/code-standards.md +65 -0
  76. mcp_atlassian_multi-0.21.2/.kiro/steering/drawio.md +920 -0
  77. mcp_atlassian_multi-0.21.2/.kiro/steering/file-writing.md +34 -0
  78. mcp_atlassian_multi-0.21.2/.kiro/steering/frontend-structure.md +60 -0
  79. mcp_atlassian_multi-0.21.2/.kiro/steering/jira-workflow.md +36 -0
  80. mcp_atlassian_multi-0.21.2/.kiro/steering/kotlin-code-standards.md +195 -0
  81. mcp_atlassian_multi-0.21.2/.mintignore +17 -0
  82. mcp_atlassian_multi-0.21.2/.pre-commit-config.yaml +64 -0
  83. mcp_atlassian_multi-0.21.2/.worktreeinclude +4 -0
  84. mcp_atlassian_multi-0.21.2/AGENTS.md +96 -0
  85. mcp_atlassian_multi-0.21.2/CLAUDE.md +1 -0
  86. mcp_atlassian_multi-0.21.2/CONTRIBUTING.md +141 -0
  87. mcp_atlassian_multi-0.21.2/Dockerfile +58 -0
  88. mcp_atlassian_multi-0.21.2/LICENSE +21 -0
  89. mcp_atlassian_multi-0.21.2/PKG-INFO +122 -0
  90. mcp_atlassian_multi-0.21.2/README.md +87 -0
  91. mcp_atlassian_multi-0.21.2/SECURITY.md +45 -0
  92. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_add_comment.yaml +4 -0
  93. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_create_page.yaml +4 -0
  94. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_attachments.yaml +6 -0
  95. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_page.yaml +4 -0
  96. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_page_views.yaml +6 -0
  97. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_search.yaml +6 -0
  98. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_update_page.yaml +4 -0
  99. mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_upload_attachment.yaml +4 -0
  100. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_add_comment.yaml +4 -0
  101. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_batch_get_changelogs.yaml +6 -0
  102. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_create_issue.yaml +6 -0
  103. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_download_attachments.yaml +4 -0
  104. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_agile_boards.yaml +4 -0
  105. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_issue.yaml +6 -0
  106. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_issue_sla.yaml +4 -0
  107. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_sprint_issues.yaml +4 -0
  108. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_search.yaml +6 -0
  109. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_search_fields.yaml +4 -0
  110. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_transition_issue.yaml +4 -0
  111. mcp_atlassian_multi-0.21.2/docs/_overrides/jira_update_issue.yaml +4 -0
  112. mcp_atlassian_multi-0.21.2/docs/advanced/docker-production.mdx +184 -0
  113. mcp_atlassian_multi-0.21.2/docs/advanced/sla-metrics.mdx +134 -0
  114. mcp_atlassian_multi-0.21.2/docs/authentication.mdx +164 -0
  115. mcp_atlassian_multi-0.21.2/docs/compatibility.mdx +152 -0
  116. mcp_atlassian_multi-0.21.2/docs/configuration.mdx +251 -0
  117. mcp_atlassian_multi-0.21.2/docs/favicon.svg +4 -0
  118. mcp_atlassian_multi-0.21.2/docs/guides/common-workflows.mdx +135 -0
  119. mcp_atlassian_multi-0.21.2/docs/guides/cql-guide.mdx +103 -0
  120. mcp_atlassian_multi-0.21.2/docs/guides/jql-guide.mdx +111 -0
  121. mcp_atlassian_multi-0.21.2/docs/http-transport.mdx +234 -0
  122. mcp_atlassian_multi-0.21.2/docs/index.mdx +39 -0
  123. mcp_atlassian_multi-0.21.2/docs/installation.mdx +135 -0
  124. mcp_atlassian_multi-0.21.2/docs/sigpipe-analysis.mdx +269 -0
  125. mcp_atlassian_multi-0.21.2/docs/tools/confluence-attachments.mdx +129 -0
  126. mcp_atlassian_multi-0.21.2/docs/tools/confluence-comments.mdx +122 -0
  127. mcp_atlassian_multi-0.21.2/docs/tools/confluence-pages.mdx +197 -0
  128. mcp_atlassian_multi-0.21.2/docs/tools/confluence-search.mdx +51 -0
  129. mcp_atlassian_multi-0.21.2/docs/tools/jira-agile.mdx +150 -0
  130. mcp_atlassian_multi-0.21.2/docs/tools/jira-attachments.mdx +38 -0
  131. mcp_atlassian_multi-0.21.2/docs/tools/jira-comments-worklogs.mdx +119 -0
  132. mcp_atlassian_multi-0.21.2/docs/tools/jira-forms-metrics.mdx +112 -0
  133. mcp_atlassian_multi-0.21.2/docs/tools/jira-issues.mdx +193 -0
  134. mcp_atlassian_multi-0.21.2/docs/tools/jira-links-versions.mdx +139 -0
  135. mcp_atlassian_multi-0.21.2/docs/tools/jira-search-fields.mdx +93 -0
  136. mcp_atlassian_multi-0.21.2/docs/tools/jira-service-desk.mdx +45 -0
  137. mcp_atlassian_multi-0.21.2/docs/tools-reference.mdx +123 -0
  138. mcp_atlassian_multi-0.21.2/docs/troubleshooting.mdx +270 -0
  139. mcp_atlassian_multi-0.21.2/docs.json +115 -0
  140. mcp_atlassian_multi-0.21.2/documents/templates/BRD-TEMPLATE.md +218 -0
  141. mcp_atlassian_multi-0.21.2/documents/templates/DESIGN-SYSTEM.md +303 -0
  142. mcp_atlassian_multi-0.21.2/documents/templates/DPG-TEMPLATE.md +318 -0
  143. mcp_atlassian_multi-0.21.2/documents/templates/FSD-TEMPLATE.md +306 -0
  144. mcp_atlassian_multi-0.21.2/documents/templates/RLN-TEMPLATE.md +200 -0
  145. mcp_atlassian_multi-0.21.2/documents/templates/SECURITY-REPORT-TEMPLATE.md +166 -0
  146. mcp_atlassian_multi-0.21.2/documents/templates/STC-TEMPLATE.md +277 -0
  147. mcp_atlassian_multi-0.21.2/documents/templates/STP-TEMPLATE.md +258 -0
  148. mcp_atlassian_multi-0.21.2/documents/templates/TDD-TEMPLATE.md +444 -0
  149. mcp_atlassian_multi-0.21.2/documents/templates/TEST-REPORT-TEMPLATE.md +292 -0
  150. mcp_atlassian_multi-0.21.2/documents/templates/UG-TEMPLATE.md +339 -0
  151. mcp_atlassian_multi-0.21.2/documents/templates/UI-SPEC-TEMPLATE.md +222 -0
  152. mcp_atlassian_multi-0.21.2/helm/Chart.yaml +21 -0
  153. mcp_atlassian_multi-0.21.2/helm/README.md +160 -0
  154. mcp_atlassian_multi-0.21.2/helm/templates/NOTES.txt +99 -0
  155. mcp_atlassian_multi-0.21.2/helm/templates/_helpers.tpl +60 -0
  156. mcp_atlassian_multi-0.21.2/helm/templates/configmap.yaml +25 -0
  157. mcp_atlassian_multi-0.21.2/helm/templates/deployment.yaml +321 -0
  158. mcp_atlassian_multi-0.21.2/helm/templates/hpa.yaml +32 -0
  159. mcp_atlassian_multi-0.21.2/helm/templates/ingress.yaml +61 -0
  160. mcp_atlassian_multi-0.21.2/helm/templates/pvc.yaml +21 -0
  161. mcp_atlassian_multi-0.21.2/helm/templates/rbac.yaml +24 -0
  162. mcp_atlassian_multi-0.21.2/helm/templates/secret.yaml +41 -0
  163. mcp_atlassian_multi-0.21.2/helm/templates/service.yaml +21 -0
  164. mcp_atlassian_multi-0.21.2/helm/templates/serviceaccount.yaml +13 -0
  165. mcp_atlassian_multi-0.21.2/helm/values.yaml +246 -0
  166. mcp_atlassian_multi-0.21.2/pyproject.toml +163 -0
  167. mcp_atlassian_multi-0.21.2/requirements.txt +34 -0
  168. mcp_atlassian_multi-0.21.2/scripts/generate_tool_docs.py +529 -0
  169. mcp_atlassian_multi-0.21.2/scripts/oauth_authorize.py +353 -0
  170. mcp_atlassian_multi-0.21.2/scripts/templates/tool_category.mdx.j2 +42 -0
  171. mcp_atlassian_multi-0.21.2/scripts/test_with_real_data.sh +145 -0
  172. mcp_atlassian_multi-0.21.2/smithery.yaml +110 -0
  173. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/__init__.py +489 -0
  174. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/__init__.py +52 -0
  175. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/analytics.py +173 -0
  176. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/attachments.py +559 -0
  177. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/client.py +223 -0
  178. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/comments.py +238 -0
  179. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/config.py +266 -0
  180. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/constants.py +50 -0
  181. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/labels.py +79 -0
  182. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/pages.py +1202 -0
  183. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/protocols.py +106 -0
  184. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/search.py +195 -0
  185. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/spaces.py +100 -0
  186. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/users.py +100 -0
  187. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/utils.py +122 -0
  188. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/v2_adapter.py +1130 -0
  189. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/exceptions.py +4 -0
  190. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/__init__.py +96 -0
  191. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/attachments.py +469 -0
  192. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/boards.py +88 -0
  193. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/client.py +389 -0
  194. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/comments.py +259 -0
  195. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/config.py +342 -0
  196. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/constants.py +216 -0
  197. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/development.py +402 -0
  198. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/epics.py +946 -0
  199. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/field_options.py +235 -0
  200. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/fields.py +862 -0
  201. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/formatting.py +345 -0
  202. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms.py +225 -0
  203. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms_api.py +408 -0
  204. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms_common.py +133 -0
  205. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/issues.py +1610 -0
  206. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/links.py +224 -0
  207. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/metrics.py +408 -0
  208. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/projects.py +465 -0
  209. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/protocols.py +285 -0
  210. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/queues.py +218 -0
  211. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/search.py +307 -0
  212. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/sla.py +683 -0
  213. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/sprints.py +218 -0
  214. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/transitions.py +407 -0
  215. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/users.py +412 -0
  216. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/utils.py +123 -0
  217. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/watchers.py +98 -0
  218. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/worklog.py +245 -0
  219. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/__init__.py +107 -0
  220. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/base.py +126 -0
  221. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/__init__.py +38 -0
  222. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/analytics.py +52 -0
  223. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/comment.py +109 -0
  224. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/common.py +175 -0
  225. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/label.py +62 -0
  226. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/page.py +296 -0
  227. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/search.py +74 -0
  228. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/space.py +57 -0
  229. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/user_search.py +145 -0
  230. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/constants.py +63 -0
  231. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/__init__.py +110 -0
  232. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/adf.py +362 -0
  233. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/agile.py +152 -0
  234. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/comment.py +97 -0
  235. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/common.py +597 -0
  236. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/field_option.py +105 -0
  237. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/forms.py +162 -0
  238. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/issue.py +813 -0
  239. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/link.py +285 -0
  240. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/metrics.py +231 -0
  241. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/project.py +111 -0
  242. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/queue.py +246 -0
  243. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/search.py +114 -0
  244. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/sla.py +221 -0
  245. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/version.py +46 -0
  246. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/workflow.py +93 -0
  247. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/worklog.py +109 -0
  248. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/__init__.py +15 -0
  249. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/base.py +417 -0
  250. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/confluence.py +105 -0
  251. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/jira.py +608 -0
  252. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/__init__.py +5 -0
  253. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/client_storage.py +180 -0
  254. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/confluence.py +2073 -0
  255. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/context.py +23 -0
  256. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/dependencies.py +731 -0
  257. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/jira.py +3275 -0
  258. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/main.py +827 -0
  259. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/multi_user.py +110 -0
  260. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/oauth_proxy.py +73 -0
  261. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/__init__.py +45 -0
  262. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/date.py +65 -0
  263. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/decorators.py +170 -0
  264. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/env.py +93 -0
  265. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/environment.py +179 -0
  266. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/io.py +58 -0
  267. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/lifecycle.py +85 -0
  268. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/logging.py +118 -0
  269. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/media.py +128 -0
  270. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/oauth.py +724 -0
  271. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/oauth_setup.py +447 -0
  272. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/ssl.py +122 -0
  273. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/token_verifier.py +29 -0
  274. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/tools.py +63 -0
  275. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/toolsets.py +261 -0
  276. mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/urls.py +205 -0
  277. mcp_atlassian_multi-0.21.2/tests/README.md +303 -0
  278. mcp_atlassian_multi-0.21.2/tests/__init__.py +0 -0
  279. mcp_atlassian_multi-0.21.2/tests/conftest.py +365 -0
  280. mcp_atlassian_multi-0.21.2/tests/e2e/__init__.py +0 -0
  281. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/__init__.py +0 -0
  282. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/conftest.py +492 -0
  283. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_adf_write.py +280 -0
  284. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_confluence_auth_matrix.py +131 -0
  285. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_confluence_cloud_operations.py +139 -0
  286. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_images_cloud.py +177 -0
  287. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_jira_auth_matrix.py +143 -0
  288. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_jira_cloud_operations.py +201 -0
  289. mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_mcp_tools_cloud.py +183 -0
  290. mcp_atlassian_multi-0.21.2/tests/e2e/conftest.py +590 -0
  291. mcp_atlassian_multi-0.21.2/tests/e2e/docker/.env.example +4 -0
  292. mcp_atlassian_multi-0.21.2/tests/e2e/docker/README.md +98 -0
  293. mcp_atlassian_multi-0.21.2/tests/e2e/docker/create-pat.sh +75 -0
  294. mcp_atlassian_multi-0.21.2/tests/e2e/docker/docker-compose.yml +85 -0
  295. mcp_atlassian_multi-0.21.2/tests/e2e/docker/healthcheck.sh +40 -0
  296. mcp_atlassian_multi-0.21.2/tests/e2e/docker/setup-test-data.sh +161 -0
  297. mcp_atlassian_multi-0.21.2/tests/e2e/test_confluence_auth_matrix.py +131 -0
  298. mcp_atlassian_multi-0.21.2/tests/e2e/test_confluence_dc_operations.py +123 -0
  299. mcp_atlassian_multi-0.21.2/tests/e2e/test_images_dc.py +179 -0
  300. mcp_atlassian_multi-0.21.2/tests/e2e/test_jira_auth_matrix.py +144 -0
  301. mcp_atlassian_multi-0.21.2/tests/e2e/test_jira_dc_operations.py +194 -0
  302. mcp_atlassian_multi-0.21.2/tests/e2e/test_mcp_tools_dc.py +183 -0
  303. mcp_atlassian_multi-0.21.2/tests/e2e/test_user_lookup_dc.py +174 -0
  304. mcp_atlassian_multi-0.21.2/tests/fixtures/__init__.py +0 -0
  305. mcp_atlassian_multi-0.21.2/tests/fixtures/confluence_mocks.py +600 -0
  306. mcp_atlassian_multi-0.21.2/tests/fixtures/jira_mocks.py +777 -0
  307. mcp_atlassian_multi-0.21.2/tests/fixtures/proforma_mocks.py +179 -0
  308. mcp_atlassian_multi-0.21.2/tests/integration/README.md +194 -0
  309. mcp_atlassian_multi-0.21.2/tests/integration/conftest.py +30 -0
  310. mcp_atlassian_multi-0.21.2/tests/integration/test_real_api.py +604 -0
  311. mcp_atlassian_multi-0.21.2/tests/integration/test_ssl_verification.py +237 -0
  312. mcp_atlassian_multi-0.21.2/tests/unit/auth/__init__.py +0 -0
  313. mcp_atlassian_multi-0.21.2/tests/unit/auth/test_authentication.py +649 -0
  314. mcp_atlassian_multi-0.21.2/tests/unit/confluence/__init__.py +1 -0
  315. mcp_atlassian_multi-0.21.2/tests/unit/confluence/conftest.py +663 -0
  316. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_analytics.py +287 -0
  317. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_attachments.py +1489 -0
  318. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_client.py +461 -0
  319. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_client_oauth.py +421 -0
  320. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_comments.py +515 -0
  321. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_config.py +331 -0
  322. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_constants.py +96 -0
  323. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_custom_headers.py +154 -0
  324. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_labels.py +129 -0
  325. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_pages.py +2946 -0
  326. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_search.py +967 -0
  327. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_spaces.py +167 -0
  328. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_users.py +568 -0
  329. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_utils.py +57 -0
  330. mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_v2_adapter.py +287 -0
  331. mcp_atlassian_multi-0.21.2/tests/unit/jira/conftest.py +508 -0
  332. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_attachments.py +1318 -0
  333. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_boards.py +101 -0
  334. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_client.py +398 -0
  335. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_client_oauth.py +472 -0
  336. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_comments.py +553 -0
  337. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_config.py +403 -0
  338. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_constants.py +46 -0
  339. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_custom_headers.py +141 -0
  340. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_development.py +381 -0
  341. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_epics.py +767 -0
  342. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_field_options.py +518 -0
  343. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_fields.py +1049 -0
  344. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_format_conversion.py +277 -0
  345. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_formatting.py +403 -0
  346. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_forms_api.py +621 -0
  347. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issue_creation_logic.py +432 -0
  348. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issues.py +1739 -0
  349. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issues_markdown.py +301 -0
  350. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_jql_utils.py +173 -0
  351. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_links.py +206 -0
  352. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_metrics.py +348 -0
  353. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_projects.py +768 -0
  354. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_protocols.py +193 -0
  355. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_queues.py +177 -0
  356. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_search.py +1206 -0
  357. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_sla.py +697 -0
  358. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_sprints.py +385 -0
  359. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_transitions.py +555 -0
  360. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_users.py +905 -0
  361. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_watchers.py +201 -0
  362. mcp_atlassian_multi-0.21.2/tests/unit/jira/test_worklog.py +467 -0
  363. mcp_atlassian_multi-0.21.2/tests/unit/models/__init__.py +0 -0
  364. mcp_atlassian_multi-0.21.2/tests/unit/models/conftest.py +533 -0
  365. mcp_atlassian_multi-0.21.2/tests/unit/models/test_adf.py +666 -0
  366. mcp_atlassian_multi-0.21.2/tests/unit/models/test_base_models.py +108 -0
  367. mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_common_models.py +458 -0
  368. mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_page_model.py +250 -0
  369. mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_real_data.py +86 -0
  370. mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_search_model.py +42 -0
  371. mcp_atlassian_multi-0.21.2/tests/unit/models/test_constants.py +135 -0
  372. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_comment_model.py +79 -0
  373. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_common_models.py +359 -0
  374. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_issue_model.py +775 -0
  375. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_link_models.py +312 -0
  376. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_project_model.py +94 -0
  377. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_real_data.py +256 -0
  378. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_search_model.py +209 -0
  379. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_workflow_model.py +85 -0
  380. mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_worklog_model.py +146 -0
  381. mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/__init__.py +0 -0
  382. mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/test_content_processing.py +862 -0
  383. mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/test_preprocessing.py +1384 -0
  384. mcp_atlassian_multi-0.21.2/tests/unit/servers/__init__.py +0 -0
  385. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_client_storage.py +188 -0
  386. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_confluence_server.py +965 -0
  387. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_context.py +297 -0
  388. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_cross_service.py +635 -0
  389. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_datetime_conversion.py +136 -0
  390. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_dependencies.py +1520 -0
  391. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_jira_server.py +2432 -0
  392. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_main_server.py +592 -0
  393. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_mcp_protocol.py +1233 -0
  394. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_oauth_proxy_build.py +312 -0
  395. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_schema_compatibility.py +356 -0
  396. mcp_atlassian_multi-0.21.2/tests/unit/servers/test_transport_lifecycle.py +268 -0
  397. mcp_atlassian_multi-0.21.2/tests/unit/test_exceptions.py +201 -0
  398. mcp_atlassian_multi-0.21.2/tests/unit/test_main_transport_selection.py +190 -0
  399. mcp_atlassian_multi-0.21.2/tests/unit/test_stdin_monitoring_fix.py +133 -0
  400. mcp_atlassian_multi-0.21.2/tests/unit/test_stdio_lifecycle.py +53 -0
  401. mcp_atlassian_multi-0.21.2/tests/unit/test_truststore_env.py +213 -0
  402. mcp_atlassian_multi-0.21.2/tests/unit/utils/__init__.py +1 -0
  403. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_custom_headers.py +175 -0
  404. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_date.py +118 -0
  405. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_decorators.py +143 -0
  406. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_env.py +217 -0
  407. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_environment.py +504 -0
  408. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_io.py +127 -0
  409. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_lifecycle.py +190 -0
  410. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_logging.py +64 -0
  411. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_masking.py +67 -0
  412. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_media.py +228 -0
  413. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_oauth.py +1221 -0
  414. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_oauth_setup.py +375 -0
  415. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_proxy.py +295 -0
  416. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_ssl.py +259 -0
  417. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_token_verifier.py +29 -0
  418. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_tools.py +73 -0
  419. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_toolsets.py +258 -0
  420. mcp_atlassian_multi-0.21.2/tests/unit/utils/test_urls.py +330 -0
  421. mcp_atlassian_multi-0.21.2/tests/utils/__init__.py +1 -0
  422. mcp_atlassian_multi-0.21.2/tests/utils/assertions.py +88 -0
  423. mcp_atlassian_multi-0.21.2/tests/utils/base.py +68 -0
  424. mcp_atlassian_multi-0.21.2/tests/utils/factories.py +117 -0
  425. mcp_atlassian_multi-0.21.2/tests/utils/mocks.py +246 -0
  426. mcp_atlassian_multi-0.21.2/uv.lock +3110 -0
@@ -0,0 +1,50 @@
1
+ {
2
+ "includedExtensions": [
3
+ ".kt",
4
+ ".java",
5
+ ".ts",
6
+ ".tsx",
7
+ ".js",
8
+ ".jsx",
9
+ ".py",
10
+ ".go",
11
+ ".rs",
12
+ ".cs",
13
+ ".gradle.kts",
14
+ ".gradle",
15
+ ".yml",
16
+ ".yaml",
17
+ ".properties",
18
+ ".xml",
19
+ ".json",
20
+ ".sql",
21
+ ".toml",
22
+ ".cfg",
23
+ ".ini"
24
+ ],
25
+ "excludedDirectories": [
26
+ "build",
27
+ "dist",
28
+ "out",
29
+ "target",
30
+ ".gradle",
31
+ ".git",
32
+ ".analysis",
33
+ "node_modules",
34
+ ".idea",
35
+ ".kiro",
36
+ ".vscode",
37
+ "__pycache__",
38
+ ".mypy_cache",
39
+ "vendor",
40
+ "bin",
41
+ "obj"
42
+ ],
43
+ "excludedFilePatterns": [
44
+ "*.generated.*",
45
+ "*.min.*",
46
+ "*.map",
47
+ "*.lock",
48
+ "*.sum"
49
+ ]
50
+ }
@@ -0,0 +1,17 @@
1
+ # Module Analysis — root
2
+
3
+ **Last Updated:** 2026-05-09T04:48:52.221678500Z
4
+ **Language:** unknown
5
+
6
+ ## Key Classes
7
+
8
+ | Class | Responsibility |
9
+ |-------|---------------|
10
+
11
+ ## Detected Patterns
12
+
13
+ - **DI Style**: none
14
+ - **Error Handling**: unknown
15
+ - **Naming**: unknown
16
+ - **Logging**: unknown
17
+ - **Testing**: unknown
@@ -0,0 +1,47 @@
1
+ # Code Intelligence Indexer — Multi-Language
2
+
3
+ Bộ indexer phân tích source code và tạo ra markdown analysis files cho AI agents sử dụng.
4
+
5
+ ## Chọn script phù hợp với môi trường
6
+
7
+ | Thư mục | Ngôn ngữ | Yêu cầu | Cách chạy |
8
+ |---------|----------|----------|-----------|
9
+ | `python/` | Python 3.7+ | Chỉ cần Python (standard library) | `python main.py <project_root>` |
10
+ | `java/` | Java 17+ | Chỉ cần JDK (standard library) | `run.bat <project_root>` hoặc `./run.sh <project_root>` |
11
+ | `powershell/` | PowerShell 5.1+ | Built-in trên Windows | `.\full-indexer.ps1 -RootDir <project_root>` |
12
+ | `bash/` | Bash 4+ | Built-in trên Linux/Mac | `bash full-indexer.sh <project_root>` |
13
+ | `nodejs/` | TypeScript | Node.js 18+ + npm install | `cd nodejs && npm install && npx tsx src/full-indexer.ts <project_root>` |
14
+
15
+ ## Output (giống nhau bất kể dùng script nào)
16
+
17
+ ```
18
+ .analysis/code-intelligence/
19
+ ├── project-structure.md ← Tổng quan project (modules, languages, frameworks)
20
+ ├── modules/
21
+ │ ├── root.md ← Analysis cho module root
22
+ │ ├── core.md ← Analysis cho module core
23
+ │ └── ...
24
+ ├── index-metadata.json ← Metadata (timestamps, file hashes)
25
+ ├── kb-payloads.json ← Payloads sẵn sàng ingest vào Knowledge Base
26
+ └── index-config.json ← Config (extensions, excludes)
27
+ ```
28
+
29
+ ## Khi nào dùng cái nào?
30
+
31
+ - **Windows (không có Python/Node)** → dùng `powershell/` (built-in, zero install)
32
+ - **Linux/Mac (không có Python/Node)** → dùng `bash/` (built-in, zero install)
33
+ - **Dự án Python/Django/FastAPI** → dùng `python/` (đã có Python sẵn)
34
+ - **Dự án Java/Kotlin/Spring** → dùng `java/` (đã có JDK sẵn)
35
+ - **Dự án Node.js/TypeScript** → dùng `nodejs/` (đã có Node sẵn, parser chính xác nhất)
36
+ - **Dự án Go/Rust** → dùng `python/` hoặc `bash/`
37
+ - **CI/CD pipeline** → dùng `python/` hoặc `bash/` (thường có sẵn)
38
+ - **Không có gì** → dùng Kiro AI agent fallback (xem steering file `code-intelligence.md`)
39
+
40
+ ## Thêm ngôn ngữ mới (tương lai)
41
+
42
+ Tạo thư mục mới (ví dụ: `bash/`, `powershell/`, `java/`) với cùng logic:
43
+ 1. Đọc `index-config.json`
44
+ 2. Detect project type từ build files
45
+ 3. Discover modules
46
+ 4. Scan + parse source files
47
+ 5. Ghi output vào cùng location với cùng format
@@ -0,0 +1 @@
1
+ """Code Intelligence System — Python Indexer Package."""
@@ -0,0 +1,46 @@
1
+ """Configuration loading for the Code Intelligence indexer."""
2
+
3
+ import json
4
+ import os
5
+ from typing import Dict, List
6
+
7
+ DEFAULT_CONFIG: Dict[str, List[str]] = {
8
+ "includedExtensions": [
9
+ ".kt", ".java", ".ts", ".tsx", ".js", ".jsx", ".py", ".go",
10
+ ".rs", ".cs", ".gradle.kts", ".gradle", ".yml", ".yaml",
11
+ ".properties", ".xml", ".json", ".sql", ".toml", ".cfg", ".ini"
12
+ ],
13
+ "excludedDirectories": [
14
+ "build", "dist", "out", "target", ".gradle", ".git", ".analysis",
15
+ "node_modules", ".idea", ".kiro", ".vscode", "__pycache__",
16
+ ".mypy_cache", "vendor", "bin", "obj"
17
+ ],
18
+ "excludedFilePatterns": [
19
+ "*.generated.*", "*.min.*", "*.map", "*.lock", "*.sum"
20
+ ]
21
+ }
22
+
23
+ EXTENSION_MAP = {
24
+ ".kt": "kotlin", ".java": "java", ".ts": "typescript", ".tsx": "typescript",
25
+ ".js": "javascript", ".jsx": "javascript", ".py": "python", ".go": "go",
26
+ ".rs": "rust", ".cs": "csharp", ".gradle": "gradle", ".yml": "yaml",
27
+ ".yaml": "yaml", ".xml": "xml", ".sql": "sql", ".json": "json",
28
+ ".properties": "properties", ".toml": "config", ".cfg": "config", ".ini": "config"
29
+ }
30
+
31
+ COMPOUND_EXTENSIONS = [(".gradle.kts", "gradle")]
32
+
33
+ SOURCE_EXTENSIONS = {
34
+ ".kt": "kotlin", ".java": "java", ".ts": "typescript", ".tsx": "typescript",
35
+ ".js": "javascript", ".jsx": "javascript", ".py": "python", ".go": "go",
36
+ ".rs": "rust", ".cs": "csharp"
37
+ }
38
+
39
+
40
+ def load_config(config_path: str) -> dict:
41
+ """Load index-config.json or return defaults."""
42
+ try:
43
+ with open(config_path, "r", encoding="utf-8") as f:
44
+ return json.load(f)
45
+ except (FileNotFoundError, json.JSONDecodeError):
46
+ return DEFAULT_CONFIG
@@ -0,0 +1,115 @@
1
+ """Project type detection — identifies build system, language, and framework."""
2
+
3
+ import os
4
+ from typing import Dict, Optional, Tuple
5
+
6
+ from config import SOURCE_EXTENSIONS
7
+
8
+ BUILD_FILE_PRIORITY = [
9
+ ("build.gradle.kts", "gradle-kotlin"), ("build.gradle", "gradle-java"),
10
+ ("pom.xml", "maven-java"), ("package.json", "npm"),
11
+ ("Cargo.toml", "cargo-rust"), ("go.mod", "go-module"),
12
+ ("pyproject.toml", "python"), ("setup.py", "python"),
13
+ ]
14
+
15
+ PROJECT_TYPE_LANGUAGE = {
16
+ "gradle-kotlin": "kotlin", "gradle-java": "java", "maven-java": "java",
17
+ "npm-typescript": "typescript", "npm-javascript": "javascript",
18
+ "cargo-rust": "rust", "go-module": "go", "python": "python",
19
+ "dotnet": "csharp", "generic": "unknown"
20
+ }
21
+
22
+ FRAMEWORK_PATTERNS = {
23
+ "gradle-kotlin": [("spring-boot-starter", "Spring Boot"), ("io.ktor", "Ktor"), ("ktor-", "Ktor")],
24
+ "gradle-java": [("spring-boot-starter", "Spring Boot"), ("io.ktor", "Ktor")],
25
+ "maven-java": [("spring-boot-starter", "Spring Boot"), ("io.quarkus", "Quarkus")],
26
+ "npm-typescript": [('"react"', "React"), ('"next"', "Next.js"), ('"@angular/core"', "Angular"),
27
+ ('"vue"', "Vue.js"), ('"express"', "Express.js"), ('"@nestjs/core"', "NestJS")],
28
+ "npm-javascript": [('"react"', "React"), ('"express"', "Express.js")],
29
+ "python": [("django", "Django"), ("flask", "Flask"), ("fastapi", "FastAPI")],
30
+ "cargo-rust": [("actix-web", "Actix Web"), ("axum", "Axum"), ("rocket", "Rocket")],
31
+ "go-module": [("github.com/gin-gonic/gin", "Gin"), ("github.com/gofiber/fiber", "Fiber")],
32
+ }
33
+
34
+
35
+ def detect_project_type(root_dir: str) -> dict:
36
+ """Detect project type, primary language, and framework."""
37
+ project_type, build_file = _find_build_file(root_dir)
38
+ project_type = _refine_npm(root_dir, project_type)
39
+ primary_language = _determine_language(root_dir, project_type)
40
+ framework = _detect_framework(root_dir, build_file, project_type)
41
+
42
+ print(f"[Code-Index] INFO: Project detected — type={project_type}, "
43
+ f"language={primary_language}, framework={framework}, buildFile={build_file}")
44
+ return {"projectType": project_type, "primaryLanguage": primary_language,
45
+ "framework": framework, "buildFile": build_file}
46
+
47
+
48
+ def _find_build_file(root_dir: str) -> Tuple[str, str]:
49
+ """Find the primary build file in priority order."""
50
+ for filename, ptype in BUILD_FILE_PRIORITY:
51
+ if os.path.isfile(os.path.join(root_dir, filename)):
52
+ return ptype, filename
53
+ # Check .sln / .csproj
54
+ for f in os.listdir(root_dir):
55
+ if f.endswith(".sln") or f.endswith(".csproj"):
56
+ return "dotnet", f
57
+ return "generic", "none"
58
+
59
+
60
+ def _refine_npm(root_dir: str, project_type: str) -> str:
61
+ """Refine npm to npm-typescript or npm-javascript."""
62
+ if project_type != "npm":
63
+ return project_type
64
+ tsconfig = os.path.join(root_dir, "tsconfig.json")
65
+ return "npm-typescript" if os.path.isfile(tsconfig) else "npm-javascript"
66
+
67
+
68
+ def _determine_language(root_dir: str, project_type: str) -> str:
69
+ """Determine primary language from file counts and project type."""
70
+ lang_counts = _count_source_files(root_dir, max_depth=3)
71
+ implied = PROJECT_TYPE_LANGUAGE.get(project_type, "unknown")
72
+ if implied != "unknown" and lang_counts.get(implied, 0) > 0:
73
+ return implied
74
+ if lang_counts:
75
+ return max(lang_counts, key=lang_counts.get)
76
+ return implied
77
+
78
+
79
+ def _detect_framework(root_dir: str, build_file: str, project_type: str) -> Optional[str]:
80
+ """Detect framework from build file content."""
81
+ if build_file == "none":
82
+ return None
83
+ build_path = os.path.join(root_dir, build_file)
84
+ try:
85
+ content = open(build_path, "r", encoding="utf-8", errors="ignore").read()
86
+ except OSError:
87
+ return None
88
+ for pattern, fw in FRAMEWORK_PATTERNS.get(project_type, []):
89
+ if pattern in content:
90
+ return fw
91
+ return None
92
+
93
+
94
+ def _count_source_files(directory: str, max_depth: int, depth: int = 0) -> Dict[str, int]:
95
+ """Recursively count source files by language."""
96
+ counts: Dict[str, int] = {}
97
+ if depth > max_depth:
98
+ return counts
99
+ skip = {"node_modules", ".git", "build", "dist", "out", "target", ".gradle", "vendor"}
100
+ try:
101
+ entries = os.scandir(directory)
102
+ except OSError:
103
+ return counts
104
+ for entry in entries:
105
+ if entry.is_dir(follow_symlinks=False):
106
+ if entry.name in skip:
107
+ continue
108
+ for lang, count in _count_source_files(entry.path, max_depth, depth + 1).items():
109
+ counts[lang] = counts.get(lang, 0) + count
110
+ elif entry.is_file():
111
+ ext = os.path.splitext(entry.name)[1].lower()
112
+ lang = SOURCE_EXTENSIONS.get(ext)
113
+ if lang:
114
+ counts[lang] = counts.get(lang, 0) + 1
115
+ return counts
@@ -0,0 +1,184 @@
1
+ """Module discovery — finds subprojects based on build system."""
2
+
3
+ import json
4
+ import os
5
+ import re
6
+ from typing import List
7
+
8
+
9
+ def discover_modules(root_dir: str, detection: dict) -> List[dict]:
10
+ """Discover modules/subprojects based on build system."""
11
+ project_type = detection["projectType"]
12
+ build_file = detection["buildFile"]
13
+
14
+ discoverers = {
15
+ "gradle-kotlin": _discover_gradle, "gradle-java": _discover_gradle,
16
+ "maven-java": _discover_maven, "npm-typescript": _discover_npm,
17
+ "npm-javascript": _discover_npm, "cargo-rust": _discover_cargo,
18
+ "go-module": _discover_go, "python": _discover_python,
19
+ }
20
+ discoverer = discoverers.get(project_type)
21
+ modules = discoverer(root_dir) if discoverer else []
22
+
23
+ if not modules:
24
+ modules = [_create_root_module(root_dir, project_type, build_file)]
25
+
26
+ print(f"[Code-Index] INFO: Module discovery — found {len(modules)} module(s)")
27
+ return modules
28
+
29
+
30
+ def _create_root_module(root_dir: str, project_type: str, build_file: str) -> dict:
31
+ """Create a single root module as fallback."""
32
+ src_dirs = _detect_src_dirs(root_dir, ".", project_type)
33
+ return {"name": "root", "path": ".", "sourceDirectories": src_dirs,
34
+ "buildFile": build_file if build_file != "none" else None, "language": None}
35
+
36
+
37
+ def _detect_src_dirs(root_dir: str, mod_path: str, project_type: str) -> List[str]:
38
+ """Detect source directories for a module."""
39
+ if project_type in ("gradle-kotlin", "gradle-java", "maven-java"):
40
+ return _gradle_maven_src(root_dir, mod_path)
41
+ if project_type in ("npm-typescript", "npm-javascript"):
42
+ return _npm_src(root_dir, mod_path)
43
+ for candidate in ["src", "lib", "."]:
44
+ full = os.path.join(root_dir, mod_path, candidate) if mod_path != "." else os.path.join(root_dir, candidate)
45
+ if os.path.isdir(full):
46
+ return [f"{mod_path}/{candidate}" if mod_path != "." else candidate]
47
+ return [mod_path]
48
+
49
+
50
+ def _gradle_maven_src(root_dir: str, mod_path: str) -> List[str]:
51
+ """Detect Gradle/Maven source directories."""
52
+ candidates = [f"{mod_path}/src/main/kotlin", f"{mod_path}/src/main/java",
53
+ f"{mod_path}/src/main/resources", f"{mod_path}/src/test/kotlin",
54
+ f"{mod_path}/src/test/java"]
55
+ found = [c for c in candidates if os.path.isdir(os.path.join(root_dir, c))]
56
+ return found if found else [mod_path]
57
+
58
+
59
+ def _npm_src(root_dir: str, mod_path: str) -> List[str]:
60
+ """Detect npm source directories."""
61
+ candidates = [f"{mod_path}/src", f"{mod_path}/lib", f"{mod_path}/app"]
62
+ found = [c for c in candidates if os.path.isdir(os.path.join(root_dir, c))]
63
+ return found if found else [mod_path]
64
+
65
+
66
+ def _discover_gradle(root_dir: str) -> List[dict]:
67
+ """Discover Gradle subprojects from settings file."""
68
+ modules = []
69
+ for sf in ("settings.gradle.kts", "settings.gradle"):
70
+ path = os.path.join(root_dir, sf)
71
+ if not os.path.isfile(path):
72
+ continue
73
+ content = open(path, "r", encoding="utf-8", errors="ignore").read()
74
+ seen = set()
75
+ for match in re.finditer(r'["\']([^"\']+)["\']', content):
76
+ name = match.group(1).lstrip(":").replace(":", "/")
77
+ if name in seen or not os.path.isdir(os.path.join(root_dir, name)):
78
+ continue
79
+ seen.add(name)
80
+ src_dirs = _gradle_maven_src(root_dir, name)
81
+ modules.append({"name": name.replace("/", "-"), "path": name,
82
+ "sourceDirectories": src_dirs, "buildFile": None, "language": None})
83
+ break
84
+ return modules
85
+
86
+
87
+ def _discover_maven(root_dir: str) -> List[dict]:
88
+ """Discover Maven child modules from pom.xml."""
89
+ modules = []
90
+ pom = os.path.join(root_dir, "pom.xml")
91
+ if not os.path.isfile(pom):
92
+ return modules
93
+ content = open(pom, "r", encoding="utf-8", errors="ignore").read()
94
+ for match in re.finditer(r"<module>\s*([^<]+?)\s*</module>", content):
95
+ name = match.group(1).strip()
96
+ if os.path.isdir(os.path.join(root_dir, name)):
97
+ src_dirs = _gradle_maven_src(root_dir, name)
98
+ modules.append({"name": name, "path": name, "sourceDirectories": src_dirs,
99
+ "buildFile": f"{name}/pom.xml", "language": None})
100
+ return modules
101
+
102
+
103
+ def _discover_npm(root_dir: str) -> List[dict]:
104
+ """Discover npm workspace packages."""
105
+ modules = []
106
+ pkg_path = os.path.join(root_dir, "package.json")
107
+ if not os.path.isfile(pkg_path):
108
+ return modules
109
+ try:
110
+ pkg = json.load(open(pkg_path, "r", encoding="utf-8"))
111
+ except (json.JSONDecodeError, OSError):
112
+ return modules
113
+ workspaces = pkg.get("workspaces", [])
114
+ if isinstance(workspaces, dict):
115
+ workspaces = workspaces.get("packages", [])
116
+ for pattern in workspaces:
117
+ if "*" in pattern:
118
+ parent = pattern.rstrip("/*").rstrip("/**")
119
+ parent_dir = os.path.join(root_dir, parent)
120
+ if os.path.isdir(parent_dir):
121
+ for entry in os.scandir(parent_dir):
122
+ if entry.is_dir() and os.path.isfile(os.path.join(entry.path, "package.json")):
123
+ mod_path = f"{parent}/{entry.name}"
124
+ modules.append({"name": entry.name, "path": mod_path,
125
+ "sourceDirectories": _npm_src(root_dir, mod_path),
126
+ "buildFile": f"{mod_path}/package.json", "language": None})
127
+ elif os.path.isdir(os.path.join(root_dir, pattern)):
128
+ modules.append({"name": os.path.basename(pattern), "path": pattern,
129
+ "sourceDirectories": _npm_src(root_dir, pattern),
130
+ "buildFile": f"{pattern}/package.json", "language": None})
131
+ return modules
132
+
133
+
134
+ def _discover_cargo(root_dir: str) -> List[dict]:
135
+ """Discover Cargo workspace members."""
136
+ cargo = os.path.join(root_dir, "Cargo.toml")
137
+ if not os.path.isfile(cargo):
138
+ return []
139
+ content = open(cargo, "r", encoding="utf-8", errors="ignore").read()
140
+ if "[workspace]" not in content:
141
+ return []
142
+ match = re.search(r'members\s*=\s*\[([^\]]*)\]', content, re.DOTALL)
143
+ if not match:
144
+ return []
145
+ modules = []
146
+ for m in re.finditer(r'"([^"]+)"', match.group(1)):
147
+ name = m.group(1)
148
+ mod_dir = os.path.join(root_dir, name)
149
+ if os.path.isdir(mod_dir):
150
+ src = f"{name}/src" if os.path.isdir(os.path.join(mod_dir, "src")) else name
151
+ modules.append({"name": os.path.basename(name), "path": name,
152
+ "sourceDirectories": [src], "buildFile": f"{name}/Cargo.toml", "language": "rust"})
153
+ return modules
154
+
155
+
156
+ def _discover_go(root_dir: str) -> List[dict]:
157
+ """Discover Go module."""
158
+ go_mod = os.path.join(root_dir, "go.mod")
159
+ if not os.path.isfile(go_mod):
160
+ return []
161
+ content = open(go_mod, "r", encoding="utf-8", errors="ignore").read()
162
+ match = re.search(r'^module\s+(\S+)', content, re.MULTILINE)
163
+ name = os.path.basename(match.group(1)) if match else "root"
164
+ return [{"name": name, "path": ".", "sourceDirectories": ["."],
165
+ "buildFile": "go.mod", "language": "go"}]
166
+
167
+
168
+ def _discover_python(root_dir: str) -> List[dict]:
169
+ """Discover Python monorepo packages."""
170
+ modules = []
171
+ for indicator in ("packages", "libs"):
172
+ ind_dir = os.path.join(root_dir, indicator)
173
+ if not os.path.isdir(ind_dir):
174
+ continue
175
+ for entry in os.scandir(ind_dir):
176
+ if entry.is_dir():
177
+ has_build = (os.path.isfile(os.path.join(entry.path, "pyproject.toml")) or
178
+ os.path.isfile(os.path.join(entry.path, "setup.py")))
179
+ if has_build:
180
+ sub = f"{indicator}/{entry.name}"
181
+ src = f"{sub}/src" if os.path.isdir(os.path.join(root_dir, sub, "src")) else sub
182
+ modules.append({"name": entry.name, "path": sub,
183
+ "sourceDirectories": [src], "buildFile": None, "language": "python"})
184
+ return modules
@@ -0,0 +1,76 @@
1
+ """Analysis file generator — produces markdown output files."""
2
+
3
+ import os
4
+ from datetime import datetime, timezone
5
+ from typing import List
6
+
7
+ from utils import atomic_write, infer_responsibility
8
+
9
+
10
+ def generate_project_structure(modules_data: List[dict], project_info: dict, output_dir: str):
11
+ """Generate project-structure.md."""
12
+ timestamp = datetime.now(timezone.utc).isoformat()
13
+ lines = [
14
+ f"# Project Structure — {project_info['projectName']}",
15
+ "", f"**Last Updated:** {timestamp}",
16
+ f"**Project Type:** {project_info['projectType']}", "",
17
+ "## Modules", "",
18
+ "| Module | Purpose | Language | Framework | Dependencies | Source Files |",
19
+ "|--------|---------|----------|-----------|-------------|-------------|",
20
+ ]
21
+ for mod in modules_data:
22
+ fw = mod.get("framework") or "—"
23
+ deps = ", ".join(mod.get("dependencies", [])[:5]) or "—"
24
+ lines.append(f"| {mod['name']} | {mod.get('purpose', '—')} | "
25
+ f"{mod['language']} | {fw} | {deps} | {mod['sourceFileCount']} |")
26
+
27
+ lines += ["", "## Inter-Module Dependencies", "",
28
+ "| Module | Depends On |", "|--------|-----------|"]
29
+ for mod in modules_data:
30
+ deps = ", ".join(mod.get("dependencies", [])) or "—"
31
+ lines.append(f"| {mod['name']} | {deps} |")
32
+ lines.append("")
33
+
34
+ atomic_write(os.path.join(output_dir, "project-structure.md"), "\n".join(lines))
35
+
36
+
37
+ def generate_module_analysis(module_data: dict, output_dir: str):
38
+ """Generate modules/{name}.md."""
39
+ modules_dir = os.path.join(output_dir, "modules")
40
+ os.makedirs(modules_dir, exist_ok=True)
41
+ timestamp = datetime.now(timezone.utc).isoformat()
42
+ fw = module_data.get("framework") or "—"
43
+
44
+ lines = [
45
+ f"# Module Analysis — {module_data['name']}",
46
+ "", f"**Last Updated:** {timestamp}",
47
+ f"**Language:** {module_data['language']} | **Framework:** {fw}", "",
48
+ "## Key Classes", "",
49
+ "| Class | Visibility | Responsibility |",
50
+ "|-------|------------|---------------|",
51
+ ]
52
+ for cls in module_data.get("classes", [])[:30]:
53
+ resp = infer_responsibility(cls["name"])
54
+ lines.append(f"| {cls['name']} | {cls['visibility']} | {resp} |")
55
+
56
+ lines += ["", "## Public API Surface", ""]
57
+ pub_fns = [f for f in module_data.get("functions", [])
58
+ if f["visibility"] in ("public", "exported")]
59
+ if pub_fns:
60
+ for fn in pub_fns[:20]:
61
+ params = ", ".join(f"{p['name']}: {p['type']}" for p in fn.get("parameters", []))
62
+ lines.append(f"- `{fn['name']}({params}): {fn['returnType']}`")
63
+ else:
64
+ lines.append("_No public functions detected._")
65
+
66
+ lines += ["", "## Dependencies", ""]
67
+ deps = module_data.get("dependencies", [])
68
+ lines.append(", ".join(deps) if deps else "None detected.")
69
+
70
+ lines += ["", "## Detected Patterns", ""]
71
+ patterns = module_data.get("patterns", {})
72
+ for key in ("diStyle", "errorHandling", "naming", "logging", "testing"):
73
+ lines.append(f"- **{key}**: {patterns.get(key, 'unknown')}")
74
+ lines.append("")
75
+
76
+ atomic_write(os.path.join(modules_dir, f"{module_data['name']}.md"), "\n".join(lines))