atomadic-forge 0.75.3__tar.gz → 0.76.0__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 (459) hide show
  1. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/CHANGELOG.md +8 -0
  2. {atomadic_forge-0.75.3/src/atomadic_forge.egg-info → atomadic_forge-0.76.0}/PKG-INFO +8 -8
  3. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/README.md +7 -7
  4. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/IDE_INTEGRATION.md +1 -1
  5. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/pyproject.toml +1 -1
  6. atomadic_forge-0.76.0/src/atomadic_forge/a1_at_functions/cosine_similarity.py +22 -0
  7. atomadic_forge-0.76.0/src/atomadic_forge/a1_at_functions/graft_extract.py +221 -0
  8. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +186 -1
  9. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +31 -0
  10. atomadic_forge-0.76.0/src/atomadic_forge/a3_og_features/graft_feature.py +234 -0
  11. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +442 -0
  12. atomadic_forge-0.76.0/src/atomadic_forge/commands/graft.py +139 -0
  13. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/harvest.py +22 -0
  14. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0/src/atomadic_forge.egg-info}/PKG-INFO +8 -8
  15. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/SOURCES.txt +6 -0
  16. atomadic_forge-0.76.0/tests/test_graft_feature.py +150 -0
  17. atomadic_forge-0.76.0/tests/test_harvest_source_warnings.py +78 -0
  18. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/FUNDING.yml +0 -0
  19. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  20. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/actions/forge-action/README.md +0 -0
  23. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/actions/forge-action/action.yml +0 -0
  24. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/dependabot.yml +0 -0
  25. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/pull_request_template.md +0 -0
  26. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/ci.yml +0 -0
  27. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/customer-refactor.yml +0 -0
  28. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/forge-self-certify.yml +0 -0
  29. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  30. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  31. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/metrics-drift.yml +0 -0
  32. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/publish-on-tag.yml +0 -0
  33. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/release-readiness.yml +0 -0
  34. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/release.yml +0 -0
  35. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/surface-drift.yml +0 -0
  36. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/.github/workflows/uptime.yml +0 -0
  37. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/ARCHITECTURE.md +0 -0
  38. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/CONTRIBUTING.md +0 -0
  39. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/LICENSE +0 -0
  40. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/MANIFEST.in +0 -0
  41. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/SECURITY.md +0 -0
  42. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/assets/Atomadic-Forge-01.png +0 -0
  43. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/01-getting-started.md +0 -0
  44. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/02-commands.md +0 -0
  45. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/03-tutorial.md +0 -0
  46. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/04-llm-loops.md +0 -0
  47. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/05-faq.md +0 -0
  48. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/AGENTS_GUIDE.md +0 -0
  49. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/AIR_GAPPED.md +0 -0
  50. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/CI_CD.md +0 -0
  51. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  52. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/COMMANDS.md +0 -0
  53. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/FIRST_10_MINUTES.md +0 -0
  54. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/FORMALIZATION.md +0 -0
  55. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/HIVE_PRIMITIVES.md +0 -0
  56. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/HIVE_STATUS.md +0 -0
  57. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/LANDSCAPE.md +0 -0
  58. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/MARKET_POSITIONING.md +0 -0
  59. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/MCP_TOOLS.md +0 -0
  60. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/MIGRATION.md +0 -0
  61. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/MULTI_REPO.md +0 -0
  62. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/PROVIDERS.md +0 -0
  63. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/README.md +0 -0
  64. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/RECEIPT.md +0 -0
  65. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/RELAY_PROTOCOL.md +0 -0
  66. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/RELEASE_CHECKLIST.md +0 -0
  67. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/RELEASE_MESSAGING.md +0 -0
  68. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/ROADMAP.md +0 -0
  69. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/SHOWCASE.md +0 -0
  70. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/SIDECAR.md +0 -0
  71. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/STUDIO.md +0 -0
  72. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  73. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  74. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  75. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/WHY_NOW.md +0 -0
  76. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  77. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/WORLD_COLLISION.md +0 -0
  78. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/INDEX.md +0 -0
  79. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/absorb.md +0 -0
  80. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/audit.md +0 -0
  81. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/chat.md +0 -0
  82. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/commandsmith.md +0 -0
  83. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/config.md +0 -0
  84. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/create.md +0 -0
  85. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/demo.md +0 -0
  86. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/emergent-swarm.md +0 -0
  87. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/emergent-then-synergy.md +0 -0
  88. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/emergent.md +0 -0
  89. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/enhancement.md +0 -0
  90. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/evolve-then-iterate.md +0 -0
  91. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/evolve.md +0 -0
  92. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/feature-then-emergent.md +0 -0
  93. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/guard-install.md +0 -0
  94. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/handoff.md +0 -0
  95. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/harvest.md +0 -0
  96. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/hive.md +0 -0
  97. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/iterate.md +0 -0
  98. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/materialize.md +0 -0
  99. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/metrics.md +0 -0
  100. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/recon-swarm.md +0 -0
  101. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/relay.md +0 -0
  102. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/surface.md +0 -0
  103. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/synergy-then-emergent.md +0 -0
  104. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/synergy.md +0 -0
  105. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/welcome.md +0 -0
  106. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/commands/wisdom.md +0 -0
  107. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  108. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/compliance/CS-1.md +0 -0
  109. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  110. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  111. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  112. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  113. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/01-quickstart.md +0 -0
  114. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/02-your-first-package.md +0 -0
  115. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  116. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  117. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  118. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  119. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/setup.cfg +0 -0
  120. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/__init__.py +0 -0
  121. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/__main__.py +0 -0
  122. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  123. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  124. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  125. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  126. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  127. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  128. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  129. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  130. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  131. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  132. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  133. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  134. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  135. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  136. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  137. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  138. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  139. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  140. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  141. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  142. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  143. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  144. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  145. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  146. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  147. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  148. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  149. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  150. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  151. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  152. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  153. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  154. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  155. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  156. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  157. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  158. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  159. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  160. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  161. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  162. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  163. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  164. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  165. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  166. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  167. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  168. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  169. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  170. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  171. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  172. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  173. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  174. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  175. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  176. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  177. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  178. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  179. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  180. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  181. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  182. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  183. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  184. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  185. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  186. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  187. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  188. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  189. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  190. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  191. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  192. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  193. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  194. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  195. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  196. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  197. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  198. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  199. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  200. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  201. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  202. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  203. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  204. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  205. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  206. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  207. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  208. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  209. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  210. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  211. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  212. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  213. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  214. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  215. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  216. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  217. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  218. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  219. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  220. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  221. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
  222. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  223. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  224. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  225. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  226. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  227. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  228. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  229. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  230. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  231. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  232. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  233. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  234. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  235. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  236. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  237. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  238. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  239. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  240. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  241. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  242. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  243. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  244. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  245. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  246. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  247. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  248. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  249. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  250. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  251. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  252. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  253. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  254. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  255. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  256. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  257. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  258. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  259. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  260. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  261. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  262. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  263. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  264. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  265. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  266. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  267. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  268. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  269. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
  270. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  271. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  272. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  273. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  274. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  275. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  276. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  277. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  278. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  279. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  280. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  281. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  282. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  283. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  284. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  285. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  286. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  287. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  288. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  289. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  290. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  291. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  292. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  293. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  294. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  295. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  296. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  297. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  298. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  299. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  300. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  301. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  302. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  303. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  304. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  305. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  306. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  307. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  308. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  309. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  310. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  311. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  312. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  313. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  314. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  315. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/__init__.py +0 -0
  316. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/_registry.py +0 -0
  317. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/absorb.py +0 -0
  318. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/audit.py +0 -0
  319. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/chat.py +0 -0
  320. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  321. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  322. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/create.py +0 -0
  323. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/demo.py +0 -0
  324. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent.py +0 -0
  325. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  326. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  327. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  328. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/evolve.py +0 -0
  329. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  330. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  331. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  332. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/handoff.py +0 -0
  333. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/hive.py +0 -0
  334. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/iterate.py +0 -0
  335. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/materialize.py +0 -0
  336. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/metrics.py +0 -0
  337. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  338. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/relay.py +0 -0
  339. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/surface.py +0 -0
  340. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/synergy.py +0 -0
  341. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  342. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/welcome.py +0 -0
  343. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  344. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  345. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  346. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  347. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  348. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_aaaa_nexus_client.py +0 -0
  349. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_abstract_method_repair.py +0 -0
  350. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_agent_hire_protocol.py +0 -0
  351. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_agent_plan.py +0 -0
  352. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_agent_plan_pkg_label.py +0 -0
  353. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_agent_summary.py +0 -0
  354. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_ast_scope_lock.py +0 -0
  355. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_audit_verb.py +0 -0
  356. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_body_extractor_repairs.py +0 -0
  357. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_call_graph_summary.py +0 -0
  358. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_capability_scout.py +0 -0
  359. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_card_renderer.py +0 -0
  360. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_certify_operational_axis.py +0 -0
  361. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_chat.py +0 -0
  362. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_cherry_pick.py +0 -0
  363. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_classify_tier.py +0 -0
  364. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_classify_tier_ast_signals.py +0 -0
  365. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_cli_smoke.py +0 -0
  366. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_cli_swarm_aliases.py +0 -0
  367. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_codex_5_complete.py +0 -0
  368. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  369. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_commandsmith.py +0 -0
  370. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_compiler_feedback.py +0 -0
  371. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_compliance_checker.py +0 -0
  372. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_config.py +0 -0
  373. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_copilots_copilot.py +0 -0
  374. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_cost_circuit_breaker.py +0 -0
  375. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_create_feature.py +0 -0
  376. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_cs1_renderer.py +0 -0
  377. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_custom_provider.py +0 -0
  378. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_dead_code_check.py +0 -0
  379. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_dedup_engine.py +0 -0
  380. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_demo.py +0 -0
  381. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_doc_auto_update.py +0 -0
  382. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_emergent_compose.py +0 -0
  383. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_emergent_signature_extract.py +0 -0
  384. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_emergent_synthesize_imports.py +0 -0
  385. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_enhancement_proposal.py +0 -0
  386. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_error_codes.py +0 -0
  387. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_error_hints.py +0 -0
  388. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_evolve_js.py +0 -0
  389. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_exported_api_check.py +0 -0
  390. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_finalize_scaffold.py +0 -0
  391. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_forge_action.py +0 -0
  392. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_forge_auth_a1.py +0 -0
  393. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_forge_auth_a2.py +0 -0
  394. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_forge_enforce.py +0 -0
  395. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_generation_quality.py +0 -0
  396. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_git_churn.py +0 -0
  397. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_handoff.py +0 -0
  398. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_harvest_concept_bridge.py +0 -0
  399. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_hierarchical_memory.py +0 -0
  400. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_hive_sync.py +0 -0
  401. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_ignore_and_docs.py +0 -0
  402. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_import_smoke.py +0 -0
  403. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_iterate_evolve.py +0 -0
  404. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_js_certify.py +0 -0
  405. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_js_parser.py +0 -0
  406. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_js_recon.py +0 -0
  407. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_js_wire.py +0 -0
  408. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_lineage_chain.py +0 -0
  409. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_ling_provider.py +0 -0
  410. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_local_signer.py +0 -0
  411. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_lsp_protocol.py +0 -0
  412. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_maintainability_index.py +0 -0
  413. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_manifest_diff.py +0 -0
  414. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_materialize_feature.py +0 -0
  415. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  416. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_mcp_protocol.py +0 -0
  417. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_nexus_bridge.py +0 -0
  418. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_ollama_client.py +0 -0
  419. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_pipeline.py +0 -0
  420. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_plan_apply.py +0 -0
  421. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_polyglot_cli_mcp.py +0 -0
  422. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_polyglot_full_pipeline.py +0 -0
  423. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_polyglot_hardening.py +0 -0
  424. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  425. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_polyglot_symbol_parity.py +0 -0
  426. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_pre_audit_smoke.py +0 -0
  427. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_precommit_hooks.py +0 -0
  428. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_progress_reporter.py +0 -0
  429. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_receipt_emitter.py +0 -0
  430. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_receipt_schema.py +0 -0
  431. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_receipt_signer.py +0 -0
  432. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_remote_seed_store.py +0 -0
  433. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_repo_public_surface.py +0 -0
  434. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_response_enricher.py +0 -0
  435. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_roi_calculator.py +0 -0
  436. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  437. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_sbom_emitter.py +0 -0
  438. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_scaffold.py +0 -0
  439. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_sidecar.py +0 -0
  440. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_sidecar_validate.py +0 -0
  441. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_smell_score_formula.py +0 -0
  442. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_stagnation.py +0 -0
  443. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_steersman_pack.py +0 -0
  444. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_stub_detector.py +0 -0
  445. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_surface_export.py +0 -0
  446. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_surface_gap_check.py +0 -0
  447. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_synergy.py +0 -0
  448. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_test_runner.py +0 -0
  449. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_tier_init_rebuild.py +0 -0
  450. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_trust_gate_response.py +0 -0
  451. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_verify_suggested_recipe.py +0 -0
  452. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_welcome.py +0 -0
  453. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_welcome_enhancements.py +0 -0
  454. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_whoami_cmd.py +0 -0
  455. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_wire_certify.py +0 -0
  456. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_wire_stubs_gen.py +0 -0
  457. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_wire_suggest_repairs.py +0 -0
  458. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_wire_type_checking.py +0 -0
  459. {atomadic_forge-0.75.3 → atomadic_forge-0.76.0}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.76.0 — 2026-05-08
