atomadic-forge 0.75.1__tar.gz → 0.75.3__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 (454) hide show
  1. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/CHANGELOG.md +14 -0
  2. {atomadic_forge-0.75.1/src/atomadic_forge.egg-info → atomadic_forge-0.75.3}/PKG-INFO +1 -1
  3. atomadic_forge-0.75.3/docs/commands/metrics.md +91 -0
  4. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/pyproject.toml +1 -1
  5. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +5 -2
  6. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +163 -7
  7. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +63 -1
  8. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/metrics.py +84 -2
  9. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
  10. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_doc_auto_update.py +16 -0
  11. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_repo_public_surface.py +72 -0
  12. atomadic_forge-0.75.1/docs/commands/metrics.md +0 -46
  13. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/FUNDING.yml +0 -0
  14. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  15. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  17. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/actions/forge-action/README.md +0 -0
  18. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/actions/forge-action/action.yml +0 -0
  19. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/dependabot.yml +0 -0
  20. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/pull_request_template.md +0 -0
  21. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/ci.yml +0 -0
  22. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/customer-refactor.yml +0 -0
  23. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/forge-self-certify.yml +0 -0
  24. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/mcp-registry-publish.yml +0 -0
  25. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/metrics-auto-regen.yml +0 -0
  26. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/metrics-drift.yml +0 -0
  27. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/publish-on-tag.yml +0 -0
  28. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/release-readiness.yml +0 -0
  29. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/release.yml +0 -0
  30. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/surface-drift.yml +0 -0
  31. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/.github/workflows/uptime.yml +0 -0
  32. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/ARCHITECTURE.md +0 -0
  33. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/CONTRIBUTING.md +0 -0
  34. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/LICENSE +0 -0
  35. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/MANIFEST.in +0 -0
  36. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/README.md +0 -0
  37. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/SECURITY.md +0 -0
  38. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/assets/Atomadic-Forge-01.png +0 -0
  39. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/01-getting-started.md +0 -0
  40. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/02-commands.md +0 -0
  41. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/03-tutorial.md +0 -0
  42. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/04-llm-loops.md +0 -0
  43. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/05-faq.md +0 -0
  44. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/AGENTS_GUIDE.md +0 -0
  45. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/AIR_GAPPED.md +0 -0
  46. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/CI_CD.md +0 -0
  47. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/CODEX_WALKTHROUGH.md +0 -0
  48. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/COMMANDS.md +0 -0
  49. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/FIRST_10_MINUTES.md +0 -0
  50. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/FORMALIZATION.md +0 -0
  51. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/HIVE_PRIMITIVES.md +0 -0
  52. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/HIVE_STATUS.md +0 -0
  53. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/IDE_INTEGRATION.md +0 -0
  54. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/LANDSCAPE.md +0 -0
  55. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/MARKET_POSITIONING.md +0 -0
  56. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/MCP_TOOLS.md +0 -0
  57. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/MIGRATION.md +0 -0
  58. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/MULTI_REPO.md +0 -0
  59. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/PROVIDERS.md +0 -0
  60. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/README.md +0 -0
  61. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/RECEIPT.md +0 -0
  62. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/RELAY_PROTOCOL.md +0 -0
  63. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/RELEASE_CHECKLIST.md +0 -0
  64. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/RELEASE_MESSAGING.md +0 -0
  65. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/ROADMAP.md +0 -0
  66. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/SHOWCASE.md +0 -0
  67. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/SIDECAR.md +0 -0
  68. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/STUDIO.md +0 -0
  69. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  70. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
  71. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
  72. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/WHY_NOW.md +0 -0
  73. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  74. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/WORLD_COLLISION.md +0 -0
  75. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/INDEX.md +0 -0
  76. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/absorb.md +0 -0
  77. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/audit.md +0 -0
  78. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/chat.md +0 -0
  79. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/commandsmith.md +0 -0
  80. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/config.md +0 -0
  81. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/create.md +0 -0
  82. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/demo.md +0 -0
  83. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/emergent-swarm.md +0 -0
  84. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/emergent-then-synergy.md +0 -0
  85. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/emergent.md +0 -0
  86. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/enhancement.md +0 -0
  87. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/evolve-then-iterate.md +0 -0
  88. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/evolve.md +0 -0
  89. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/feature-then-emergent.md +0 -0
  90. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/guard-install.md +0 -0
  91. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/handoff.md +0 -0
  92. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/harvest.md +0 -0
  93. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/hive.md +0 -0
  94. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/iterate.md +0 -0
  95. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/materialize.md +0 -0
  96. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/recon-swarm.md +0 -0
  97. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/relay.md +0 -0
  98. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/surface.md +0 -0
  99. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/synergy-then-emergent.md +0 -0
  100. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/synergy.md +0 -0
  101. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/welcome.md +0 -0
  102. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/commands/wisdom.md +0 -0
  103. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  104. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/compliance/CS-1.md +0 -0
  105. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  106. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  107. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  108. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  109. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/01-quickstart.md +0 -0
  110. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/02-your-first-package.md +0 -0
  111. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/03-the-five-tier-law.md +0 -0
  112. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/04-plug-in-llms.md +0 -0
  113. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  114. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/docs/tutorials/06-javascript-quickstart.md +0 -0
  115. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/setup.cfg +0 -0
  116. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/__init__.py +0 -0
  117. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/__main__.py +0 -0
  118. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  119. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  120. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  121. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  122. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  123. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  124. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  125. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  126. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  127. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  128. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  129. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  130. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
  131. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  132. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  133. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  134. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  135. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  136. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  137. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  138. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  139. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
  140. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  141. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  142. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  143. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  144. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  145. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  146. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  147. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
  148. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  149. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  150. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  151. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  152. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
  153. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  154. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
  155. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
  156. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  157. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  158. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  159. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  160. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  161. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  162. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  163. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  164. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  165. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  166. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  167. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  168. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
  169. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
  170. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  171. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  172. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  173. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  174. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  175. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  176. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  177. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  178. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  179. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  180. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  181. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  182. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  183. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
  184. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  185. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
  186. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  187. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
  188. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
  189. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  190. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  191. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  192. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  193. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  194. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  195. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  196. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  197. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  198. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  199. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  200. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  201. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
  202. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  203. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
  204. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  205. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  206. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  207. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
  208. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
  209. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
  210. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  211. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  212. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  213. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  214. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  215. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  216. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  217. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  218. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  219. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  220. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  221. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  222. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  223. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
  224. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  225. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  226. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  227. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  228. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  229. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
  230. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
  231. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  232. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
  233. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  234. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  235. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  236. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  237. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  238. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  239. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  240. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  241. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  242. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  243. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  244. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  245. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
  246. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  247. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  248. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  249. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  250. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  251. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  252. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  253. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  254. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  255. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  256. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  257. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  258. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  259. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  260. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  261. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  262. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  263. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
  264. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  265. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
  266. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  267. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  268. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  269. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  270. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
  271. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  272. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  273. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  274. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  275. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  276. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  277. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  278. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  279. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  280. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  281. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  282. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  283. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  284. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  285. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  286. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  287. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  288. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
  289. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  290. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  291. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  292. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  293. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  294. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  295. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  296. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
  297. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  298. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  299. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  300. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
  301. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  302. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  303. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
  304. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
  305. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  306. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  307. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
  308. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  309. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  310. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  311. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/__init__.py +0 -0
  312. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/_registry.py +0 -0
  313. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/absorb.py +0 -0
  314. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/audit.py +0 -0
  315. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/chat.py +0 -0
  316. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/commandsmith.py +0 -0
  317. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/config_cmd.py +0 -0
  318. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/create.py +0 -0
  319. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/demo.py +0 -0
  320. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent.py +0 -0
  321. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  322. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  323. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/enhancement.py +0 -0
  324. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/evolve.py +0 -0
  325. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  326. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  327. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/guard_install.py +0 -0
  328. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/handoff.py +0 -0
  329. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/harvest.py +0 -0
  330. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/hive.py +0 -0
  331. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/iterate.py +0 -0
  332. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/materialize.py +0 -0
  333. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  334. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/relay.py +0 -0
  335. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/surface.py +0 -0
  336. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/synergy.py +0 -0
  337. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  338. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/welcome.py +0 -0
  339. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/wisdom.py +0 -0
  340. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/SOURCES.txt +0 -0
  341. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  342. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  343. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/requires.txt +0 -0
  344. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  345. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_aaaa_nexus_client.py +0 -0
  346. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_abstract_method_repair.py +0 -0
  347. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_agent_hire_protocol.py +0 -0
  348. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_agent_plan.py +0 -0
  349. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_agent_plan_pkg_label.py +0 -0
  350. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_agent_summary.py +0 -0
  351. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_ast_scope_lock.py +0 -0
  352. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_audit_verb.py +0 -0
  353. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_body_extractor_repairs.py +0 -0
  354. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_call_graph_summary.py +0 -0
  355. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_capability_scout.py +0 -0
  356. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_card_renderer.py +0 -0
  357. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_certify_operational_axis.py +0 -0
  358. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_chat.py +0 -0
  359. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_cherry_pick.py +0 -0
  360. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_classify_tier.py +0 -0
  361. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_classify_tier_ast_signals.py +0 -0
  362. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_cli_smoke.py +0 -0
  363. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_cli_swarm_aliases.py +0 -0
  364. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_codex_5_complete.py +0 -0
  365. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_codex_6_enforce_polyglot.py +0 -0
  366. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_commandsmith.py +0 -0
  367. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_compiler_feedback.py +0 -0
  368. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_compliance_checker.py +0 -0
  369. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_config.py +0 -0
  370. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_copilots_copilot.py +0 -0
  371. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_cost_circuit_breaker.py +0 -0
  372. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_create_feature.py +0 -0
  373. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_cs1_renderer.py +0 -0
  374. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_custom_provider.py +0 -0
  375. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_dead_code_check.py +0 -0
  376. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_dedup_engine.py +0 -0
  377. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_demo.py +0 -0
  378. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_emergent_compose.py +0 -0
  379. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_emergent_signature_extract.py +0 -0
  380. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_emergent_synthesize_imports.py +0 -0
  381. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_enhancement_proposal.py +0 -0
  382. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_error_codes.py +0 -0
  383. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_error_hints.py +0 -0
  384. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_evolve_js.py +0 -0
  385. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_exported_api_check.py +0 -0
  386. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_finalize_scaffold.py +0 -0
  387. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_forge_action.py +0 -0
  388. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_forge_auth_a1.py +0 -0
  389. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_forge_auth_a2.py +0 -0
  390. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_forge_enforce.py +0 -0
  391. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_generation_quality.py +0 -0
  392. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_git_churn.py +0 -0
  393. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_handoff.py +0 -0
  394. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_harvest_concept_bridge.py +0 -0
  395. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_hierarchical_memory.py +0 -0
  396. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_hive_sync.py +0 -0
  397. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_ignore_and_docs.py +0 -0
  398. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_import_smoke.py +0 -0
  399. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_iterate_evolve.py +0 -0
  400. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_js_certify.py +0 -0
  401. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_js_parser.py +0 -0
  402. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_js_recon.py +0 -0
  403. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_js_wire.py +0 -0
  404. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_lineage_chain.py +0 -0
  405. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_ling_provider.py +0 -0
  406. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_local_signer.py +0 -0
  407. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_lsp_protocol.py +0 -0
  408. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_maintainability_index.py +0 -0
  409. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_manifest_diff.py +0 -0
  410. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_materialize_feature.py +0 -0
  411. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_mcp_lazy_bootstrap.py +0 -0
  412. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_mcp_protocol.py +0 -0
  413. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_nexus_bridge.py +0 -0
  414. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_ollama_client.py +0 -0
  415. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_pipeline.py +0 -0
  416. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_plan_apply.py +0 -0
  417. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_polyglot_cli_mcp.py +0 -0
  418. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_polyglot_full_pipeline.py +0 -0
  419. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_polyglot_hardening.py +0 -0
  420. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_polyglot_swift_kotlin_go.py +0 -0
  421. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_polyglot_symbol_parity.py +0 -0
  422. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_pre_audit_smoke.py +0 -0
  423. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_precommit_hooks.py +0 -0
  424. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_progress_reporter.py +0 -0
  425. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_receipt_emitter.py +0 -0
  426. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_receipt_schema.py +0 -0
  427. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_receipt_signer.py +0 -0
  428. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_remote_seed_store.py +0 -0
  429. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_response_enricher.py +0 -0
  430. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_roi_calculator.py +0 -0
  431. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_sbom_cmd_text_summary.py +0 -0
  432. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_sbom_emitter.py +0 -0
  433. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_scaffold.py +0 -0
  434. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_sidecar.py +0 -0
  435. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_sidecar_validate.py +0 -0
  436. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_smell_score_formula.py +0 -0
  437. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_stagnation.py +0 -0
  438. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_steersman_pack.py +0 -0
  439. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_stub_detector.py +0 -0
  440. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_surface_export.py +0 -0
  441. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_surface_gap_check.py +0 -0
  442. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_synergy.py +0 -0
  443. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_test_runner.py +0 -0
  444. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_tier_init_rebuild.py +0 -0
  445. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_trust_gate_response.py +0 -0
  446. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_verify_suggested_recipe.py +0 -0
  447. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_welcome.py +0 -0
  448. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_welcome_enhancements.py +0 -0
  449. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_whoami_cmd.py +0 -0
  450. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_wire_certify.py +0 -0
  451. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_wire_stubs_gen.py +0 -0
  452. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_wire_suggest_repairs.py +0 -0
  453. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_wire_type_checking.py +0 -0
  454. {atomadic_forge-0.75.1 → atomadic_forge-0.75.3}/tests/test_wisdom.py +0 -0
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.75.3 — 2026-05-08
6
+
7
+ ### Changed
8
+
9
+ - d4b631b feat(metrics): sync tagged repo metrics surfaces (GP Lane C W6)
10
+
11
+
12
+ ## v0.75.2 — 2026-05-08
13
+
14
+ ### Changed
15
+
16
+ - c411603 fix(docs): close wrapped whitepaper drift (GP Lane C W6)
17
+
18
+
5
19
  ## v0.75.1 — 2026-05-08
