atomadic-forge 0.16.2__tar.gz → 0.50.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 (409) hide show
  1. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/ci.yml +21 -0
  2. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/customer-refactor.yml +4 -4
  3. atomadic_forge-0.50.0/.github/workflows/metrics-auto-regen.yml +96 -0
  4. atomadic_forge-0.50.0/.github/workflows/metrics-drift.yml +61 -0
  5. atomadic_forge-0.50.0/.github/workflows/publish-on-tag.yml +104 -0
  6. atomadic_forge-0.50.0/.github/workflows/uptime.yml +72 -0
  7. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/CHANGELOG.md +529 -0
  8. atomadic_forge-0.50.0/PKG-INFO +262 -0
  9. atomadic_forge-0.50.0/README.md +230 -0
  10. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/01-getting-started.md +4 -0
  11. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/02-commands.md +6 -0
  12. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/AGENTS_GUIDE.md +71 -4
  13. atomadic_forge-0.50.0/docs/IDE_INTEGRATION.md +83 -0
  14. atomadic_forge-0.50.0/docs/PROVIDERS.md +153 -0
  15. atomadic_forge-0.50.0/docs/V0.46.0_JUSTIFICATION_REPORT.md +148 -0
  16. atomadic_forge-0.50.0/docs/V0.47.0_SELF_TEST_REPORT.md +167 -0
  17. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/pyproject.toml +17 -2
  18. atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/config_defaults.py +61 -0
  19. atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/gen_language.py +192 -0
  20. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +8 -1
  21. atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +114 -0
  22. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +35 -0
  23. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/call_graph.py +47 -4
  24. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +11 -2
  25. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/custom_provider_client.py +259 -0
  26. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/forge_metrics.py +257 -0
  27. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1527 -1789
  28. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_classify.py +111 -0
  29. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_imports.py +208 -0
  30. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_surface.py +418 -0
  31. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/provider_resolver.py +141 -0
  32. atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +273 -0
  33. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +129 -18
  34. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +4 -1
  35. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_selector.py +9 -1
  36. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wire_check.py +92 -4
  37. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commit_compose.py +2 -0
  38. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop.py +137 -15
  39. atomadic_forge-0.50.0/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +192 -0
  40. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/mcp_server.py +94 -10
  41. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/surface_export.py +89 -9
  42. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +41 -2
  43. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +6 -3
  44. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +45 -31
  45. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +7 -1
  46. atomadic_forge-0.50.0/src/atomadic_forge/commands/config_cmd.py +322 -0
  47. atomadic_forge-0.50.0/src/atomadic_forge/commands/metrics.py +126 -0
  48. atomadic_forge-0.50.0/src/atomadic_forge.egg-info/PKG-INFO +262 -0
  49. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/SOURCES.txt +22 -0
  50. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_summary.py +6 -6
  51. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_codex_5_complete.py +19 -15
  52. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_copilots_copilot.py +11 -8
  53. atomadic_forge-0.50.0/tests/test_custom_provider.py +248 -0
  54. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_enhancement_proposal.py +5 -5
  55. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_evolve_js.py +8 -3
  56. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_handoff.py +5 -5
  57. atomadic_forge-0.50.0/tests/test_mcp_lazy_bootstrap.py +114 -0
  58. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_mcp_protocol.py +175 -181
  59. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_plan_apply.py +9 -6
  60. atomadic_forge-0.50.0/tests/test_polyglot_cli_mcp.py +343 -0
  61. atomadic_forge-0.50.0/tests/test_polyglot_full_pipeline.py +477 -0
  62. atomadic_forge-0.50.0/tests/test_polyglot_hardening.py +479 -0
  63. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_polyglot_swift_kotlin_go.py +20 -10
  64. atomadic_forge-0.50.0/tests/test_polyglot_symbol_parity.py +425 -0
  65. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_trust_gate_response.py +12 -8
  66. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_welcome.py +2 -2
  67. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_whoami_cmd.py +8 -2
  68. atomadic_forge-0.16.2/PKG-INFO +0 -808
  69. atomadic_forge-0.16.2/README.md +0 -776
  70. atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -38
  71. atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -116
  72. atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -146
  73. atomadic_forge-0.16.2/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -50
  74. atomadic_forge-0.16.2/src/atomadic_forge/commands/config_cmd.py +0 -145
  75. atomadic_forge-0.16.2/src/atomadic_forge.egg-info/PKG-INFO +0 -808
  76. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/FUNDING.yml +0 -0
  77. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  78. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  79. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  80. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/actions/forge-action/README.md +0 -0
  81. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/actions/forge-action/action.yml +0 -0
  82. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/dependabot.yml +0 -0
  83. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/pull_request_template.md +0 -0
  84. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/forge-self-certify.yml +0 -0
  85. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/release.yml +0 -0
  86. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/surface-drift.yml +0 -0
  87. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/ARCHITECTURE.md +0 -0
  88. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/CONTRIBUTING.md +0 -0
  89. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/LICENSE +0 -0
  90. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/MANIFEST.in +0 -0
  91. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/SECURITY.md +0 -0
  92. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/assets/Atomadic-Forge-01.png +0 -0
  93. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/03-tutorial.md +0 -0
  94. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/04-llm-loops.md +0 -0
  95. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/05-faq.md +0 -0
  96. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/AIR_GAPPED.md +0 -0
  97. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/CI_CD.md +0 -0
  98. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/CODEX_WALKTHROUGH.md +0 -0
  99. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/COMMANDS.md +0 -0
  100. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/FIRST_10_MINUTES.md +0 -0
  101. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/FORMALIZATION.md +0 -0
  102. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/HIVE_PRIMITIVES.md +0 -0
  103. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/HIVE_STATUS.md +0 -0
  104. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/LANDSCAPE.md +0 -0
  105. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MARKET_POSITIONING.md +0 -0
  106. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MIGRATION.md +0 -0
  107. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MULTI_REPO.md +0 -0
  108. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/README.md +0 -0
  109. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RECEIPT.md +0 -0
  110. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELAY_PROTOCOL.md +0 -0
  111. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELEASE_CHECKLIST.md +0 -0
  112. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELEASE_MESSAGING.md +0 -0
  113. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/ROADMAP.md +0 -0
  114. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/SHOWCASE.md +0 -0
  115. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/SIDECAR.md +0 -0
  116. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/STUDIO.md +0 -0
  117. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
  118. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WHY_NOW.md +0 -0
  119. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
  120. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WORLD_COLLISION.md +0 -0
  121. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/INDEX.md +0 -0
  122. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/chat.md +0 -0
  123. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/commandsmith.md +0 -0
  124. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/config.md +0 -0
  125. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/demo.md +0 -0
  126. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/emergent-then-synergy.md +0 -0
  127. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/emergent.md +0 -0
  128. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/evolve-then-iterate.md +0 -0
  129. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/evolve.md +0 -0
  130. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/feature-then-emergent.md +0 -0
  131. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/iterate.md +0 -0
  132. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/synergy-then-emergent.md +0 -0
  133. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/synergy.md +0 -0
  134. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  135. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/CS-1.md +0 -0
  136. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  137. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  138. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  139. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
  140. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/01-quickstart.md +0 -0
  141. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/02-your-first-package.md +0 -0
  142. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
  143. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  144. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  145. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
  146. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/setup.cfg +0 -0
  147. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/__init__.py +0 -0
  148. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/__main__.py +0 -0
  149. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  150. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  151. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  152. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  153. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  154. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
  155. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  156. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  157. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
  158. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
  159. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
  160. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
  161. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
  162. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
  163. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  164. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  165. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
  166. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  167. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  168. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  169. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  170. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  171. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
  172. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
  173. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  174. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  175. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  176. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  177. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  178. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  179. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  180. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  181. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  182. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
  183. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  184. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  185. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  186. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  187. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  188. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  189. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  190. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  191. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  192. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  193. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  194. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  195. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
  196. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  197. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  198. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
  199. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  200. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  201. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
  202. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  203. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
  204. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
  205. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
  206. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  207. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  208. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
  209. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  210. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
  211. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  212. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  213. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  214. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  215. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  216. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  217. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  218. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  219. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  220. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  221. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  222. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  223. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  224. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  225. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  226. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
  227. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
  228. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  229. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  230. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  231. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  232. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  233. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  234. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  235. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  236. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  237. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  238. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  239. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  240. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  241. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  242. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  243. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  244. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
  245. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
  246. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
  247. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
  248. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
  249. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
  250. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
  251. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
  252. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  253. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
  254. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
  255. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
  256. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  257. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
  258. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
  259. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  260. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  261. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
  262. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  263. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  264. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  265. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
  266. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
  267. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
  268. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  269. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
  270. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
  271. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  272. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  273. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  274. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  275. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  276. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  277. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  278. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  279. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
  280. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
  281. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  282. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  283. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
  284. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
  285. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  286. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  287. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
  288. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
  289. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
  290. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  291. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
  292. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
  293. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
  294. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  295. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  296. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
  297. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
  298. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  299. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  300. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  301. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/__init__.py +0 -0
  302. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/_registry.py +0 -0
  303. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/audit.py +0 -0
  304. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/chat.py +0 -0
  305. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
  306. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/create.py +0 -0
  307. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/demo.py +0 -0
  308. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent.py +0 -0
  309. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
  310. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  311. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/enhancement.py +0 -0
  312. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve.py +0 -0
  313. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  314. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  315. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/guard_install.py +0 -0
  316. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/handoff.py +0 -0
  317. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/harvest.py +0 -0
  318. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/hive.py +0 -0
  319. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/iterate.py +0 -0
  320. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/materialize.py +0 -0
  321. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
  322. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/relay.py +0 -0
  323. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/surface.py +0 -0
  324. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy.py +0 -0
  325. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  326. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/welcome.py +0 -0
  327. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/wisdom.py +0 -0
  328. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  329. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  330. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  331. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  332. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_aaaa_nexus_client.py +0 -0
  333. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_hire_protocol.py +0 -0
  334. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_plan.py +0 -0
  335. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_plan_pkg_label.py +0 -0
  336. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_audit_verb.py +0 -0
  337. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_body_extractor_repairs.py +0 -0
  338. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_card_renderer.py +0 -0
  339. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_certify_operational_axis.py +0 -0
  340. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_chat.py +0 -0
  341. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_classify_tier.py +0 -0
  342. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_classify_tier_ast_signals.py +0 -0
  343. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cli_smoke.py +0 -0
  344. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cli_swarm_aliases.py +0 -0
  345. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
  346. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_commandsmith.py +0 -0
  347. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_compiler_feedback.py +0 -0
  348. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_compliance_checker.py +0 -0
  349. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_config.py +0 -0
  350. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cost_circuit_breaker.py +0 -0
  351. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_create_feature.py +0 -0
  352. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cs1_renderer.py +0 -0
  353. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_dedup_engine.py +0 -0
  354. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_demo.py +0 -0
  355. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_compose.py +0 -0
  356. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_signature_extract.py +0 -0
  357. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_synthesize_imports.py +0 -0
  358. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_error_codes.py +0 -0
  359. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_error_hints.py +0 -0
  360. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_exported_api_check.py +0 -0
  361. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_action.py +0 -0
  362. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_auth_a1.py +0 -0
  363. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_auth_a2.py +0 -0
  364. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_enforce.py +0 -0
  365. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_generation_quality.py +0 -0
  366. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_hierarchical_memory.py +0 -0
  367. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_hive_sync.py +0 -0
  368. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ignore_and_docs.py +0 -0
  369. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_import_smoke.py +0 -0
  370. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_iterate_evolve.py +0 -0
  371. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_certify.py +0 -0
  372. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_parser.py +0 -0
  373. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_recon.py +0 -0
  374. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_wire.py +0 -0
  375. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_lineage_chain.py +0 -0
  376. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ling_provider.py +0 -0
  377. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_local_signer.py +0 -0
  378. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_lsp_protocol.py +0 -0
  379. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_manifest_diff.py +0 -0
  380. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_materialize_feature.py +0 -0
  381. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_nexus_bridge.py +0 -0
  382. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ollama_client.py +0 -0
  383. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_pipeline.py +0 -0
  384. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_pre_audit_smoke.py +0 -0
  385. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_precommit_hooks.py +0 -0
  386. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_progress_reporter.py +0 -0
  387. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_emitter.py +0 -0
  388. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_schema.py +0 -0
  389. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_signer.py +0 -0
  390. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_response_enricher.py +0 -0
  391. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_roi_calculator.py +0 -0
  392. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sbom_cmd_text_summary.py +0 -0
  393. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sbom_emitter.py +0 -0
  394. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_scaffold.py +0 -0
  395. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sidecar.py +0 -0
  396. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sidecar_validate.py +0 -0
  397. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_smell_score_formula.py +0 -0
  398. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_stagnation.py +0 -0
  399. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_stub_detector.py +0 -0
  400. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_surface_export.py +0 -0
  401. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_synergy.py +0 -0
  402. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_test_runner.py +0 -0
  403. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_tier_init_rebuild.py +0 -0
  404. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_verify_suggested_recipe.py +0 -0
  405. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_welcome_enhancements.py +0 -0
  406. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_certify.py +0 -0
  407. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_suggest_repairs.py +0 -0
  408. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_type_checking.py +0 -0
  409. {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wisdom.py +0 -0
@@ -94,3 +94,24 @@ jobs:
94
94
  with:
95
95
  name: atomadic-forge-dist
96
96
  path: dist/*
97
+
98
+ metrics:
99
+ name: Metrics freshness
100
+ runs-on: ubuntu-latest
101
+ steps:
102
+ - name: Check out repository
103
+ uses: actions/checkout@v6
104
+
105
+ - name: Set up Python
106
+ uses: actions/setup-python@v6
107
+ with:
108
+ python-version: "3.12"
109
+ cache: pip
110
+
111
+ - name: Install package
112
+ run: |
113
+ python -m pip install --upgrade pip
114
+ python -m pip install -e ".[dev]"
115
+
116
+ - name: Verify forge_metrics.json is current
117
+ run: python scripts/update_metrics.py --check
@@ -1,4 +1,4 @@
1
- # Customer Refactor — fully automated $499 forge.atomadic.tech fulfillment.
1
+ # Customer Refactor — fully automated $149/$99 forge.atomadic.tech fulfillment.
2
2
  #
3
3
  # Triggered by Atomadic's REFACTOR_REPO action via the GitHub
4
4
  # repository_dispatch API. The cognition worker POSTs:
@@ -28,7 +28,7 @@
28
28
  # The cognition endpoint emails the customer (apology + refund offer) and
29
29
  # pings Dad on Discord so the order can be retried manually.
30
30
 
31
- name: Customer Refactor (forge.atomadic.tech $499 fulfillment)
31
+ name: Customer Refactor (forge.atomadic.tech $149/$99 fulfillment)
32
32
 
33
33
  on:
34
34
  repository_dispatch:
@@ -55,7 +55,7 @@ on:
55
55
  description: "Amount paid (cents)"
56
56
  required: false
57
57
  type: string
58
- default: "49900"
58
+ default: "9900"
59
59
 
60
60
  permissions:
61
61
  contents: read
@@ -234,7 +234,7 @@ jobs:
234
234
  echo " above."
235
235
  echo "4. Run your own test suite — Forge does not touch behavior."
236
236
  echo ""
237
- echo "One round of revisions is included with your $499 order."
237
+ echo "One round of revisions is included with your order."
238
238
  echo "Reply to the email you received from Atomadic with anything"
239
239
  echo "you want changed."
240
240
  echo ""
@@ -0,0 +1,96 @@
1
+ name: Metrics Auto-Regenerate
2
+
3
+ # Single-source-of-truth pipeline. On every push to main, recomputes the
4
+ # canonical forge_metrics.json artifact and pushes a follow-up commit if
5
+ # the artifact drifted from what the source tree should produce.
6
+ #
7
+ # Together with metrics-drift.yml (CI gate on PRs), this means:
8
+ # - PRs are blocked on stale metrics.
9
+ # - Direct pushes to main self-heal automatically.
10
+ # - Public surfaces (atomadic.tech, shields.io endpoints proxied by
11
+ # the worker) always read live numbers from the same JSON.
12
+ #
13
+ # Lean theorem count requires the IP-protected mhed-codex repo. The
14
+ # FORGE_MHED_CODEX_REPO secret (org-level) provides a deploy-key URL;
15
+ # without it the lean_theorems block is preserved from the prior commit
16
+ # (see surgical merge step below) so this workflow never destroys real
17
+ # numbers when running without the IP repo attached.
18
+
19
+ on:
20
+ push:
21
+ branches: [main]
22
+ paths:
23
+ - "src/atomadic_forge/**"
24
+ - "tests/**"
25
+ - "pyproject.toml"
26
+ - "src/atomadic_forge/a1_at_functions/forge_metrics.py"
27
+ - "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
28
+
29
+ permissions:
30
+ contents: write
31
+
32
+ jobs:
33
+ regen:
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 8
36
+ if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'chore(metrics): auto-regenerate') }}
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ with:
40
+ fetch-depth: 0
41
+ token: ${{ secrets.GITHUB_TOKEN }}
42
+ - uses: actions/setup-python@v5
43
+ with:
44
+ python-version: "3.12"
45
+ - name: Install package
46
+ run: pip install -e . --quiet
47
+ - name: Run pytest to count live passing
48
+ id: pytest
49
+ run: |
50
+ set +e
51
+ out=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
52
+ echo "$out"
53
+ passed=$(echo "$out" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
54
+ echo "passed=${passed:-0}" >> "$GITHUB_OUTPUT"
55
+ - name: Optionally clone IP-protected mhed-codex (preserves lean count)
56
+ if: ${{ env.MHED_CODEX_DEPLOY_KEY != '' }}
57
+ env:
58
+ MHED_CODEX_DEPLOY_KEY: ${{ secrets.MHED_CODEX_DEPLOY_KEY }}
59
+ run: |
60
+ mkdir -p ~/.ssh && chmod 700 ~/.ssh
61
+ echo "$MHED_CODEX_DEPLOY_KEY" > ~/.ssh/mhed_key && chmod 600 ~/.ssh/mhed_key
62
+ GIT_SSH_COMMAND="ssh -i ~/.ssh/mhed_key -o StrictHostKeyChecking=no" \
63
+ git clone --depth 1 git@github.com:atomadictech/mhed-codex.git /tmp/mhed-codex
64
+ echo "FORGE_MHED_CODEX=/tmp/mhed-codex" >> "$GITHUB_ENV"
65
+ - name: Regenerate forge_metrics.json
66
+ run: |
67
+ # Save the previous lean_theorems block so we can preserve it
68
+ # when no mhed-codex is attached (avoid zeroing the public
69
+ # number on a routine source-only push).
70
+ python -c "import json; d=json.load(open('forge_metrics.json')); print(json.dumps(d.get('lean_theorems', {})))" > /tmp/prev_lean.json
71
+ forge metrics --apply --tests-passing ${{ steps.pytest.outputs.passed }}
72
+ # If no mhed-codex was attached this run, restore prior lean block.
73
+ if [ -z "${FORGE_MHED_CODEX:-}" ]; then
74
+ python <<'PY'
75
+ import json, pathlib
76
+ p = pathlib.Path("forge_metrics.json")
77
+ d = json.loads(p.read_text())
78
+ prev = json.loads(pathlib.Path("/tmp/prev_lean.json").read_text())
79
+ # Only restore if the freshly-computed block reports found=False
80
+ # (i.e. mhed-codex unavailable) AND the prior had a real count.
81
+ if not d.get("lean_theorems", {}).get("found") and prev.get("count"):
82
+ d["lean_theorems"] = prev
83
+ p.write_text(json.dumps(d, indent=2, sort_keys=True) + "\n")
84
+ PY
85
+ fi
86
+ - name: Commit if drifted
87
+ run: |
88
+ git config user.name "atomadic-bot"
89
+ git config user.email "bot@atomadic.tech"
90
+ if git diff --quiet -- forge_metrics.json; then
91
+ echo "metrics already current — no commit"
92
+ exit 0
93
+ fi
94
+ git add forge_metrics.json
95
+ git commit -m "chore(metrics): auto-regenerate forge_metrics.json [skip ci]"
96
+ git push origin main
@@ -0,0 +1,61 @@
1
+ name: Metrics Drift Gate
2
+
3
+ # CI gate that keeps forge_metrics.json in sync with the live forge surface.
4
+ # Any PR that changes TOOLS, CLI registry, source/test counts, or
5
+ # pyproject.toml WITHOUT regenerating forge_metrics.json fails this check.
6
+ #
7
+ # Lean theorem count is recomputed only when the FORGE_MHED_CODEX repo is
8
+ # accessible (CI env var). When not set, the lean_theorems block is
9
+ # preserved from the in-tree forge_metrics.json so PRs that don't touch
10
+ # mhed-codex don't get blocked here.
11
+ #
12
+ # Fix when this fails: forge metrics --apply && git add forge_metrics.json
13
+
14
+ on:
15
+ pull_request:
16
+ paths:
17
+ - "src/atomadic_forge/a0_qk_constants/schema_version_registry.py"
18
+ - "src/atomadic_forge/a1_at_functions/mcp_protocol.py"
19
+ - "src/atomadic_forge/a1_at_functions/forge_metrics.py"
20
+ - "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
21
+ - "src/atomadic_forge/a4_sy_orchestration/cli.py"
22
+ - "src/atomadic_forge/commands/**"
23
+ - "pyproject.toml"
24
+ - "forge_metrics.json"
25
+ push:
26
+ branches: [main]
27
+
28
+ jobs:
29
+ metrics-drift:
30
+ runs-on: ubuntu-latest
31
+ timeout-minutes: 5
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.12"
37
+ - name: Install package (editable)
38
+ run: pip install -e . --quiet
39
+ - name: Compute live metrics + diff vs. checked-in artifact
40
+ run: |
41
+ set -euo pipefail
42
+ # Save committed copy.
43
+ cp forge_metrics.json /tmp/forge_metrics.committed.json
44
+ # Recompute (Lean count zero in CI unless FORGE_MHED_CODEX is wired).
45
+ forge metrics --apply
46
+ # If the only delta is the timestamp, that's expected — strip it
47
+ # before diffing so we only fail on substantive drift.
48
+ jq 'del(.generated_at_utc)' /tmp/forge_metrics.committed.json > /tmp/a.json
49
+ jq 'del(.generated_at_utc)' forge_metrics.json > /tmp/b.json
50
+ # If FORGE_MHED_CODEX is not set, also ignore the lean_theorems
51
+ # block (will be 0 in CI but the committed artifact has the real
52
+ # count from the IP repo).
53
+ if [ -z "${FORGE_MHED_CODEX:-}" ]; then
54
+ jq 'del(.lean_theorems)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
55
+ jq 'del(.lean_theorems)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
56
+ fi
57
+ if ! diff -u /tmp/a.json /tmp/b.json; then
58
+ echo "::error::forge_metrics.json is stale. Run 'forge metrics --apply' and commit the result."
59
+ exit 1
60
+ fi
61
+ echo "metrics drift check: OK"
@@ -0,0 +1,104 @@
1
+ name: Publish on tag
2
+
3
+ # v0.50.0 — single tag → full publish chain.
4
+ #
5
+ # Pushing a v* tag fires this workflow, which:
6
+ # 1. Verifies forge_metrics.json is current at the tag (no stale numbers
7
+ # shipping to PyPI / atomadic.tech / shields.io).
8
+ # 2. Creates a GitHub Release using the matching CHANGELOG section.
9
+ # The GH-Release event triggers release.yml which builds + publishes
10
+ # to PyPI.
11
+ # 3. Fires a `repository_dispatch` to atomadic-forge-cloudflare-workers
12
+ # so the MCP worker redeploys with the same version. Public
13
+ # surfaces (badges, metrics.json proxy, MCP endpoint) are then in
14
+ # lockstep with the PyPI release.
15
+ #
16
+ # Required secrets:
17
+ # GH_TOKEN — automatic (github.token)
18
+ # WORKER_DEPLOY_PAT — PAT with `repo` scope on the worker repo;
19
+ # grants permission to fire repository_dispatch. If unset, the
20
+ # cross-repo dispatch is skipped (worker can be redeployed
21
+ # manually via its own workflow_dispatch).
22
+
23
+ on:
24
+ push:
25
+ tags:
26
+ - 'v*'
27
+
28
+ permissions:
29
+ contents: write
30
+
31
+ jobs:
32
+ publish:
33
+ name: Publish chain (metrics → GH Release → worker dispatch)
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 10
36
+ steps:
37
+ - name: Check out repository
38
+ uses: actions/checkout@v4
39
+ with:
40
+ fetch-depth: 0
41
+
42
+ - name: Extract version from tag
43
+ id: version
44
+ run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
45
+
46
+ - uses: actions/setup-python@v5
47
+ with:
48
+ python-version: "3.12"
49
+
50
+ - name: Install package
51
+ run: pip install -e . --quiet
52
+
53
+ - name: Verify forge_metrics.json is current at this tag
54
+ run: |
55
+ set -euo pipefail
56
+ # Save the in-tree artifact, recompute, diff (ignoring
57
+ # generated_at_utc and lean_theorems — Lean count requires
58
+ # the IP-protected mhed-codex repo, not present in CI).
59
+ cp forge_metrics.json /tmp/forge_metrics.committed.json
60
+ # Use the most recent passing test count from the suite.
61
+ set +e
62
+ ptout=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
63
+ set -e
64
+ passed=$(echo "$ptout" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
65
+ forge metrics --apply --tests-passing "${passed:-0}"
66
+ jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
67
+ /tmp/forge_metrics.committed.json > /tmp/a.json
68
+ jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
69
+ forge_metrics.json > /tmp/b.json
70
+ if ! diff -u /tmp/a.json /tmp/b.json; then
71
+ echo "::error::forge_metrics.json is stale at tag ${GITHUB_REF_NAME}. Re-run \`forge metrics --apply\` and re-tag."
72
+ exit 1
73
+ fi
74
+
75
+ - name: Extract changelog for this version
76
+ id: changelog
77
+ run: |
78
+ version="${{ steps.version.outputs.version }}"
79
+ changelog=$(sed -n "/^## .*${version}/,/^## /{/^## .*${version}/d;/^## /d;p}" CHANGELOG.md | head -100)
80
+ if [ -z "$changelog" ]; then
81
+ changelog="Release v${version}"
82
+ fi
83
+ echo "$changelog" > /tmp/release_notes.md
84
+
85
+ - name: Create GitHub Release
86
+ env:
87
+ GH_TOKEN: ${{ github.token }}
88
+ run: |
89
+ gh release create "${{ github.ref_name }}" \
90
+ --title "Atomadic Forge ${{ github.ref_name }}" \
91
+ --notes-file /tmp/release_notes.md
92
+
93
+ - name: Dispatch worker redeploy
94
+ if: ${{ secrets.WORKER_DEPLOY_PAT != '' }}
95
+ env:
96
+ PAT: ${{ secrets.WORKER_DEPLOY_PAT }}
97
+ run: |
98
+ curl -fsS -X POST \
99
+ -H "Accept: application/vnd.github+json" \
100
+ -H "Authorization: Bearer ${PAT}" \
101
+ -H "X-GitHub-Api-Version: 2022-11-28" \
102
+ https://api.github.com/repos/atomadictech/atomadic-forge-cloudflare-workers/dispatches \
103
+ -d "{\"event_type\":\"forge-released\",\"client_payload\":{\"version\":\"${{ steps.version.outputs.version }}\"}}"
104
+ echo "dispatched forge-released v${{ steps.version.outputs.version }} → worker repo"
@@ -0,0 +1,72 @@
1
+ name: Uptime monitor
2
+
3
+ # Runs every 30 minutes. Pings all Atomadic services and opens an
4
+ # issue if any are down. Free uptime monitoring via GitHub Actions.
5
+
6
+ on:
7
+ schedule:
8
+ - cron: '*/30 * * * *'
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+ issues: write
14
+
15
+ jobs:
16
+ check:
17
+ name: Health check
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 3
20
+ steps:
21
+ - name: Ping all services
22
+ id: ping
23
+ run: |
24
+ failed=""
25
+ for entry in \
26
+ "forge.atomadic.tech|https://forge.atomadic.tech" \
27
+ "forge-mcp|https://forge.atomadic.tech/mcp" \
28
+ "chat.atomadic.tech|https://chat.atomadic.tech" \
29
+ "forge-auth|https://forge-auth.atomadic.tech" \
30
+ ; do
31
+ name="${entry%%|*}"
32
+ url="${entry##*|}"
33
+ status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$url" 2>/dev/null || echo "000")
34
+ # 200, 401, 405 are all "alive" responses for various endpoints
35
+ if [[ "$status" =~ ^(200|301|302|401|403|405)$ ]]; then
36
+ echo "OK $status $name"
37
+ else
38
+ echo "ERR $status $name"
39
+ failed="$failed $name($status)"
40
+ fi
41
+ done
42
+
43
+ if [ -n "$failed" ]; then
44
+ echo "failed=$failed" >> "$GITHUB_OUTPUT"
45
+ echo "has_failure=true" >> "$GITHUB_OUTPUT"
46
+ else
47
+ echo "has_failure=false" >> "$GITHUB_OUTPUT"
48
+ fi
49
+
50
+ - name: Open issue if services are down
51
+ if: steps.ping.outputs.has_failure == 'true'
52
+ uses: actions/checkout@v6
53
+
54
+ - name: Create or update issue
55
+ if: steps.ping.outputs.has_failure == 'true'
56
+ env:
57
+ GH_TOKEN: ${{ github.token }}
58
+ run: |
59
+ title="Uptime alert: services down"
60
+ body="The following services are unreachable: ${{ steps.ping.outputs.failed }}
61
+
62
+ Detected at $(date -u +'%Y-%m-%d %H:%M UTC')
63
+
64
+ Run \`make uptime\` locally to verify."
65
+
66
+ # Check if an open uptime issue already exists
67
+ existing=$(gh issue list --label uptime --state open --json number -q '.[0].number' 2>/dev/null || true)
68
+ if [ -n "$existing" ]; then
69
+ gh issue comment "$existing" --body "$body"
70
+ else
71
+ gh issue create --title "$title" --body "$body" --label uptime
72
+ fi