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.
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/index-config.json +50 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/modules/root.md +17 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/README.md +47 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/__init__.py +1 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/config.py +46 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/detector.py +115 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/discovery.py +184 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/generator.py +76 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/main.py +147 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/parser.py +186 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/patterns.py +89 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/scanner.py +56 -0
- mcp_atlassian_multi-0.21.2/.analysis/code-intelligence/scripts/python/utils.py +91 -0
- mcp_atlassian_multi-0.21.2/.claude/settings.json +11 -0
- mcp_atlassian_multi-0.21.2/.devcontainer/Dockerfile +3 -0
- mcp_atlassian_multi-0.21.2/.devcontainer/devcontainer.json +44 -0
- mcp_atlassian_multi-0.21.2/.devcontainer/post-create.sh +39 -0
- mcp_atlassian_multi-0.21.2/.devcontainer/post-start.sh +12 -0
- mcp_atlassian_multi-0.21.2/.dockerignore +53 -0
- mcp_atlassian_multi-0.21.2/.github/FUNDING.yml +1 -0
- mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/bug_report.yml +122 -0
- mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
- mcp_atlassian_multi-0.21.2/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- mcp_atlassian_multi-0.21.2/.github/copilot-instructions.md +135 -0
- mcp_atlassian_multi-0.21.2/.github/pull_request_template.md +31 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/claude.yml +36 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/docker-publish.yml +77 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/lint.yml +27 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/publish.yml +153 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/stale.yml +53 -0
- mcp_atlassian_multi-0.21.2/.github/workflows/tests.yml +42 -0
- mcp_atlassian_multi-0.21.2/.gitignore +82 -0
- mcp_atlassian_multi-0.21.2/.kiro/.sdlc-manifest.json +290 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ba-agent.json +18 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ba-agent.md +513 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/dev-agent.json +25 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/dev-agent.md +374 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/devops-agent.json +18 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/devops-agent.md +393 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ba-agent.md +503 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/dev-agent.md +365 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/devops-agent.md +441 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/qa-agent.md +697 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/sa-agent.md +472 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/scrum-master-agent.md +455 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/security-agent.md +492 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/sm-agent.md +1484 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ta-agent.md +286 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/prompts/ui-agent.md +417 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/qa-agent.json +18 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/qa-agent.md +706 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/sa-agent.json +18 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/sa-agent.md +481 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/scrum-master-agent.json +24 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/scrum-master-agent.md +454 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/security-agent.json +17 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/security-agent.md +503 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/sm-agent.json +25 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/sm-agent.md +1387 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ta-agent.json +18 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ta-agent.md +298 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ui-agent.json +25 -0
- mcp_atlassian_multi-0.21.2/.kiro/agents/ui-agent.md +417 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-create.json +33 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-delete.json +33 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-edit.json +33 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/code-index-full.json +12 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/file-watcher.sh +53 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio-edit.kiro.hook +16 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio-xml.kiro.hook +16 -0
- mcp_atlassian_multi-0.21.2/.kiro/hooks/validate-drawio.sh +28 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/agent-self-learning.md +45 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/backend-structure.md +183 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/code-intelligence.md +25 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/code-standards.md +65 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/drawio.md +920 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/file-writing.md +34 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/frontend-structure.md +60 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/jira-workflow.md +36 -0
- mcp_atlassian_multi-0.21.2/.kiro/steering/kotlin-code-standards.md +195 -0
- mcp_atlassian_multi-0.21.2/.mintignore +17 -0
- mcp_atlassian_multi-0.21.2/.pre-commit-config.yaml +64 -0
- mcp_atlassian_multi-0.21.2/.worktreeinclude +4 -0
- mcp_atlassian_multi-0.21.2/AGENTS.md +96 -0
- mcp_atlassian_multi-0.21.2/CLAUDE.md +1 -0
- mcp_atlassian_multi-0.21.2/CONTRIBUTING.md +141 -0
- mcp_atlassian_multi-0.21.2/Dockerfile +58 -0
- mcp_atlassian_multi-0.21.2/LICENSE +21 -0
- mcp_atlassian_multi-0.21.2/PKG-INFO +122 -0
- mcp_atlassian_multi-0.21.2/README.md +87 -0
- mcp_atlassian_multi-0.21.2/SECURITY.md +45 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_add_comment.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_create_page.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_attachments.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_page.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_get_page_views.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_search.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_update_page.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/confluence_upload_attachment.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_add_comment.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_batch_get_changelogs.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_create_issue.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_download_attachments.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_agile_boards.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_issue.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_issue_sla.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_get_sprint_issues.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_search.yaml +6 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_search_fields.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_transition_issue.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/_overrides/jira_update_issue.yaml +4 -0
- mcp_atlassian_multi-0.21.2/docs/advanced/docker-production.mdx +184 -0
- mcp_atlassian_multi-0.21.2/docs/advanced/sla-metrics.mdx +134 -0
- mcp_atlassian_multi-0.21.2/docs/authentication.mdx +164 -0
- mcp_atlassian_multi-0.21.2/docs/compatibility.mdx +152 -0
- mcp_atlassian_multi-0.21.2/docs/configuration.mdx +251 -0
- mcp_atlassian_multi-0.21.2/docs/favicon.svg +4 -0
- mcp_atlassian_multi-0.21.2/docs/guides/common-workflows.mdx +135 -0
- mcp_atlassian_multi-0.21.2/docs/guides/cql-guide.mdx +103 -0
- mcp_atlassian_multi-0.21.2/docs/guides/jql-guide.mdx +111 -0
- mcp_atlassian_multi-0.21.2/docs/http-transport.mdx +234 -0
- mcp_atlassian_multi-0.21.2/docs/index.mdx +39 -0
- mcp_atlassian_multi-0.21.2/docs/installation.mdx +135 -0
- mcp_atlassian_multi-0.21.2/docs/sigpipe-analysis.mdx +269 -0
- mcp_atlassian_multi-0.21.2/docs/tools/confluence-attachments.mdx +129 -0
- mcp_atlassian_multi-0.21.2/docs/tools/confluence-comments.mdx +122 -0
- mcp_atlassian_multi-0.21.2/docs/tools/confluence-pages.mdx +197 -0
- mcp_atlassian_multi-0.21.2/docs/tools/confluence-search.mdx +51 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-agile.mdx +150 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-attachments.mdx +38 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-comments-worklogs.mdx +119 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-forms-metrics.mdx +112 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-issues.mdx +193 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-links-versions.mdx +139 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-search-fields.mdx +93 -0
- mcp_atlassian_multi-0.21.2/docs/tools/jira-service-desk.mdx +45 -0
- mcp_atlassian_multi-0.21.2/docs/tools-reference.mdx +123 -0
- mcp_atlassian_multi-0.21.2/docs/troubleshooting.mdx +270 -0
- mcp_atlassian_multi-0.21.2/docs.json +115 -0
- mcp_atlassian_multi-0.21.2/documents/templates/BRD-TEMPLATE.md +218 -0
- mcp_atlassian_multi-0.21.2/documents/templates/DESIGN-SYSTEM.md +303 -0
- mcp_atlassian_multi-0.21.2/documents/templates/DPG-TEMPLATE.md +318 -0
- mcp_atlassian_multi-0.21.2/documents/templates/FSD-TEMPLATE.md +306 -0
- mcp_atlassian_multi-0.21.2/documents/templates/RLN-TEMPLATE.md +200 -0
- mcp_atlassian_multi-0.21.2/documents/templates/SECURITY-REPORT-TEMPLATE.md +166 -0
- mcp_atlassian_multi-0.21.2/documents/templates/STC-TEMPLATE.md +277 -0
- mcp_atlassian_multi-0.21.2/documents/templates/STP-TEMPLATE.md +258 -0
- mcp_atlassian_multi-0.21.2/documents/templates/TDD-TEMPLATE.md +444 -0
- mcp_atlassian_multi-0.21.2/documents/templates/TEST-REPORT-TEMPLATE.md +292 -0
- mcp_atlassian_multi-0.21.2/documents/templates/UG-TEMPLATE.md +339 -0
- mcp_atlassian_multi-0.21.2/documents/templates/UI-SPEC-TEMPLATE.md +222 -0
- mcp_atlassian_multi-0.21.2/helm/Chart.yaml +21 -0
- mcp_atlassian_multi-0.21.2/helm/README.md +160 -0
- mcp_atlassian_multi-0.21.2/helm/templates/NOTES.txt +99 -0
- mcp_atlassian_multi-0.21.2/helm/templates/_helpers.tpl +60 -0
- mcp_atlassian_multi-0.21.2/helm/templates/configmap.yaml +25 -0
- mcp_atlassian_multi-0.21.2/helm/templates/deployment.yaml +321 -0
- mcp_atlassian_multi-0.21.2/helm/templates/hpa.yaml +32 -0
- mcp_atlassian_multi-0.21.2/helm/templates/ingress.yaml +61 -0
- mcp_atlassian_multi-0.21.2/helm/templates/pvc.yaml +21 -0
- mcp_atlassian_multi-0.21.2/helm/templates/rbac.yaml +24 -0
- mcp_atlassian_multi-0.21.2/helm/templates/secret.yaml +41 -0
- mcp_atlassian_multi-0.21.2/helm/templates/service.yaml +21 -0
- mcp_atlassian_multi-0.21.2/helm/templates/serviceaccount.yaml +13 -0
- mcp_atlassian_multi-0.21.2/helm/values.yaml +246 -0
- mcp_atlassian_multi-0.21.2/pyproject.toml +163 -0
- mcp_atlassian_multi-0.21.2/requirements.txt +34 -0
- mcp_atlassian_multi-0.21.2/scripts/generate_tool_docs.py +529 -0
- mcp_atlassian_multi-0.21.2/scripts/oauth_authorize.py +353 -0
- mcp_atlassian_multi-0.21.2/scripts/templates/tool_category.mdx.j2 +42 -0
- mcp_atlassian_multi-0.21.2/scripts/test_with_real_data.sh +145 -0
- mcp_atlassian_multi-0.21.2/smithery.yaml +110 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/__init__.py +489 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/__init__.py +52 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/analytics.py +173 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/attachments.py +559 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/client.py +223 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/comments.py +238 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/config.py +266 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/constants.py +50 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/labels.py +79 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/pages.py +1202 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/protocols.py +106 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/search.py +195 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/spaces.py +100 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/users.py +100 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/utils.py +122 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/confluence/v2_adapter.py +1130 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/exceptions.py +4 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/__init__.py +96 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/attachments.py +469 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/boards.py +88 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/client.py +389 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/comments.py +259 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/config.py +342 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/constants.py +216 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/development.py +402 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/epics.py +946 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/field_options.py +235 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/fields.py +862 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/formatting.py +345 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms.py +225 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms_api.py +408 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/forms_common.py +133 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/issues.py +1610 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/links.py +224 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/metrics.py +408 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/projects.py +465 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/protocols.py +285 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/queues.py +218 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/search.py +307 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/sla.py +683 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/sprints.py +218 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/transitions.py +407 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/users.py +412 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/utils.py +123 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/watchers.py +98 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/jira/worklog.py +245 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/__init__.py +107 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/base.py +126 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/__init__.py +38 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/analytics.py +52 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/comment.py +109 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/common.py +175 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/label.py +62 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/page.py +296 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/search.py +74 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/space.py +57 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/confluence/user_search.py +145 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/constants.py +63 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/__init__.py +110 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/adf.py +362 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/agile.py +152 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/comment.py +97 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/common.py +597 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/field_option.py +105 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/forms.py +162 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/issue.py +813 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/link.py +285 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/metrics.py +231 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/project.py +111 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/queue.py +246 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/search.py +114 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/sla.py +221 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/version.py +46 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/workflow.py +93 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/models/jira/worklog.py +109 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/__init__.py +15 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/base.py +417 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/confluence.py +105 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/preprocessing/jira.py +608 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/__init__.py +5 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/client_storage.py +180 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/confluence.py +2073 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/context.py +23 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/dependencies.py +731 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/jira.py +3275 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/main.py +827 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/multi_user.py +110 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/servers/oauth_proxy.py +73 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/__init__.py +45 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/date.py +65 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/decorators.py +170 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/env.py +93 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/environment.py +179 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/io.py +58 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/lifecycle.py +85 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/logging.py +118 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/media.py +128 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/oauth.py +724 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/oauth_setup.py +447 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/ssl.py +122 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/token_verifier.py +29 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/tools.py +63 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/toolsets.py +261 -0
- mcp_atlassian_multi-0.21.2/src/mcp_atlassian/utils/urls.py +205 -0
- mcp_atlassian_multi-0.21.2/tests/README.md +303 -0
- mcp_atlassian_multi-0.21.2/tests/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/conftest.py +365 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/conftest.py +492 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_adf_write.py +280 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_confluence_auth_matrix.py +131 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_confluence_cloud_operations.py +139 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_images_cloud.py +177 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_jira_auth_matrix.py +143 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_jira_cloud_operations.py +201 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/cloud/test_mcp_tools_cloud.py +183 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/conftest.py +590 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/.env.example +4 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/README.md +98 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/create-pat.sh +75 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/docker-compose.yml +85 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/healthcheck.sh +40 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/docker/setup-test-data.sh +161 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_confluence_auth_matrix.py +131 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_confluence_dc_operations.py +123 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_images_dc.py +179 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_jira_auth_matrix.py +144 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_jira_dc_operations.py +194 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_mcp_tools_dc.py +183 -0
- mcp_atlassian_multi-0.21.2/tests/e2e/test_user_lookup_dc.py +174 -0
- mcp_atlassian_multi-0.21.2/tests/fixtures/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/fixtures/confluence_mocks.py +600 -0
- mcp_atlassian_multi-0.21.2/tests/fixtures/jira_mocks.py +777 -0
- mcp_atlassian_multi-0.21.2/tests/fixtures/proforma_mocks.py +179 -0
- mcp_atlassian_multi-0.21.2/tests/integration/README.md +194 -0
- mcp_atlassian_multi-0.21.2/tests/integration/conftest.py +30 -0
- mcp_atlassian_multi-0.21.2/tests/integration/test_real_api.py +604 -0
- mcp_atlassian_multi-0.21.2/tests/integration/test_ssl_verification.py +237 -0
- mcp_atlassian_multi-0.21.2/tests/unit/auth/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/unit/auth/test_authentication.py +649 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/__init__.py +1 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/conftest.py +663 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_analytics.py +287 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_attachments.py +1489 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_client.py +461 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_client_oauth.py +421 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_comments.py +515 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_config.py +331 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_constants.py +96 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_custom_headers.py +154 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_labels.py +129 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_pages.py +2946 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_search.py +967 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_spaces.py +167 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_users.py +568 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_utils.py +57 -0
- mcp_atlassian_multi-0.21.2/tests/unit/confluence/test_v2_adapter.py +287 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/conftest.py +508 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_attachments.py +1318 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_boards.py +101 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_client.py +398 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_client_oauth.py +472 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_comments.py +553 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_config.py +403 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_constants.py +46 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_custom_headers.py +141 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_development.py +381 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_epics.py +767 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_field_options.py +518 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_fields.py +1049 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_format_conversion.py +277 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_formatting.py +403 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_forms_api.py +621 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issue_creation_logic.py +432 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issues.py +1739 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_issues_markdown.py +301 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_jql_utils.py +173 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_links.py +206 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_metrics.py +348 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_projects.py +768 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_protocols.py +193 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_queues.py +177 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_search.py +1206 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_sla.py +697 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_sprints.py +385 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_transitions.py +555 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_users.py +905 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_watchers.py +201 -0
- mcp_atlassian_multi-0.21.2/tests/unit/jira/test_worklog.py +467 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/conftest.py +533 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_adf.py +666 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_base_models.py +108 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_common_models.py +458 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_page_model.py +250 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_real_data.py +86 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_confluence_search_model.py +42 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_constants.py +135 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_comment_model.py +79 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_common_models.py +359 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_issue_model.py +775 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_link_models.py +312 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_project_model.py +94 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_real_data.py +256 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_search_model.py +209 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_workflow_model.py +85 -0
- mcp_atlassian_multi-0.21.2/tests/unit/models/test_jira_worklog_model.py +146 -0
- mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/test_content_processing.py +862 -0
- mcp_atlassian_multi-0.21.2/tests/unit/preprocessing/test_preprocessing.py +1384 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/__init__.py +0 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_client_storage.py +188 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_confluence_server.py +965 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_context.py +297 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_cross_service.py +635 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_datetime_conversion.py +136 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_dependencies.py +1520 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_jira_server.py +2432 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_main_server.py +592 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_mcp_protocol.py +1233 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_oauth_proxy_build.py +312 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_schema_compatibility.py +356 -0
- mcp_atlassian_multi-0.21.2/tests/unit/servers/test_transport_lifecycle.py +268 -0
- mcp_atlassian_multi-0.21.2/tests/unit/test_exceptions.py +201 -0
- mcp_atlassian_multi-0.21.2/tests/unit/test_main_transport_selection.py +190 -0
- mcp_atlassian_multi-0.21.2/tests/unit/test_stdin_monitoring_fix.py +133 -0
- mcp_atlassian_multi-0.21.2/tests/unit/test_stdio_lifecycle.py +53 -0
- mcp_atlassian_multi-0.21.2/tests/unit/test_truststore_env.py +213 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/__init__.py +1 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_custom_headers.py +175 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_date.py +118 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_decorators.py +143 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_env.py +217 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_environment.py +504 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_io.py +127 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_lifecycle.py +190 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_logging.py +64 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_masking.py +67 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_media.py +228 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_oauth.py +1221 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_oauth_setup.py +375 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_proxy.py +295 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_ssl.py +259 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_token_verifier.py +29 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_tools.py +73 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_toolsets.py +258 -0
- mcp_atlassian_multi-0.21.2/tests/unit/utils/test_urls.py +330 -0
- mcp_atlassian_multi-0.21.2/tests/utils/__init__.py +1 -0
- mcp_atlassian_multi-0.21.2/tests/utils/assertions.py +88 -0
- mcp_atlassian_multi-0.21.2/tests/utils/base.py +68 -0
- mcp_atlassian_multi-0.21.2/tests/utils/factories.py +117 -0
- mcp_atlassian_multi-0.21.2/tests/utils/mocks.py +246 -0
- 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))
|