6
20
 
7
21
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.75.1
3
+ Version: 0.75.3
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
@@ -0,0 +1,91 @@
1
+ # `atomadic-forge metrics`
2
+
3
+ _Emit forge_metrics.json — canonical metrics for README/CHANGELOG/welcome/worker._
4
+
5
+ - **Module**: `atomadic_forge.commands.metrics`
6
+ - **Surface**: `typer_app`
7
+ - **Source root**: `atomadic_forge_seed`
8
+ - **Hidden**: `False`
9
+
10
+ ## Forge metrics
11
+
12
+ Use the top-level command when updating Forge's own public counters.
13
+
14
+ ```bash
15
+ forge metrics
16
+ forge metrics --apply
17
+ forge metrics --json
18
+ ```
19
+
20
+ `--apply` rewrites `forge_metrics.json`. This artifact is Forge-specific:
21
+ README badges, release automation, and Worker metadata read from it.
22
+
23
+ ## Product repo metrics
24
+
25
+ Use the `repo` subcommand when updating any product repository's own public
26
+ surface.
27
+
28
+ ```bash
29
+ forge metrics repo --project /path/to/product
30
+ forge metrics repo --project /path/to/product --apply
31
+ forge metrics repo --project /path/to/product --json
32
+ forge metrics repo --project /path/to/product --init-config --apply
33
+ forge metrics repo --project /path/to/product --apply --commit --push
34
+ ```
35
+
36
+ The repo sync is intentionally separate from Forge metrics. It computes the
37
+ target repo's source files, source lines, test files, languages, name, and
38
+ version, then plans these bounded writes:
39
+
40
+ | File | Update |
41
+ |------|--------|
42
+ | `repo_metrics.json` | Canonical product metrics artifact |
43
+ | `README.md` | Metrics copy block between `<!-- forge:metrics:start -->` markers |
44
+ | `server.json` | MCP registry version and description, when present |
45
+
46
+ Dry-run is the default. Passing `--apply` writes the product surface and does
47
+ not mutate `forge_metrics.json`.
48
+
49
+ ### Config and live external surfaces
50
+
51
+ Repos can opt into a custom metrics surface with
52
+ `.atomadic-forge/repo-metrics.config.json`:
53
+
54
+ ```json
55
+ {
56
+ "schema_version": "atomadic-forge.repo_metrics_config/v1",
57
+ "artifact_path": "public/metrics.json",
58
+ "document_globs": ["README.md", "docs/**/*.md", "website/**/*.mdx"],
59
+ "readme_block": true,
60
+ "sync_server_json": true,
61
+ "extra_metrics": {
62
+ "customer_count": 42
63
+ },
64
+ "aliases": {
65
+ "customers": "customer_count"
66
+ }
67
+ }
68
+ ```
69
+
70
+ `artifact_path` is the JSON file your site or Worker can serve. For example,
71
+ set it to `public/metrics.json`, deploy that folder, and the website can fetch
72
+ the same live repo metrics as ordinary JSON.
73
+
74
+ Any configured document can contain inline metric markers:
75
+
76
+ ```md
77
+ Source files: <!-- forge:metric key=source_file_count format=comma -->0<!-- /forge:metric -->
78
+ Customers: <!-- forge:metric customers -->0<!-- /forge:metric -->
79
+ Languages: <!-- forge:metric languages -->unknown<!-- /forge:metric -->
80
+ ```
81
+
82
+ On `forge metrics repo --apply`, Forge scans the configured document globs,
83
+ updates every marker it finds, writes the metrics artifact, and leaves
84
+ unmarked prose alone. Supported marker formats are `plain`, `comma`,
85
+ `compact`, and `json`. Markers inside fenced code blocks are treated as
86
+ examples and are not updated.
87
+
88
+ For release automation, pass `--commit` to stage and commit only the files
89
+ Forge planned to write. Pass `--push` to commit if needed and push the current
90
+ branch after the metrics surface is refreshed.
91
+
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.75.1"
7
+ version = "0.75.3"
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"
@@ -59,8 +59,11 @@ _CHANGELOG_VER_RE = re.compile(r"^## v(\d+\.\d+\.\d+)", re.MULTILINE)
59
59
  # IDE_INTEGRATION.md: matches "**NN tools**" or "**NN tools dispatching NN actions**"