6
+
7
+ - feat(forge): graft — surgical single-symbol cross-repo capability transfer
8
+ - fix(lint): clear 14 ruff violations blocking CI
9
+ - release: v0.75.3
10
+ - fix(forge): GAP-014 — harvest fail-loud on missing/empty sources
11
+
12
+
5
13
  ## v0.75.3 — 2026-05-08
6
14
 
7
15
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.75.3
3
+ Version: 0.76.0
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
@@ -176,11 +176,11 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
176
176
  | `forge plan` | Bounded execution plan with risk + rollback |
177
177
  | `forge chat` | Terminal copilot over forge docs |
178
178
 
179
- **84 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
179
+ **59 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
180
180
 
181
181
  ---
182
182
 
183
- ## MCP Server — 10 Tools, 112 Actions
183
+ ## MCP Server — 10 Tools, 116 Actions
184
184
 
185
185
  Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aider, Devin, or any MCP-compatible agent:
186
186
 
@@ -200,7 +200,7 @@ Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aide
200
200
  | Tool | Actions | What it does |
201
201
  |------|---------|-------------|
202
202
  | `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, capability tour |
203
- | `explore` | 16 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
203
+ | `explore` | 17 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
204
204
  | `audit` | 23 | Quality gates, change safety, trust |
205
205
  | `plan` | 10 | Orient + dev utilities — context/compose/policy/recipes/generate/apply/locate/commit/scaffold/steersman |
206
206
  | `transmute` | 3 | **FLAGSHIP** spaghetti→certified pipeline — auto/cherry/finalize |
@@ -223,10 +223,10 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
223
223
  | Metric | Value |
224
224
  |--------|-------|
225
225
 
226
- | MCP tools | **10 tools · 112 actions** |
227
- | CLI verbs | **84** |
228
- | Source files | **228** (~45K LOC) |
229
- | Tests | **1555 passing** across **112 test files** |
226
+ | MCP tools | **10 tools · 116 actions** |
227
+ | CLI verbs | **59** |
228
+ | Source files | **232** (~47K LOC) |
229
+ | Tests | **1578 passing** across **114 test files** |
230
230
  | Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
231
231
  | Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
232
232
  | Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
@@ -144,11 +144,11 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
144
144
  | `forge plan` | Bounded execution plan with risk + rollback |
145
145
  | `forge chat` | Terminal copilot over forge docs |
146
146
 
147
- **84 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
147
+ **59 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
148
148
 
149
149
  ---
150
150
 
151
- ## MCP Server — 10 Tools, 112 Actions
151
+ ## MCP Server — 10 Tools, 116 Actions
152
152
 
153
153
  Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aider, Devin, or any MCP-compatible agent:
154
154
 
@@ -168,7 +168,7 @@ Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aide
168
168
  | Tool | Actions | What it does |
169
169
  |------|---------|-------------|
170
170
  | `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, capability tour |
