atomadic-forge 0.57.1__tar.gz → 0.59.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 (450) hide show
  1. {atomadic_forge-0.57.1/src/atomadic_forge.egg-info → atomadic_forge-0.59.0}/PKG-INFO +1 -1
  2. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/pyproject.toml +1 -1
  3. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +19 -0
  4. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +28 -2
  5. atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +253 -0
  6. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +24 -1
  7. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +83 -3
  8. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +15 -8
  9. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/git_churn.py +6 -0
  10. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +159 -0
  11. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +167 -7
  12. atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +268 -0
  13. atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/steersman_pack.py +198 -0
  14. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +50 -4
  15. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +65 -7
  16. atomadic_forge-0.59.0/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +180 -0
  17. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +23 -5
  18. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/create_feature.py +45 -4
  19. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +125 -0
  20. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +22 -18
  21. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/mcp_server.py +83 -8
  22. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +55 -2
  23. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/create.py +4 -4
  24. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
  25. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/SOURCES.txt +8 -0
  26. atomadic_forge-0.59.0/tests/test_ast_scope_lock.py +119 -0
  27. atomadic_forge-0.59.0/tests/test_cherry_pick.py +68 -0
  28. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cli_smoke.py +33 -0
  29. atomadic_forge-0.59.0/tests/test_create_feature.py +368 -0
  30. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_signature_extract.py +21 -0
  31. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_synthesize_imports.py +23 -0
  32. atomadic_forge-0.59.0/tests/test_finalize_scaffold.py +110 -0
  33. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_git_churn.py +2 -0
  34. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_materialize_feature.py +18 -0
  35. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_mcp_protocol.py +31 -0
  36. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_nexus_bridge.py +88 -9
  37. atomadic_forge-0.59.0/tests/test_remote_seed_store.py +108 -0
  38. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_scaffold.py +25 -0
  39. atomadic_forge-0.59.0/tests/test_steersman_pack.py +150 -0
  40. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_stub_detector.py +98 -2
  41. atomadic_forge-0.57.1/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -94
  42. atomadic_forge-0.57.1/tests/test_create_feature.py +0 -183
  43. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/FUNDING.yml +0 -0
  44. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  45. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  46. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  47. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/actions/forge-action/README.md +0 -0
  48. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/actions/forge-action/action.yml +0 -0
  49. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/dependabot.yml +0 -0
  50. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/pull_request_template.md +0 -0
  51. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/ci.yml +0 -0
  52. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/customer-refactor.yml +0 -0
  53. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/forge-self-certify.yml +0 -0
  54. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/mcp-registry-publish.yml +0 -0
  55. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/metrics-auto-regen.yml +0 -0
  56. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/metrics-drift.yml +0 -0
  57. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/publish-on-tag.yml +0 -0
  58. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/release-readiness.yml +0 -0
  59. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/release.yml +0 -0
  60. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/surface-drift.yml +0 -0
  61. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/uptime.yml +0 -0
  62. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/ARCHITECTURE.md +0 -0
  63. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/CHANGELOG.md +0 -0
  64. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/CONTRIBUTING.md +0 -0
  65. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/LICENSE +0 -0
  66. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/MANIFEST.in +0 -0
  67. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/README.md +0 -0
  68. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/SECURITY.md +0 -0
  69. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/assets/Atomadic-Forge-01.png +0 -0
  70. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/01-getting-started.md +0 -0
  71. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/02-commands.md +0 -0
  72. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/03-tutorial.md +0 -0
  73. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/04-llm-loops.md +0 -0
  74. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/05-faq.md +0 -0
  75. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/AGENTS_GUIDE.md +0 -0
  76. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/AIR_GAPPED.md +0 -0
  77. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/CI_CD.md +0 -0
  78. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  79. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/COMMANDS.md +0 -0
  80. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/FIRST_10_MINUTES.md +0 -0
  81. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/FORMALIZATION.md +0 -0
  82. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/HIVE_PRIMITIVES.md +0 -0
  83. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/HIVE_STATUS.md +0 -0
  84. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/IDE_INTEGRATION.md +0 -0
  85. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/LANDSCAPE.md +0 -0
  86. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MARKET_POSITIONING.md +0 -0
  87. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MCP_TOOLS.md +0 -0
  88. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MIGRATION.md +0 -0
  89. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MULTI_REPO.md +0 -0
  90. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/PROVIDERS.md +0 -0
  91. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/README.md +0 -0
  92. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RECEIPT.md +0 -0
  93. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELAY_PROTOCOL.md +0 -0
  94. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELEASE_CHECKLIST.md +0 -0
  95. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELEASE_MESSAGING.md +0 -0
  96. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/ROADMAP.md +0 -0
  97. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/SHOWCASE.md +0 -0
  98. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/SIDECAR.md +0 -0
  99. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/STUDIO.md +0 -0
  100. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  101. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  102. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  103. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WHY_NOW.md +0 -0
  104. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  105. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WORLD_COLLISION.md +0 -0
  106. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/INDEX.md +0 -0
  107. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/absorb.md +0 -0
  108. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/audit.md +0 -0
  109. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/chat.md +0 -0
  110. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/commandsmith.md +0 -0
  111. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/config.md +0 -0
  112. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/create.md +0 -0
  113. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/demo.md +0 -0
  114. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent-swarm.md +0 -0
  115. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent-then-synergy.md +0 -0
  116. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent.md +0 -0
  117. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/enhancement.md +0 -0
  118. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/evolve-then-iterate.md +0 -0
  119. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/evolve.md +0 -0
  120. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/feature-then-emergent.md +0 -0
  121. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/guard-install.md +0 -0
  122. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/handoff.md +0 -0
  123. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/harvest.md +0 -0
  124. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/hive.md +0 -0
  125. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/iterate.md +0 -0
  126. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/materialize.md +0 -0
  127. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/metrics.md +0 -0
  128. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/recon-swarm.md +0 -0
  129. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/relay.md +0 -0
  130. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/surface.md +0 -0
  131. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/synergy-then-emergent.md +0 -0
  132. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/synergy.md +0 -0
  133. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/welcome.md +0 -0
  134. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/wisdom.md +0 -0
  135. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  136. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/CS-1.md +0 -0
  137. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  138. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  139. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  140. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  141. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/01-quickstart.md +0 -0
  142. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/02-your-first-package.md +0 -0
  143. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  144. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  145. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  146. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  147. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/setup.cfg +0 -0
  148. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/__init__.py +0 -0
  149. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/__main__.py +0 -0
  150. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  151. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  152. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  153. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  154. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  155. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  156. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  157. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  158. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  159. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  160. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  161. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  162. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  163. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  164. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  165. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  166. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  167. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  168. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  169. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  170. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  171. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  172. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  173. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  174. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  175. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  176. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  177. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  178. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  179. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  180. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  181. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  182. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  183. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  184. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  185. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  186. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  187. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  188. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  189. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  190. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  191. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  192. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  193. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  194. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  195. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  196. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  197. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
  198. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  199. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  200. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  201. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  202. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  203. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  204. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  205. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  206. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  207. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  208. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  209. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  210. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  211. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  212. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  213. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  214. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  215. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  216. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  217. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  218. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  219. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  220. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  221. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  222. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  223. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  224. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  225. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  226. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  227. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  228. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  229. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  230. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  231. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  232. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  233. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  234. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  235. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  236. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  237. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  238. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  239. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  240. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  241. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  242. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  243. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  244. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  245. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  246. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  247. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  248. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  249. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  250. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  251. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  252. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  253. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  254. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  255. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  256. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  257. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  258. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  259. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  260. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  261. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  262. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  263. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  264. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  265. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  266. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  267. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  268. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  269. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  270. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  271. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  272. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  273. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  274. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  275. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  276. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  277. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  278. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  279. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  280. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  281. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  282. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  283. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  284. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  285. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  286. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  287. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  288. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  289. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  290. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  291. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  292. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  293. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  294. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  295. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  296. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  297. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  298. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  299. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  300. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  301. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  302. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  303. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  304. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  305. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  306. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  307. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  308. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  309. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  310. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  311. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  312. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  313. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  314. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  315. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  316. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  317. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  318. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  319. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
  320. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  321. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  322. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  323. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/__init__.py +0 -0
  324. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/_registry.py +0 -0
  325. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/absorb.py +0 -0
  326. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/audit.py +0 -0
  327. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/chat.py +0 -0
  328. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  329. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  330. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/demo.py +0 -0
  331. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent.py +0 -0
  332. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  333. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  334. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  335. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve.py +0 -0
  336. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  337. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  338. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  339. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/handoff.py +0 -0
  340. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/harvest.py +0 -0
  341. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/hive.py +0 -0
  342. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/iterate.py +0 -0
  343. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/materialize.py +0 -0
  344. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/metrics.py +0 -0
  345. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  346. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/relay.py +0 -0
  347. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/surface.py +0 -0
  348. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy.py +0 -0
  349. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  350. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/welcome.py +0 -0
  351. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  352. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  353. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  354. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  355. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  356. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_aaaa_nexus_client.py +0 -0
  357. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_hire_protocol.py +0 -0
  358. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_plan.py +0 -0
  359. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_plan_pkg_label.py +0 -0
  360. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_summary.py +0 -0
  361. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_audit_verb.py +0 -0
  362. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_body_extractor_repairs.py +0 -0
  363. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_call_graph_summary.py +0 -0
  364. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_capability_scout.py +0 -0
  365. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_card_renderer.py +0 -0
  366. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_certify_operational_axis.py +0 -0
  367. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_chat.py +0 -0
  368. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_classify_tier.py +0 -0
  369. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_classify_tier_ast_signals.py +0 -0
  370. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cli_swarm_aliases.py +0 -0
  371. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_codex_5_complete.py +0 -0
  372. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  373. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_commandsmith.py +0 -0
  374. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_compiler_feedback.py +0 -0
  375. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_compliance_checker.py +0 -0
  376. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_config.py +0 -0
  377. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_copilots_copilot.py +0 -0
  378. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cost_circuit_breaker.py +0 -0
  379. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cs1_renderer.py +0 -0
  380. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_custom_provider.py +0 -0
  381. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_dead_code_check.py +0 -0
  382. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_dedup_engine.py +0 -0
  383. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_demo.py +0 -0
  384. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_doc_auto_update.py +0 -0
  385. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_compose.py +0 -0
  386. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_enhancement_proposal.py +0 -0
  387. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_error_codes.py +0 -0
  388. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_error_hints.py +0 -0
  389. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_evolve_js.py +0 -0
  390. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_exported_api_check.py +0 -0
  391. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_action.py +0 -0
  392. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_auth_a1.py +0 -0
  393. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_auth_a2.py +0 -0
  394. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_enforce.py +0 -0
  395. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_generation_quality.py +0 -0
  396. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_handoff.py +0 -0
  397. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_harvest_concept_bridge.py +0 -0
  398. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_hierarchical_memory.py +0 -0
  399. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_hive_sync.py +0 -0
  400. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ignore_and_docs.py +0 -0
  401. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_import_smoke.py +0 -0
  402. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_iterate_evolve.py +0 -0
  403. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_certify.py +0 -0
  404. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_parser.py +0 -0
  405. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_recon.py +0 -0
  406. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_wire.py +0 -0
  407. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_lineage_chain.py +0 -0
  408. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ling_provider.py +0 -0
  409. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_local_signer.py +0 -0
  410. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_lsp_protocol.py +0 -0
  411. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_maintainability_index.py +0 -0
  412. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_manifest_diff.py +0 -0
  413. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
  414. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ollama_client.py +0 -0
  415. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_pipeline.py +0 -0
  416. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_plan_apply.py +0 -0
  417. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_cli_mcp.py +0 -0
  418. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_full_pipeline.py +0 -0
  419. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_hardening.py +0 -0
  420. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  421. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_symbol_parity.py +0 -0
  422. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_pre_audit_smoke.py +0 -0
  423. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_precommit_hooks.py +0 -0
  424. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_progress_reporter.py +0 -0
  425. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_emitter.py +0 -0
  426. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_schema.py +0 -0
  427. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_signer.py +0 -0
  428. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_response_enricher.py +0 -0
  429. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_roi_calculator.py +0 -0
  430. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  431. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sbom_emitter.py +0 -0
  432. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sidecar.py +0 -0
  433. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sidecar_validate.py +0 -0
  434. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_smell_score_formula.py +0 -0
  435. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_stagnation.py +0 -0
  436. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_surface_export.py +0 -0
  437. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_surface_gap_check.py +0 -0
  438. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_synergy.py +0 -0
  439. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_test_runner.py +0 -0
  440. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_tier_init_rebuild.py +0 -0
  441. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_trust_gate_response.py +0 -0
  442. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_verify_suggested_recipe.py +0 -0
  443. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_welcome.py +0 -0
  444. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_welcome_enhancements.py +0 -0
  445. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_whoami_cmd.py +0 -0
  446. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_certify.py +0 -0
  447. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_stubs_gen.py +0 -0
  448. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_suggest_repairs.py +0 -0
  449. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_type_checking.py +0 -0
  450. {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wisdom.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.57.1
3
+ Version: 0.59.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.57.1"
7
+ version = "0.59.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"
@@ -63,6 +63,25 @@ class FCode(TypedDict):
63
63
 
64
64
 
65
65
  F_CODE_REGISTRY: dict[str, FCode] = {
66
+ # ---- Cherry-pick / remote seed hydration (F0010-F0019) ----
67
+ "F0017": FCode(
68
+ code="F0017",
69
+ name="remote-seed-url-invalid",
70
+ severity="warn",
71
+ title="Remote seed URL could not be normalized for harvest/create.",
72
+ hint_key="",
73
+ auto_fixable=False,
74
+ doc_anchor="f0017-remote-seed-url-invalid",
75
+ ),
76
+ "F0018": FCode(
77
+ code="F0018",
78
+ name="remote-seed-hydration-failed",
79
+ severity="warn",
80
+ title="Remote seed repository could not be cloned or refreshed.",
81
+ hint_key="",
82
+ auto_fixable=False,
83
+ doc_anchor="f0018-remote-seed-hydration-failed",
84
+ ),
66
85
  # ---- Wire / upward-import violations (F0040-F0049) ----
67
86
  "F0040": FCode(
68
87
  code="F0040",
@@ -22,11 +22,32 @@ DEFAULT_NEXUS_BASE_URL: Final[str] = "https://atomadic.tech"
22
22
  DEFAULT_NEXUS_MCP_PATH: Final[str] = "/mcp"
23
23
 
24
24
  # Auth: caller supplies ATOMADIC_MASTER_KEY (or per-agent subscription
25
- # key once the auth-worker side ships per-agent scoping). The bridge
26
- # never embeds keys in source.
25
+ # key once the auth-worker side ships per-agent scoping). Forge's
26
+ # public/auth gateway keys are accepted as aliases so paid users can
27
+ # run Forge and Nexus from the same master key. The bridge never embeds
28
+ # keys in source.
27
29
  ENV_NEXUS_BASE_URL: Final[str] = "ATOMADIC_NEXUS_URL"
28
30
  ENV_NEXUS_MASTER_KEY: Final[str] = "ATOMADIC_MASTER_KEY"
29
31
  ENV_NEXUS_SUBSCRIPTION_KEY: Final[str] = "ATOMADIC_SUBSCRIPTION_KEY"
32
+ ENV_NEXUS_BASE_URL_ALIASES: Final[tuple[str, ...]] = (
33
+ "ATOMADIC_NEXUS_URL",
34
+ "AAAA_NEXUS_URL",
35
+ )
36
+ ENV_NEXUS_MASTER_KEY_ALIASES: Final[tuple[str, ...]] = (
37
+ "ATOMADIC_MASTER_KEY",
38
+ "FORGE_MASTER_API_KEY",
39
+ "AAAA_NEXUS_API_KEY",
40
+ )
41
+ ENV_NEXUS_SUBSCRIPTION_KEY_ALIASES: Final[tuple[str, ...]] = (
42
+ "ATOMADIC_SUBSCRIPTION_KEY",
43
+ "FORGE_API_KEY",
44
+ )
45
+ ENV_NEXUS_VAULT_PATH: Final[str] = "ATOMADIC_VAULT_ENV"
46
+ NEXUS_PREMIUM_HINT: Final[str] = (
47
+ "Nexus attestation skipped. Purchase or configure a Nexus key, reuse "
48
+ "FORGE_MASTER_API_KEY as a master key, or wire x402 payments for "
49
+ "metered access."
50
+ )
30
51
 
31
52
  # ── LIVE primitives we wire against (verified 2026-05-06) ────────────
32
53
  # Each is a tools/call name on the Nexus MCP. The bridge exposes
@@ -57,6 +78,11 @@ __all__ = [
57
78
  "SCHEMA_VERSION_NEXUS_CALL_V1",
58
79
  "DEFAULT_NEXUS_BASE_URL", "DEFAULT_NEXUS_MCP_PATH",
59
80
  "ENV_NEXUS_BASE_URL", "ENV_NEXUS_MASTER_KEY", "ENV_NEXUS_SUBSCRIPTION_KEY",
81
+ "ENV_NEXUS_BASE_URL_ALIASES",
82
+ "ENV_NEXUS_MASTER_KEY_ALIASES",
83
+ "ENV_NEXUS_SUBSCRIPTION_KEY_ALIASES",
84
+ "ENV_NEXUS_VAULT_PATH",
85
+ "NEXUS_PREMIUM_HINT",
60
86
  "NEXUS_TOOL_IDENTITY_VERIFY", "NEXUS_TOOL_FEDERATION_MINT",
61
87
  "NEXUS_TOOL_AUTHORIZE_ACTION", "NEXUS_TOOL_SYS_TRUST_GATE",
62
88
  "NEXUS_TOOL_CONTRACT_VERIFY", "NEXUS_TOOL_LINEAGE_RECORD",
@@ -0,0 +1,253 @@
1
+ """Tier a1 — pure AST scope locks for multi-repo swarms.
2
+
3
+ Golden Path Lane C W6 follow-on deliverable. ``audit(action='ast_scope')``
4
+ uses this module to compress a proposed multi-repo mutation into exact
5
+ function/class node envelopes before any agent edits files. AAAA-Nexus can
6
+ attest the returned lock payload through existing lineage primitives, while
7
+ the math here stays local, deterministic, and dependency-free.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import ast
12
+ import hashlib
13
+ import json
14
+ from pathlib import Path
15
+ from typing import Any
16
+
17
+ SCHEMA_VERSION_AST_SCOPE_V1 = "atomadic-forge.ast_scope/v1"
18
+
19
+
20
+ def _tier_for_path(path: str) -> str:
21
+ for part in Path(path).parts:
22
+ if part.startswith("a") and part in {
23
+ "a0_qk_constants",
24
+ "a1_at_functions",
25
+ "a2_mo_composites",
26
+ "a3_og_features",
27
+ "a4_sy_orchestration",
28
+ }:
29
+ return part
30
+ return ""
31
+
32
+
33
+ def _sha(payload: Any, *, size: int = 16) -> str:
34
+ raw = json.dumps(payload, sort_keys=True, separators=(",", ":"), default=str)
35
+ return hashlib.sha256(raw.encode("utf-8")).hexdigest()[:size]
36
+
37
+
38
+ def _module_for(rel: str) -> str:
39
+ p = Path(rel).with_suffix("")
40
+ parts = [part for part in p.parts if part != "src"]
41
+ if parts and parts[-1] == "__init__":
42
+ parts.pop()
43
+ return ".".join(parts)
44
+
45
+
46
+ def _node_source_digest(source_lines: list[str], start: int, end: int) -> str:
47
+ text = "\n".join(source_lines[max(0, start - 1): max(start - 1, end)])
48
+ return hashlib.sha256(text.encode("utf-8")).hexdigest()[:16]
49
+
50
+
51
+ def _collect_python_nodes(path: Path, *, project_root: Path) -> list[dict[str, Any]]:
52
+ rel = path.relative_to(project_root).as_posix()
53
+ try:
54
+ text = path.read_text(encoding="utf-8", errors="replace")
55
+ tree = ast.parse(text, filename=str(path))
56
+ except (OSError, SyntaxError):
57
+ return []
58
+ lines = text.splitlines()
59
+ module = _module_for(rel)
60
+ out: list[dict[str, Any]] = []
61
+
62
+ def add_node(node: ast.AST, *, name: str, kind: str) -> None:
63
+ start = int(getattr(node, "lineno", 1))
64
+ end = int(getattr(node, "end_lineno", start))
65
+ qualname = f"{module}.{name}" if module else name
66
+ out.append({
67
+ "node_id": "ast-" + _sha({"file": rel, "qualname": qualname, "start": start, "end": end}),
68
+ "file": rel,
69
+ "qualname": qualname,
70
+ "kind": kind,
71
+ "tier": _tier_for_path(rel),
72
+ "start_line": start,
73
+ "end_line": end,
74
+ "line_span": max(1, end - start + 1),
75
+ "source_digest": _node_source_digest(lines, start, end),
76
+ })
77
+
78
+ for node in tree.body:
79
+ if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
80
+ add_node(node, name=node.name, kind="function")
81
+ elif isinstance(node, ast.ClassDef):
82
+ add_node(node, name=node.name, kind="class")
83
+ for sub in node.body:
84
+ if isinstance(sub, ast.FunctionDef | ast.AsyncFunctionDef):
85
+ add_node(sub, name=f"{node.name}.{sub.name}", kind="method")
86
+ return out
87
+
88
+
89
+ def _target_matches(node: dict[str, Any], targets: set[str]) -> bool:
90
+ if not targets:
91
+ return True
92
+ qual = str(node.get("qualname", ""))
93
+ return qual in targets or any(qual.endswith("." + t) for t in targets)
94
+
95
+
96
+ def build_ast_scope_blueprint(
97
+ *,
98
+ project_roots: list[Path | str],
99
+ targets: list[str] | None = None,
100
+ max_nodes: int = 200,
101
+ ) -> dict[str, Any]:
102
+ """Return compressed AST node scope for one or more repos.
103
+
104
+ ``targets`` may contain full qualnames or suffixes such as
105
+ ``AuthClient.refresh``. When omitted, the blueprint inventories up to
106
+ ``max_nodes`` nodes per portfolio pass.
107
+ """
108
+ target_set = {t for t in (targets or []) if t}
109
+ repos: list[dict[str, Any]] = []
110
+ all_nodes: list[dict[str, Any]] = []
111
+ raw_py_file_count = 0
112
+ raw_line_count = 0
113
+ for root_raw in project_roots:
114
+ root = Path(root_raw).resolve()
115
+ repo_nodes: list[dict[str, Any]] = []
116
+ repo_py_file_count = 0
117
+ repo_line_count = 0
118
+ if root.exists():
119
+ for py_file in sorted(root.rglob("*.py")):
120
+ rel_parts = py_file.relative_to(root).parts
121
+ if any(part in {"__pycache__", ".venv", "venv", ".git"} for part in rel_parts):
122
+ continue
123
+ repo_py_file_count += 1
124
+ raw_py_file_count += 1
125
+ try:
126
+ lines_here = py_file.read_text(
127
+ encoding="utf-8",
128
+ errors="replace",
129
+ ).count("\n") + 1
130
+ except OSError:
131
+ lines_here = 0
132
+ repo_line_count += lines_here
133
+ raw_line_count += lines_here
134
+ for node in _collect_python_nodes(py_file, project_root=root):
135
+ if _target_matches(node, target_set):
136
+ node = {**node, "repo_root": str(root)}
137
+ repo_nodes.append(node)
138
+ all_nodes.append(node)
139
+ if len(all_nodes) >= max_nodes:
140
+ break
141
+ if len(all_nodes) >= max_nodes:
142
+ break
143
+ repos.append({
144
+ "repo_root": str(root),
145
+ "exists": root.exists(),
146
+ "node_count": len(repo_nodes),
147
+ "python_file_count": repo_py_file_count,
148
+ "python_line_count": repo_line_count,
149
+ })
150
+ if len(all_nodes) >= max_nodes:
151
+ break
152
+ scanned_lines = sum(int(n["line_span"]) for n in all_nodes)
153
+ compressed_tokens = max(1, len(json.dumps(all_nodes, default=str)) // 4)
154
+ raw_token_estimate = max(compressed_tokens, raw_line_count * 4)
155
+ savings_pct = round(100.0 * (1.0 - (compressed_tokens / raw_token_estimate)), 1)
156
+ return {
157
+ "schema_version": SCHEMA_VERSION_AST_SCOPE_V1,
158
+ "project_roots": [str(Path(p).resolve()) for p in project_roots],
159
+ "targets": sorted(target_set),
160
+ "repos": repos,
161
+ "node_count": len(all_nodes),
162
+ "nodes": all_nodes,
163
+ "compressed_context": {
164
+ "ast_lines_retained": scanned_lines,
165
+ "raw_python_files": raw_py_file_count,
166
+ "raw_python_lines": raw_line_count,
167
+ "compressed_tokens_estimate": compressed_tokens,
168
+ "raw_tokens_estimate": raw_token_estimate,
169
+ "token_savings_pct": savings_pct,
170
+ },
171
+ }
172
+
173
+
174
+ def mint_ast_locks(
175
+ blueprint: dict[str, Any],
176
+ *,
177
+ agent_ids: list[str] | None = None,
178
+ ttl_secs: int = 3600,
179
+ ) -> dict[str, Any]:
180
+ """Mint deterministic local locks over blueprint nodes.
181
+
182
+ These are not remote AAAA-Nexus tokens. They are scope payloads suitable
183
+ for Nexus ``lineage_record`` attestation or ``authorize_action`` resource
184
+ checks with today's live Nexus surface.
185
+ """
186
+ agents = agent_ids or ["agent-0"]
187
+ locks: list[dict[str, Any]] = []
188
+ nodes = list(blueprint.get("nodes") or [])
189
+ for idx, node in enumerate(nodes):
190
+ agent_id = agents[idx % len(agents)]
191
+ resource = (
192
+ f"{node.get('repo_root')}::{node.get('file')}:"
193
+ f"{node.get('start_line')}-{node.get('end_line')}::{node.get('qualname')}"
194
+ )
195
+ payload = {
196
+ "agent_id": agent_id,
197
+ "node_id": node.get("node_id"),
198
+ "resource": resource,
199
+ "ttl_secs": ttl_secs,
200
+ "source_digest": node.get("source_digest"),
201
+ }
202
+ locks.append({
203
+ "lock_id": "lock-" + _sha(payload, size=20),
204
+ **payload,
205
+ "allowed_file": node.get("file"),
206
+ "allowed_line_range": [node.get("start_line"), node.get("end_line")],
207
+ "tier": node.get("tier"),
208
+ "nexus_attestable": True,
209
+ "nexus_live_op": "lineage_record",
210
+ })
211
+ return {
212
+ "schema_version": "atomadic-forge.ast_locks/v1",
213
+ "blueprint_hash": _sha(blueprint, size=20),
214
+ "lock_count": len(locks),
215
+ "locks": locks,
216
+ "ttl_secs": ttl_secs,
217
+ }
218
+
219
+
220
+ def ast_scope_plan(
221
+ *,
222
+ project_roots: list[Path | str],
223
+ targets: list[str] | None = None,
224
+ agent_ids: list[str] | None = None,
225
+ ttl_secs: int = 3600,
226
+ max_nodes: int = 200,
227
+ ) -> dict[str, Any]:
228
+ """Return blueprint + locks in one MCP-friendly envelope."""
229
+ blueprint = build_ast_scope_blueprint(
230
+ project_roots=project_roots,
231
+ targets=targets,
232
+ max_nodes=max_nodes,
233
+ )
234
+ locks = mint_ast_locks(blueprint, agent_ids=agent_ids, ttl_secs=ttl_secs)
235
+ return {
236
+ "schema_version": "atomadic-forge.ast_scope_plan/v1",
237
+ "blueprint": blueprint,
238
+ "locks": locks,
239
+ "verdict": "PASS" if locks["lock_count"] else "REFINE",
240
+ "summary": (
241
+ f"{blueprint['node_count']} AST node(s), "
242
+ f"{locks['lock_count']} lock(s), "
243
+ f"{blueprint['compressed_context']['token_savings_pct']}% estimated token savings"
244
+ ),
245
+ }
246
+
247
+
248
+ __all__ = (
249
+ "SCHEMA_VERSION_AST_SCOPE_V1",
250
+ "ast_scope_plan",
251
+ "build_ast_scope_blueprint",
252
+ "mint_ast_locks",
253
+ )
@@ -8,11 +8,28 @@ the assimilate phase; this layer just records intent.
8
8
  from __future__ import annotations
9
9
 
10
10
  from collections.abc import Iterable
11
+ from pathlib import PurePosixPath
12
+
13
+ from ..a0_qk_constants.lang_extensions import NON_TIER_SOURCE_DIRS
14
+
15
+
16
+ def _is_in_non_tier_dir(file_rel: str) -> bool:
17
+ """True when the relative file path lives under a non-tier source dir.
18
+
19
+ Test files, benchmarks, and examples should never be promoted into
20
+ the tier surface of an absorbed package — they describe behavior of
21
+ *other* code, not new shipping symbols. Closes GAP-004.
22
+ """
23
+ if not file_rel:
24
+ return False
25
+ parts = PurePosixPath(file_rel.replace("\\", "/")).parts
26
+ return any(p in NON_TIER_SOURCE_DIRS for p in parts)
11
27
 
12
28
 
13
29
  def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
14
30
  pick_all: bool = False, min_confidence: float = 0.0,
15
- only_tier: str | None = None) -> dict:
31
+ only_tier: str | None = None,
32
+ include_non_tier_dirs: bool = False) -> dict:
16
33
  """Build a cherry_pick manifest from a scout report.
17
34
 
18
35
  Filters:
@@ -22,6 +39,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
22
39
  (Forge currently emits 0.0 for hard hits and 0.5 for fallbacks; future
23
40
  versions will produce richer signals.)
24
41
  * ``only_tier`` — restrict to symbols already classified to this tier.
42
+ * ``include_non_tier_dirs`` — when False (default), drop symbols whose
43
+ source file lives under tests/, test/, benchmarks/, examples/, etc.
44
+ Pass True only when you explicitly want to absorb test fixtures.
25
45
  """
26
46
  syms = scout_report.get("symbols", [])
27
47
  wanted = set(names) if names else None
@@ -33,6 +53,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
33
53
  continue
34
54
  if only_tier and s["tier_guess"] != only_tier:
35
55
  continue
56
+ if (not include_non_tier_dirs
57
+ and _is_in_non_tier_dir(s.get("file", ""))):
58
+ continue
36
59
  items.append({
37
60
  "qualname": s["qualname"],
38
61
  "target_tier": s["tier_guess"],
@@ -14,6 +14,7 @@ from collections.abc import Iterable
14
14
  from pathlib import Path
15
15
 
16
16
  from ..a0_qk_constants.emergent_types import SymbolSignatureCard
17
+ from ..a0_qk_constants.lang_extensions import PYTHON_EXTS
17
18
 
18
19
  _TIERS = (
19
20
  "a0_qk_constants", "a1_at_functions", "a2_mo_composites",
@@ -35,9 +36,17 @@ def _module_for(file: Path, src_root: Path, package: str) -> str:
35
36
  parts = list(rel.parts)
36
37
  if parts and parts[-1] == "__init__":
37
38
  parts.pop()
39
+ if not package:
40
+ return ".".join(parts)
38
41
  return ".".join([package, *parts]) if parts else package
39
42
 
40
43
 
44
+ def _join_flat_module(package: str, module_parts: list[str]) -> str:
45
+ if not package:
46
+ return ".".join(module_parts)
47
+ return ".".join([package, *module_parts]) if module_parts else package
48
+
49
+
41
50
  def _tier_of(file: Path, src_root: Path) -> str:
42
51
  parts = file.relative_to(src_root).parts
43
52
  for p in parts:
@@ -58,6 +67,55 @@ def _domain_of(stem: str) -> str:
58
67
  return parts[0].lower() if parts else "misc"
59
68
 
60
69
 
70
+ def _identifier_token(value: str, fallback: str = "symbol") -> str:
71
+ value = re.sub(r"[^A-Za-z0-9_]+", "_", value).strip("_")
72
+ if not value or value[0].isdigit():
73
+ value = f"{fallback}_{value}" if value else fallback
74
+ return value
75
+
76
+
77
+ def _module_from_rel(file: str, package: str) -> str:
78
+ rel = Path(file).with_suffix("")
79
+ parts = [_identifier_token(p, "mod") for p in rel.parts]
80
+ if parts and parts[-1] == "__init__":
81
+ parts.pop()
82
+ if package:
83
+ return ".".join([_identifier_token(package, "pkg"), *parts])
84
+ return ".".join(parts)
85
+
86
+
87
+ def _signature_from_scout_symbol(sym: dict, *, package: str) -> SymbolSignatureCard | None:
88
+ if sym.get("language") in (None, "python"):
89
+ return None
90
+ name = str(sym.get("name") or sym.get("qualname") or "").strip()
91
+ if not name:
92
+ return None
93
+ qual_tail = ".".join(_identifier_token(part, "member")
94
+ for part in name.split(".") if part)
95
+ module = _module_from_rel(str(sym.get("file") or ""), package)
96
+ if not module or not qual_tail:
97
+ return None
98
+ effects = sym.get("effects") or []
99
+ output = (
100
+ "Callable"
101
+ if sym.get("kind") in {"function", "method"}
102
+ else "Mapping[str, Any]"
103
+ if sym.get("kind") == "class"
104
+ else "Any"
105
+ )
106
+ return SymbolSignatureCard(
107
+ name=qual_tail,
108
+ qualname=f"{module}.{qual_tail}",
109
+ module=module,
110
+ tier=str(sym.get("suggested_tier") or sym.get("tier_guess") or "a1_at_functions"),
111
+ domain=_domain_of(Path(str(sym.get("file") or name)).stem),
112
+ inputs=[("value", "Any")],
113
+ output=output,
114
+ is_pure="io" not in effects and "state" not in effects,
115
+ docstring=f"{sym.get('language')} {sym.get('kind')} surface",
116
+ )
117
+
118
+
61
119
  def _ann_text(node: ast.AST | None) -> str:
62
120
  if node is None:
63
121
  return "Any"
@@ -212,8 +270,18 @@ def harvest_signatures(
212
270
  # Caller passed a repo root, not a src layout. Use the repo as the
213
271
  # walk root and fabricate a one-level package alias from the directory.
214
272
  walk_root = src_root
215
- package_for_module = src_root.name.replace("-", "_")
216
- for py_file in sorted(walk_root.rglob("*.py")):
273
+ if package and (src_root / f"{package}.py").is_file():
274
+ # PEP-621/setuptools py-modules layout: files are importable as
275
+ # top-level modules, not as ``repo_name.<module>``.
276
+ package_for_module = ""
277
+ elif package:
278
+ package_for_module = package
279
+ else:
280
+ package_for_module = src_root.name.replace("-", "_")
281
+ for py_file in sorted(
282
+ p for p in walk_root.rglob("*")
283
+ if p.is_file() and p.suffix.lower() in PYTHON_EXTS
284
+ ):
217
285
  if py_file.name.startswith("_"):
218
286
  continue
219
287
  # Use parts RELATIVE to walk_root so a hidden parent like
@@ -232,11 +300,23 @@ def harvest_signatures(
232
300
  module_parts = list(rel.parts)
233
301
  if module_parts and module_parts[-1] == "__init__":
234
302
  module_parts.pop()
235
- module = ".".join([package_for_module, *module_parts]) if module_parts else package_for_module
303
+ module = _join_flat_module(package_for_module, module_parts)
236
304
  except ValueError:
237
305
  module = package_for_module
238
306
  tier = _flat_tier_for(py_file)
239
307
  domain = _domain_of(py_file.stem)
240
308
  cards.extend(_harvest_one_file(py_file, module=module,
241
309
  tier=tier, domain=domain))
310
+
311
+ try:
312
+ from .scout_walk import harvest_repo
313
+ scout = harvest_repo(walk_root)
314
+ except Exception:
315
+ scout = {"symbols": []}
316
+ seen = {card["qualname"] for card in cards}
317
+ for sym in scout.get("symbols") or []:
318
+ card = _signature_from_scout_symbol(sym, package=package_for_module)
319
+ if card and card["qualname"] not in seen:
320
+ cards.append(card)
321
+ seen.add(card["qualname"])
242
322
  return cards
@@ -36,12 +36,19 @@ def _imports_for(chain_qualnames: list[str]) -> list[str]:
36
36
  return out
37
37
 
38
38
 
39
+ def _is_class_method_qualname(q: str) -> bool:
40
+ module, _, _name = q.rpartition(".")
41
+ if not module:
42
+ return False
43
+ last_seg = module.rsplit(".", 1)[-1]
44
+ return bool(last_seg and last_seg[0].isupper())
45
+
46
+
39
47
  def render_emergent_feature(card: EmergentCandidateCard) -> str:
40
48
  chain = card["chain"]
41
49
  qualnames = chain["chain"]
42
50
  bridges = chain["bridges"]
43
51
  name = card["name"].replace("-", "_")
44
- imports = _imports_for(qualnames)
45
52
  summary = card["summary"].replace('"""', "'''")
46
53
  novelty = "; ".join(card["novelty_signals"]) or "(none)"
47
54
  score = card["score"]
@@ -70,8 +77,6 @@ def render_emergent_feature(card: EmergentCandidateCard) -> str:
70
77
  "from typing import Any",
71
78
  "",
72
79
  ])
73
- lines.extend(imports)
74
- lines.append("")
75
80
  lines.append(f"def run_{name}(seed: Any) -> dict[str, Any]:")
76
81
  lines.append(f' """Wired composition for {card["name"]}.')
77
82
  lines.append("")
@@ -80,17 +85,19 @@ def render_emergent_feature(card: EmergentCandidateCard) -> str:
80
85
  lines.append(" trace: list[Any] = []")
81
86
  lines.append(" value = seed")
82
87
  for i, q in enumerate(qualnames):
83
- _module, _, callable_name = q.rpartition(".")
84
- if "." in callable_name:
85
- # method case — fall back to a noop trace step rather than guessing
86
- # the receiver. Manual wiring required.
88
+ module, _, callable_name = q.rpartition(".")
89
+ if _is_class_method_qualname(q):
90
+ # Method case — fall back to a noop trace step rather than guessing
91
+ # the receiver. Manual wiring required.
87
92
  lines.append(
88
93
  f" # NOTE: step {i+1} is a method ({callable_name}); "
89
94
  "wire the receiver manually."
90
95
  )
91
96
  lines.append(f" trace.append(({q!r}, 'unwired-method'))")
92
97
  continue
93
- lines.append(f" value = {callable_name}(value)")
98
+ alias = f"_step_{i+1}_{callable_name}"
99
+ lines.append(f" from {module} import {callable_name} as {alias}")
100
+ lines.append(f" value = {alias}(value)")
94
101
  lines.append(f" trace.append(({q!r}, value))")
95
102
  lines.append(" return {'final': value, 'trace': trace}")
96
103
  lines.append("")
@@ -87,6 +87,12 @@ def compute_git_churn(
87
87
  stats. Returns a minimal error dict if git is unavailable.
88
88
  """
89
89
  root = Path(project_root).resolve()
90
+ if not (root / ".git").exists():
91
+ return {
92
+ "schema_version": SCHEMA_VERSION_GIT_CHURN_V1,
93
+ "available": False,
94
+ "reason": "not a git repository root",
95
+ }
90
96
  counts = _commit_count_per_file(root, since=since)
91
97
  if not counts:
92
98
  return {