60
60
  _IDE_TOOLS_RE = re.compile(r'\*\*\d+ tools(?:\s+dispatching\s+\d+\s+actions)?\*\*')
61
61
 
62
- # WHITEPAPER.md: matches "NN MCP tools [word] dispatching NN actions" (optional mid-word)
63
- _WP_TOOLS_PHRASE_RE = re.compile(r'(\d+) MCP tools(?:\s+\w+)? dispatching (\d+) actions')
62
+ # WHITEPAPER.md: matches "NN MCP tools [word] dispatching NN actions",
63
+ # including prose line wraps between "MCP" and "tools".
64
+ _WP_TOOLS_PHRASE_RE = re.compile(
65
+ r'(\d+)\s+MCP\s+tools(?:\s+\w+)?\s+dispatching\s+(\d+)\s+actions'
66
+ )
64
67
  # WHITEPAPER.md: matches "NN,NNN passing tests" or "NN passing tests"
65
68
  _WP_TESTS_RE = re.compile(r'([\d,]+) passing tests')
66
69
 
@@ -12,6 +12,8 @@ import re
12
12
  from typing import Any
13
13
 
14
14
  SCHEMA_VERSION_REPO_METRICS_V1 = "atomadic-forge.repo_metrics/v1"
15
+ SCHEMA_VERSION_REPO_METRICS_CONFIG_V1 = "atomadic-forge.repo_metrics_config/v1"
16
+ DEFAULT_REPO_METRICS_CONFIG_PATH = ".atomadic-forge/repo-metrics.config.json"
15
17
 