171
- | `explore` | 16 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
171
+ | `explore` | 17 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
172
172
  | `audit` | 23 | Quality gates, change safety, trust |
173
173
  | `plan` | 10 | Orient + dev utilities — context/compose/policy/recipes/generate/apply/locate/commit/scaffold/steersman |
174
174
  | `transmute` | 3 | **FLAGSHIP** spaghetti→certified pipeline — auto/cherry/finalize |
@@ -191,10 +191,10 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
191
191
  | Metric | Value |
192
192
  |--------|-------|
193
193
 
194
- | MCP tools | **10 tools · 112 actions** |
195
- | CLI verbs | **84** |
196
- | Source files | **228** (~45K LOC) |
197
- | Tests | **1555 passing** across **112 test files** |
194
+ | MCP tools | **10 tools · 116 actions** |
195
+ | CLI verbs | **59** |
196
+ | Source files | **232** (~47K LOC) |
197
+ | Tests | **1578 passing** across **114 test files** |
198
198
  | Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
199
199
  | Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
200
200
  | Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
@@ -16,7 +16,7 @@ See `vscode-extension/README.md` for settings + usage.
16
16
 
17
17
  ## 2. MCP server (works with any MCP-aware assistant)
18
18
 
19
- Forge ships a fully-typed MCP server with **10 tools dispatching 112 actions** spanning recon, wire, certify, plan, enforce, emergent, synergy, wisdom, lineage, hive coordination, and AAAA-Nexus trust gates. Any of these clients can attach:
19
+ Forge ships a fully-typed MCP server with **10 tools dispatching 116 actions** spanning recon, wire, certify, plan, enforce, emergent, synergy, wisdom, lineage, hive coordination, and AAAA-Nexus trust gates. Any of these clients can attach:
20
20
 
