agent-codinglanguage-mapper 1.1.1__tar.gz → 1.1.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 (233) hide show
  1. agent_codinglanguage_mapper-1.1.2/.github/workflows/ci.yml +445 -0
  2. agent_codinglanguage_mapper-1.1.2/MANIFEST.in +12 -0
  3. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/PKG-INFO +11 -9
  4. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/README.md +10 -8
  5. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/pyproject.toml +1 -1
  6. agent_codinglanguage_mapper-1.1.2/scripts/audit_language_matrix.py +584 -0
  7. agent_codinglanguage_mapper-1.1.2/scripts/benchmark_large_workspaces.py +352 -0
  8. agent_codinglanguage_mapper-1.1.2/scripts/build_github_performance_corpus.py +279 -0
  9. agent_codinglanguage_mapper-1.1.2/scripts/evaluate_external_corpora.py +456 -0
  10. agent_codinglanguage_mapper-1.1.2/scripts/generate_language_matrix.py +312 -0
  11. agent_codinglanguage_mapper-1.1.2/scripts/run_opencode_e2e.py +2229 -0
  12. agent_codinglanguage_mapper-1.1.2/scripts/run_openrouter_e2e.py +2358 -0
  13. agent_codinglanguage_mapper-1.1.2/src/agent_codinglanguage_mapper/_version.py +1 -0
  14. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi.py +51 -30
  15. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/preprocessor.py +55 -44
  16. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/tree_sitter.py +223 -116
  17. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/discovery.py +51 -32
  18. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/indexer.py +185 -91
  19. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/mapper.py +37 -10
  20. agent_codinglanguage_mapper-1.1.2/src/agent_codinglanguage_mapper/templates/opencode/agents/agent-codinglanguage-mapper.md +43 -0
  21. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/templates/opencode/plugins/codebase_map.ts +53 -1
  22. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/templates/skill/SKILL.md +6 -6
  23. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper.egg-info/PKG-INFO +11 -9
  24. agent_codinglanguage_mapper-1.1.2/src/agent_codinglanguage_mapper.egg-info/SOURCES.txt +227 -0
  25. agent_codinglanguage_mapper-1.1.2/tests/corpora.lock.json +188 -0
  26. agent_codinglanguage_mapper-1.1.2/tests/e2e/runtime.lock.json +38 -0
  27. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/cpp/golden.json +11 -0
  28. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/cpp/prompt.txt +1 -0
  29. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/cpp/workspace/src/cache.cpp +5 -0
  30. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/csharp/golden.json +11 -0
  31. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/csharp/prompt.txt +1 -0
  32. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/csharp/workspace/src/RateService.cs +10 -0
  33. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/delphi/golden.json +11 -0
  34. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/delphi/prompt.txt +1 -0
  35. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/delphi/workspace/src/InventoryService.pas +18 -0
  36. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/guidelines/golden.json +11 -0
  37. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/guidelines/prompt.txt +1 -0
  38. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/guidelines/workspace/.editorconfig +8 -0
  39. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/guidelines/workspace/src/sample.py +2 -0
  40. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/mixed-ffi/golden.json +16 -0
  41. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/mixed-ffi/prompt.txt +1 -0
  42. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/mixed-ffi/workspace/CMakeLists.txt +4 -0
  43. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/mixed-ffi/workspace/native/metrics.cpp +5 -0
  44. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/mixed-ffi/workspace/python/metrics_bridge.py +5 -0
  45. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/python/golden.json +11 -0
  46. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/python/prompt.txt +1 -0
  47. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/python/workspace/src/billing.py +5 -0
  48. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/rust/golden.json +11 -0
  49. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/rust/prompt.txt +1 -0
  50. agent_codinglanguage_mapper-1.1.2/tests/e2e/scenarios/rust/workspace/src/lib.rs +5 -0
  51. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/DeprecatedOnConst.pas +11 -0
  52. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/VariantRecordFieldAttributes.pas +17 -0
  53. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/alignedrecords.pas +26 -0
  54. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/constset.pas +21 -0
  55. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/deprecatedtype.pas +20 -0
  56. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/dottedtypes.pas +37 -0
  57. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/endtoken.pas +32 -0
  58. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/experimentals.pas +18 -0
  59. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/externalfunction.pas +9 -0
  60. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/finalizationinitializationexports.pas +53 -0
  61. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/forwardoverloaded.pas +19 -0
  62. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/forwardwithoutsemicolon.pas +20 -0
  63. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/genericconstraints.pas +26 -0
  64. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/genericinterfacemethoddelegation.pas +28 -0
  65. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/implementsgenerictype.pas +18 -0
  66. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/include file2.inc +1 -0
  67. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/includefile.inc +1 -0
  68. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/includefile.pas +17 -0
  69. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/managedrecords.pas +25 -0
  70. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/messagemethod.pas +13 -0
  71. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/multiline.pas +24 -0
  72. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/nonalignedrecords.pas +25 -0
  73. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/numbers.pas +20 -0
  74. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/pointerchars.pas +28 -0
  75. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/properties.pas +24 -0
  76. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/strictvisibility.pas +13 -0
  77. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/tryexcept.pas +54 -0
  78. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/umlauts.pas +0 -0
  79. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/legacy_snippets/whitespacearoundifdefcondition.pas +23 -0
  80. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/library_demo.dpr +20 -0
  81. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/package_demo.dpk +10 -0
  82. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/program_demo.dpr +11 -0
  83. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_advanced.pas +66 -0
  84. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_attributes.pas +25 -0
  85. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_basic.pas +17 -0
  86. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_consumer.pas +19 -0
  87. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_generics.pas +44 -0
  88. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_inheritance.pas +29 -0
  89. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_math.pas +14 -0
  90. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_properties.pas +45 -0
  91. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_sections.pas +19 -0
  92. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_statements.pas +52 -0
  93. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_types.pas +56 -0
  94. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_unresolved.pas +16 -0
  95. agent_codinglanguage_mapper-1.1.2/tests/fixtures/delphi/unit_with.pas +31 -0
  96. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/Legacy.csx +2 -0
  97. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/Modern.cs +6 -0
  98. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/legacy.hpp +1 -0
  99. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/legacy.py +4 -0
  100. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/legacy.rs +1 -0
  101. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/modern.cpp +6 -0
  102. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/modern.py +9 -0
  103. agent_codinglanguage_mapper-1.1.2/tests/fixtures/polyglot/modern.rs +6 -0
  104. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-03.cpp +6 -0
  105. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-11.cpp +6 -0
  106. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-14.cpp +6 -0
  107. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-17.cpp +6 -0
  108. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-20.cpp +6 -0
  109. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-23.cpp +9 -0
  110. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-98.cpp +6 -0
  111. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-gnu-stable.cpp +6 -0
  112. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/cpp/cpp-msvc-stable.cpp +6 -0
  113. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-1.cs +5 -0
  114. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-10.cs +5 -0
  115. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-11.cs +5 -0
  116. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-12.cs +5 -0
  117. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-13.cs +5 -0
  118. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-14.cs +5 -0
  119. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-2.cs +5 -0
  120. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-3.cs +5 -0
  121. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-4.cs +5 -0
  122. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-5.cs +5 -0
  123. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-6.cs +5 -0
  124. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-7.cs +5 -0
  125. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-8.cs +5 -0
  126. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/csharp/csharp-9.cs +5 -0
  127. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-10-2006.pas +13 -0
  128. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-11-2007.pas +13 -0
  129. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-12-2009.pas +13 -0
  130. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-13-2010.pas +13 -0
  131. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-14-xe-2011.pas +13 -0
  132. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-15-xe2-2012.pas +13 -0
  133. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-16-xe3-2013.pas +13 -0
  134. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-17-xe4-2013.pas +13 -0
  135. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-18-xe5-2013.pas +13 -0
  136. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-19-xe6-2014.pas +13 -0
  137. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-20-xe7-2014.pas +13 -0
  138. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-21-xe8-2015.pas +13 -0
  139. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-22-10-seattle-2015.pas +13 -0
  140. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-23-10-1-berlin-2016.pas +13 -0
  141. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-24-10-2-tokyo-2017.pas +13 -0
  142. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-25-10-3-rio-2018.pas +14 -0
  143. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-26-10-4-sydney-2020.pas +13 -0
  144. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-27-11-alexandria-2021.pas +13 -0
  145. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-28-12-athens-2023.pas +16 -0
  146. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-29-13-florence-2024.pas +13 -0
  147. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-7-7.pas +13 -0
  148. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-8-8.pas +13 -0
  149. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-9-2005.pas +13 -0
  150. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/delphi/delphi-directives.pas +16 -0
  151. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-2-7.py +14 -0
  152. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-0.py +13 -0
  153. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-1.py +13 -0
  154. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-10.py +15 -0
  155. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-11.py +15 -0
  156. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-12.py +14 -0
  157. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-13.py +14 -0
  158. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-14.py +13 -0
  159. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-2.py +13 -0
  160. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-3.py +13 -0
  161. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-4.py +14 -0
  162. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-5.py +13 -0
  163. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-6.py +13 -0
  164. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-7.py +14 -0
  165. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-8.py +13 -0
  166. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/python/python-3-9.py +13 -0
  167. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/rust/rust-2015.rs +8 -0
  168. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/rust/rust-2018.rs +7 -0
  169. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/rust/rust-2021.rs +7 -0
  170. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/fixtures/rust/rust-2024.rs +8 -0
  171. agent_codinglanguage_mapper-1.1.2/tests/language_matrix/matrix.json +1548 -0
  172. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_adapters.py +244 -0
  173. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_delphi_adapter.py +128 -1
  174. agent_codinglanguage_mapper-1.1.2/tests/test_github_performance_corpus.py +204 -0
  175. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_indexer.py +127 -1
  176. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_integration_install.py +61 -3
  177. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_language_matrix.py +6 -1
  178. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_mapper_details.py +96 -6
  179. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_opencode_e2e_harness.py +138 -15
  180. agent_codinglanguage_mapper-1.1.2/tests/test_openrouter_e2e_harness.py +4465 -0
  181. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_package_contract.py +39 -2
  182. agent_codinglanguage_mapper-1.1.2/tests/test_performance_harness.py +155 -0
  183. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_workspace.py +40 -0
  184. agent_codinglanguage_mapper-1.1.1/src/agent_codinglanguage_mapper/_version.py +0 -1
  185. agent_codinglanguage_mapper-1.1.1/src/agent_codinglanguage_mapper/templates/opencode/agents/agent-codinglanguage-mapper.md +0 -16
  186. agent_codinglanguage_mapper-1.1.1/src/agent_codinglanguage_mapper.egg-info/SOURCES.txt +0 -69
  187. agent_codinglanguage_mapper-1.1.1/tests/test_performance_harness.py +0 -61
  188. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/LICENSE +0 -0
  189. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/setup.cfg +0 -0
  190. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/__init__.py +0 -0
  191. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/__main__.py +0 -0
  192. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/__init__.py +0 -0
  193. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/__init__.py +0 -0
  194. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/comment_builder.py +0 -0
  195. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/consts.py +0 -0
  196. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/grammar.py +0 -0
  197. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lark_builder.py +0 -0
  198. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lark_tokens.py +0 -0
  199. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lsp_server.py +0 -0
  200. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/nodes.py +0 -0
  201. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/parser.py +0 -0
  202. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/project_discovery.py +0 -0
  203. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/project_indexer.py +0 -0
  204. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/semantic.py +0 -0
  205. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/semantic_builder.py +0 -0
  206. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/source_reader.py +0 -0
  207. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/workspace.py +0 -0
  208. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/cli.py +0 -0
  209. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/formatting.py +0 -0
  210. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/guidelines.py +0 -0
  211. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/integration.py +0 -0
  212. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/lsp_server.py +0 -0
  213. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/lsp_service.py +0 -0
  214. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/models.py +0 -0
  215. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/protocol.py +0 -0
  216. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/rendering.py +0 -0
  217. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/worker.py +0 -0
  218. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper/workspace.py +0 -0
  219. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper.egg-info/dependency_links.txt +0 -0
  220. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper.egg-info/entry_points.txt +0 -0
  221. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper.egg-info/requires.txt +0 -0
  222. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/src/agent_codinglanguage_mapper.egg-info/top_level.txt +0 -0
  223. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_cli.py +0 -0
  224. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_discovery.py +0 -0
  225. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_ffi.py +0 -0
  226. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_guideline_formatting.py +0 -0
  227. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_guidelines.py +0 -0
  228. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_large_files.py +0 -0
  229. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_lsp_server.py +0 -0
  230. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_lsp_service.py +0 -0
  231. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_protocol.py +0 -0
  232. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_rendering.py +0 -0
  233. {agent_codinglanguage_mapper-1.1.1 → agent_codinglanguage_mapper-1.1.2}/tests/test_worker.py +0 -0