16
18
  _SOURCE_EXTS = {
17
19
  ".py": "Python",
@@ -44,6 +46,32 @@ _SKIP_PARTS = {
44
46
  _TEST_NAME_RE = re.compile(r"(^test_|_test\.|\.test\.|\.spec\.)")
45
47
  _PYPROJECT_VERSION_RE = re.compile(r'(?m)^version\s*=\s*"([^"]+)"')
46
48
  _PYPROJECT_NAME_RE = re.compile(r'(?m)^name\s*=\s*"([^"]+)"')
49
+ _METRIC_MARKER_RE = re.compile(
50
+ r"(?P<open><!--\s*forge:metric(?P<attrs>[^>]*)-->)"
51
+ r"(?P<body>.*?)"
52
+ r"(?P<close><!--\s*/forge:metric\s*-->)",
53
+ re.DOTALL,
54
+ )
55
+ _FENCED_CODE_RE = re.compile(r"(```.*?```)", re.DOTALL)
56
+ _ATTR_RE = re.compile(r"\b(?P<key>[a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*"
57
+ r"(?P<quote>['\"]?)(?P<value>[^'\"\s]+)(?P=quote)")
58
+
59
+ DEFAULT_REPO_METRICS_CONFIG: dict[str, Any] = {
60
+ "schema_version": SCHEMA_VERSION_REPO_METRICS_CONFIG_V1,
61
+ "artifact_path": "repo_metrics.json",
62
+ "document_globs": [
63
+ "README.md",
64
+ "docs/**/*.md",
65
+ "site/**/*.md",
66
+ "website/**/*.md",
67
+ "app/**/*.mdx",
68
+ "src/**/*.mdx",
69
+ ],
70
+ "readme_block": True,
71
+ "sync_server_json": True,
72
+ "extra_metrics": {},
73
+ "aliases": {},
74
+ }
47
75
 
48
76
 
49
77
  def should_skip_public_metric_path(path_parts: tuple[str, ...]) -> bool:
@@ -117,6 +145,40 @@ def compute_repo_public_metrics_from_records(
117
145
  }
118
146
 
119
147
 
148
+ def normalize_repo_metrics_config(raw: dict[str, Any] | None = None) -> dict[str, Any]:
149
+ """Return a forward-compatible repo metrics config."""
150
+ config = dict(DEFAULT_REPO_METRICS_CONFIG)
151
+ incoming = raw or {}
152
+ for key, value in incoming.items():
153
+ if key in {"document_globs"} and isinstance(value, list):
154
+ config[key] = [str(item) for item in value if str(item).strip()]
155
+ elif key in {"readme_block", "sync_server_json"}:
156
+ config[key] = bool(value)
157
+ elif key in {"extra_metrics", "aliases"} and isinstance(value, dict):
158
+ config[key] = dict(value)
159
+ elif key == "artifact_path" and str(value).strip():
160
+ config[key] = str(value)
161
+ elif key == "schema_version":
162
+ config[key] = str(value)
163
+ if not config["document_globs"]:
164
+ config["document_globs"] = list(DEFAULT_REPO_METRICS_CONFIG["document_globs"])
165
+ return config
166
+
167
+
168
+ def render_repo_metrics_config_json(config: dict[str, Any] | None = None) -> str:
169
+ """Stable starter config for any repo using ``forge metrics repo``."""
170
+ return json.dumps(normalize_repo_metrics_config(config), indent=2, sort_keys=True) + "\n"
171
+
172
+
173
+ def metrics_with_config(metrics: dict[str, Any], config: dict[str, Any]) -> dict[str, Any]:
174
+ """Overlay configured customer metrics onto computed repo metrics."""
175
+ combined = dict(metrics)
176
+ extra = config.get("extra_metrics", {})
177
+ if isinstance(extra, dict):
178
+ combined.update(extra)
179
+ return combined
180
+
181
+
120
182
  def render_repo_metrics_json(metrics: dict[str, Any]) -> str:
121
183
  """Stable JSON for ``repo_metrics.json``."""
122
184
  return json.dumps(metrics, indent=2, sort_keys=True) + "\n"
@@ -160,6 +222,72 @@ def render_readme_with_metrics(readme_text: str, metrics: dict[str, Any]) -> str
160
222
  return readme_text.rstrip() + "\n\n" + block
161
223
 
162
224
 
225
+ def _parse_marker_attrs(attrs: str) -> dict[str, str]:
226
+ parsed = {m.group("key"): m.group("value") for m in _ATTR_RE.finditer(attrs)}
227
+ if "key" not in parsed:
228
+ for token in attrs.strip().split():
229
+ if "=" not in token:
230
+ parsed["key"] = token.strip()
231
+ break
232
+ return parsed
233
+
234
+
235
+ def _resolve_metric_value(metrics: dict[str, Any], aliases: dict[str, Any], key: str) -> Any:
236
+ target = aliases.get(key, key)
237
+ current: Any = metrics
238
+ for part in str(target).split("."):
239
+ if isinstance(current, dict) and part in current:
240
+ current = current[part]
241
+ else:
242
+ return None
243
+ return current
244
+
245
+
246
+ def format_metric_value(value: Any, fmt: str = "plain") -> str:
247
+ """Render a metric value for inline docs/site markers."""
248
+ if fmt == "json":
249
+ return json.dumps(value, sort_keys=True)
250
+ if isinstance(value, list):
251
+ value = ", ".join(str(item) for item in value)
252
+ if fmt == "comma" and isinstance(value, int):
253
+ return f"{value:,}"
254
+ if fmt == "compact" and isinstance(value, int):
255
+ if abs(value) >= 1_000_000:
256
+ return f"{value / 1_000_000:.1f}M".replace(".0M", "M")
257
+ if abs(value) >= 1_000:
258
+ return f"{value / 1_000:.0f}K"
259
+ return str(value)
260
+
261
+
262
+ def render_text_with_metric_markers(
263
+ text: str,
264
+ metrics: dict[str, Any],
265
+ config: dict[str, Any] | None = None,
266
+ ) -> str:
267
+ """Refresh inline ``forge:metric`` markers in arbitrary text."""
268
+ normalized = normalize_repo_metrics_config(config)
269
+ aliases = normalized.get("aliases", {})
270
+ if not isinstance(aliases, dict):
271
+ aliases = {}
272
+
273
+ def replace(match: re.Match[str]) -> str:
274
+ attrs = _parse_marker_attrs(match.group("attrs"))
275
+ key = attrs.get("key")
276
+ if not key:
277
+ return match.group(0)
278
+ value = _resolve_metric_value(metrics, aliases, key)
279
+ if value is None:
280
+ return match.group(0)
281
+ rendered = format_metric_value(value, attrs.get("format", "plain"))
282
+ return f"{match.group('open')}{rendered}{match.group('close')}"
283
+
284
+ parts = _FENCED_CODE_RE.split(text)
285
+ for idx, part in enumerate(parts):
286
+ if idx % 2 == 0:
287
+ parts[idx] = _METRIC_MARKER_RE.sub(replace, part)
288
+ return "".join(parts)
289
+
290
+
163
291
  def render_server_json_with_metrics(server_text: str, metrics: dict[str, Any]) -> str:
164
292
  """Update MCP registry/server metadata from repo metrics."""
165
293
  data = json.loads(server_text)
@@ -184,32 +312,53 @@ def plan_repo_public_surface_from_inputs(
184
312
  metrics: dict[str, Any],
185
313
  readme_text: str | None = None,
186
314
  server_text: str | None = None,
315
+ documents: dict[str, str] | None = None,
316
+ config: dict[str, Any] | None = None,
187
317
  ) -> dict[str, Any]:
188
318
  """Return planned public-surface writes from already-loaded inputs."""
319
+ normalized = normalize_repo_metrics_config(config)
320
+ rendered_metrics = metrics_with_config(metrics, normalized)
189
321
  writes: list[dict[str, str]] = [{
190
- "path": "repo_metrics.json",
322
+ "path": str(normalized.get("artifact_path") or "repo_metrics.json"),
191
323
  "reason": "canonical product metrics",
192
- "content": render_repo_metrics_json(metrics),
324
+ "content": render_repo_metrics_json(rendered_metrics),
193
325
  }]
194
- if readme_text is not None:
326
+ document_texts = dict(documents or {})
327
+ if readme_text is not None and "README.md" not in document_texts:
328
+ document_texts["README.md"] = readme_text
329
+ for path, text in sorted(document_texts.items()):
330
+ if path == "README.md" and normalized.get("readme_block", True):
331
+ continue
332
+ updated = render_text_with_metric_markers(text, rendered_metrics, normalized)
333
+ if updated != text:
334
+ writes.append({
335
+ "path": path,
336
+ "reason": "Forge metric markers",
337
+ "content": updated,
338
+ })
339
+ if readme_text is not None and normalized.get("readme_block", True):
340
+ marked_readme = render_text_with_metric_markers(
341
+ readme_text, rendered_metrics, normalized
342
+ )
195
343
  writes.append({
196
344
  "path": "README.md",
197
345
  "reason": "Forge-managed public metrics copy block",
198
- "content": render_readme_with_metrics(readme_text, metrics),
346
+ "content": render_readme_with_metrics(marked_readme, rendered_metrics),
199
347
  })
200
- if server_text is not None:
348
+ if server_text is not None and normalized.get("sync_server_json", True):
201
349
  try:
202
350
  writes.append({
203
351
  "path": "server.json",
204
352
  "reason": "MCP registry metadata version/description sync",
205
- "content": render_server_json_with_metrics(server_text, metrics),
353
+ "content": render_server_json_with_metrics(server_text, rendered_metrics),
206
354
  })
207
355
  except json.JSONDecodeError:
208
356
  pass
209
357
  return {
210
358
  "schema_version": "atomadic-forge.repo_public_surface_plan/v1",
211
359
  "project_root": project_root,
212
- "metrics": metrics,
360
+ "config": normalized,
361
+ "metrics": rendered_metrics,
213
362
  "writes": writes,
214
363
  "write_count": len(writes),
215
364
  }
@@ -217,12 +366,19 @@ def plan_repo_public_surface_from_inputs(
217
366
 
218
367
  __all__ = [
219
368
  "SCHEMA_VERSION_REPO_METRICS_V1",
369
+ "SCHEMA_VERSION_REPO_METRICS_CONFIG_V1",
370
+ "DEFAULT_REPO_METRICS_CONFIG_PATH",
220
371
  "compute_repo_public_metrics_from_records",
372
+ "format_metric_value",
221
373
  "infer_project_identity_from_metadata",
374
+ "metrics_with_config",
375
+ "normalize_repo_metrics_config",
222
376
  "plan_repo_public_surface_from_inputs",
223
377
  "render_readme_metrics_block",
224
378
  "render_readme_with_metrics",
379
+ "render_repo_metrics_config_json",
225
380
  "render_repo_metrics_json",
226
381
  "render_server_json_with_metrics",
382
+ "render_text_with_metric_markers",
227
383
  "should_skip_public_metric_path",
228
384
  ]
@@ -6,13 +6,17 @@ metric computation/rendering to ``a1_at_functions/repo_public_surface.py``.
6
6
  """
7
7
  from __future__ import annotations
8
8
 
9
+ import json
9
10
  from pathlib import Path
10
11
  from typing import Any
11
12
 
12
13
  from atomadic_forge.a1_at_functions.repo_public_surface import (
14
+ DEFAULT_REPO_METRICS_CONFIG_PATH,
13
15
  compute_repo_public_metrics_from_records,
14
16
  infer_project_identity_from_metadata,
17
+ normalize_repo_metrics_config,
15
18
  plan_repo_public_surface_from_inputs,
19
+ render_repo_metrics_config_json,
16
20
  should_skip_public_metric_path,
17
21
  )
18
22
 
@@ -34,6 +38,38 @@ def _identity_for_root(root: Path) -> dict[str, str]:
34
38
  )
35
39
 
36
40
 
41
+ def _safe_relative_path(path_text: str, fallback: str) -> str:
42
+ path = Path(path_text)
43
+ if path.is_absolute() or ".." in path.parts:
44
+ return fallback
45
+ return path.as_posix()
46
+
47
+
48
+ def load_repo_metrics_config(
49
+ project_root: Path | str,
50
+ config_path: Path | str | None = None,
51
+ ) -> dict[str, Any]:
52
+ """Load optional repo metrics config, falling back to defaults."""
53
+ root = Path(project_root).resolve()
54
+ path = Path(config_path) if config_path else root / DEFAULT_REPO_METRICS_CONFIG_PATH
55
+ if not path.is_absolute():
56
+ path = root / path
57
+ raw: dict[str, Any] = {}
58
+ if path.exists():
59
+ try:
60
+ loaded = json.loads(_read_text(path))
61
+ if isinstance(loaded, dict):
62
+ raw = loaded
63
+ except json.JSONDecodeError:
64
+ raw = {}
65
+ config = normalize_repo_metrics_config(raw)
66
+ config["artifact_path"] = _safe_relative_path(
67
+ str(config.get("artifact_path") or "repo_metrics.json"),
68
+ "repo_metrics.json",
69
+ )
70
+ return config
71
+
72
+
37
73
  def compute_repo_public_metrics(project_root: Path | str) -> dict[str, Any]:
38
74
  """Compute product-facing metrics for any source repository."""
39
75
  root = Path(project_root).resolve()
@@ -52,9 +88,31 @@ def compute_repo_public_metrics(project_root: Path | str) -> dict[str, Any]:
52
88
  return compute_repo_public_metrics_from_records(_identity_for_root(root), records)
53
89
 
54
90
 
55
- def plan_repo_public_surface_sync(project_root: Path | str) -> dict[str, Any]:
91
+ def _configured_documents(root: Path, config: dict[str, Any]) -> dict[str, str]:
92
+ documents: dict[str, str] = {}
93
+ for pattern in config.get("document_globs") or []:
94
+ pattern_text = str(pattern)
95
+ if not pattern_text or Path(pattern_text).is_absolute():
96
+ continue
97
+ for path in root.glob(pattern_text):
98
+ if not path.is_file():
99
+ continue
100
+ rel_path = path.relative_to(root)
101
+ if should_skip_public_metric_path(tuple(rel_path.parts)):
102
+ continue
103
+ if path.suffix.lower() not in {".md", ".mdx", ".html", ".htm"}:
104
+ continue
105
+ documents[rel_path.as_posix()] = _read_text(path)
106
+ return documents
107
+
108
+
109
+ def plan_repo_public_surface_sync(
110
+ project_root: Path | str,
111
+ config_path: Path | str | None = None,
112
+ ) -> dict[str, Any]:
56
113
  """Return planned public-surface writes for any product repo."""
57
114
  root = Path(project_root).resolve()
115
+ config = load_repo_metrics_config(root, config_path=config_path)
58
116
  readme = root / "README.md"
59
117
  server = root / "server.json"
60
118
  return plan_repo_public_surface_from_inputs(
@@ -62,10 +120,14 @@ def plan_repo_public_surface_sync(project_root: Path | str) -> dict[str, Any]:
62
120
  metrics=compute_repo_public_metrics(root),
63
121
  readme_text=_read_text(readme) if readme.exists() else None,
64
122
  server_text=_read_text(server) if server.exists() else None,
123
+ documents=_configured_documents(root, config),
124
+ config=config,
65
125
  )
66
126
 
67
127
 
68
128
  __all__ = [
69
129
  "compute_repo_public_metrics",
130
+ "load_repo_metrics_config",
70
131
  "plan_repo_public_surface_sync",
132
+ "render_repo_metrics_config_json",
71
133
  ]
@@ -18,13 +18,16 @@ Usage::
18
18
  from __future__ import annotations
19
19
 
20
20
  import json
21
+ import subprocess
21
22
  from pathlib import Path
22
23
  from typing import Annotated
23
24
 
24
25
  import typer
25
26
 
26
27
  from atomadic_forge.a2_mo_composites.repo_public_surface_sync import (
28
+ DEFAULT_REPO_METRICS_CONFIG_PATH,
27
29
  plan_repo_public_surface_sync,
30
+ render_repo_metrics_config_json,
28
31
  )
29
32
  from atomadic_forge.a3_og_features.forge_metrics_feature import emit_forge_metrics
30
33
 
@@ -140,6 +143,30 @@ def repo_cmd(
140
143
  "--json",
141
144
  help="Emit the plan as JSON.",
142
145
  )] = False,
146
+ config: Annotated[Path | None, typer.Option(
147
+ "--config",
148
+ help="Optional repo metrics config JSON path.",
149
+ exists=False,
150
+ file_okay=True,
151
+ dir_okay=False,
152
+ resolve_path=False,
153
+ )] = None,
154
+ init_config: Annotated[bool, typer.Option(
155
+ "--init-config",
156
+ help="Create a starter .atomadic-forge/repo-metrics.config.json.",
157
+ )] = False,
158
+ commit: Annotated[bool, typer.Option(
159
+ "--commit",
160
+ help="After --apply, commit the repo metrics surface changes.",
161
+ )] = False,
162
+ push: Annotated[bool, typer.Option(
163
+ "--push",
164
+ help="After --apply, commit if needed and push the current branch.",
165
+ )] = False,
166
+ message: Annotated[str, typer.Option(
167
+ "--message",
168
+ help="Commit message used with --commit/--push.",
169
+ )] = "docs(metrics): sync repo public metrics",
143
170
  ) -> None:
144
171
  """Update a product repo's own public metrics and copy surface.
145
172
 
@@ -148,7 +175,29 @@ def repo_cmd(
148
175
  README block between ``<!-- forge:metrics:start -->`` markers, and
149
176
  syncs MCP ``server.json`` version/description when present.
150
177
  """
151
- plan = plan_repo_public_surface_sync(project)
178
+ root = project.resolve()
179
+ if init_config:
180
+ target = config if config is not None else Path(DEFAULT_REPO_METRICS_CONFIG_PATH)
181
+ target_path = target if target.is_absolute() else root / target
182
+ content = render_repo_metrics_config_json()
183
+ if json_out:
184
+ typer.echo(json.dumps({
185
+ "schema_version": "atomadic-forge.repo_metrics_config_plan/v1",
186
+ "path": str(target_path),
187
+ "content": content,
188
+ "would_write": not apply,
189
+ }, indent=2, sort_keys=True))
190
+ return
191
+ if apply:
192
+ target_path.parent.mkdir(parents=True, exist_ok=True)
193
+ target_path.write_text(content, encoding="utf-8")
194
+ typer.echo(f"wrote {target_path}")
195
+ else:
196
+ typer.echo(f"would write {target_path}")
197
+ typer.echo("\n(dry-run; pass --apply to create the config)")
198
+ return
199
+
200
+ plan = plan_repo_public_surface_sync(root, config_path=config)
152
201
  if json_out:
153
202
  typer.echo(json.dumps(plan, indent=2, sort_keys=True))
154
203
  return
@@ -167,12 +216,45 @@ def repo_cmd(
167
216
  " languages : "
168
217
  + ", ".join(plan["metrics"].get("languages") or ["unknown"])
169
218
  )
219
+ written_paths: list[str] = []
170
220
  for write in plan["writes"]:
171
- target = project / write["path"]
221
+ target = (root / write["path"]).resolve()
222
+ try:
223
+ target.relative_to(root)
224
+ except ValueError:
225
+ typer.echo(f" skipped {write['path']} — outside project root", err=True)
226
+ continue
172
227
  if apply:
228
+ target.parent.mkdir(parents=True, exist_ok=True)
173
229
  target.write_text(write["content"], encoding="utf-8")
230
+ written_paths.append(write["path"])
174
231
  typer.echo(f" wrote {write['path']} — {write['reason']}")
175
232
  else:
176
233
  typer.echo(f" would write {write['path']} — {write['reason']}")
177
234
  if not apply:
178
235
  typer.echo("\n(dry-run; pass --apply to update the product surface)")
236
+ return
237
+ if (commit or push) and written_paths:
238
+ subprocess.run(["git", "add", *written_paths], cwd=str(root), check=True)
239
+ diff = subprocess.run(
240
+ ["git", "diff", "--cached", "--quiet"],
241
+ cwd=str(root),
242
+ )
243
+ if diff.returncode == 0:
244
+ typer.echo(" no metric changes to commit")
245
+ else:
246
+ subprocess.run(["git", "commit", "-m", message], cwd=str(root), check=True)
247
+ typer.echo(f" committed — {message}")
248
+ if push:
249
+ branch = subprocess.run(
250
+ ["git", "branch", "--show-current"],
251
+ cwd=str(root),
252
+ capture_output=True,
253
+ text=True,
254
+ check=True,
255
+ ).stdout.strip()
256
+ if not branch:
257
+ typer.echo(" push skipped — detached HEAD", err=True)
258
+ return
259
+ subprocess.run(["git", "push", "-u", "origin", branch], cwd=str(root), check=True)
260
+ typer.echo(f" pushed origin/{branch}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.75.1
3
+ Version: 0.75.3
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
@@ -14,6 +14,7 @@ from atomadic_forge.a1_at_functions.doc_auto_update import (
14
14
  _load_metrics,
15
15
  run_doc_auto_update,
16
16
  update_changelog,
17
+ update_extended_docs,
17
18
  update_readme,
18
19
  )
19
20
 
@@ -181,3 +182,18 @@ def test_count_mcp_actions_per_tool_real_project() -> None:
181
182
  counts = _count_mcp_actions_per_tool(real_root)
182
183
  assert counts.get("explore", 0) > 10
183
184
  assert counts.get("audit", 0) > 10
185
+
186
+
187
+ def test_extended_docs_updates_wrapped_whitepaper_tool_phrase(tmp_project: Path) -> None:
188
+ (tmp_project / "WHITEPAPER.md").write_text(
189
+ "Traction: **10 MCP\n"
190
+ "tools live dispatching 79 actions**, and **123 passing tests**.\n",
191
+ encoding="utf-8",
192
+ )
193
+
194
+ result = update_extended_docs(tmp_project, dry_run=False)
195
+ whitepaper = (tmp_project / "WHITEPAPER.md").read_text(encoding="utf-8")
196
+
197
+ assert result["available"]
198
+ assert "10 MCP tools dispatching 78 actions" in whitepaper
199
+ assert "1490 passing tests" in whitepaper