21
21
  - **Claude Code** (Anthropic CLI) — `claude mcp add atomadic-forge -- forge mcp serve --project ${workspaceFolder}`
22
22
  - **Cursor** — Settings → MCP Servers → add the same command above
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.75.3"
7
+ version = "0.76.0"
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,22 @@
1
+ """Grafted from search_symbols.py (lines 410–423) by `forge graft`."""
2
+ from __future__ import annotations
3
+
4
+ import math
5
+
6
+ SCHEMA_VERSION_GRAFT_COSINE_SIMILARITY = "atomadic-forge.graft.cosine_similarity/v1"
7
+
8
+ def cosine_similarity(a: list[float], b: list[float]) -> float:
9
+ """Cosine similarity in pure Python (no numpy).
10
+
11
+ Returns 0.0 if either vector is zero-length or the lists differ in size.
12
+ Uses ``math.sqrt`` and ``sum()`` — no external deps.
13
+ """
14
+ if not a or not b or len(a) != len(b):
15
+ return 0.0
16
+ dot = sum(x * y for x, y in zip(a, b, strict=False))
17
+ norm_a = math.sqrt(sum(x * x for x in a))
18
+ norm_b = math.sqrt(sum(y * y for y in b))
19
+ if norm_a == 0.0 or norm_b == 0.0:
20
+ return 0.0
21
+ return dot / (norm_a * norm_b)
22
+
@@ -0,0 +1,221 @@
1
+ """Tier a1 — pure source-extraction helpers for ``forge graft``.
2
+
3
+ Given a Python source file and a top-level symbol name (function or class),
4
+ return the exact source slice for that symbol — with its docstring,
5
+ decorators, and trailing whitespace preserved. No imports, no deps,
6
+ no I/O beyond the input read. AST-based: deterministic and reproducible.
7
+
8
+ This is the read-only half of the graft pipeline. The write half lives
9
+ in a3 (``graft_feature``) so this module stays a pure-tier-1 helper.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import ast
14
+ from dataclasses import dataclass
15
+ from pathlib import Path
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class GraftExtract:
20
+ """One extracted symbol slice ready to drop into a target file.
21
+
22
+ * ``symbol_name`` — the bare top-level name (no qualifier dotting).
23
+ * ``kind`` — ``"function"`` (def) | ``"async_function"`` (async def) |
24
+ ``"class"`` (class).
25
+ * ``source`` — the verbatim source slice, INCLUDING any preceding
26
+ decorators and the body. Ends with a trailing newline.
27
+ * ``imports_needed`` — the set of bare module names the symbol's body
28
+ references. Caller resolves these against the source file's import
29
+ table to build the new module's import block.
30
+ * ``start_line`` / ``end_line`` — 1-based line numbers in the source
31
+ file (for diagnostics and lineage).
32
+ """
33
+ symbol_name: str
34
+ kind: str
35
+ source: str
36
+ imports_needed: frozenset[str]
37
+ start_line: int
38
+ end_line: int
39
+
40
+
41
+ def _walk_imports_used(node: ast.AST) -> set[str]:
42
+ """Return the set of bare module names that the AST subtree references.
43
+
44
+ Recognizes ``ast.Name`` references (e.g. ``math.sqrt`` → ``math``) and
45
+ ``ast.Attribute`` chains (e.g. ``math.pi`` → ``math``). The result is
46
+ a superset of "names that look like modules" — the caller is
47
+ responsible for filtering against the source file's actual imports.
48
+ """
49
+ used: set[str] = set()
50
+ for sub in ast.walk(node):
51
+ if isinstance(sub, ast.Name):
52
+ used.add(sub.id)
53
+ elif isinstance(sub, ast.Attribute):
54
+ # Walk to the leftmost Name in the attribute chain.
55
+ cur: ast.AST = sub
56
+ while isinstance(cur, ast.Attribute):
57
+ cur = cur.value
58
+ if isinstance(cur, ast.Name):
59
+ used.add(cur.id)
60
+ return used
61
+
62
+
63
+ def _import_table(tree: ast.Module) -> dict[str, str]:
64
+ """Build a mapping from bound name → "import statement source".
65
+
66
+ Records every ``import X`` and ``from Y import Z [as W]`` at module
67
+ level. The bound name is what shows up in code; the source is the
68
+ one-liner we'd emit verbatim into the new module. Aliased imports
69
+ (``import numpy as np``) bind ``np``, not ``numpy``.
70
+ """
71
+ table: dict[str, str] = {}
72
+ for node in tree.body:
73
+ if isinstance(node, ast.Import):
74
+ for alias in node.names:
75
+ bound = alias.asname or alias.name.split(".")[0]
76
+ if alias.asname:
77
+ table[bound] = f"import {alias.name} as {alias.asname}"
78
+ else:
79
+ table[bound] = f"import {alias.name}"
80
+ elif isinstance(node, ast.ImportFrom):
81
+ module = node.module or ""
82
+ level = node.level or 0
83
+ prefix = "." * level + module if level or module else ""
84
+ for alias in node.names:
85
+ bound = alias.asname or alias.name
86
+ if alias.asname:
87
+ table[bound] = (
88
+ f"from {prefix} import {alias.name} as {alias.asname}"
89
+ )
90
+ else:
91
+ table[bound] = f"from {prefix} import {alias.name}"
92
+ return table
93
+
94
+
95
+ def extract_symbol(source_file: Path, symbol_name: str) -> GraftExtract:
96
+ """Extract a top-level function or class slice from ``source_file``.
97
+
98
+ Returns a :class:`GraftExtract` carrying the verbatim source plus the
99
+ set of stdlib/third-party imports the symbol's body references that
100
+ are bound at module scope in ``source_file``.
101
+
102
+ Raises:
103
+ FileNotFoundError: ``source_file`` does not exist.
104
+ KeyError: no top-level symbol named ``symbol_name`` was
105
+ found in the AST. Mismatched casing or nested
106
+ definitions are not silently substituted.
107
+ SyntaxError: ``source_file`` does not parse as Python.
108
+ """
109
+ src_path = Path(source_file)
110
+ if not src_path.is_file():
111
+ raise FileNotFoundError(f"graft source not found: {src_path}")
112
+ text = src_path.read_text(encoding="utf-8")
113
+ tree = ast.parse(text, filename=str(src_path))
114
+ lines = text.splitlines(keepends=True)
115
+
116
+ target = None
117
+ for node in tree.body:
118
+ if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef):
119
+ if node.name == symbol_name:
120
+ target = node
121
+ break
122
+
123
+ if target is None:
124
+ raise KeyError(
125
+ f"no top-level symbol named {symbol_name!r} in {src_path.name}"
126
+ )
127
+
128
+ # AST start_lineno points at the `def`/`class` line. Decorators are
129
+ # stored separately; their source precedes the def by one line each.
130
+ if getattr(target, "decorator_list", None):
131
+ start = min(d.lineno for d in target.decorator_list)
132
+ else:
133
+ start = target.lineno
134
+ end = getattr(target, "end_lineno", start)
135
+ slice_lines = lines[start - 1 : end]
136
+ source = "".join(slice_lines)
137
+ if not source.endswith("\n"):
138
+ source = source + "\n"
139
+
140
+ # Resolve imports: walk the symbol body for names used, intersect with
141
+ # the source file's import table. Stdlib refs like ``math.sqrt`` come
142
+ # back as needing ``import math``.
143
+ used = _walk_imports_used(target)
144
+ table = _import_table(tree)
145
+ imports_needed = frozenset(name for name in used if name in table)
146
+
147
+ if isinstance(target, ast.AsyncFunctionDef):
148
+ kind = "async_function"
149
+ elif isinstance(target, ast.FunctionDef):
150
+ kind = "function"
151
+ else:
152
+ kind = "class"
153
+
154
+ return GraftExtract(
155
+ symbol_name=symbol_name,
156
+ kind=kind,
157
+ source=source,
158
+ imports_needed=imports_needed,
159
+ start_line=start,
160
+ end_line=end,
161
+ )
162
+
163
+
164
+ def render_grafted_module(
165
+ extract: GraftExtract,
166
+ *,
167
+ source_file: Path,
168
+ import_table: dict[str, str] | None = None,
169
+ docstring_prefix: str = "",
170
+ ) -> str:
171
+ """Render a stand-alone Python module that wraps the extracted symbol.
172
+
173
+ The output module:
174
+ * starts with a triple-quoted docstring describing the graft origin;
175
+ * imports only what the symbol body actually uses (resolved via
176
+ ``import_table`` or a fresh scan of ``source_file``);
177
+ * embeds the extracted source slice verbatim.
178
+
179
+ The resulting text is ready to write to disk and pass through
180
+ ``forge wire`` / ``forge certify`` without manual edits.
181
+ """
182
+ if import_table is None:
183
+ text = Path(source_file).read_text(encoding="utf-8")
184
+ tree = ast.parse(text)
185
+ import_table = _import_table(tree)
186
+
187
+ needed_imports = sorted(
188
+ import_table[name]
189
+ for name in extract.imports_needed
190
+ if name in import_table
191
+ )
192
+ # Skip relative imports — they don't resolve in the new module.
193
+ needed_imports = [imp for imp in needed_imports
194
+ if not imp.startswith("from .")]
195
+
196
+ parts: list[str] = []
197
+ docstring_body = (
198
+ f'"""{docstring_prefix}Grafted from '
199
+ f'{Path(source_file).name} (lines '
200
+ f'{extract.start_line}–{extract.end_line}) by `forge graft`."""'
201
+ )
202
+ parts.append(docstring_body)
203
+ parts.append("from __future__ import annotations")
204
+ parts.append("")
205
+ if needed_imports:
206
+ parts.extend(needed_imports)
207
+ parts.append("")
208
+ # Surface-gap-discoverable: emit a SCHEMA_VERSION_GRAFT_<NAME>
209
+ # constant so the existing entry-point walker recognizes the grafted
210
+ # symbol as a wireable a1 function. Without this, auto-wire skips
211
+ # the graft because the heuristic only inspects modules carrying
212
+ # a structured-output contract marker.
213
+ upper_name = extract.symbol_name.upper().lstrip("_")
214
+ parts.append(
215
+ f'SCHEMA_VERSION_GRAFT_{upper_name} = '
216
+ f'"atomadic-forge.graft.{extract.symbol_name}/v1"'
217
+ )
218
+ parts.append("")
219
+ parts.append(extract.source.rstrip())
220
+ parts.append("") # trailing newline
221
+ return "\n".join(parts) + "\n"
@@ -1397,6 +1397,150 @@ def _tool_doc_drift(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1397
1397
  return detect_doc_drift(root)
1398
1398
 
1399
1399
 
1400
+
1401
+ def _tool_agent_plan(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1402
+ """Auto-generated MCP handler for agent_plan_emitter.emit_agent_plan."""
1403
+ from .agent_plan_emitter import emit_agent_plan
1404
+ return emit_agent_plan(args)
1405
+
1406
+
1407
+ def _tool_ast_scope_blueprint(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1408
+ """Auto-generated MCP handler for ast_scope_lock.build_ast_scope_blueprint."""
1409
+ from .ast_scope_lock import build_ast_scope_blueprint
1410
+ return build_ast_scope_blueprint(args)
1411
+
1412
+
1413
+ def _tool_mint_ast_locks(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1414
+ """Auto-generated MCP handler for ast_scope_lock.mint_ast_locks."""
1415
+ from .ast_scope_lock import mint_ast_locks
1416
+ blueprint = str(args.get('blueprint', ''))
1417
+ return mint_ast_locks(blueprint=blueprint)
1418
+
1419
+
1420
+ def _tool_add_node(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1421
+ """Auto-generated MCP handler for ast_scope_lock.add_node."""
1422
+ from .ast_scope_lock import add_node
1423
+ node = args.get('node')
1424
+ return add_node(node=node)
1425
+
1426
+
1427
+ def _tool_class_signals(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1428
+ """Auto-generated MCP handler for body_extractor.detect_class_signals."""
1429
+ from .body_extractor import detect_class_signals
1430
+ target = args.get('target')
1431
+ return detect_class_signals(target=target)
1432
+
1433
+
1434
+ def _tool_body(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1435
+ """Auto-generated MCP handler for body_extractor.extract_body."""
1436
+ from .body_extractor import extract_body
1437
+ source_path = str(args.get('source_path', ''))
1438
+ symbol_name = str(args.get('symbol_name', ''))
1439
+ language = str(args.get('language', ''))
1440
+ return extract_body(source_path=source_path, symbol_name=symbol_name, language=language)
1441
+
1442
+
1443
+ def _tool_documentation(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1444
+ """Auto-generated MCP handler for certify_checks.check_documentation."""
1445
+ from .certify_checks import check_documentation
1446
+ root = Path(args.get('project_root', project_root)).resolve()
1447
+ return check_documentation(root)
1448
+
1449
+
1450
+ def _tool_tests_present(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1451
+ """Auto-generated MCP handler for certify_checks.check_tests_present."""
1452
+ from .certify_checks import check_tests_present
1453
+ root = Path(args.get('project_root', project_root)).resolve()
1454
+ return check_tests_present(root)
1455
+
1456
+
1457
+ def _tool_count_untiered_source_files(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1458
+ """Auto-generated MCP handler for certify_checks.count_untiered_source_files."""
1459
+ from .certify_checks import count_untiered_source_files
1460
+ root = Path(args.get('project_root', project_root)).resolve()
1461
+ return count_untiered_source_files(root)
1462
+
1463
+
1464
+ def _tool_tier_layout(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1465
+ """Auto-generated MCP handler for certify_checks.check_tier_layout."""
1466
+ from .certify_checks import check_tier_layout
1467
+ root = Path(args.get('project_root', project_root)).resolve()
1468
+ package = str(args.get('package', ''))
1469
+ return check_tier_layout(root, package=package)
1470
+
1471
+
1472
+ def _tool_no_upward_imports(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1473
+ """Auto-generated MCP handler for certify_checks.check_no_upward_imports."""
1474
+ from .certify_checks import check_no_upward_imports
1475
+ root = Path(args.get('project_root', project_root)).resolve()
1476
+ package = str(args.get('package', ''))
1477
+ return check_no_upward_imports(root, package=package)
1478
+
1479
+
1480
+ def _tool_ci_workflow(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1481
+ """Auto-generated MCP handler for certify_checks.check_ci_workflow."""
1482
+ from .certify_checks import check_ci_workflow
1483
+ root = Path(args.get('project_root', project_root)).resolve()
1484
+ return check_ci_workflow(root)
1485
+
1486
+
1487
+ def _tool_changelog(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1488
+ """Auto-generated MCP handler for certify_checks.check_changelog."""
1489
+ from .certify_checks import check_changelog
1490
+ root = Path(args.get('project_root', project_root)).resolve()
1491
+ return check_changelog(root)
1492
+
1493
+
1494
+ def _tool_chat_context(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1495
+ """Auto-generated MCP handler for chat_context.build_chat_context."""
1496
+ from .chat_context import build_chat_context
1497
+ paths = list(args.get('paths', []))
1498
+ return build_chat_context(paths=paths)
1499
+
1500
+
1501
+ def _tool_effects(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1502
+ """Auto-generated MCP handler for classify_tier.detect_effects."""
1503
+ from .classify_tier import detect_effects
1504
+ node = args.get('node')
1505
+ return detect_effects(node=node)
1506
+
1507
+
1508
+ def _tool_compliance(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1509
+ """Auto-generated MCP handler for compliance_checker.check_compliance."""
1510
+ from .compliance_checker import check_compliance
1511
+ receipt = args.get('receipt')
1512
+ return check_compliance(receipt=receipt)
1513
+
1514
+
1515
+ def _tool_compliance_framework(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1516
+ """Auto-generated MCP handler for compliance_checker.check_compliance_framework."""
1517
+ from .compliance_checker import check_compliance_framework
1518
+ receipt = args.get('receipt')
1519
+ framework = str(args.get('framework', ''))
1520
+ return check_compliance_framework(receipt=receipt, framework=framework)
1521
+
1522
+
1523
+ def _tool_cosine_similarity(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1524
+ """Auto-generated MCP handler for cosine_similarity.cosine_similarity."""
1525
+ from .cosine_similarity import cosine_similarity
1526
+ a = list(args.get('a', []))
1527
+ b = list(args.get('b', []))
1528
+ return cosine_similarity(a=a, b=b)
1529
+
1530
+
1531
+ def _tool_update_readme(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1532
+ """Auto-generated MCP handler for doc_auto_update.update_readme."""
1533
+ from .doc_auto_update import update_readme
1534
+ project_root = Path(args.get('project_root', project_root)).resolve()
1535
+ return update_readme(project_root)
1536
+
1537
+
1538
+ def _tool_update_extended_docs(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1539
+ """Auto-generated MCP handler for doc_auto_update.update_extended_docs."""
1540
+ from .doc_auto_update import update_extended_docs
1541
+ project_root = Path(args.get('project_root', project_root)).resolve()
1542
+ return update_extended_docs(project_root)
1543
+
1400
1544
  def _tool_smell_scan(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
1401
1545
  """Run code-smell detection (cyclomatic complexity + long functions
1402
1546
  + duplicated bodies). Pure: composes the a1 ``smell_scan`` walker."""
@@ -2418,6 +2562,46 @@ def _tool_explore(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
2418
2562
  return _tool_dead_code(project_root, inner)
2419
2563
  elif action == "maintainability":
2420
2564
  return _tool_maintainability(project_root, inner)
2565
+ elif action == "agent_plan":
2566
+ return _tool_agent_plan(project_root, inner)
2567
+ elif action == "ast_scope_blueprint":
2568
+ return _tool_ast_scope_blueprint(project_root, inner)
2569
+ elif action == "mint_ast_locks":
2570
+ return _tool_mint_ast_locks(project_root, inner)
2571
+ elif action == "add_node":
2572
+ return _tool_add_node(project_root, inner)
2573
+ elif action == "class_signals":
2574
+ return _tool_class_signals(project_root, inner)
2575
+ elif action == "body":
2576
+ return _tool_body(project_root, inner)
2577
+ elif action == "documentation":
2578
+ return _tool_documentation(project_root, inner)
2579
+ elif action == "tests_present":
2580
+ return _tool_tests_present(project_root, inner)
2581
+ elif action == "count_untiered_source_files":
2582
+ return _tool_count_untiered_source_files(project_root, inner)
2583
+ elif action == "tier_layout":
2584
+ return _tool_tier_layout(project_root, inner)
2585
+ elif action == "no_upward_imports":
2586
+ return _tool_no_upward_imports(project_root, inner)
2587
+ elif action == "ci_workflow":
2588
+ return _tool_ci_workflow(project_root, inner)
2589
+ elif action == "changelog":
2590
+ return _tool_changelog(project_root, inner)
2591
+ elif action == "chat_context":
2592
+ return _tool_chat_context(project_root, inner)
2593
+ elif action == "effects":
2594
+ return _tool_effects(project_root, inner)
2595
+ elif action == "compliance":
2596
+ return _tool_compliance(project_root, inner)
2597
+ elif action == "compliance_framework":
2598
+ return _tool_compliance_framework(project_root, inner)
2599
+ elif action == "cosine_similarity":
2600
+ return _tool_cosine_similarity(project_root, inner)
2601
+ elif action == "update_readme":
2602
+ return _tool_update_readme(project_root, inner)
2603
+ elif action == "update_extended_docs":
2604
+ return _tool_update_extended_docs(project_root, inner)
2421
2605
  elif action == "concept_bridge":
2422
2606
  return _tool_concept_bridge(project_root, inner)
2423
2607
  elif action == "lineage":
@@ -2698,7 +2882,8 @@ TOOLS: dict[str, dict[str, Any]] = {
2698
2882
  "enum": ["recon", "explain", "call_graph", "call_graph_summary",
2699
2883
  "smell_scan", "churn", "surface_gaps", "capability_scout",
2700
2884
  "dead_code", "maintainability", "concept_bridge",
2701
- "lineage", "harvest", "synergy", "scan", "swarm"],
2885
+ "lineage", "harvest", "synergy", "scan", "swarm",
2886
+ "agent_plan"],
2702
2887
  "default": "recon",
2703
2888
  "description": (
2704
2889
  "'recon' — tier map; 'explain' — narrative; "
@@ -243,12 +243,43 @@ def harvest(target: Path | str, sources: list[Path | str]) -> dict[str, Any]:
243
243
  trust_gated_count = sum(1 for c in candidates if c["trust_gated"])
244
244
  review_required_count = len(candidates) - trust_gated_count
245
245
 
246
+ # Surface per-source health so callers can see which sources actually
247
+ # contributed symbols. Closes GAP-014: harvest used to silently return
248
+ # 0 candidates when a source path was missing or had no scout-walkable
249
+ # code, with no signal that anything was wrong. Now every source is
250
+ # accounted for in `per_source` and the offenders are summarised in
251
+ # `source_warnings` for fail-loud diagnostics.
252
+ per_source: list[dict[str, Any]] = []
253
+ source_warnings: list[str] = []
254
+ for entry in swarm.get("per_repo", []):
255
+ repo_path = entry.get("repo", "")
256
+ exists = bool(entry.get("exists", True))
257
+ sym_count = int(entry.get("symbol_count", 0))
258
+ per_source.append({
259
+ "repo": repo_path,
260
+ "exists": exists,
261
+ "symbol_count": sym_count,
262
+ "tier_distribution": entry.get("tier_distribution", {}),
263
+ "error": entry.get("error"),
264
+ })
265
+ if not exists:
266
+ source_warnings.append(
267
+ f"source not found on disk: {repo_path}"
268
+ )
269
+ elif sym_count == 0:
270
+ source_warnings.append(
271
+ f"source walked but produced 0 symbols (no src/<pkg>/ "
272
+ f"layout or unsupported language?): {repo_path}"
273
+ )
274
+
246
275
  return {
247
276
  "schema_version": SCHEMA_VERSION_HARVEST_V1,
248
277
  "target": str(target),
249
278
  "target_symbol_count": len(target_qualnames),
250
279
  "source_repos": [str(s) for s in sources],
251
280
  "seed_hydration": seed_hydration,
281
+ "per_source": per_source,
282
+ "source_warnings": source_warnings,
252
283
  "candidates": candidates,
253
284
  "candidate_count": len(candidates),
254
285
  "trust_gated_count": trust_gated_count,