ai-codeindex 0.26.1__tar.gz → 0.26.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 (418) hide show
  1. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CHANGELOG.md +17 -0
  2. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/PKG-INFO +2 -2
  3. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README.md +1 -1
  4. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/ROADMAP.md +2 -2
  5. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/pyproject.toml +1 -1
  6. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/README_AI.md +10 -10
  7. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_scan.py +53 -10
  8. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/enricher.py +41 -3
  9. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/README_AI.md +2 -2
  10. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_enricher.py +54 -0
  11. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_enricher_integration.py +30 -0
  12. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.editorconfig +0 -0
  13. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  14. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/enhancement.md +0 -0
  16. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/epic.md +0 -0
  17. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  18. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/workflows/ci.yml +0 -0
  19. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/workflows/publish.yml +0 -0
  20. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.gitignore +0 -0
  21. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/.gitignore +0 -0
  22. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/design_philosophy.md +0 -0
  23. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/development_workflow.md +0 -0
  24. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/project_overview.md +0 -0
  25. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/release_automation.md +0 -0
  26. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/suggested_commands.md +0 -0
  27. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CLAUDE.md +0 -0
  28. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CODE_OF_CONDUCT.md +0 -0
  29. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CONTRIBUTING.md +0 -0
  30. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/FOR_LOOMGRAPH.md +0 -0
  31. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/LICENSE +0 -0
  32. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/Makefile +0 -0
  33. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/PROJECT_SYMBOLS.md +0 -0
  34. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README_AI.md +0 -0
  35. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README_zh.md +0 -0
  36. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/SECURITY.md +0 -0
  37. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/.gitignore +0 -0
  38. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/Makefile +0 -0
  39. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/README.md +0 -0
  40. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/grade.py +0 -0
  41. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/questions.yaml.example +0 -0
  42. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/report.py +0 -0
  43. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/run_bench.py +0 -0
  44. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/targets.yaml.example +0 -0
  45. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/README.md +0 -0
  46. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/001-use-tree-sitter-for-parsing.md +0 -0
  47. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/002-external-ai-cli-integration.md +0 -0
  48. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/003-add-swift-objc-support.md +0 -0
  49. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/004-automatic-claude-md-update.md +0 -0
  50. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/005-navigation-disclaimer-and-readme-size-cap.md +0 -0
  51. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/006-distribution-architecture-split.md +0 -0
  52. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/document-aggregation.md +0 -0
  53. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/initial-design.md +0 -0
  54. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/kiss-universal-description.md +0 -0
  55. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/parallel-strategy.md +0 -0
  56. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design-philosophy.md +0 -0
  57. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/benchmark/2026-05-readme-impact.md +0 -0
  58. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/QUICK_START_RELEASE.md +0 -0
  59. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/claude-code-adoption-guide.md +0 -0
  60. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/claude-code-adoption-guide.zh.md +0 -0
  61. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/gitflow-workflow.md +0 -0
  62. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/github-issue-quick-reference.md +0 -0
  63. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/package-naming.md +0 -0
  64. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/pre-release-checklist.md +0 -0
  65. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/setup.md +0 -0
  66. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/team-workflow-guide.md +0 -0
  67. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/test-architecture.md +0 -0
  68. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/before-after/README.md +0 -0
  69. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/case-studies/php-payment-project.md +0 -0
  70. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/loomgraph-efficiency-comparison.md +0 -0
  71. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/advanced-usage.md +0 -0
  72. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/claude-code-integration.md +0 -0
  73. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/configuration.md +0 -0
  74. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/contributing.md +0 -0
  75. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/getting-started.md +0 -0
  76. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/git-hooks-integration.md +0 -0
  77. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/json-output-integration.md +0 -0
  78. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/loomgraph-integration.md +0 -0
  79. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/README.md +0 -0
  80. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/executive-summary.md +0 -0
  81. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/README.md +0 -0
  82. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.10.0.md +0 -0
  83. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.12.0.md +0 -0
  84. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.12.1.md +0 -0
  85. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.14.0.md +0 -0
  86. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.15.0.md +0 -0
  87. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.0.md +0 -0
  88. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.2.md +0 -0
  89. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.3.md +0 -0
  90. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.18.0.md +0 -0
  91. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.19.0.md +0 -0
  92. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.2.0.md +0 -0
  93. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.20.0.md +0 -0
  94. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.23.1.md +0 -0
  95. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.23.2.md +0 -0
  96. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.24.0.md +0 -0
  97. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.25.0.md +0 -0
  98. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.0.md +0 -0
  99. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.1.md +0 -0
  100. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.2.md +0 -0
  101. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.4.0.md +0 -0
  102. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.5.0-beta1.md +0 -0
  103. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.7.0.md +0 -0
  104. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.8.0.md +0 -0
  105. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.9.0.md +0 -0
  106. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/CLAUDE.md.php-project +0 -0
  107. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/CLAUDE.md.template +0 -0
  108. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/README.md +0 -0
  109. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/README_AI.md +0 -0
  110. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/ai-integration-guide.md +0 -0
  111. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/README_AI.md +0 -0
  112. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/README.md +0 -0
  113. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/README_AI.md +0 -0
  114. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/test_template_extractor.py +0 -0
  115. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/yourframework_extractor.py +0 -0
  116. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_output.json +0 -0
  117. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_php_output.json +0 -0
  118. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_sample.php +0 -0
  119. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_sample.py +0 -0
  120. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/parse_integration_example.sh +0 -0
  121. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/print_env.py +0 -0
  122. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/README.md +0 -0
  123. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/templates/post-commit-update-logic.sh +0 -0
  124. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/templates/post-commit-v4 +0 -0
  125. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/swift-objc-support-analysis.md +0 -0
  126. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/swift-poc-summary.md +0 -0
  127. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-codeindex-v2.md +0 -0
  128. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-codeindex.md +0 -0
  129. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-loomgraph-v2.md +0 -0
  130. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-loomgraph.md +0 -0
  131. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/workflow-comparison.md +0 -0
  132. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/README.md +0 -0
  133. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/README_AI.md +0 -0
  134. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/bump_version.sh +0 -0
  135. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/check_docs_release.py +0 -0
  136. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/check_version_consistency.py +0 -0
  137. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/close-epic9-issues.sh +0 -0
  138. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/diagnose_ai_failures.py +0 -0
  139. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/hooks/hook-common.sh +0 -0
  140. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/hooks/pre-push +0 -0
  141. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/PROJECT_INDEX.json +0 -0
  142. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/README.md +0 -0
  143. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/hierarchical_strategy.py +0 -0
  144. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/pre_release_check.sh +0 -0
  145. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/release.sh +0 -0
  146. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/test_hook_e2e.sh +0 -0
  147. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/validate_php_project.py +0 -0
  148. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/README.md +0 -0
  149. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/create.sh +0 -0
  150. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/install.sh +0 -0
  151. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/src/mo-arch/SKILL.md +0 -0
  152. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/src/mo-index/SKILL.md +0 -0
  153. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/README_AI.md +0 -0
  154. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/__init__.py +0 -0
  155. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/adaptive_config.py +0 -0
  156. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/adaptive_selector.py +0 -0
  157. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/ai_helper.py +0 -0
  158. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/claude_md.py +0 -0
  159. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli.py +0 -0
  160. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_claude_md.py +0 -0
  161. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_common.py +0 -0
  162. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_config.py +0 -0
  163. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_config_commands.py +0 -0
  164. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_docs.py +0 -0
  165. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_hooks.py +0 -0
  166. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_parse.py +0 -0
  167. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_symbols.py +0 -0
  168. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_tech_debt.py +0 -0
  169. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/config.py +0 -0
  170. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/config_help.py +0 -0
  171. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/directory_tree.py +0 -0
  172. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/docstring_processor.py +0 -0
  173. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/doctor.py +0 -0
  174. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/errors.py +0 -0
  175. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/README_AI.md +0 -0
  176. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/__init__.py +0 -0
  177. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/spring.py +0 -0
  178. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/thinkphp.py +0 -0
  179. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/file_classifier.py +0 -0
  180. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/framework_detect.py +0 -0
  181. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/hierarchical.py +0 -0
  182. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/hooks.py +0 -0
  183. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/incremental.py +0 -0
  184. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/init_wizard.py +0 -0
  185. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/invoker.py +0 -0
  186. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/objc_association.py +0 -0
  187. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parallel.py +0 -0
  188. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parser.py +0 -0
  189. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/README_AI.md +0 -0
  190. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/__init__.py +0 -0
  191. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/base.py +0 -0
  192. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/README_AI.md +0 -0
  193. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/__init__.py +0 -0
  194. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/calls.py +0 -0
  195. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/imports.py +0 -0
  196. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/inheritance.py +0 -0
  197. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/symbols.py +0 -0
  198. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java_parser.py +0 -0
  199. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/README_AI.md +0 -0
  200. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/__init__.py +0 -0
  201. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/calls.py +0 -0
  202. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/imports.py +0 -0
  203. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/inheritance.py +0 -0
  204. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/symbols.py +0 -0
  205. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/README_AI.md +0 -0
  206. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/__init__.py +0 -0
  207. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/calls.py +0 -0
  208. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/imports.py +0 -0
  209. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/inheritance.py +0 -0
  210. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/symbols.py +0 -0
  211. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/README_AI.md +0 -0
  212. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/__init__.py +0 -0
  213. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/calls.py +0 -0
  214. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/imports.py +0 -0
  215. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/inheritance.py +0 -0
  216. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/symbols.py +0 -0
  217. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/README_AI.md +0 -0
  218. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/__init__.py +0 -0
  219. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/calls.py +0 -0
  220. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/imports.py +0 -0
  221. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/inheritance.py +0 -0
  222. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/symbols.py +0 -0
  223. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/README_AI.md +0 -0
  224. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/__init__.py +0 -0
  225. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/calls.py +0 -0
  226. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/imports.py +0 -0
  227. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/inheritance.py +0 -0
  228. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/symbols.py +0 -0
  229. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/utils.py +0 -0
  230. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/route_extractor.py +0 -0
  231. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/route_registry.py +0 -0
  232. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/scanner.py +0 -0
  233. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/semantic_extractor.py +0 -0
  234. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/skill_helpers.py +0 -0
  235. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/smart_writer.py +0 -0
  236. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/symbol_index.py +0 -0
  237. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/symbol_scorer.py +0 -0
  238. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/tech_debt.py +0 -0
  239. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/tech_debt_formatters.py +0 -0
  240. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/README_AI.md +0 -0
  241. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/__init__.py +0 -0
  242. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/claude_md_core.md +0 -0
  243. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/test_smells.py +0 -0
  244. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writer.py +0 -0
  245. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/README_AI.md +0 -0
  246. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/__init__.py +0 -0
  247. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/core.py +0 -0
  248. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/detailed_generator.py +0 -0
  249. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/navigation_generator.py +0 -0
  250. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/overview_generator.py +0 -0
  251. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/utils.py +0 -0
  252. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/generator.py +0 -0
  253. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/analyze_legacy_tests.py +0 -0
  254. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/compare_coverage.py +0 -0
  255. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/compare_test_results.py +0 -0
  256. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/java.yaml +0 -0
  257. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/php.yaml +0 -0
  258. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/python.yaml +0 -0
  259. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/templates/inheritance_test.py.j2 +0 -0
  260. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/__init__.py +0 -0
  261. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/conftest.py +0 -0
  262. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/README_AI.md +0 -0
  263. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/__init__.py +0 -0
  264. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_spring.py +0 -0
  265. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_thinkphp.py +0 -0
  266. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_thinkphp_description.py +0 -0
  267. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/README.md +0 -0
  268. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/cli_scan_defaults.feature +0 -0
  269. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/help_system.feature +0 -0
  270. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/init_wizard.feature +0 -0
  271. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/symbol_overload_detection.feature +0 -0
  272. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/tech_debt_detection.feature +0 -0
  273. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/tech_debt_reporting.feature +0 -0
  274. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/README_AI.md +0 -0
  275. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Controller.php +0 -0
  276. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/README_AI.md +0 -0
  277. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Service.java +0 -0
  278. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Simple.java +0 -0
  279. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/broken.py +0 -0
  280. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/complete.py +0 -0
  281. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/service.ts +0 -0
  282. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/simple.php +0 -0
  283. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/simple.py +0 -0
  284. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/unsupported.txt +0 -0
  285. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/enum.java +0 -0
  286. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/generics.java +0 -0
  287. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/imports.java +0 -0
  288. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/interface.java +0 -0
  289. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/record.java +0 -0
  290. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/sealed_class.java +0 -0
  291. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/simple_class.java +0 -0
  292. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/Application.java +0 -0
  293. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/User.java +0 -0
  294. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserController.java +0 -0
  295. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserRepository.java +0 -0
  296. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserService.java +0 -0
  297. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring_controller.java +0 -0
  298. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/app.js +0 -0
  299. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/component.tsx +0 -0
  300. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/service.ts +0 -0
  301. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/README.md +0 -0
  302. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/README_AI.md +0 -0
  303. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/file1.py +0 -0
  304. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2a/file2.py +0 -0
  305. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2a/level3/file4.py +0 -0
  306. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2b/file3.py +0 -0
  307. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchy_simple.py +0 -0
  308. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_adaptive_config.py +0 -0
  309. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_adaptive_selector.py +0 -0
  310. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_ai_helper.py +0 -0
  311. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_backward_compatibility.py +0 -0
  312. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_call_integration.py +0 -0
  313. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_claude_md.py +0 -0
  314. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_claude_md_injection.py +0 -0
  315. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_config_gitignore.py +0 -0
  316. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_debt_scan.py +0 -0
  317. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_docstring_options.py +0 -0
  318. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_hooks.py +0 -0
  319. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_json.py +0 -0
  320. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_parse.py +0 -0
  321. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_scan_defaults_bdd.py +0 -0
  322. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_tech_debt.py +0 -0
  323. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_config_adaptive.py +0 -0
  324. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_dataclass_structure.py +0 -0
  325. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_directory_tree.py +0 -0
  326. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_docstring_config.py +0 -0
  327. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_docstring_processor.py +0 -0
  328. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_doctor.py +0 -0
  329. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_error_handling.py +0 -0
  330. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_file_classifier.py +0 -0
  331. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_help_system_bdd.py +0 -0
  332. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hook_post_commit.py +0 -0
  333. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks.py +0 -0
  334. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks_config.py +0 -0
  335. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks_integration.py +0 -0
  336. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_init_minimal_scope.py +0 -0
  337. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_init_wizard_bdd.py +0 -0
  338. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_integration_swift_objc.py +0 -0
  339. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_annotations.py +0 -0
  340. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_calls.py +0 -0
  341. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_edge_cases.py +0 -0
  342. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_error_recovery.py +0 -0
  343. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_generic_bounds.py +0 -0
  344. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_inheritance.py +0 -0
  345. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_lambda.py +0 -0
  346. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_lombok.py +0 -0
  347. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_module.py +0 -0
  348. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_parser.py +0 -0
  349. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_spring.py +0 -0
  350. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_throws.py +0 -0
  351. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_json_output.py +0 -0
  352. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_lazy_loading.py +0 -0
  353. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_list_dirs_diagnostic.py +0 -0
  354. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_loomgraph_integration.py +0 -0
  355. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_objc_association_utils.py +0 -0
  356. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parallel_scan.py +0 -0
  357. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser.py +0 -0
  358. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_detection.py +0 -0
  359. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_association.py +0 -0
  360. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_basic.py +0 -0
  361. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_bridging.py +0 -0
  362. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_categories.py +0 -0
  363. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_docstrings.py +0 -0
  364. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_extensions.py +0 -0
  365. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_generics.py +0 -0
  366. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_inheritance.py +0 -0
  367. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_integration.py +0 -0
  368. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_poc.py +0 -0
  369. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_properties.py +0 -0
  370. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_property_wrappers.py +0 -0
  371. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_protocols.py +0 -0
  372. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_signatures.py +0 -0
  373. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_calls.py +0 -0
  374. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_comment_extraction.py +0 -0
  375. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_docstring_extraction.py +0 -0
  376. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_import_alias.py +0 -0
  377. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_inheritance.py +0 -0
  378. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_loomgraph_integration.py +0 -0
  379. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_project_index_semantic.py +0 -0
  380. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_calls.py +0 -0
  381. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_docstring_description.py +0 -0
  382. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_import_alias.py +0 -0
  383. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_inheritance.py +0 -0
  384. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_extractor.py +0 -0
  385. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_info.py +0 -0
  386. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_registry.py +0 -0
  387. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_table_description.py +0 -0
  388. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_table_display.py +0 -0
  389. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_scanall_auto_ai.py +0 -0
  390. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_scanner_passthrough.py +0 -0
  391. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_semantic_extractor.py +0 -0
  392. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_skill_helpers.py +0 -0
  393. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer.py +0 -0
  394. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_adaptive.py +0 -0
  395. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_docstring.py +0 -0
  396. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_enriched.py +0 -0
  397. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_integration.py +0 -0
  398. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_semantic.py +0 -0
  399. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_story_4_4_integration.py +0 -0
  400. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_symbol_overload.py +0 -0
  401. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_symbol_scorer.py +0 -0
  402. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_bdd.py +0 -0
  403. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_detector.py +0 -0
  404. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_formatters.py +0 -0
  405. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_ios.py +0 -0
  406. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_java.py +0 -0
  407. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_reporter.py +0 -0
  408. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_test_smells.py +0 -0
  409. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_thinkphp_route_extractor.py +0 -0
  410. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_typescript_integration.py +0 -0
  411. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_typescript_parser.py +0 -0
  412. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_windows_path_optimization.py +0 -0
  413. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_writer_preserves_enrichment.py +0 -0
  414. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/README_AI.md +0 -0
  415. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/__init__.py +0 -0
  416. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/test_generators.py +0 -0
  417. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/test_utils.py +0 -0
  418. {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/uv.lock +0 -0
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.26.2] - 2026-06-22
11
+
12
+ **Theme**: enrichment-quality patch. `scan-all --ai` was silently writing punt
13
+ text ("I need the file names") as the directory description for leaf dirs and
14
+ caching it as `enrichment: ok`. A/B on a real TS monorepo: 23/50 punts → 0/50.
15
+ No contract change.
16
+
17
+ > **Upgrade note**: existing `README_AI.md` files enriched by ≤0.26.1 may carry
18
+ > poisoned descriptions stamped `enrichment: ok`, which the cache will not
19
+ > refresh on its own. After upgrading, run **`codeindex scan-all --ai --retry-all`**
20
+ > once to flush and regenerate them.
21
+
22
+ ### Fixed
23
+
24
+ - **`scan-all --ai` enrichment now feeds each directory its OWN files/symbols, fixing leaf-dir punts** (GH #94): `_enrich_directories_with_ai` built the prompt from `build_safe_subdir_context(child_dirs)` — child *directory* names only — while `build_enrich_prompt` instructed the model "based ONLY on the file names and symbol names above." A leaf dir's content is *files*, not subdirs, so the prompt carried nothing to describe; worse, a single uninformative child like `__tests__` made the subdir context non-empty and short-circuited the README fallback. On a TypeScript monorepo this hit 21/50 enriched dirs (`controllers`, `services`, `routes`, `screens`, `pages` — all the leaf code dirs), and the model correctly punted ("I need the file names and symbol names"). New `cli_scan._build_enrich_summary` re-parses the directory's own files **non-recursively** (`scan_directory(recursive=False)` — no subtree leak) and runs them through the existing `extract_symbol_summary`, then `enricher.merge_enrich_context` combines that (primary) with the subdir names (supplementary). Both sources are AST/tree-derived, never README markdown, so the anti-injection-chain property `build_safe_subdir_context` was built for is preserved. `build_enrich_prompt`'s instruction was de-lied ("based ONLY on the information above (file names, symbol names, and subdirectories)") and a dir with genuinely no indexable content is now marked `failed (reason: no indexable content)` — retryable — instead of being sent a self-contradictory prompt. *(The original issue blamed `parallel_workers=16` concurrency; that was a confounded experiment — enrichment is a serial loop and the punts occurred serially. Diagnosis corrected by source read + clean repro before this fix.)*
25
+ - **Punt detection (`looks_like_refusal`) now covers the leaf-dir phrasings it was missing** (GH #94, extends GH #85): the GH #85 refusal table had `i need more` but not `i need specific`, and **zero Chinese prefixes** — so `I need specific file names…` / `我需要…文件名和符号名` / `请提供…` slipped through and were stamped `<!-- enrichment: ok -->`, poisoning the cache (skipped on re-run without `--retry-all`). Added `i need specific` plus a deliberately specific Chinese set (`我需要`, `请提供`, `需要具体`, `信息不足`, `我看到的信息`) — kept narrow so legit one-liners that merely contain `需要` (e.g. "需要登录的接口") are not misclassified, locked by `test_chinese_descriptions_with_xuyao_are_not_refusals`.
26
+
10
27
  ## [0.26.1] - 2026-06-05
11
28
 
12
29
  **Theme**: GitFlow + non-Python UX patch. Four bug fixes from continued fabricOS dogfood — all paths where `codeindex` silently no-op'd or warned about state that wasn't real. No contract changes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ai-codeindex
3
- Version: 0.26.1
3
+ Version: 0.26.2
4
4
  Summary: AI-native code indexing tool for large codebases
5
5
  Project-URL: Homepage, https://github.com/dreamlx/codeindex
6
6
  Project-URL: Documentation, https://github.com/dreamlx/codeindex
@@ -578,7 +578,7 @@ See [Release Automation Guide](docs/development/QUICK_START_RELEASE.md) for deta
578
578
 
579
579
  ## Roadmap
580
580
 
581
- **Current version**: v0.25.0
581
+ **Current version**: v0.26.2
582
582
 
583
583
  **Recent milestones**:
584
584
  - v0.23.0 — **AI-Enhanced Module Descriptions**: two-phase pipeline, auto-AI enrichment, post-commit thin wrapper
@@ -521,7 +521,7 @@ See [Release Automation Guide](docs/development/QUICK_START_RELEASE.md) for deta
521
521
 
522
522
  ## Roadmap
523
523
 
524
- **Current version**: v0.25.0
524
+ **Current version**: v0.26.2
525
525
 
526
526
  **Recent milestones**:
527
527
  - v0.23.0 — **AI-Enhanced Module Descriptions**: two-phase pipeline, auto-AI enrichment, post-commit thin wrapper
@@ -1,7 +1,7 @@
1
1
  # codeindex Strategic Roadmap
2
2
 
3
3
  **Last Updated**: 2026-03-06
4
- **Current Version**: v0.25.0
4
+ **Current Version**: v0.26.2
5
5
  **Vision**: Universal Code Parser - Best-in-class multi-language AST parser for AI-assisted development
6
6
  **Positioning**: Focused on code parsing and structured data extraction, not AI analysis
7
7
 
@@ -534,4 +534,4 @@
534
534
  **Next Review**: 2026-03-31
535
535
  **Maintained By**: @dreamlx
536
536
  **Last Updated**: 2026-03-06
537
- **Current Version**: v0.25.0
537
+ **Current Version**: v0.26.2
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ai-codeindex"
3
- version = "0.26.1"
3
+ version = "0.26.2"
4
4
  description = "AI-native code indexing tool for large codebases"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,12 +1,12 @@
1
1
  <!-- codeindex navigation index — agent: drill into source via Read/Grep for precise mechanism; do not treat this as final word. -->
2
- <!-- Generated by codeindex (detailed) at 2026-06-05T21:54:59.634399 -->
2
+ <!-- Generated by codeindex (detailed) at 2026-06-21T23:56:14.087118 -->
3
3
 
4
4
  # codeindex
5
5
 
6
6
  ## Overview
7
7
 
8
8
  - **Files**: 89
9
- - **Symbols**: 572
9
+ - **Symbols**: 574
10
10
 
11
11
  ## Files
12
12
 
@@ -227,6 +227,11 @@ s_
227
227
  timeout: int = 120,
228
228
  retry_all: bool = False,
229
229
  ) -> None`
230
+ - `def _build_enrich_summary(
231
+ dir_path: Path,
232
+ child_dirs: list[Path],
233
+ config: Config,
234
+ ) -> str`
230
235
  - `def _enrich_directories_with_ai(
231
236
  dirs: list[Path],
232
237
  tree: DirectoryTree,
@@ -237,14 +242,8 @@ s_
237
242
  enrichment_cache: dict[Path, str] | None = None,
238
243
  ) -> None`
239
244
  - `def _print_enrichment_failure_hint(failed_dirs: list[str]) -> None`
240
- - `def _process_directory_with_smartwriter(
241
- dir_path: Path,
242
- tree: DirectoryTree,
243
- config: Config,
244
- docstring_processor=None,
245
- ) -> tuple[Path, bool, str, int]`
246
245
 
247
- _... and 2 more symbols_
246
+ _... and 3 more symbols_
248
247
 
249
248
  ### cli_symbols.py
250
249
  _CLI commands for symbol indexing and dependency analysis.
@@ -345,7 +344,8 @@ co_
345
344
  - `def show_full_config_help() -> None`
346
345
  - `def _show_param_section(param_name: str) -> None`
347
346
  - `def explain_parameter(
348
- param_name: str, curr
347
+ param_name: str, current_value: Optional[any] = None, cpu_count: Optional[int] = None
348
+
349
349
 
350
350
  ---
351
351
  _Content truncated due to size limit. See individual module README files for details._
@@ -634,6 +634,47 @@ def _process_directories_parallel(
634
634
  )
635
635
 
636
636
 
637
+ def _build_enrich_summary(
638
+ dir_path: Path,
639
+ child_dirs: list[Path],
640
+ config: Config,
641
+ ) -> str:
642
+ """Build the enrichment prompt context for one directory (GH #94).
643
+
644
+ Combines the directory's OWN file/symbol summary — re-parsed from source
645
+ (AST), non-recursively, so subtree content does not leak in — with its
646
+ subdirectory names. The dir's own content is the primary signal; subdir
647
+ names are supplementary. This fixes leaf dirs (e.g. ``controllers`` whose
648
+ only child is ``__tests__``) that previously got only a useless
649
+ ``Subdirectories: __tests__`` and made the model punt.
650
+
651
+ Args:
652
+ dir_path: Directory being enriched.
653
+ child_dirs: Indexed child directories (from ``tree.get_children``).
654
+ config: Active configuration (for language/exclude filtering).
655
+
656
+ Returns:
657
+ Combined context string, or empty if the dir has no indexable content.
658
+ """
659
+ from .enricher import (
660
+ build_safe_subdir_context,
661
+ extract_symbol_summary,
662
+ merge_enrich_context,
663
+ )
664
+ from .parallel import parse_files_parallel
665
+ from .scanner import scan_directory
666
+
667
+ subdir_context = build_safe_subdir_context(child_dirs)
668
+
669
+ own_summary = ""
670
+ scan_result = scan_directory(dir_path, config, recursive=False)
671
+ if scan_result.files:
672
+ parse_results = parse_files_parallel(scan_result.files, config, quiet=True)
673
+ own_summary = extract_symbol_summary(parse_results)
674
+
675
+ return merge_enrich_context(own_summary, subdir_context)
676
+
677
+
637
678
  def _enrich_directories_with_ai(
638
679
  dirs: list[Path],
639
680
  tree: DirectoryTree,
@@ -665,8 +706,6 @@ def _enrich_directories_with_ai(
665
706
  """
666
707
  from .enricher import (
667
708
  build_enrich_prompt,
668
- build_safe_subdir_context,
669
- extract_summary_from_readme,
670
709
  inject_blockquote,
671
710
  looks_like_refusal,
672
711
  mark_enrichment_status,
@@ -715,17 +754,21 @@ def _enrich_directories_with_ai(
715
754
  for dir_path in enrich_dirs:
716
755
  readme_path = dir_path / config.output_file
717
756
 
718
- # Prefer tree-derived context (subdir names only) to avoid the
719
- # injection chain through markdown-embedded AI descriptions.
720
- # Fall back to README parsing only for dirs without indexed children
721
- # (rare for enrichable navigation/overview dirs).
757
+ # Build context from the dir's OWN files/symbols (primary) plus its
758
+ # subdirectory names (supplementary). Both come from AST/tree sources,
759
+ # never README markdown, so the anti-injection-chain property holds
760
+ # (GH #94).
722
761
  child_dirs = tree.get_children(dir_path)
723
- summary = build_safe_subdir_context(child_dirs)
724
-
725
- if not summary:
726
- summary = extract_summary_from_readme(readme_path)
762
+ summary = _build_enrich_summary(dir_path, child_dirs, config)
727
763
 
728
764
  if not summary:
765
+ # Nothing indexable to describe — mark failed (retryable) rather
766
+ # than send a prompt that asks the model to describe nothing.
767
+ if readme_path.exists():
768
+ mark_enrichment_status(
769
+ readme_path, "failed", reason="no indexable content"
770
+ )
771
+ failed_dirs.append(dir_path.name)
729
772
  continue
730
773
 
731
774
  # Include parent directory name for context
@@ -36,11 +36,19 @@ _REFUSAL_PREFIXES = (
36
36
  "i'm unable",
37
37
  "i am unable",
38
38
  "i need more",
39
+ "i need specific", # GH #94: leaf-dir punt asking for omitted file/symbol names
39
40
  "no file",
40
41
  "insufficient context",
41
42
  "without more",
42
43
  "sorry, i",
43
44
  "as an ai",
45
+ # Chinese punts (GH #94). Kept specific so legit one-liners that merely
46
+ # contain 需要 (e.g. "需要登录的接口") are not misclassified.
47
+ "我需要",
48
+ "请提供",
49
+ "需要具体",
50
+ "信息不足",
51
+ "我看到的信息",
44
52
  )
45
53
 
46
54
 
@@ -165,6 +173,35 @@ def build_safe_subdir_context(child_dirs: list[Path]) -> str:
165
173
  return "Subdirectories: " + ", ".join(names) + suffix
166
174
 
167
175
 
176
+ def merge_enrich_context(own_summary: str, subdir_context: str) -> str:
177
+ """Combine a directory's own file/symbol summary with its subdir names.
178
+
179
+ GH #94: a directory's OWN files and symbols are the primary signal for a
180
+ one-line description; subdirectory names are only supplementary. The
181
+ previous enrichment path used subdir context with a README fallback and a
182
+ single uninformative child (e.g. ``__tests__``) made the subdir context
183
+ non-empty, short-circuiting the dir's own content and leaving leaf dirs
184
+ with an empty prompt — so the model punted ("I need the file names").
185
+
186
+ Both inputs come from AST/tree sources (``extract_symbol_summary`` and
187
+ ``build_safe_subdir_context``), never from README markdown, preserving the
188
+ anti-injection-chain property ``build_safe_subdir_context`` was built for.
189
+
190
+ Args:
191
+ own_summary: ``extract_symbol_summary`` output (file: symbols; ...).
192
+ subdir_context: ``build_safe_subdir_context`` output (Subdirectories: ...).
193
+
194
+ Returns:
195
+ Combined context string, or empty string if both inputs are empty.
196
+ """
197
+ parts = []
198
+ if own_summary and own_summary.strip():
199
+ parts.append(f"Files: {own_summary.strip()}")
200
+ if subdir_context and subdir_context.strip():
201
+ parts.append(subdir_context.strip())
202
+ return "\n".join(parts)
203
+
204
+
168
205
  def build_enrich_prompt(
169
206
  dir_name: str,
170
207
  symbol_summary: str,
@@ -188,13 +225,14 @@ def build_enrich_prompt(
188
225
  return (
189
226
  context
190
227
  + "\n"
191
- "Based ONLY on the file names and symbol names above, write a concise "
192
- "functional description of this module (30 chars or less). "
228
+ "Based ONLY on the information above (file names, symbol names, and "
229
+ "subdirectories), write a concise functional description of this "
230
+ "module (30 chars or less). "
193
231
  "Describe WHAT it does, not HOW. "
194
232
  "Examples: '会员等级、积分、权益卡管理', 'Payment gateway (Alipay/WeChat)', "
195
233
  "'物流配送与运费计算'. "
196
234
  "Output ONLY the description text. No quotes, no markdown, no explanation. "
197
- "Do NOT invent features not evidenced by the symbol names."
235
+ "Do NOT invent features not evidenced by the names above."
198
236
  )
199
237
 
200
238
 
@@ -1,12 +1,12 @@
1
1
  <!-- codeindex navigation index — agent: drill into source via Read/Grep for precise mechanism; do not treat this as final word. -->
2
- <!-- Generated by codeindex (detailed) at 2026-06-05T21:54:59.931951 -->
2
+ <!-- Generated by codeindex (detailed) at 2026-06-21T23:56:14.360118 -->
3
3
 
4
4
  # tests
5
5
 
6
6
  ## Overview
7
7
 
8
8
  - **Files**: 125
9
- - **Symbols**: 2164
9
+ - **Symbols**: 2172
10
10
 
11
11
  ## Files
12
12
 
@@ -420,6 +420,40 @@ class TestMarkEnrichmentStatus:
420
420
  assert "line2" not in enrichment_line or "\n" not in enrichment_line
421
421
 
422
422
 
423
+ class TestMergeEnrichContext:
424
+ """GH #94: dir's own files/symbols are primary; subdir names supplementary."""
425
+
426
+ def test_own_symbols_primary_subdirs_supplementary(self):
427
+ from codeindex.enricher import merge_enrich_context
428
+
429
+ merged = merge_enrich_context(
430
+ "user.controller.ts: login, logout; auth.ts: verify",
431
+ "Subdirectories: __tests__",
432
+ )
433
+ assert "login" in merged
434
+ assert "auth.ts" in merged
435
+ assert "__tests__" in merged # supplementary, still present
436
+
437
+ def test_uninformative_subdir_does_not_hide_own_symbols(self):
438
+ """The exact bug: 'Subdirectories: __tests__' used to short-circuit."""
439
+ from codeindex.enricher import merge_enrich_context
440
+
441
+ merged = merge_enrich_context("svc.ts: doWork", "Subdirectories: __tests__")
442
+ assert "doWork" in merged
443
+
444
+ def test_empty_own_summary_falls_back_to_subdirs(self):
445
+ from codeindex.enricher import merge_enrich_context
446
+
447
+ merged = merge_enrich_context("", "Subdirectories: components, pages")
448
+ assert "components" in merged
449
+
450
+ def test_both_empty_returns_empty(self):
451
+ from codeindex.enricher import merge_enrich_context
452
+
453
+ assert merge_enrich_context("", "") == ""
454
+ assert merge_enrich_context(" ", " ") == ""
455
+
456
+
423
457
  class TestLooksLikeRefusal:
424
458
  """Tests for the GH #85 refusal detector."""
425
459
 
@@ -443,6 +477,26 @@ class TestLooksLikeRefusal:
443
477
  assert looks_like_refusal("\n\ni cannot help\n")
444
478
  assert looks_like_refusal("I Don't Have Enough Info")
445
479
 
480
+ def test_leaf_dir_punt_phrasings(self):
481
+ """GH #94: leaf dirs punt with phrasings the GH #85 table missed.
482
+
483
+ The empty-symbol enrichment prompt makes the model ask for the
484
+ very file/symbol names that were omitted. These were stamped
485
+ `enrichment: ok` because the prefix table had `i need more` but
486
+ not `i need specific`, and zero Chinese prefixes.
487
+ """
488
+ assert looks_like_refusal("I need specific file names and symbol names")
489
+ assert looks_like_refusal("我需要具体的文件名和符号名才能描述")
490
+ assert looks_like_refusal("请提供文件名和符号名")
491
+ assert looks_like_refusal("需要具体的文件列表")
492
+ assert looks_like_refusal("信息不足,无法生成描述")
493
+ assert looks_like_refusal("我看到的信息不足以描述该模块")
494
+
495
+ def test_chinese_descriptions_with_xuyao_are_not_refusals(self):
496
+ """Legit Chinese one-liners that merely contain 需要 must pass."""
497
+ assert not looks_like_refusal("需要登录的接口与权限校验")
498
+ assert not looks_like_refusal("处理需要异步执行的后台任务")
499
+
446
500
  def test_normal_descriptions_are_not_refusals(self):
447
501
  """Real one-line descriptions must pass through unmolested."""
448
502
  assert not looks_like_refusal("会员等级管理、积分兑换、权益卡券")
@@ -83,6 +83,36 @@ class TestEnrichmentIntegration:
83
83
  # Prompt should ask for concise description
84
84
  assert "30" in prompt or "concise" in prompt.lower()
85
85
 
86
+ def test_build_enrich_summary_includes_own_symbols_for_leaf_dir(self, tmp_path):
87
+ """GH #94: a leaf dir whose only child is __tests__ must still get its
88
+ OWN file/symbol names into the enrichment summary — not just the
89
+ useless 'Subdirectories: __tests__' that previously short-circuited it.
90
+ """
91
+ from codeindex.cli_scan import _build_enrich_summary
92
+ from codeindex.config import Config
93
+
94
+ controllers = tmp_path / "controllers"
95
+ controllers.mkdir()
96
+ (controllers / "user.py").write_text(
97
+ "class UserController:\n"
98
+ " def login(self):\n"
99
+ " pass\n"
100
+ " def logout(self):\n"
101
+ " pass\n"
102
+ )
103
+ tests_dir = controllers / "__tests__"
104
+ tests_dir.mkdir()
105
+ (tests_dir / "user_test.py").write_text("def test_login():\n pass\n")
106
+
107
+ config = Config(languages=["python"], include=["**/*"], exclude=[])
108
+ summary = _build_enrich_summary(controllers, [tests_dir], config)
109
+
110
+ # Own files/symbols present (the bug: these were entirely absent)
111
+ assert "user.py" in summary
112
+ assert "login" in summary
113
+ # Must NOT recurse into __tests__ (scan_directory recursive=False)
114
+ assert "test_login" not in summary
115
+
86
116
  def test_re_enrich_updates_description(self, tmp_path):
87
117
  """Running enrich twice should update, not duplicate."""
88
118
  readme = tmp_path / "README_AI.md"
File without changes
File without changes
File without changes
File without changes
File without changes