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.
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CHANGELOG.md +17 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/PKG-INFO +2 -2
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README.md +1 -1
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/ROADMAP.md +2 -2
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/pyproject.toml +1 -1
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/README_AI.md +10 -10
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_scan.py +53 -10
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/enricher.py +41 -3
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/README_AI.md +2 -2
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_enricher.py +54 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_enricher_integration.py +30 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.editorconfig +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/enhancement.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/epic.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/workflows/ci.yml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.github/workflows/publish.yml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.gitignore +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/.gitignore +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/design_philosophy.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/development_workflow.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/project_overview.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/release_automation.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/.serena/memories/suggested_commands.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CLAUDE.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CODE_OF_CONDUCT.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/CONTRIBUTING.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/FOR_LOOMGRAPH.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/LICENSE +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/Makefile +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/PROJECT_SYMBOLS.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/README_zh.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/SECURITY.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/.gitignore +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/Makefile +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/grade.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/questions.yaml.example +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/report.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/run_bench.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/bench/targets.yaml.example +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/001-use-tree-sitter-for-parsing.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/002-external-ai-cli-integration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/003-add-swift-objc-support.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/004-automatic-claude-md-update.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/005-navigation-disclaimer-and-readme-size-cap.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/006-distribution-architecture-split.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/document-aggregation.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/initial-design.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/kiss-universal-description.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/parallel-strategy.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design-philosophy.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/benchmark/2026-05-readme-impact.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/QUICK_START_RELEASE.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/claude-code-adoption-guide.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/claude-code-adoption-guide.zh.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/gitflow-workflow.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/github-issue-quick-reference.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/package-naming.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/pre-release-checklist.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/setup.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/team-workflow-guide.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/test-architecture.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/before-after/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/case-studies/php-payment-project.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/loomgraph-efficiency-comparison.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/advanced-usage.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/claude-code-integration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/configuration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/contributing.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/getting-started.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/git-hooks-integration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/json-output-integration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/guides/loomgraph-integration.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/planning/executive-summary.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.10.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.12.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.12.1.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.14.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.15.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.2.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.17.3.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.18.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.19.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.2.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.20.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.23.1.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.23.2.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.24.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.25.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.1.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.3.2.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.4.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.5.0-beta1.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.7.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.8.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/releases/RELEASE_NOTES_v0.9.0.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/CLAUDE.md.php-project +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/CLAUDE.md.template +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/ai-integration-guide.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/test_template_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/frameworks/template/yourframework_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_output.json +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_php_output.json +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_sample.php +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/loomgraph_sample.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/parse_integration_example.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/examples/print_env.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/templates/post-commit-update-logic.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/hooks/templates/post-commit-v4 +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/swift-objc-support-analysis.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/swift-poc-summary.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-codeindex-v2.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-codeindex.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-loomgraph-v2.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/tech-debt-loomgraph.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/reports/workflow-comparison.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/bump_version.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/check_docs_release.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/check_version_consistency.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/close-epic9-issues.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/diagnose_ai_failures.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/hooks/hook-common.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/hooks/pre-push +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/PROJECT_INDEX.json +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/legacy/hierarchical_strategy.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/pre_release_check.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/release.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/test_hook_e2e.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/scripts/validate_php_project.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/create.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/install.sh +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/src/mo-arch/SKILL.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/skills/src/mo-index/SKILL.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/adaptive_config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/adaptive_selector.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/ai_helper.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/claude_md.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_claude_md.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_common.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_config_commands.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_docs.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_hooks.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_parse.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/cli_tech_debt.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/config_help.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/directory_tree.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/docstring_processor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/doctor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/errors.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/spring.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/extractors/thinkphp.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/file_classifier.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/framework_detect.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/hierarchical.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/hooks.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/incremental.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/init_wizard.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/invoker.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/objc_association.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parallel.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parser.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/base.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/java_parser.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/objc/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/php/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/python/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/swift/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/imports.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/typescript/symbols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/parsers/utils.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/route_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/route_registry.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/scanner.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/semantic_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/skill_helpers.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/smart_writer.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/symbol_index.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/symbol_scorer.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/tech_debt.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/tech_debt_formatters.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/templates/claude_md_core.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/test_smells.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writer.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/core.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/detailed_generator.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/navigation_generator.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/overview_generator.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/src/codeindex/writers/utils.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/generator.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/analyze_legacy_tests.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/compare_coverage.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/scripts/compare_test_results.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/java.yaml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/php.yaml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/specs/python.yaml +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/test_generator/templates/inheritance_test.py.j2 +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/conftest.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_spring.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_thinkphp.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/extractors/test_thinkphp_description.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/cli_scan_defaults.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/help_system.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/init_wizard.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/symbol_overload_detection.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/tech_debt_detection.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/features/tech_debt_reporting.feature +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Controller.php +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Service.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/Simple.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/broken.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/complete.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/service.ts +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/simple.php +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/simple.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/cli_parse/unsupported.txt +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/enum.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/generics.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/imports.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/interface.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/record.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/sealed_class.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/simple_class.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/Application.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/User.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserController.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserRepository.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring/UserService.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/java/spring_controller.java +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/app.js +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/component.tsx +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/fixtures/typescript/service.ts +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/README.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/file1.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2a/file2.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2a/level3/file4.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchical_test/level1/level2b/file3.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/legacy/test_hierarchy_simple.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_adaptive_config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_adaptive_selector.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_ai_helper.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_backward_compatibility.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_call_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_claude_md.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_claude_md_injection.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_config_gitignore.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_debt_scan.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_docstring_options.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_hooks.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_json.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_parse.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_scan_defaults_bdd.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_cli_tech_debt.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_config_adaptive.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_dataclass_structure.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_directory_tree.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_docstring_config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_docstring_processor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_doctor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_error_handling.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_file_classifier.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_help_system_bdd.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hook_post_commit.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks_config.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_hooks_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_init_minimal_scope.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_init_wizard_bdd.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_integration_swift_objc.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_annotations.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_edge_cases.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_error_recovery.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_generic_bounds.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_lambda.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_lombok.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_module.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_parser.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_spring.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_java_throws.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_json_output.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_lazy_loading.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_list_dirs_diagnostic.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_loomgraph_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_objc_association_utils.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parallel_scan.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_detection.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_association.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_basic.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_bridging.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_objc_categories.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_docstrings.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_extensions.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_generics.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_poc.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_properties.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_property_wrappers.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_protocols.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_parser_swift_signatures.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_comment_extraction.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_docstring_extraction.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_import_alias.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_php_loomgraph_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_project_index_semantic.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_calls.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_docstring_description.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_import_alias.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_python_inheritance.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_info.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_registry.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_table_description.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_route_table_display.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_scanall_auto_ai.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_scanner_passthrough.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_semantic_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_skill_helpers.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_adaptive.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_docstring.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_enriched.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_smart_writer_semantic.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_story_4_4_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_symbol_overload.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_symbol_scorer.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_bdd.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_detector.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_formatters.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_ios.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_java.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_tech_debt_reporter.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_test_smells.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_thinkphp_route_extractor.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_typescript_integration.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_typescript_parser.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_windows_path_optimization.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/test_writer_preserves_enrichment.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/README_AI.md +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/__init__.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/test_generators.py +0 -0
- {ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/tests/writers/test_utils.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
537
|
+
**Current Version**: v0.26.2
|
|
@@ -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-
|
|
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**:
|
|
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
|
|
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,
|
|
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
|
-
#
|
|
719
|
-
#
|
|
720
|
-
#
|
|
721
|
-
# (
|
|
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 =
|
|
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
|
|
192
|
-
"functional description of this
|
|
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
|
|
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-
|
|
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**:
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/001-use-tree-sitter-for-parsing.md
RENAMED
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/002-external-ai-cli-integration.md
RENAMED
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/003-add-swift-objc-support.md
RENAMED
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/adr/004-automatic-claude-md-update.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/document-aggregation.md
RENAMED
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/architecture/design/kiss-universal-description.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/claude-code-adoption-guide.zh.md
RENAMED
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/development/github-issue-quick-reference.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/case-studies/php-payment-project.md
RENAMED
|
File without changes
|
{ai_codeindex-0.26.1 → ai_codeindex-0.26.2}/docs/evaluation/loomgraph-efficiency-comparison.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|