@@ -0,0 +1,445 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ env:
12
+ PIP_DISABLE_PIP_VERSION_CHECK: "1"
13
+ PYTHONUTF8: "1"
14
+
15
+ jobs:
16
+ build:
17
+ name: Build release artifacts
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 15
20
+
21
+ steps:
22
+ - name: Check out source
23
+ uses: actions/checkout@v7
24
+
25
+ - name: Set up Python 3.12
26
+ uses: actions/setup-python@v6
27
+ with:
28
+ python-version: "3.12"
29
+
30
+ - name: Install build tooling
31
+ run: python -m pip install "build>=1.2" "twine>=5"
32
+
33
+ - name: Build wheel and source distribution once
34
+ run: python -m build
35
+
36
+ - name: Validate distribution metadata
37
+ run: python -m twine check dist/*
38
+
39
+ - name: Validate package contents and write checksums
40
+ shell: bash
41
+ run: |
42
+ python - <<'PY'
43
+ from email.parser import BytesParser
44
+ import hashlib
45
+ from pathlib import Path
46
+ import tarfile
47
+ import zipfile
48
+
49
+ dist = Path("dist")
50
+ wheels = sorted(dist.glob("*.whl"))
51
+ sdists = sorted(dist.glob("*.tar.gz"))
52
+ assert len(wheels) == 1, f"expected one wheel, found {wheels}"
53
+ assert len(sdists) == 1, f"expected one sdist, found {sdists}"
54
+
55
+ expected_templates = {
56
+ "agent_codinglanguage_mapper/templates/skill/SKILL.md",
57
+ "agent_codinglanguage_mapper/templates/opencode/plugins/codebase_map.ts",
58
+ }
59
+ forbidden = ("python-delphi-lsp", "python_delphi_lsp", "delphi_lsp")
60
+
61
+ with zipfile.ZipFile(wheels[0]) as archive:
62
+ names = set(archive.namelist())
63
+ metadata_name = next(name for name in names if name.endswith(".dist-info/METADATA"))
64
+ metadata = BytesParser().parsebytes(archive.read(metadata_name))
65
+ assert metadata["Name"] == "agent-codinglanguage-mapper"
66
+ assert metadata["Version"] == "1.1.2"
67
+ assert metadata["Author"] == "Dark Light"
68
+ requirements = [value.lower() for value in metadata.get_all("Requires-Dist", [])]
69
+ assert not any(marker in value for marker in forbidden for value in requirements)
70
+ assert expected_templates <= names
71
+ assert all(archive.getinfo(name).file_size > 0 for name in expected_templates)
72
+ assert not any(marker in name.lower() for marker in forbidden for name in names)
73
+ for name in names:
74
+ if name.endswith(".py"):
75
+ source = archive.read(name).lower()
76
+ assert not any(marker.encode() in source for marker in forbidden), name
77
+
78
+ with tarfile.open(sdists[0], "r:gz") as archive:
79
+ members = [member for member in archive.getmembers() if member.isfile()]
80
+ names = {member.name for member in members}
81
+ pkg_info_name = next(name for name in names if name.count("/") == 1 and name.endswith("/PKG-INFO"))
82
+ pkg_info_stream = archive.extractfile(pkg_info_name)
83
+ assert pkg_info_stream is not None
84
+ metadata = BytesParser().parsebytes(pkg_info_stream.read())
85
+ assert metadata["Name"] == "agent-codinglanguage-mapper"
86
+ assert metadata["Version"] == "1.1.2"
87
+ assert metadata["Author"] == "Dark Light"
88
+ requirements = [value.lower() for value in metadata.get_all("Requires-Dist", [])]
89
+ assert not any(marker in value for marker in forbidden for value in requirements)
90
+ for template in expected_templates:
91
+ matches = [name for name in names if name.endswith(f"/{template}")]
92
+ assert len(matches) == 1, f"missing or duplicate sdist template: {template}"
93
+ member = archive.getmember(matches[0])
94
+ assert member.size > 0
95
+ assert not any(marker in name.lower() for marker in forbidden for name in names)
96
+
97
+ checksum_lines = []
98
+ for artifact in [*wheels, *sdists]:
99
+ digest = hashlib.sha256(artifact.read_bytes()).hexdigest()
100
+ checksum_lines.append(f"{digest} {artifact.name}")
101
+ (dist / "SHA256SUMS").write_text("\n".join(checksum_lines) + "\n", encoding="ascii")
102
+ PY
103
+
104
+ - name: Upload exact distribution artifacts
105
+ uses: actions/upload-artifact@v7
106
+ with:
107
+ name: python-distributions
108
+ path: |
109
+ dist/*.whl
110
+ dist/*.tar.gz
111
+ dist/SHA256SUMS
112
+ if-no-files-found: error
113
+ retention-days: 14
114
+
115
+ wheel-tests:
116
+ name: Wheel tests (${{ matrix.os }}, Python ${{ matrix.python-version }})
117
+ needs: build
118
+ runs-on: ${{ matrix.os }}
119
+ timeout-minutes: 25
120
+ strategy:
121
+ fail-fast: false
122
+ matrix:
123
+ os:
124
+ - ubuntu-latest
125
+ - macos-latest
126
+ - windows-latest
127
+ python-version:
128
+ - "3.10"
129
+ - "3.11"
130
+ - "3.12"
131
+ - "3.13"
132
+ - "3.14"
133
+
134
+ steps:
135
+ - name: Check out tests
136
+ uses: actions/checkout@v7
137
+
138
+ - name: Set up Python ${{ matrix.python-version }}
139
+ uses: actions/setup-python@v6
140
+ with:
141
+ python-version: ${{ matrix.python-version }}
142
+
143
+ - name: Download exact distribution artifacts
144
+ uses: actions/download-artifact@v8
145
+ with:
146
+ name: python-distributions
147
+ path: dist
148
+
149
+ - name: Verify artifact checksums
150
+ shell: bash
151
+ run: |
152
+ python - <<'PY'
153
+ import hashlib
154
+ from pathlib import Path
155
+
156
+ dist = Path("dist")
157
+ expected = {}
158
+ for line in (dist / "SHA256SUMS").read_text(encoding="ascii").splitlines():
159
+ digest, filename = line.split(maxsplit=1)
160
+ expected[filename] = digest
161
+ artifacts = sorted([*dist.glob("*.whl"), *dist.glob("*.tar.gz")])
162
+ assert len(artifacts) == 2
163
+ assert set(expected) == {artifact.name for artifact in artifacts}
164
+ for artifact in artifacts:
165
+ actual = hashlib.sha256(artifact.read_bytes()).hexdigest()
166
+ assert actual == expected[artifact.name], artifact.name
167
+ PY
168
+
169
+ - name: Install exact wheel and test tooling
170
+ shell: bash
171
+ run: |
172
+ python -m pip install --upgrade pip
173
+ python -m pip install dist/*.whl
174
+ python -m pip install "pytest>=8" "pytest-cov>=5" "tomli>=2; python_version < '3.11'"
175
+
176
+ - name: Verify imports use the installed wheel
177
+ shell: bash
178
+ env:
179
+ HF_DATASETS_OFFLINE: "1"
180
+ HF_HUB_OFFLINE: "1"
181
+ PIP_NO_INDEX: "1"
182
+ TRANSFORMERS_OFFLINE: "1"
183
+ UV_OFFLINE: "1"
184
+ run: |
185
+ python - <<'PY'
186
+ from pathlib import Path
187
+ import agent_codinglanguage_mapper
188
+
189
+ imported = Path(agent_codinglanguage_mapper.__file__).resolve()
190
+ source = (Path.cwd() / "src").resolve()
191
+ assert source not in imported.parents, f"source-tree import detected: {imported}"
192
+ assert agent_codinglanguage_mapper.__version__ == "1.1.2"
193
+ PY
194
+
195
+ - name: Run offline package test gates
196
+ shell: bash
197
+ env:
198
+ HF_DATASETS_OFFLINE: "1"
199
+ HF_HUB_OFFLINE: "1"
200
+ OPENCODE_DISABLE_AUTOUPDATE: "1"
201
+ PIP_NO_INDEX: "1"
202
+ TRANSFORMERS_OFFLINE: "1"
203
+ UV_OFFLINE: "1"
204
+ run: |
205
+ python -m pytest -q -o pythonpath= \
206
+ tests/test_adapters.py \
207
+ tests/test_cli.py \
208
+ tests/test_delphi_adapter.py \
209
+ tests/test_discovery.py \
210
+ tests/test_ffi.py \
211
+ tests/test_guideline_formatting.py \
212
+ tests/test_guidelines.py \
213
+ tests/test_indexer.py \
214
+ tests/test_integration_install.py \
215
+ tests/test_language_matrix.py \
216
+ tests/test_lsp_server.py \
217
+ tests/test_lsp_service.py \
218
+ tests/test_mapper_details.py \
219
+ tests/test_openrouter_e2e_harness.py \
220
+ tests/test_package_contract.py \
221
+ tests/test_protocol.py \
222
+ tests/test_rendering.py \
223
+ tests/test_worker.py \
224
+ tests/test_workspace.py
225
+
226
+ sdist-tests:
227
+ name: Source distribution tests (Ubuntu, Python 3.12)
228
+ needs: build
229
+ runs-on: ubuntu-latest
230
+ timeout-minutes: 25
231
+
232
+ steps:
233
+ - name: Check out tests
234
+ uses: actions/checkout@v7
235
+
236
+ - name: Set up Python 3.12
237
+ uses: actions/setup-python@v6
238
+ with:
239
+ python-version: "3.12"
240
+
241
+ - name: Download exact distribution artifacts
242
+ uses: actions/download-artifact@v8
243
+ with:
244
+ name: python-distributions
245
+ path: dist
246
+
247
+ - name: Verify artifact checksums and read sdist dependencies
248
+ shell: bash
249
+ run: |
250
+ python - <<'PY'
251
+ from email.parser import BytesParser
252
+ import hashlib
253
+ from pathlib import Path
254
+ import tarfile
255
+
256
+ dist = Path("dist")
257
+ expected = {}
258
+ for line in (dist / "SHA256SUMS").read_text(encoding="ascii").splitlines():
259
+ digest, filename = line.split(maxsplit=1)
260
+ expected[filename] = digest
261
+ artifacts = sorted([*dist.glob("*.whl"), *dist.glob("*.tar.gz")])
262
+ assert len(artifacts) == 2
263
+ assert set(expected) == {artifact.name for artifact in artifacts}
264
+ for artifact in artifacts:
265
+ actual = hashlib.sha256(artifact.read_bytes()).hexdigest()
266
+ assert actual == expected[artifact.name], artifact.name
267
+
268
+ sdists = sorted(dist.glob("*.tar.gz"))
269
+ assert len(sdists) == 1, f"expected one sdist, found {sdists}"
270
+ with tarfile.open(sdists[0], "r:gz") as archive:
271
+ pkg_info = next(
272
+ member
273
+ for member in archive.getmembers()
274
+ if member.isfile() and member.name.count("/") == 1 and member.name.endswith("/PKG-INFO")
275
+ )
276
+ stream = archive.extractfile(pkg_info)
277
+ assert stream is not None
278
+ metadata = BytesParser().parsebytes(stream.read())
279
+ requirements = metadata.get_all("Requires-Dist", [])
280
+ Path("sdist-runtime-requirements.txt").write_text(
281
+ "\n".join(requirements) + "\n",
282
+ encoding="utf-8",
283
+ )
284
+ PY
285
+
286
+ - name: Install sdist dependencies and test tooling
287
+ run: |
288
+ python -m pip install --upgrade pip
289
+ python -m pip install "setuptools>=77" wheel
290
+ python -m pip install -r sdist-runtime-requirements.txt
291
+ python -m pip install "pytest>=8" "pytest-cov>=5" "tomli>=2; python_version < '3.11'"
292
+
293
+ - name: Install the exact source distribution offline
294
+ env:
295
+ HF_DATASETS_OFFLINE: "1"
296
+ HF_HUB_OFFLINE: "1"
297
+ PIP_NO_INDEX: "1"
298
+ TRANSFORMERS_OFFLINE: "1"
299
+ UV_OFFLINE: "1"
300
+ run: python -m pip install --no-build-isolation --no-cache-dir --no-deps dist/*.tar.gz
301
+
302
+ - name: Verify imports use the installed source distribution
303
+ shell: bash
304
+ env:
305
+ HF_DATASETS_OFFLINE: "1"
306
+ HF_HUB_OFFLINE: "1"
307
+ PIP_NO_INDEX: "1"
308
+ TRANSFORMERS_OFFLINE: "1"
309
+ UV_OFFLINE: "1"
310
+ run: |
311
+ python - <<'PY'
312
+ import hashlib
313
+ from importlib.metadata import distribution
314
+ import json
315
+ from pathlib import Path
316
+ from urllib.parse import unquote, urlparse
317
+ import agent_codinglanguage_mapper
318
+
319
+ imported = Path(agent_codinglanguage_mapper.__file__).resolve()
320
+ source = (Path.cwd() / "src").resolve()
321
+ assert source not in imported.parents, f"source-tree import detected: {imported}"
322
+ assert agent_codinglanguage_mapper.__version__ == "1.1.2"
323
+
324
+ sdists = sorted(Path("dist").glob("*.tar.gz"))
325
+ assert len(sdists) == 1, f"expected one sdist, found {sdists}"
326
+ installed = distribution("agent-codinglanguage-mapper")
327
+ direct_url_text = installed.read_text("direct_url.json")
328
+ assert direct_url_text is not None, "pip did not record the installed archive"
329
+ direct_url = json.loads(direct_url_text)
330
+ installed_archive = Path(unquote(urlparse(direct_url["url"]).path)).name
331
+ assert installed_archive == sdists[0].name
332
+ expected_hash = hashlib.sha256(sdists[0].read_bytes()).hexdigest()
333
+ assert direct_url["archive_info"]["hash"] == f"sha256={expected_hash}"
334
+ PY
335
+
336
+ - name: Run offline source distribution test gates
337
+ shell: bash
338
+ env:
339
+ HF_DATASETS_OFFLINE: "1"
340
+ HF_HUB_OFFLINE: "1"
341
+ OPENCODE_DISABLE_AUTOUPDATE: "1"
342
+ PIP_NO_INDEX: "1"
343
+ TRANSFORMERS_OFFLINE: "1"
344
+ UV_OFFLINE: "1"
345
+ run: |
346
+ python -m pytest -q -o pythonpath= \
347
+ tests/test_adapters.py \
348
+ tests/test_cli.py \
349
+ tests/test_delphi_adapter.py \
350
+ tests/test_discovery.py \
351
+ tests/test_ffi.py \
352
+ tests/test_guideline_formatting.py \
353
+ tests/test_guidelines.py \
354
+ tests/test_indexer.py \
355
+ tests/test_integration_install.py \
356
+ tests/test_language_matrix.py \
357
+ tests/test_lsp_server.py \
358
+ tests/test_lsp_service.py \
359
+ tests/test_mapper_details.py \
360
+ tests/test_openrouter_e2e_harness.py \
361
+ tests/test_package_contract.py \
362
+ tests/test_protocol.py \
363
+ tests/test_rendering.py \
364
+ tests/test_worker.py \
365
+ tests/test_workspace.py
366
+
367
+ quality:
368
+ name: Static, audit, and performance gates
369
+ needs: build
370
+ runs-on: ubuntu-latest
371
+ timeout-minutes: 30
372
+
373
+ steps:
374
+ - name: Check out source
375
+ uses: actions/checkout@v7
376
+
377
+ - name: Set up Python 3.12
378
+ uses: actions/setup-python@v6
379
+ with:
380
+ python-version: "3.12"
381
+
382
+ - name: Download exact distribution artifacts
383
+ uses: actions/download-artifact@v8
384
+ with:
385
+ name: python-distributions
386
+ path: dist
387
+
388
+ - name: Install exact wheel and quality tooling
389
+ run: |
390
+ python -m pip install --upgrade pip
391
+ python -m pip install dist/*.whl
392
+ python -m pip install "mypy==1.19.1" "pytest>=8" "ruff>=0.6" "tomli>=2"
393
+
394
+ - name: Run Ruff
395
+ run: python -m ruff check src tests scripts
396
+
397
+ - name: Run strict mypy
398
+ run: python -m mypy src scripts
399
+
400
+ - name: Audit the formal language matrix offline
401
+ env:
402
+ HF_DATASETS_OFFLINE: "1"
403
+ HF_HUB_OFFLINE: "1"
404
+ PIP_NO_INDEX: "1"
405
+ TRANSFORMERS_OFFLINE: "1"
406
+ UV_OFFLINE: "1"
407
+ run: python scripts/audit_language_matrix.py
408
+
409
+ - name: Run source-only harness tests offline
410
+ env:
411
+ HF_DATASETS_OFFLINE: "1"
412
+ HF_HUB_OFFLINE: "1"
413
+ OPENCODE_DISABLE_AUTOUPDATE: "1"
414
+ PIP_NO_INDEX: "1"
415
+ TRANSFORMERS_OFFLINE: "1"
416
+ UV_OFFLINE: "1"
417
+ run: |
418
+ python -m pytest -q -o pythonpath= \
419
+ tests/test_large_files.py \
420
+ tests/test_opencode_e2e_harness.py \
421
+ tests/test_openrouter_e2e_harness.py \
422
+ tests/test_performance_harness.py
423
+
424
+ - name: Enforce large-workspace performance budgets
425
+ env:
426
+ HF_DATASETS_OFFLINE: "1"
427
+ HF_HUB_OFFLINE: "1"
428
+ PIP_NO_INDEX: "1"
429
+ TRANSFORMERS_OFFLINE: "1"
430
+ UV_OFFLINE: "1"
431
+ run: |
432
+ python scripts/benchmark_large_workspaces.py \
433
+ --lines 100000 \
434
+ --samples 5 \
435
+ --report-only \
436
+ --output ci-artifacts/large-workspace-benchmark.json
437
+
438
+ - name: Upload benchmark report
439
+ if: always()
440
+ uses: actions/upload-artifact@v7
441
+ with:
442
+ name: large-workspace-benchmark
443
+ path: ci-artifacts/large-workspace-benchmark.json
444
+ if-no-files-found: warn
445
+ retention-days: 14
@@ -0,0 +1,12 @@
1
+ include .github/workflows/ci.yml
2
+ include scripts/audit_language_matrix.py
3
+ include scripts/benchmark_large_workspaces.py
4
+ include scripts/build_github_performance_corpus.py
5
+ include scripts/evaluate_external_corpora.py
6
+ include scripts/generate_language_matrix.py
7
+ include scripts/run_opencode_e2e.py
8
+ include scripts/run_openrouter_e2e.py
9
+ include tests/corpora.lock.json
10
+ recursive-include tests/e2e *.cpp *.cs *.json *.pas *.py *.rs *.txt .editorconfig CMakeLists.txt
11
+ recursive-include tests/fixtures *.cpp *.cs *.csx *.dpk *.dpr *.hpp *.inc *.pas *.py *.rs
12
+ recursive-include tests/language_matrix *.cpp *.cs *.json *.pas *.py *.rs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-codinglanguage-mapper
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: Agent-focused semantic mapping and language services for mixed-language codebases.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -333,7 +333,9 @@ This creates:
333
333
  .opencode/plugins/codebase_map.ts
334
334
  ```
335
335
 
336
- The generated `agent-codinglanguage-mapper` agent denies all tools by default and permits only its package-named skill, `codebase_map`, and `code_guidelines`. The plugin maps the active OpenCode directory, serializes Protocol 3 requests through one worker, applies a hard timeout, reports bounded worker `stderr`, restarts after failure, and preserves focus plus warm parser indexes across short idle gaps. It stops the worker when the session is deleted or after 60 seconds without another mapper request.
336
+ The generated `agent-codinglanguage-mapper` agent denies all tools by default and permits only its package-named skill, the legacy `codebase_map` tool, `code_guidelines`, three fixed phase tools (`codebase_map_open`, `codebase_map_focus`, and `codebase_map_inspect_declaration`), and five fixed-language find tools: `codebase_map_find_python`, `codebase_map_find_rust`, `codebase_map_find_csharp`, `codebase_map_find_delphi`, and `codebase_map_find_cpp`. Each fixed-language tool requires `query`, accepts the optional `project_id`, `file_id`, `cursor`, `max_items`, and `max_chars` bounds, and injects its own Protocol 3 `find` action and language. It defaults to at most 5 results and 4,000 characters, while callers can explicitly raise either bound when needed. The fixed open, focus, and declaration-inspect tools likewise inject their Protocol 3 action and inspect detail. These smaller schemas prevent a model from corrupting or omitting required phase fields and keep follow-up model context bounded.
337
+
338
+ All mapper tools share the same persistent worker. The plugin maps the active OpenCode directory, serializes Protocol 3 requests, applies a hard timeout, reports bounded worker `stderr`, restarts after failure, and preserves focus plus warm parser indexes across short idle gaps. It stops the worker when the session is deleted or after 60 seconds without another mapper request.
337
339
 
338
340
  The installer never reads or changes `opencode.json`; user configuration remains
339
341
  user-owned. The deprecated `--write`, `--write-config`, and `--write-agent`
@@ -350,16 +352,16 @@ Run it with:
350
352
  ```bash
351
353
  opencode run \
352
354
  --agent agent-codinglanguage-mapper \
353
- "Find PaymentService, inspect its implementation, and cite the callers. Use only the installed skill and codebase_map."
355
+ "Find the C# PaymentService and cite its declaration. Use the installed skill and the fixed open, C# find, focus, and declaration-inspect tools."
354
356
  ```
355
357
 
356
358
  A typical investigation should:
357
359
 
358
- 1. Call `codebase_map` with `action: open`.
359
- 2. Use `find` with the narrowest useful language/project/file filters.
360
- 3. Select a returned `target_id` with `focus`.
361
- 4. Request only the required `inspect` detail.
362
- 5. Use `trace` only for explicit Protocol 3 relations.
360
+ 1. Call `codebase_map_open`.
361
+ 2. When one language is known, call its `codebase_map_find_<language>` tool with a narrow `query` and optional project/file filters. Use legacy `codebase_map` with `action: find` for mixed-language searches.
362
+ 3. Select a returned `target_id` with `codebase_map_focus`.
363
+ 4. Call `codebase_map_inspect_declaration` without arguments for the focused declaration. Use legacy `codebase_map` only when another inspect detail is required.
364
+ 5. Use legacy `codebase_map` with `trace` only for explicit Protocol 3 relations.
363
365
  6. Follow `next_cursor` when evidence is truncated.
364
366
 
365
367
  A formatting task should first call `code_guidelines` with `detect`, then `audit`, then `patch`. The agent can either improve source-aware findings itself or apply the package plan with `action: apply` and `write: true`. It must finish with another `audit`; it must never use `apply` merely to discover what would change.
@@ -387,7 +389,7 @@ Private Linux CI records and uploads the same measurements with `--report-only`;
387
389
 
388
390
  ## Offline Ornith/OpenCode Evaluation
389
391
 
390
- The repository contains seven release E2Es: Python, Rust, C#, Delphi, C++, a mixed-language FFI workspace, and a coding-guidelines write workflow. They use the pinned local Ornith revision through vLLM 0.23.0 and OpenCode 1.17.18. The guidelines scenario must detect and audit the profile, inspect a patch, explicitly apply it with `write: true`, and finish with a clean audit. The Python scenario continues the same session through a headless OpenCode server and must inspect the focused symbol in a second turn without another `find` or explicit `target_id`, proving that the plugin preserves its warm worker. It then opens an independent session whose target-less `inspect` must be empty, proving that focus never crosses chat boundaries. The harness fails if a model shard is missing, a download is attempted, an unapproved tool is called, any assistant message uses a different agent, model, or provider, a worker survives server shutdown, or required evidence is absent.
392
+ The repository contains seven release E2Es: Python, Rust, C#, Delphi, C++, a mixed-language FFI workspace, and a coding-guidelines write workflow. They use the pinned local Ornith revision through vLLM 0.23.0 and OpenCode 1.17.18. The guidelines scenario must detect and audit the profile, inspect a patch, explicitly apply it with `write: true`, and finish with a clean audit. The Python scenario continues the same session through a headless OpenCode server and must inspect the focused symbol in a second turn without another `find` or explicit `target_id`, proving that the plugin preserves its warm worker. It then opens an independent session whose target-less `inspect` must be empty, proving that focus never crosses chat boundaries. The harness preflights the exact legacy-plus-fixed tool surface and accepts semantic evidence produced by either a fixed-language find tool or the legacy mapper. It fails if a model shard is missing, a download is attempted, an unapproved tool is called, any assistant message uses a different agent, model, or provider, a worker survives server shutdown, or required evidence is absent.
391
393
 
392
394
  Inspect the plan without launching a model:
393
395
 
@@ -286,7 +286,9 @@ This creates:
286
286
  .opencode/plugins/codebase_map.ts
287
287
  ```
288
288
 
289
- The generated `agent-codinglanguage-mapper` agent denies all tools by default and permits only its package-named skill, `codebase_map`, and `code_guidelines`. The plugin maps the active OpenCode directory, serializes Protocol 3 requests through one worker, applies a hard timeout, reports bounded worker `stderr`, restarts after failure, and preserves focus plus warm parser indexes across short idle gaps. It stops the worker when the session is deleted or after 60 seconds without another mapper request.
289
+ The generated `agent-codinglanguage-mapper` agent denies all tools by default and permits only its package-named skill, the legacy `codebase_map` tool, `code_guidelines`, three fixed phase tools (`codebase_map_open`, `codebase_map_focus`, and `codebase_map_inspect_declaration`), and five fixed-language find tools: `codebase_map_find_python`, `codebase_map_find_rust`, `codebase_map_find_csharp`, `codebase_map_find_delphi`, and `codebase_map_find_cpp`. Each fixed-language tool requires `query`, accepts the optional `project_id`, `file_id`, `cursor`, `max_items`, and `max_chars` bounds, and injects its own Protocol 3 `find` action and language. It defaults to at most 5 results and 4,000 characters, while callers can explicitly raise either bound when needed. The fixed open, focus, and declaration-inspect tools likewise inject their Protocol 3 action and inspect detail. These smaller schemas prevent a model from corrupting or omitting required phase fields and keep follow-up model context bounded.
290
+
291
+ All mapper tools share the same persistent worker. The plugin maps the active OpenCode directory, serializes Protocol 3 requests, applies a hard timeout, reports bounded worker `stderr`, restarts after failure, and preserves focus plus warm parser indexes across short idle gaps. It stops the worker when the session is deleted or after 60 seconds without another mapper request.
290
292
 
291
293
  The installer never reads or changes `opencode.json`; user configuration remains
292
294
  user-owned. The deprecated `--write`, `--write-config`, and `--write-agent`
@@ -303,16 +305,16 @@ Run it with:
303
305
  ```bash
304
306
  opencode run \
305
307
  --agent agent-codinglanguage-mapper \
306
- "Find PaymentService, inspect its implementation, and cite the callers. Use only the installed skill and codebase_map."
308
+ "Find the C# PaymentService and cite its declaration. Use the installed skill and the fixed open, C# find, focus, and declaration-inspect tools."
307
309
  ```
308
310
 
309
311
  A typical investigation should:
310
312
 
311
- 1. Call `codebase_map` with `action: open`.
312
- 2. Use `find` with the narrowest useful language/project/file filters.
313
- 3. Select a returned `target_id` with `focus`.
314
- 4. Request only the required `inspect` detail.
315
- 5. Use `trace` only for explicit Protocol 3 relations.
313
+ 1. Call `codebase_map_open`.
314
+ 2. When one language is known, call its `codebase_map_find_<language>` tool with a narrow `query` and optional project/file filters. Use legacy `codebase_map` with `action: find` for mixed-language searches.
315
+ 3. Select a returned `target_id` with `codebase_map_focus`.
316
+ 4. Call `codebase_map_inspect_declaration` without arguments for the focused declaration. Use legacy `codebase_map` only when another inspect detail is required.
317
+ 5. Use legacy `codebase_map` with `trace` only for explicit Protocol 3 relations.
316
318
  6. Follow `next_cursor` when evidence is truncated.
317
319
 
318
320
  A formatting task should first call `code_guidelines` with `detect`, then `audit`, then `patch`. The agent can either improve source-aware findings itself or apply the package plan with `action: apply` and `write: true`. It must finish with another `audit`; it must never use `apply` merely to discover what would change.
@@ -340,7 +342,7 @@ Private Linux CI records and uploads the same measurements with `--report-only`;
340
342
 
341
343
  ## Offline Ornith/OpenCode Evaluation
342
344
 
343
- The repository contains seven release E2Es: Python, Rust, C#, Delphi, C++, a mixed-language FFI workspace, and a coding-guidelines write workflow. They use the pinned local Ornith revision through vLLM 0.23.0 and OpenCode 1.17.18. The guidelines scenario must detect and audit the profile, inspect a patch, explicitly apply it with `write: true`, and finish with a clean audit. The Python scenario continues the same session through a headless OpenCode server and must inspect the focused symbol in a second turn without another `find` or explicit `target_id`, proving that the plugin preserves its warm worker. It then opens an independent session whose target-less `inspect` must be empty, proving that focus never crosses chat boundaries. The harness fails if a model shard is missing, a download is attempted, an unapproved tool is called, any assistant message uses a different agent, model, or provider, a worker survives server shutdown, or required evidence is absent.
345
+ The repository contains seven release E2Es: Python, Rust, C#, Delphi, C++, a mixed-language FFI workspace, and a coding-guidelines write workflow. They use the pinned local Ornith revision through vLLM 0.23.0 and OpenCode 1.17.18. The guidelines scenario must detect and audit the profile, inspect a patch, explicitly apply it with `write: true`, and finish with a clean audit. The Python scenario continues the same session through a headless OpenCode server and must inspect the focused symbol in a second turn without another `find` or explicit `target_id`, proving that the plugin preserves its warm worker. It then opens an independent session whose target-less `inspect` must be empty, proving that focus never crosses chat boundaries. The harness preflights the exact legacy-plus-fixed tool surface and accepts semantic evidence produced by either a fixed-language find tool or the legacy mapper. It fails if a model shard is missing, a download is attempted, an unapproved tool is called, any assistant message uses a different agent, model, or provider, a worker survives server shutdown, or required evidence is absent.
344
346
 
345
347
  Inspect the plan without launching a model:
346
348
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-codinglanguage-mapper"
7
- version = "1.1.1"
7
+ version = "1.1.2"
8
8
  description = "Agent-focused semantic mapping and language services for mixed-language codebases."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.15"