atomadic-forge 0.83.0__tar.gz → 0.84.1__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 (482) hide show
  1. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/CHANGELOG.md +10 -0
  2. {atomadic_forge-0.83.0/src/atomadic_forge.egg-info → atomadic_forge-0.84.1}/PKG-INFO +1 -1
  3. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/pyproject.toml +1 -1
  4. atomadic_forge-0.84.1/src/atomadic_forge/a1_at_functions/graft_extract_polyglot.py +354 -0
  5. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +2 -0
  6. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/graft_feature.py +155 -25
  7. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
  8. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
  9. atomadic_forge-0.84.1/tests/test_graft_polyglot.py +131 -0
  10. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/FUNDING.yml +0 -0
  11. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  12. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  14. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/README.md +0 -0
  15. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/action.yml +0 -0
  16. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/dependabot.yml +0 -0
  17. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/pull_request_template.md +0 -0
  18. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/ci.yml +0 -0
  19. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/customer-refactor.yml +0 -0
  20. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/forge-self-certify.yml +0 -0
  21. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/mcp-registry-publish.yml +0 -0
  22. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-auto-regen.yml +0 -0
  23. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-drift.yml +0 -0
  24. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/publish-on-tag.yml +0 -0
  25. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/release-readiness.yml +0 -0
  26. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/release.yml +0 -0
  27. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/surface-drift.yml +0 -0
  28. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/uptime.yml +0 -0
  29. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/ARCHITECTURE.md +0 -0
  30. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/CONTRIBUTING.md +0 -0
  31. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/LICENSE +0 -0
  32. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/MANIFEST.in +0 -0
  33. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/README.md +0 -0
  34. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/SECURITY.md +0 -0
  35. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/assets/Atomadic-Forge-01.png +0 -0
  36. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/01-getting-started.md +0 -0
  37. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/02-commands.md +0 -0
  38. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/03-tutorial.md +0 -0
  39. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/04-llm-loops.md +0 -0
  40. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/05-faq.md +0 -0
  41. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/AGENTS_GUIDE.md +0 -0
  42. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/AIR_GAPPED.md +0 -0
  43. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/CI_CD.md +0 -0
  44. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/CODEX_WALKTHROUGH.md +0 -0
  45. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/COMMANDS.md +0 -0
  46. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/FIRST_10_MINUTES.md +0 -0
  47. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/FORMALIZATION.md +0 -0
  48. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/HIVE_PRIMITIVES.md +0 -0
  49. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/HIVE_STATUS.md +0 -0
  50. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/IDE_INTEGRATION.md +0 -0
  51. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/LANDSCAPE.md +0 -0
  52. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MARKET_POSITIONING.md +0 -0
  53. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MCP_TOOLS.md +0 -0
  54. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MIGRATION.md +0 -0
  55. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MULTI_REPO.md +0 -0
  56. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/PROVIDERS.md +0 -0
  57. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/README.md +0 -0
  58. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RECEIPT.md +0 -0
  59. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELAY_PROTOCOL.md +0 -0
  60. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELEASE_CHECKLIST.md +0 -0
  61. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELEASE_MESSAGING.md +0 -0
  62. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/ROADMAP.md +0 -0
  63. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/SHOWCASE.md +0 -0
  64. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/SIDECAR.md +0 -0
  65. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/STUDIO.md +0 -0
  66. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  67. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  68. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  69. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WHY_NOW.md +0 -0
  70. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  71. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WORLD_COLLISION.md +0 -0
  72. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/INDEX.md +0 -0
  73. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/absorb.md +0 -0
  74. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/audit.md +0 -0
  75. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/chat.md +0 -0
  76. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/commandsmith.md +0 -0
  77. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/config.md +0 -0
  78. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/create.md +0 -0
  79. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/demo.md +0 -0
  80. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent-swarm.md +0 -0
  81. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent-then-synergy.md +0 -0
  82. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent.md +0 -0
  83. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/enhancement.md +0 -0
  84. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/evolve-then-iterate.md +0 -0
  85. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/evolve.md +0 -0
  86. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/feature-then-emergent.md +0 -0
  87. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/guard-install.md +0 -0
  88. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/handoff.md +0 -0
  89. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/harvest.md +0 -0
  90. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/hive.md +0 -0
  91. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/iterate.md +0 -0
  92. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/materialize.md +0 -0
  93. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/metrics.md +0 -0
  94. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/recon-swarm.md +0 -0
  95. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/relay.md +0 -0
  96. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/surface.md +0 -0
  97. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/synergy-then-emergent.md +0 -0
  98. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/synergy.md +0 -0
  99. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/welcome.md +0 -0
  100. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/wisdom.md +0 -0
  101. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  102. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/CS-1.md +0 -0
  103. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  104. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  105. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  106. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  107. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/01-quickstart.md +0 -0
  108. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/02-your-first-package.md +0 -0
  109. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
  110. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/04-plug-in-llms.md +0 -0
  111. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  112. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
  113. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/setup.cfg +0 -0
  114. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__init__.py +0 -0
  115. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__main__.py +0 -0
  116. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  117. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  118. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  119. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  120. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  121. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  122. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  123. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  124. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  125. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  126. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  127. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  128. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  129. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  130. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  131. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  132. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  133. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  134. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  135. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  136. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  137. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  138. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  139. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  140. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  141. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  142. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  143. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  144. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  145. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  146. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  147. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  148. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  149. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  150. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  151. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  152. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  153. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  154. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  155. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  156. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  157. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  158. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  159. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/closest_match.py +0 -0
  160. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  161. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  162. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  163. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  164. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  165. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  166. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
  167. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  168. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  169. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  170. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  171. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  172. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  173. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  174. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  175. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  176. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  177. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  178. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  179. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  180. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  181. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  182. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  183. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  184. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  185. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  186. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  187. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
  188. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/graft_extract_js.py +0 -0
  189. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  190. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  191. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  192. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  193. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  194. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +0 -0
  195. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  196. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  197. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  198. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  199. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/levenshtein_distance.py +0 -0
  200. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  201. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  202. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  203. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  204. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  205. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  206. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  207. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  208. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/monadic_laws.py +0 -0
  209. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  210. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  211. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  212. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  213. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  214. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  215. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  216. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  217. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  218. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  219. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  220. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  221. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recon_cache.py +0 -0
  222. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  223. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  224. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  225. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  226. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  227. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  228. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  229. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  230. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  231. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  232. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  233. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  234. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  235. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  236. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  237. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  238. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  239. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  240. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  241. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  242. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  243. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  244. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  245. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  246. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  247. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  248. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  249. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  250. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  251. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  252. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  253. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  254. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  255. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  256. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  257. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  258. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  259. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  260. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  261. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  262. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  263. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  264. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  265. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  266. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  267. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  268. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  269. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  270. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  271. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  272. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  273. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  274. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  275. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  276. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  277. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  278. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  279. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  280. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  281. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  282. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  283. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  284. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  285. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  286. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  287. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  288. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  289. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  290. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  291. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  292. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  293. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  294. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  295. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  296. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  297. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  298. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  299. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  300. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  301. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  302. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  303. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  304. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  305. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  306. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/recipe_replay.py +0 -0
  307. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  308. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  309. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  310. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  311. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  312. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  313. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  314. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  315. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  316. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
  317. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  318. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  319. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  320. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/__init__.py +0 -0
  321. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_monadic_laws_shared.py +0 -0
  322. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_registry.py +0 -0
  323. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/absorb.py +0 -0
  324. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/aiom_check.py +0 -0
  325. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/audit.py +0 -0
  326. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/chat.py +0 -0
  327. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
  328. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
  329. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/create.py +0 -0
  330. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/demo.py +0 -0
  331. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent.py +0 -0
  332. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  333. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  334. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/enhancement.py +0 -0
  335. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve.py +0 -0
  336. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  337. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  338. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fingerprint.py +0 -0
  339. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fuzz.py +0 -0
  340. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/graft.py +0 -0
  341. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/guard_install.py +0 -0
  342. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/handoff.py +0 -0
  343. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/harvest.py +0 -0
  344. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/hive.py +0 -0
  345. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/iterate.py +0 -0
  346. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/materialize.py +0 -0
  347. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/mcb_check.py +0 -0
  348. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/metrics.py +0 -0
  349. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  350. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/relay.py +0 -0
  351. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/replay.py +0 -0
  352. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/surface.py +0 -0
  353. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy.py +0 -0
  354. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  355. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/token_savings.py +0 -0
  356. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/welcome.py +0 -0
  357. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/wisdom.py +0 -0
  358. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  359. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  360. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
  361. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  362. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_aaaa_nexus_client.py +0 -0
  363. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_abstract_method_repair.py +0 -0
  364. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_hire_protocol.py +0 -0
  365. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_plan.py +0 -0
  366. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_plan_pkg_label.py +0 -0
  367. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_summary.py +0 -0
  368. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ast_scope_lock.py +0 -0
  369. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_audit_verb.py +0 -0
  370. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_body_extractor_repairs.py +0 -0
  371. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_call_graph_summary.py +0 -0
  372. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_capability_scout.py +0 -0
  373. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_card_renderer.py +0 -0
  374. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_certify_operational_axis.py +0 -0
  375. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_chat.py +0 -0
  376. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cherry_dedup_class_methods.py +0 -0
  377. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cherry_pick.py +0 -0
  378. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_classify_tier.py +0 -0
  379. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_classify_tier_ast_signals.py +0 -0
  380. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cli_smoke.py +0 -0
  381. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cli_swarm_aliases.py +0 -0
  382. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_codex_5_complete.py +0 -0
  383. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
  384. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_commandsmith.py +0 -0
  385. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_compiler_feedback.py +0 -0
  386. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_compliance_checker.py +0 -0
  387. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_config.py +0 -0
  388. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_copilots_copilot.py +0 -0
  389. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cost_circuit_breaker.py +0 -0
  390. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_create_feature.py +0 -0
  391. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cs1_renderer.py +0 -0
  392. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_custom_provider.py +0 -0
  393. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_dead_code_check.py +0 -0
  394. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_dedup_engine.py +0 -0
  395. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_demo.py +0 -0
  396. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_doc_auto_update.py +0 -0
  397. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_compose.py +0 -0
  398. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_signature_extract.py +0 -0
  399. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_synthesize_imports.py +0 -0
  400. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_enhancement_proposal.py +0 -0
  401. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_error_codes.py +0 -0
  402. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_error_hints.py +0 -0
  403. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_evolve_js.py +0 -0
  404. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_exported_api_check.py +0 -0
  405. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_finalize_scaffold.py +0 -0
  406. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_action.py +0 -0
  407. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a1.py +0 -0
  408. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a2.py +0 -0
  409. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_enforce.py +0 -0
  410. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_generation_quality.py +0 -0
  411. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_git_churn.py +0 -0
  412. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_graft_feature.py +0 -0
  413. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_graft_js.py +0 -0
  414. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_handoff.py +0 -0
  415. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_harvest_concept_bridge.py +0 -0
  416. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_harvest_source_warnings.py +0 -0
  417. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_hierarchical_memory.py +0 -0
  418. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_hive_sync.py +0 -0
  419. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ifwc_fuzz.py +0 -0
  420. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ignore_and_docs.py +0 -0
  421. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_import_smoke.py +0 -0
  422. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_iterate_evolve.py +0 -0
  423. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_certify.py +0 -0
  424. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_parser.py +0 -0
  425. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_recon.py +0 -0
  426. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_wire.py +0 -0
  427. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_lineage_chain.py +0 -0
  428. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ling_provider.py +0 -0
  429. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_local_signer.py +0 -0
  430. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_lsp_protocol.py +0 -0
  431. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_maintainability_index.py +0 -0
  432. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_manifest_diff.py +0 -0
  433. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_materialize_feature.py +0 -0
  434. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_mcp_lazy_bootstrap.py +0 -0
  435. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_mcp_protocol.py +0 -0
  436. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_monadic_laws.py +0 -0
  437. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_nexus_bridge.py +0 -0
  438. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ollama_client.py +0 -0
  439. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_pipeline.py +0 -0
  440. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_plan_apply.py +0 -0
  441. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_cli_mcp.py +0 -0
  442. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_full_pipeline.py +0 -0
  443. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_hardening.py +0 -0
  444. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  445. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_symbol_parity.py +0 -0
  446. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_pre_audit_smoke.py +0 -0
  447. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_precommit_hooks.py +0 -0
  448. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_progress_reporter.py +0 -0
  449. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_emitter.py +0 -0
  450. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_schema.py +0 -0
  451. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_signer.py +0 -0
  452. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_recipe_replay.py +0 -0
  453. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_recon_cache.py +0 -0
  454. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_remote_seed_store.py +0 -0
  455. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_repo_public_surface.py +0 -0
  456. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_response_enricher.py +0 -0
  457. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_roi_calculator.py +0 -0
  458. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sbom_cmd_text_summary.py +0 -0
  459. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sbom_emitter.py +0 -0
  460. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_scaffold.py +0 -0
  461. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sidecar.py +0 -0
  462. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sidecar_validate.py +0 -0
  463. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_smell_score_formula.py +0 -0
  464. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_stagnation.py +0 -0
  465. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_steersman_pack.py +0 -0
  466. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_stub_detector.py +0 -0
  467. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_surface_export.py +0 -0
  468. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_surface_gap_check.py +0 -0
  469. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_synergy.py +0 -0
  470. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_test_runner.py +0 -0
  471. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_tier_init_rebuild.py +0 -0
  472. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_token_savings_ledger.py +0 -0
  473. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_trust_gate_response.py +0 -0
  474. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_verify_suggested_recipe.py +0 -0
  475. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_welcome.py +0 -0
  476. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_welcome_enhancements.py +0 -0
  477. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_whoami_cmd.py +0 -0
  478. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_certify.py +0 -0
  479. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_stubs_gen.py +0 -0
  480. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_suggest_repairs.py +0 -0
  481. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_type_checking.py +0 -0
  482. {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.84.1 — 2026-05-08
6
+
7
+ - fix(mcp): add missing `items` to `repos` and `queries` array schemas in `explore` tool — resolves VS Code MCP validator rejection
8
+
9
+
10
+ ## v0.84.0 — 2026-05-08
11
+
12
+ - feat(forge): v0.84 — full polyglot graft + dynamic capabilities SoT
13
+
14
+
5
15
  ## v0.83.0 — 2026-05-08
6
16
 
7
17
  - feat(forge): v0.83 — JS/TS graft support; arm Atomadic with capability transfer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.83.0
3
+ Version: 0.84.1
4
4
  Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
5
5
  Author: Atomadic
6
6
  License-Expression: BUSL-1.1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.83.0"
7
+ version = "0.84.1"
8
8
  description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,354 @@
1
+ """Tier a1 — Rust + Kotlin counterparts to ``graft_extract`` and
2
+ ``graft_extract_js``. Same brace-balancing trick as the JS extractor;
3
+ language-specific header regexes drive symbol detection.
4
+
5
+ Rust supported headers:
6
+ * ``pub fn name``, ``fn name``, ``pub async fn name``, ``async fn name``
7
+ * ``pub struct Name``, ``struct Name``, ``pub enum Name``, ``enum Name``
8
+ * ``pub trait Name``, ``trait Name``
9
+ * ``impl Name`` / ``impl Trait for Name`` (block grouping)
10
+
11
+ Kotlin supported headers:
12
+ * ``fun name``, ``suspend fun name``, ``inline fun name``
13
+ * ``class Name``, ``data class Name``, ``sealed class Name``,
14
+ ``object Name``, ``interface Name``
15
+ * Modifiers tolerated: ``public/internal/private/protected/open/final/abstract``.
16
+
17
+ Both reuse :func:`js_parser._balance_braces` for body extraction.
18
+ """
19
+ from __future__ import annotations
20
+
21
+ import re
22
+ from dataclasses import dataclass, field
23
+ from pathlib import Path
24
+
25
+ from .js_parser import _balance_braces
26
+
27
+ RUST_SUFFIXES: frozenset[str] = frozenset({".rs"})
28
+ KOTLIN_SUFFIXES: frozenset[str] = frozenset({".kt", ".kts"})
29
+
30
+ # ── Rust ───────────────────────────────────────────────────────────
31
+
32
+
33
+ _RUST_HEADERS: tuple[tuple[str, str], ...] = (
34
+ ("function", r"^\s*(?:pub(?:\([^)]+\))?\s+)?(?:async\s+)?fn\s+{name}\b"),
35
+ ("struct", r"^\s*(?:pub(?:\([^)]+\))?\s+)?struct\s+{name}\b"),
36
+ ("enum", r"^\s*(?:pub(?:\([^)]+\))?\s+)?enum\s+{name}\b"),
37
+ ("trait", r"^\s*(?:pub(?:\([^)]+\))?\s+)?trait\s+{name}\b"),
38
+ ("impl", r"^\s*impl(?:\s*<[^>]+>)?\s+{name}\b"),
39
+ )
40
+
41
+ _RUST_USE = re.compile(
42
+ r"^\s*(?:pub\s+)?use\s+([^;]+);", re.MULTILINE,
43
+ )
44
+
45
+
46
+ # ── Kotlin ─────────────────────────────────────────────────────────
47
+
48
+
49
+ _KOTLIN_MODS = (
50
+ r"(?:(?:public|internal|private|protected|open|final|abstract|"
51
+ r"sealed|data|inline|suspend|operator|infix|tailrec|external|override)\s+)*"
52
+ )
53
+ _KOTLIN_HEADERS: tuple[tuple[str, str], ...] = (
54
+ ("function", rf"^\s*{_KOTLIN_MODS}fun\s+(?:<[^>]+>\s+)?(?:[A-Za-z_][\w<>.,?\s]*\.)?{{name}}\s*\("),
55
+ ("class", rf"^\s*{_KOTLIN_MODS}class\s+{{name}}\b"),
56
+ ("object", rf"^\s*{_KOTLIN_MODS}object\s+{{name}}\b"),
57
+ ("interface", rf"^\s*{_KOTLIN_MODS}interface\s+{{name}}\b"),
58
+ )
59
+
60
+ _KOTLIN_IMPORT = re.compile(
61
+ r"^\s*import\s+([\w.*]+)(?:\s+as\s+(\w+))?", re.MULTILINE,
62
+ )
63
+
64
+
65
+ # ── Shared dataclass ──────────────────────────────────────────────
66
+
67
+
68
+ @dataclass(frozen=True)
69
+ class PolyglotGraftExtract:
70
+ """Language-agnostic graft slice for Rust / Kotlin."""
71
+ symbol_name: str
72
+ kind: str
73
+ source: str
74
+ imports_needed: frozenset[str]
75
+ sibling_refs: frozenset[str] = field(default_factory=frozenset)
76
+ start_line: int = 0
77
+ end_line: int = 0
78
+ language: str = ""
79
+
80
+
81
+ # ── Helpers ───────────────────────────────────────────────────────
82
+
83
+
84
+ def _line_of(text: str, offset: int) -> int:
85
+ return text.count("\n", 0, offset) + 1
86
+
87
+
88
+ def _find_header(text: str, symbol_name: str,
89
+ patterns: tuple[tuple[str, str], ...]) -> tuple[int, str] | None:
90
+ safe = re.escape(symbol_name)
91
+ for kind, pat in patterns:
92
+ rx = re.compile(pat.format(name=safe), re.MULTILINE)
93
+ m = rx.search(text)
94
+ if m:
95
+ return (m.start(), kind)
96
+ return None
97
+
98
+
99
+ def _slice_balanced(text: str, header_start: int) -> tuple[str, int]:
100
+ """Slice from header through balanced braces. Returns (slice, end_offset)."""
101
+ open_idx = text.find("{", header_start)
102
+ if open_idx == -1:
103
+ # No body block — slice to next blank line or semicolon.
104
+ nl = text.find("\n\n", header_start)
105
+ end = nl if nl != -1 else len(text)
106
+ return text[header_start:end] + "\n", end
107
+ close_idx = _balance_braces(text, open_idx)
108
+ if close_idx == -1:
109
+ return text[header_start:], len(text)
110
+ end = close_idx + 1
111
+ if end < len(text) and text[end] == "\n":
112
+ end += 1
113
+ return text[header_start:end], end
114
+
115
+
116
+ def _walk_idents(slice_text: str) -> set[str]:
117
+ """Identifiers referenced in slice (block + line comments stripped)."""
118
+ s = re.sub(r"/\*.*?\*/", " ", slice_text, flags=re.DOTALL)
119
+ s = re.sub(r"//[^\n]*", " ", s)
120
+ return set(re.findall(r"\b[A-Za-z_][\w]*\b", s))
121
+
122
+
123
+ # ── Rust extractor ────────────────────────────────────────────────
124
+
125
+
126
+ def _rust_import_table(text: str) -> dict[str, str]:
127
+ """Map ``last_segment`` (or alias) → full ``use`` line.
128
+
129
+ ``use std::collections::HashMap;`` → ``{"HashMap": "use std::collections::HashMap;"}``
130
+ ``use foo::Bar as Quux;`` → ``{"Quux": "use foo::Bar as Quux;"}``
131
+ """
132
+ table: dict[str, str] = {}
133
+ for body in _RUST_USE.findall(text):
134
+ full = f"use {body.strip()};"
135
+ last = body.strip().split("::")[-1].strip()
136
+ # alias form
137
+ m = re.match(r"(\w+)\s+as\s+(\w+)", last)
138
+ if m:
139
+ table[m.group(2)] = full
140
+ continue
141
+ # group brace form `use foo::{A, B as X}`
142
+ m = re.match(r"\{([^}]+)\}", last)
143
+ if m:
144
+ for piece in m.group(1).split(","):
145
+ piece = piece.strip()
146
+ am = re.match(r"(\w+)\s+as\s+(\w+)", piece)
147
+ if am:
148
+ table[am.group(2)] = full
149
+ else:
150
+ name = piece.split(" as ")[-1].strip().strip("{}")
151
+ if name:
152
+ table[name] = full
153
+ continue
154
+ if last:
155
+ table[last] = full
156
+ return table
157
+
158
+
159
+ def _rust_top_defs(text: str) -> set[str]:
160
+ out: set[str] = set()
161
+ for _kind, pat in _RUST_HEADERS:
162
+ rx = re.compile(
163
+ pat.replace("{name}", r"(?P<name>[A-Za-z_]\w*)"),
164
+ re.MULTILINE,
165
+ )
166
+ for m in rx.finditer(text):
167
+ out.add(m.group("name"))
168
+ return out
169
+
170
+
171
+ def _walk_back_rust_attrs(text: str, header_start: int) -> int:
172
+ """Extend the slice start to include preceding ``#[...]`` attributes.
173
+
174
+ Walks each immediately-preceding non-blank line; if it starts with
175
+ ``#[`` (or `///` doc), include it. Stops at the first non-attribute,
176
+ non-doc line.
177
+ """
178
+ cursor = header_start
179
+ while cursor > 0:
180
+ line_start = text.rfind("\n", 0, cursor - 1) + 1
181
+ line = text[line_start:cursor].strip()
182
+ if line.startswith("#[") or line.startswith("///"):
183
+ cursor = line_start
184
+ else:
185
+ break
186
+ return cursor
187
+
188
+
189
+ def extract_symbol_rust(source_file: Path,
190
+ symbol_name: str) -> PolyglotGraftExtract:
191
+ p = Path(source_file)
192
+ if not p.is_file():
193
+ raise FileNotFoundError(f"graft source not found: {p}")
194
+ if p.suffix.lower() not in RUST_SUFFIXES:
195
+ raise ValueError(f"not a Rust source: {p.suffix}")
196
+ text = p.read_text(encoding="utf-8", errors="replace")
197
+ found = _find_header(text, symbol_name, _RUST_HEADERS)
198
+ if found is None:
199
+ raise KeyError(
200
+ f"no top-level Rust symbol named {symbol_name!r} in {p.name}",
201
+ )
202
+ header_start, kind = found
203
+ header_start = _walk_back_rust_attrs(text, header_start)
204
+ slice_text, end_offset = _slice_balanced(text, header_start)
205
+ refs = _walk_idents(slice_text) - {symbol_name}
206
+ table = _rust_import_table(text)
207
+ imports_needed = frozenset(name for name in refs if name in table)
208
+ siblings = _rust_top_defs(text) - {symbol_name}
209
+ sibling_refs = frozenset(refs & siblings)
210
+ return PolyglotGraftExtract(
211
+ symbol_name=symbol_name,
212
+ kind=kind,
213
+ source=slice_text.rstrip() + "\n",
214
+ imports_needed=imports_needed,
215
+ sibling_refs=sibling_refs,
216
+ start_line=_line_of(text, header_start),
217
+ end_line=_line_of(text, end_offset),
218
+ language="rust",
219
+ )
220
+
221
+
222
+ def render_grafted_module_rust(extract: PolyglotGraftExtract,
223
+ *, source_file: Path) -> str:
224
+ text = Path(source_file).read_text(encoding="utf-8", errors="replace")
225
+ table = _rust_import_table(text)
226
+ needed = sorted(table[n] for n in extract.imports_needed if n in table)
227
+ parts: list[str] = []
228
+ parts.append(
229
+ f"// Grafted from {Path(source_file).name} "
230
+ f"(lines {extract.start_line}–{extract.end_line}) by `forge graft`.",
231
+ )
232
+ parts.append("")
233
+ if needed:
234
+ parts.extend(needed)
235
+ parts.append("")
236
+ if extract.sibling_refs:
237
+ for sib in sorted(extract.sibling_refs):
238
+ parts.append(f"use crate::{sib}::{sib};")
239
+ parts.append("")
240
+ upper = re.sub(r"[^A-Za-z0-9]", "_", extract.symbol_name).upper().lstrip("_")
241
+ parts.append(
242
+ f'pub const SCHEMA_VERSION_GRAFT_{upper}: &str = '
243
+ f'"atomadic-forge.graft.{extract.symbol_name}/v1";',
244
+ )
245
+ parts.append("")
246
+ parts.append(extract.source.rstrip())
247
+ parts.append("")
248
+ return "\n".join(parts) + "\n"
249
+
250
+
251
+ # ── Kotlin extractor ──────────────────────────────────────────────
252
+
253
+
254
+ def _kotlin_import_table(text: str) -> dict[str, str]:
255
+ """Bound name → ``import a.b.C [as Alias]`` line.
256
+
257
+ Wildcard imports (``import a.b.*``) are skipped — too coarse to map
258
+ a single bound name back to a single line.
259
+ """
260
+ table: dict[str, str] = {}
261
+ for full, alias in _KOTLIN_IMPORT.findall(text):
262
+ if full.endswith(".*"):
263
+ continue
264
+ last = full.rsplit(".", 1)[-1]
265
+ local = alias or last
266
+ line = f"import {full}"
267
+ if alias:
268
+ line = f"import {full} as {alias}"
269
+ table[local] = line
270
+ return table
271
+
272
+
273
+ def _kotlin_top_defs(text: str) -> set[str]:
274
+ out: set[str] = set()
275
+ for _kind, pat in _KOTLIN_HEADERS:
276
+ rx = re.compile(
277
+ pat.replace("{name}", r"(?P<name>[A-Za-z_]\w*)"),
278
+ re.MULTILINE,
279
+ )
280
+ for m in rx.finditer(text):
281
+ out.add(m.group("name"))
282
+ return out
283
+
284
+
285
+ def extract_symbol_kotlin(source_file: Path,
286
+ symbol_name: str) -> PolyglotGraftExtract:
287
+ p = Path(source_file)
288
+ if not p.is_file():
289
+ raise FileNotFoundError(f"graft source not found: {p}")
290
+ if p.suffix.lower() not in KOTLIN_SUFFIXES:
291
+ raise ValueError(f"not a Kotlin source: {p.suffix}")
292
+ text = p.read_text(encoding="utf-8", errors="replace")
293
+ found = _find_header(text, symbol_name, _KOTLIN_HEADERS)
294
+ if found is None:
295
+ raise KeyError(
296
+ f"no top-level Kotlin symbol named {symbol_name!r} in {p.name}",
297
+ )
298
+ header_start, kind = found
299
+ slice_text, end_offset = _slice_balanced(text, header_start)
300
+ refs = _walk_idents(slice_text) - {symbol_name}
301
+ table = _kotlin_import_table(text)
302
+ imports_needed = frozenset(n for n in refs if n in table)
303
+ siblings = _kotlin_top_defs(text) - {symbol_name}
304
+ sibling_refs = frozenset(refs & siblings)
305
+ return PolyglotGraftExtract(
306
+ symbol_name=symbol_name,
307
+ kind=kind,
308
+ source=slice_text.rstrip() + "\n",
309
+ imports_needed=imports_needed,
310
+ sibling_refs=sibling_refs,
311
+ start_line=_line_of(text, header_start),
312
+ end_line=_line_of(text, end_offset),
313
+ language="kotlin",
314
+ )
315
+
316
+
317
+ def render_grafted_module_kotlin(extract: PolyglotGraftExtract,
318
+ *, source_file: Path,
319
+ package: str = "") -> str:
320
+ text = Path(source_file).read_text(encoding="utf-8", errors="replace")
321
+ table = _kotlin_import_table(text)
322
+ needed = sorted(table[n] for n in extract.imports_needed if n in table)
323
+ parts: list[str] = []
324
+ if package:
325
+ parts.append(f"package {package}")
326
+ parts.append("")
327
+ parts.append(
328
+ f"// Grafted from {Path(source_file).name} "
329
+ f"(lines {extract.start_line}–{extract.end_line}) by `forge graft`.",
330
+ )
331
+ parts.append("")
332
+ if needed:
333
+ parts.extend(needed)
334
+ parts.append("")
335
+ upper = re.sub(r"[^A-Za-z0-9]", "_", extract.symbol_name).upper().lstrip("_")
336
+ parts.append(
337
+ f'const val SCHEMA_VERSION_GRAFT_{upper} = '
338
+ f'"atomadic-forge.graft.{extract.symbol_name}/v1"',
339
+ )
340
+ parts.append("")
341
+ parts.append(extract.source.rstrip())
342
+ parts.append("")
343
+ return "\n".join(parts) + "\n"
344
+
345
+
346
+ __all__ = [
347
+ "KOTLIN_SUFFIXES",
348
+ "RUST_SUFFIXES",
349
+ "PolyglotGraftExtract",
350
+ "extract_symbol_kotlin",
351
+ "extract_symbol_rust",
352
+ "render_grafted_module_kotlin",
353
+ "render_grafted_module_rust",
354
+ ]
@@ -3087,6 +3087,7 @@ TOOLS: dict[str, dict[str, Any]] = {
3087
3087
  "description": "[recon/harvest] Repo path."},
3088
3088
  "repos": {
3089
3089
  "type": "array",
3090
+ "items": {"type": "string"},
3090
3091
  "description": "[recon] list of repo paths (max 23); [swarm] list of {src_root, package} objects.",
3091
3092
  "minItems": 1, "maxItems": 23,
3092
3093
  },
@@ -3121,6 +3122,7 @@ TOOLS: dict[str, dict[str, Any]] = {
3121
3122
  # capability_scout params
3122
3123
  "queries": {
3123
3124
  "type": ["string", "array"],
3125
+ "items": {"type": "string"},
3124
3126
  "description": "[capability_scout] Comma-separated or list of capability search queries.",
3125
3127
  },
3126
3128
  "per_query": {"type": "integer", "default": 8,
@@ -23,6 +23,7 @@ Pipeline::
23
23
  """
24
24
  from __future__ import annotations
25
25
 
26
+ import json
26
27
  import shutil
27
28
  from dataclasses import asdict, dataclass
28
29
  from pathlib import Path
@@ -38,11 +39,79 @@ from ..a1_at_functions.graft_extract_js import (
38
39
  extract_symbol_js,
39
40
  render_grafted_module_js,
40
41
  )
42
+ from ..a1_at_functions.graft_extract_polyglot import (
43
+ KOTLIN_SUFFIXES,
44
+ RUST_SUFFIXES,
45
+ extract_symbol_kotlin,
46
+ extract_symbol_rust,
47
+ render_grafted_module_kotlin,
48
+ render_grafted_module_rust,
49
+ )
41
50
  from ..a1_at_functions.wire_check import scan_violations
42
51
 
43
52
  SCHEMA_VERSION_GRAFT_V1 = "atomadic-forge.graft/v1"
53
+ SCHEMA_VERSION_CAPABILITIES_V1 = "atomadic.capabilities/v1"
44
54
  DEFAULT_TARGET_PACKAGE = "atomadic_forge"
45
55
 
56
+ CAPABILITIES_RELPATH = "a0_qk_constants/capabilities.json"
57
+
58
+
59
+ def _update_capabilities_sot(
60
+ pkg_dir: Path,
61
+ *,
62
+ symbol_name: str,
63
+ tier: str,
64
+ kind: str,
65
+ language: str,
66
+ source_file: str,
67
+ target_path: str,
68
+ ) -> str | None:
69
+ """Append/refresh an entry in the SoT capabilities.json under pkg_dir.
70
+
71
+ Best-effort: if the parent dir doesn't exist, do nothing (returns None).
72
+ The SoT is the file Atomadic loads at boot to know what powers he has;
73
+ keeping it dynamic means his self-awareness grows in lockstep with
74
+ every graft.
75
+ """
76
+ import datetime as _dt
77
+ sot_path = pkg_dir / CAPABILITIES_RELPATH
78
+ if not sot_path.parent.is_dir():
79
+ return None
80
+ now = _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
81
+ payload: dict[str, Any]
82
+ try:
83
+ payload = json.loads(sot_path.read_text(encoding="utf-8"))
84
+ if not isinstance(payload, dict):
85
+ payload = {}
86
+ except (OSError, ValueError):
87
+ payload = {}
88
+ payload.setdefault("schema_version", SCHEMA_VERSION_CAPABILITIES_V1)
89
+ payload.setdefault("agent", pkg_dir.name)
90
+ caps = payload.setdefault("capabilities", [])
91
+ if not isinstance(caps, list):
92
+ caps = []
93
+ # Replace existing entry for the same symbol so re-grafts overwrite.
94
+ caps = [c for c in caps if c.get("name") != symbol_name]
95
+ caps.append({
96
+ "name": symbol_name,
97
+ "tier": tier,
98
+ "kind": kind,
99
+ "language": language,
100
+ "grafted_from": source_file,
101
+ "grafted_at_utc": now,
102
+ "module_path": target_path,
103
+ })
104
+ payload["capabilities"] = caps
105
+ payload["updated_at_utc"] = now
106
+ payload["count"] = len(caps)
107
+ try:
108
+ sot_path.write_text(
109
+ json.dumps(payload, indent=2, default=str), encoding="utf-8",
110
+ )
111
+ return str(sot_path)
112
+ except OSError:
113
+ return None
114
+
46
115
  # Tier the graft lands in based on extracted symbol kind. Functions
47
116
  # default to a1 (pure helpers); classes default to a2 (composites);
48
117
  # the caller can override with --tier.
@@ -176,13 +245,13 @@ def graft(
176
245
  source_path = Path(source_file).resolve()
177
246
  target_path_root = Path(target_root).resolve()
178
247
 
179
- # v0.83: dispatch by source suffix. JS/TS sources go through the
180
- # regex-based JS extractor; everything else uses the Python AST path.
181
- is_js = source_path.suffix.lower() in JS_SUFFIXES
248
+ # v0.83/v0.84: dispatch by source suffix.
249
+ suffix = source_path.suffix.lower()
250
+ is_js = suffix in JS_SUFFIXES
251
+ is_rust = suffix in RUST_SUFFIXES
252
+ is_kotlin = suffix in KOTLIN_SUFFIXES
182
253
  if is_js:
183
254
  js_extract = extract_symbol_js(source_path, symbol_name)
184
- # Adapt JsGraftExtract to the same shape as GraftExtract so the
185
- # rest of the pipeline (rename, write, wire) stays unchanged.
186
255
  extract = GraftExtract(
187
256
  symbol_name=js_extract.symbol_name,
188
257
  kind=js_extract.kind,
@@ -192,6 +261,22 @@ def graft(
192
261
  end_line=js_extract.end_line,
193
262
  sibling_refs=js_extract.sibling_refs,
194
263
  )
264
+ elif is_rust:
265
+ rs = extract_symbol_rust(source_path, symbol_name)
266
+ extract = GraftExtract(
267
+ symbol_name=rs.symbol_name, kind=rs.kind, source=rs.source,
268
+ imports_needed=rs.imports_needed,
269
+ start_line=rs.start_line, end_line=rs.end_line,
270
+ sibling_refs=rs.sibling_refs,
271
+ )
272
+ elif is_kotlin:
273
+ kt = extract_symbol_kotlin(source_path, symbol_name)
274
+ extract = GraftExtract(
275
+ symbol_name=kt.symbol_name, kind=kt.kind, source=kt.source,
276
+ imports_needed=kt.imports_needed,
277
+ start_line=kt.start_line, end_line=kt.end_line,
278
+ sibling_refs=kt.sibling_refs,
279
+ )
195
280
  else:
196
281
  extract = extract_symbol(source_path, symbol_name)
197
282
 
@@ -212,27 +297,42 @@ def graft(
212
297
  end_line=extract.end_line,
213
298
  )
214
299
 
215
- # JS arrows / classes default to a1; classes optionally to a2.
300
+ # Tier defaults vary by language for class-shaped kinds.
216
301
  if is_js:
217
- js_default_tier = (
302
+ default_tier = (
218
303
  "a2_mo_composites" if extract.kind == "class" else "a1_at_functions"
219
304
  )
220
- chosen_tier = tier or js_default_tier
305
+ elif is_rust:
306
+ default_tier = (
307
+ "a2_mo_composites" if extract.kind in ("struct", "enum", "trait", "impl")
308
+ else "a1_at_functions"
309
+ )
310
+ elif is_kotlin:
311
+ default_tier = (
312
+ "a2_mo_composites" if extract.kind in ("class", "object", "interface")
313
+ else "a1_at_functions"
314
+ )
221
315
  else:
222
- chosen_tier = tier or _DEFAULT_TIERS.get(extract.kind, "a3_og_features")
316
+ default_tier = _DEFAULT_TIERS.get(extract.kind, "a3_og_features")
317
+ chosen_tier = tier or default_tier
318
+
319
+ if is_js:
320
+ dest_suffix = ".js"
321
+ elif is_rust:
322
+ dest_suffix = ".rs"
323
+ elif is_kotlin:
324
+ dest_suffix = ".kt"
325
+ else:
326
+ dest_suffix = ".py"
223
327
  dest = _resolve_target_module(
224
328
  target_path_root, package, chosen_tier, effective_name,
225
- suffix=".js" if is_js else ".py",
329
+ suffix=dest_suffix,
226
330
  )
331
+
227
332
  if is_js:
228
- # Re-extract via JS path to get the JsGraftExtract shape the
229
- # JS renderer wants. Cheap (single file read + regex).
230
- js_extract = extract_symbol_js(source_path, effective_name) \
231
- if effective_name == symbol_name \
232
- else extract_symbol_js(source_path, symbol_name)
333
+ from ..a1_at_functions.graft_extract_js import JsGraftExtract
334
+ js_extract = extract_symbol_js(source_path, symbol_name)
233
335
  if effective_name != symbol_name:
234
- # Apply rename to the JS extract source too.
235
- from ..a1_at_functions.graft_extract_js import JsGraftExtract
236
336
  renamed = _rename_symbol_in_source(
237
337
  js_extract.source, symbol_name, effective_name,
238
338
  )
@@ -245,13 +345,15 @@ def graft(
245
345
  start_line=js_extract.start_line,
246
346
  end_line=js_extract.end_line,
247
347
  )
248
- rendered = render_grafted_module_js(
249
- js_extract, source_file=source_path,
250
- )
348
+ rendered = render_grafted_module_js(js_extract, source_file=source_path)
349
+ elif is_rust:
350
+ rs_extract = extract_symbol_rust(source_path, symbol_name)
351
+ rendered = render_grafted_module_rust(rs_extract, source_file=source_path)
352
+ elif is_kotlin:
353
+ kt_extract = extract_symbol_kotlin(source_path, symbol_name)
354
+ rendered = render_grafted_module_kotlin(kt_extract, source_file=source_path)
251
355
  else:
252
- rendered = render_grafted_module(
253
- extract, source_file=source_path,
254
- )
356
+ rendered = render_grafted_module(extract, source_file=source_path)
255
357
 
256
358
  backup_path: str | None = None
257
359
  written = False
@@ -274,13 +376,41 @@ def graft(
274
376
  bytes_written = len(rendered.encode("utf-8"))
275
377
  written = True
276
378
 
379
+ # v0.84: keep the agent's capabilities SoT current. Best-effort:
380
+ # if the package has an a0_qk_constants/ dir we drop a
381
+ # capabilities.json entry so an agent loading it knows what
382
+ # powers it now has. Skipped silently if no SoT directory.
383
+ pkg_root_dir = (
384
+ target_path_root / "src" / package
385
+ if (target_path_root / "src" / package).is_dir()
386
+ else target_path_root / package
387
+ )
388
+ language = (
389
+ "javascript" if is_js
390
+ else "rust" if is_rust
391
+ else "kotlin" if is_kotlin
392
+ else "python"
393
+ )
394
+ _update_capabilities_sot(
395
+ pkg_root_dir,
396
+ symbol_name=effective_name,
397
+ tier=chosen_tier,
398
+ kind=extract.kind,
399
+ language=language,
400
+ source_file=str(source_path),
401
+ target_path=str(dest),
402
+ )
403
+
277
404
  # Run a focused wire scan on the package: a graft that introduces
278
405
  # an upward import is rejected on the spot. Caller can roll back
279
406
  # using backup_path if needed.
280
407
  try:
281
- wire_report = scan_violations(
282
- target_path_root / "src" / package,
408
+ scan_root = (
409
+ target_path_root / "src" / package
410
+ if (target_path_root / "src" / package).is_dir()
411
+ else target_path_root / package
283
412
  )
413
+ wire_report = scan_violations(scan_root)
284
414
  wire_violations = int(wire_report.get("violation_count", 0))
285
415
  wire_verdict = wire_report.get("verdict", "UNKNOWN")
286
416
  except Exception: # pragma: no cover - diagnostic only
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.83.0
3
+ Version: 0.84.1
4
4
  Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
5
5
  Author: Atomadic
6
6
  License-Expression: BUSL-1.1
@@ -184,6 +184,7 @@ src/atomadic_forge/a1_at_functions/generation_quality.py
184
184
  src/atomadic_forge/a1_at_functions/git_churn.py
185
185
  src/atomadic_forge/a1_at_functions/graft_extract.py
186
186
  src/atomadic_forge/a1_at_functions/graft_extract_js.py
187
+ src/atomadic_forge/a1_at_functions/graft_extract_polyglot.py
187
188
  src/atomadic_forge/a1_at_functions/handoff_builder.py
188
189
  src/atomadic_forge/a1_at_functions/harvest_absorb.py
189
190
  src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py
@@ -407,6 +408,7 @@ tests/test_generation_quality.py
407
408
  tests/test_git_churn.py
408
409
  tests/test_graft_feature.py
409
410
  tests/test_graft_js.py
411
+ tests/test_graft_polyglot.py
410
412
  tests/test_handoff.py
411
413
  tests/test_harvest_concept_bridge.py
412
414
  tests/test_harvest_source_warnings.py