atomadic-forge 0.3.5__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/ci.yml +6 -6
  2. atomadic_forge-0.5.1/.github/workflows/customer-refactor.yml +302 -0
  3. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/forge-self-certify.yml +1 -1
  4. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/release.yml +4 -4
  5. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/CHANGELOG.md +30 -0
  6. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/PKG-INFO +3 -2
  7. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/README.md +1 -0
  8. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/pyproject.toml +2 -2
  9. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/__init__.py +1 -1
  10. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +4 -0
  11. atomadic_forge-0.5.1/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -0
  12. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +138 -1
  13. atomadic_forge-0.5.1/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -0
  14. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/mcp_server.py +75 -11
  15. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/PKG-INFO +3 -2
  16. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/SOURCES.txt +5 -0
  17. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/requires.txt +1 -1
  18. atomadic_forge-0.5.1/tests/test_exported_api_check.py +146 -0
  19. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_mcp_protocol.py +53 -0
  20. atomadic_forge-0.5.1/tests/test_trust_gate_response.py +106 -0
  21. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  22. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  23. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  24. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/actions/forge-action/README.md +0 -0
  25. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/actions/forge-action/action.yml +0 -0
  26. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/dependabot.yml +0 -0
  27. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/pull_request_template.md +0 -0
  28. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/forge-studio-ci.yml +0 -0
  29. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/ARCHITECTURE.md +0 -0
  30. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/CONTRIBUTING.md +0 -0
  31. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/LICENSE +0 -0
  32. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/MANIFEST.in +0 -0
  33. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/SECURITY.md +0 -0
  34. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/assets/Atomadic-Forge-01.png +0 -0
  35. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/01-getting-started.md +0 -0
  36. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/02-commands.md +0 -0
  37. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/03-tutorial.md +0 -0
  38. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/04-llm-loops.md +0 -0
  39. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/05-faq.md +0 -0
  40. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/AGENTS_GUIDE.md +0 -0
  41. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/AIR_GAPPED.md +0 -0
  42. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/CI_CD.md +0 -0
  43. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/CODEX_WALKTHROUGH.md +0 -0
  44. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/COMMANDS.md +0 -0
  45. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/FIRST_10_MINUTES.md +0 -0
  46. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/FORMALIZATION.md +0 -0
  47. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/LANDSCAPE.md +0 -0
  48. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/MARKET_POSITIONING.md +0 -0
  49. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/MULTI_REPO.md +0 -0
  50. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/README.md +0 -0
  51. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RECEIPT.md +0 -0
  52. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RELEASE_CHECKLIST.md +0 -0
  53. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RELEASE_MESSAGING.md +0 -0
  54. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/ROADMAP.md +0 -0
  55. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/SHOWCASE.md +0 -0
  56. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/SIDECAR.md +0 -0
  57. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/STUDIO.md +0 -0
  58. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/WHY_NOW.md +0 -0
  59. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/INDEX.md +0 -0
  60. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/chat.md +0 -0
  61. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/commandsmith.md +0 -0
  62. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/config.md +0 -0
  63. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/demo.md +0 -0
  64. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/emergent-then-synergy.md +0 -0
  65. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/emergent.md +0 -0
  66. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/evolve-then-iterate.md +0 -0
  67. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/evolve.md +0 -0
  68. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/feature-then-emergent.md +0 -0
  69. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/iterate.md +0 -0
  70. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/synergy-then-emergent.md +0 -0
  71. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/synergy.md +0 -0
  72. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  73. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/CS-1.md +0 -0
  74. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  75. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  76. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  77. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/01-quickstart.md +0 -0
  78. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/02-your-first-package.md +0 -0
  79. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
  80. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/04-plug-in-llms.md +0 -0
  81. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  82. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
  83. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/setup.cfg +0 -0
  84. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/__main__.py +0 -0
  85. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  86. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  87. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  88. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  89. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  90. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  91. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  92. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  93. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  94. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  95. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  96. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  97. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  98. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  99. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  100. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  101. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  102. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  103. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  104. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  105. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  106. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  107. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  108. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  109. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  110. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  111. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  112. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  113. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  114. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  115. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  116. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  117. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  118. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  119. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  120. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  121. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  122. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  123. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  124. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  125. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  126. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  127. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  128. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  129. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  130. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  131. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  132. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  133. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  134. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  135. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  136. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  137. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  138. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  139. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  140. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  141. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  142. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  143. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  144. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  145. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  146. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  147. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  148. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  149. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  150. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  151. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  152. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  153. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  154. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  155. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  156. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  157. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  158. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  159. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  160. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  161. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  162. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  163. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  164. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  165. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  166. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  167. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  168. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  169. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  170. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  171. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  172. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  173. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  174. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  175. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  176. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  177. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  178. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  179. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  180. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  181. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  182. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  183. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  184. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  185. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  186. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  187. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  188. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  189. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  190. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  191. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  192. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
  193. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  194. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  195. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  196. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/__init__.py +0 -0
  197. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/_registry.py +0 -0
  198. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/audit.py +0 -0
  199. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/chat.py +0 -0
  200. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
  201. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
  202. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/demo.py +0 -0
  203. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent.py +0 -0
  204. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  205. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve.py +0 -0
  206. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  207. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  208. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/iterate.py +0 -0
  209. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy.py +0 -0
  210. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  211. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  212. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  213. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  214. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_aaaa_nexus_client.py +0 -0
  215. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_agent_plan.py +0 -0
  216. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_agent_summary.py +0 -0
  217. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_audit_verb.py +0 -0
  218. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_badge_worker.py +0 -0
  219. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_body_extractor_repairs.py +0 -0
  220. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_card_renderer.py +0 -0
  221. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_certify_operational_axis.py +0 -0
  222. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_chat.py +0 -0
  223. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_classify_tier.py +0 -0
  224. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_cli_smoke.py +0 -0
  225. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_codex_5_complete.py +0 -0
  226. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
  227. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_commandsmith.py +0 -0
  228. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_compiler_feedback.py +0 -0
  229. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_compliance_checker.py +0 -0
  230. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_config.py +0 -0
  231. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_copilots_copilot.py +0 -0
  232. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_cs1_renderer.py +0 -0
  233. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_demo.py +0 -0
  234. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_emergent_compose.py +0 -0
  235. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_emergent_signature_extract.py +0 -0
  236. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_error_codes.py +0 -0
  237. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_error_hints.py +0 -0
  238. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_evolve_js.py +0 -0
  239. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_action.py +0 -0
  240. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_auth_a1.py +0 -0
  241. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_auth_a2.py +0 -0
  242. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_enforce.py +0 -0
  243. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_generation_quality.py +0 -0
  244. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_ignore_and_docs.py +0 -0
  245. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_import_smoke.py +0 -0
  246. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_iterate_evolve.py +0 -0
  247. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_certify.py +0 -0
  248. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_parser.py +0 -0
  249. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_recon.py +0 -0
  250. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_wire.py +0 -0
  251. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_lineage_chain.py +0 -0
  252. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_local_signer.py +0 -0
  253. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_lsp_protocol.py +0 -0
  254. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_manifest_diff.py +0 -0
  255. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_ollama_client.py +0 -0
  256. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_pipeline.py +0 -0
  257. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_plan_apply.py +0 -0
  258. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_pre_audit_smoke.py +0 -0
  259. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_precommit_hooks.py +0 -0
  260. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_progress_reporter.py +0 -0
  261. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_emitter.py +0 -0
  262. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_schema.py +0 -0
  263. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_signer.py +0 -0
  264. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_roi_calculator.py +0 -0
  265. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sbom_emitter.py +0 -0
  266. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_scaffold.py +0 -0
  267. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sidecar.py +0 -0
  268. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sidecar_validate.py +0 -0
  269. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_stagnation.py +0 -0
  270. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_stub_detector.py +0 -0
  271. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_synergy.py +0 -0
  272. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_test_runner.py +0 -0
  273. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_tier_init_rebuild.py +0 -0
  274. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_vscode_extension_manifest.py +0 -0
  275. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_whoami_cmd.py +0 -0
  276. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_wire_certify.py +0 -0
  277. {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_wire_suggest_repairs.py +0 -0
@@ -24,10 +24,10 @@ jobs:
24
24
 
25
25
  steps:
26
26
  - name: Check out repository
27
- uses: actions/checkout@v4
27
+ uses: actions/checkout@v6
28
28
 
29
29
  - name: Set up Python
30
- uses: actions/setup-python@v5
30
+ uses: actions/setup-python@v6
31
31
  with:
32
32
  python-version: ${{ matrix.python-version }}
33
33
  cache: pip
@@ -63,7 +63,7 @@ jobs:
63
63
 
64
64
  - name: Upload self-certify report
65
65
  if: always()
66
- uses: actions/upload-artifact@v4
66
+ uses: actions/upload-artifact@v7
67
67
  with:
68
68
  name: forge-certify-self-${{ matrix.python-version }}
69
69
  path: certify_self.json
@@ -74,10 +74,10 @@ jobs:
74
74
  runs-on: ubuntu-latest
75
75
  steps:
76
76
  - name: Check out repository
77
- uses: actions/checkout@v4
77
+ uses: actions/checkout@v6
78
78
 
79
79
  - name: Set up Python
80
- uses: actions/setup-python@v5
80
+ uses: actions/setup-python@v6
81
81
  with:
82
82
  python-version: "3.12"
83
83
  cache: pip
@@ -90,7 +90,7 @@ jobs:
90
90
  python -m twine check dist/*
91
91
 
92
92
  - name: Upload distributions
93
- uses: actions/upload-artifact@v4
93
+ uses: actions/upload-artifact@v7
94
94
  with:
95
95
  name: atomadic-forge-dist
96
96
  path: dist/*
@@ -0,0 +1,302 @@
1
+ # Customer Refactor — fully automated $499 forge.atomadic.tech fulfillment.
2
+ #
3
+ # Triggered by Atomadic's REFACTOR_REPO action via the GitHub
4
+ # repository_dispatch API. The cognition worker POSTs:
5
+ #
6
+ # curl -X POST -H "Authorization: token $GH_TOKEN" \
7
+ # https://api.github.com/repos/atomadictech/atomadic-forge/dispatches \
8
+ # -d '{"event_type":"forge-refactor","client_payload":{...}}'
9
+ #
10
+ # Required client_payload fields:
11
+ # order_id — opaque string, Stripe-session-derived (forge-refactor-cs_…)
12
+ # session_id — Stripe session id, also used for tracing
13
+ # repo — full URL to the customer's public GitHub repo
14
+ # email — customer email (where the PR-ready notification goes)
15
+ # amount_cents — amount paid, just for record-keeping
16
+ #
17
+ # The workflow:
18
+ # 1. Clones the customer's repo into ./target/
19
+ # 2. Installs atomadic-forge from PyPI
20
+ # 3. Runs `forge auto` to produce a re-tiered package under ./forged/
21
+ # 4. Forks the customer's repo to the bot account, pushes the refactor
22
+ # branch, and opens a PR back to the customer's main branch.
23
+ # 5. POSTs the PR url + state to atomadic-cognition's /refactor-completed
24
+ # endpoint with the same shared bearer token used by /refactor-purchased.
25
+ #
26
+ # Failure handling: any step that fails is captured by the final
27
+ # notify-cognition step and reported to the customer as `status=failed`.
28
+ # The cognition endpoint emails the customer (apology + refund offer) and
29
+ # pings Dad on Discord so the order can be retried manually.
30
+
31
+ name: Customer Refactor (forge.atomadic.tech $499 fulfillment)
32
+
33
+ on:
34
+ repository_dispatch:
35
+ types: [forge-refactor]
36
+ workflow_dispatch:
37
+ inputs:
38
+ order_id:
39
+ description: "Order id (forge-refactor-cs_...)"
40
+ required: true
41
+ type: string
42
+ session_id:
43
+ description: "Stripe session id"
44
+ required: false
45
+ type: string
46
+ repo:
47
+ description: "Customer repo URL (full https://github.com/...)"
48
+ required: true
49
+ type: string
50
+ email:
51
+ description: "Customer email"
52
+ required: true
53
+ type: string
54
+ amount_cents:
55
+ description: "Amount paid (cents)"
56
+ required: false
57
+ type: string
58
+ default: "49900"
59
+
60
+ permissions:
61
+ contents: read
62
+ actions: read
63
+
64
+ jobs:
65
+ refactor:
66
+ name: forge auto + open PR
67
+ runs-on: ubuntu-latest
68
+ timeout-minutes: 25
69
+ env:
70
+ ORDER_ID: ${{ github.event.client_payload.order_id || inputs.order_id }}
71
+ SESSION_ID: ${{ github.event.client_payload.session_id || inputs.session_id }}
72
+ CUSTOMER_REPO: ${{ github.event.client_payload.repo || inputs.repo }}
73
+ CUSTOMER_EMAIL: ${{ github.event.client_payload.email || inputs.email }}
74
+ AMOUNT_CENTS: ${{ github.event.client_payload.amount_cents || inputs.amount_cents }}
75
+ BOT_TOKEN: ${{ secrets.FORGE_BOT_TOKEN }}
76
+ FORGE_API_KEY: ${{ secrets.FORGE_API_KEY }}
77
+ PURCHASE_TOKEN: ${{ secrets.PURCHASE_WEBHOOK_TOKEN }}
78
+ COGNITION_URL: https://atomadic-cognition.atomadictech.workers.dev
79
+ outputs:
80
+ pr_url: ${{ steps.open_pr.outputs.pr_url }}
81
+ status: ${{ steps.open_pr.outputs.status }}
82
+
83
+ steps:
84
+ - name: Validate inputs
85
+ run: |
86
+ if [ -z "$CUSTOMER_REPO" ] || [ -z "$CUSTOMER_EMAIL" ] || [ -z "$ORDER_ID" ]; then
87
+ echo "::error::Missing required client_payload fields (repo, email, order_id)"
88
+ exit 1
89
+ fi
90
+ echo "Order: $ORDER_ID"
91
+ echo "Repo: $CUSTOMER_REPO"
92
+ echo "Customer: $CUSTOMER_EMAIL"
93
+
94
+ - name: Set up Python 3.12
95
+ uses: actions/setup-python@v5
96
+ with:
97
+ python-version: "3.12"
98
+
99
+ - name: Install atomadic-forge from PyPI
100
+ run: |
101
+ python -m pip install --upgrade pip
102
+ pip install atomadic-forge==0.3.5
103
+ forge --version
104
+
105
+ - name: Clone customer repo
106
+ id: clone
107
+ run: |
108
+ mkdir -p target
109
+ git clone --depth 50 "$CUSTOMER_REPO" target/repo
110
+ cd target/repo
111
+ DEFAULT_BRANCH=$(git symbolic-ref --short HEAD)
112
+ REPO_OWNER=$(echo "$CUSTOMER_REPO" | sed -E 's|https://github.com/([^/]+)/.*|\1|')
113
+ REPO_NAME=$(echo "$CUSTOMER_REPO" | sed -E 's|https://github.com/[^/]+/([^/.]+).*|\1|')
114
+ echo "default_branch=$DEFAULT_BRANCH" >> "$GITHUB_OUTPUT"
115
+ echo "repo_owner=$REPO_OWNER" >> "$GITHUB_OUTPUT"
116
+ echo "repo_name=$REPO_NAME" >> "$GITHUB_OUTPUT"
117
+
118
+ - name: Run forge auto on the customer repo
119
+ id: forge_auto
120
+ continue-on-error: true
121
+ run: |
122
+ set -e
123
+ cd target/repo
124
+ # Sanitize the order id for use as a directory name. Some
125
+ # session ids contain `_` which is fine, but the package name
126
+ # cannot contain `-`; we keep them separate (output dir vs
127
+ # --package).
128
+ PKG=$(echo "$ORDER_ID" | tr '-' '_' | tr '/' '_')
129
+ echo "pkg=$PKG" >> "$GITHUB_OUTPUT"
130
+ OUT_DIR="forged/$PKG"
131
+ # Capture certify-before for the PR body. These are best-effort
132
+ # — some repos don't have an obvious src/ root for wire.
133
+ forge certify . --json > /tmp/certify-before.json 2>/dev/null || echo '{}' > /tmp/certify-before.json
134
+ forge wire . --json > /tmp/wire-before.json 2>/dev/null || echo '{}' > /tmp/wire-before.json
135
+ # Run the flagship: scout → cherry-pick → assimilate → wire →
136
+ # certify → emergent. Real failures fail the step (no `|| true`).
137
+ forge auto . "$OUT_DIR" --apply --package absorbed
138
+ ls -la "$OUT_DIR" "$OUT_DIR/src" 2>&1 || true
139
+ forge certify "$OUT_DIR" --json > /tmp/certify-after.json 2>/dev/null || echo '{}' > /tmp/certify-after.json
140
+ forge wire "$OUT_DIR/src" --json > /tmp/wire-after.json 2>/dev/null || echo '{}' > /tmp/wire-after.json
141
+ echo "forge_auto succeeded; output at target/repo/$OUT_DIR"
142
+
143
+ - name: Fork customer repo to bot account
144
+ id: fork
145
+ if: steps.forge_auto.outcome == 'success'
146
+ run: |
147
+ # POST /repos/{owner}/{repo}/forks creates a fork under the
148
+ # authenticated user (the bot). Idempotent — if already forked,
149
+ # returns the existing fork.
150
+ curl -sS -X POST \
151
+ -H "Authorization: token $BOT_TOKEN" \
152
+ -H "Accept: application/vnd.github+json" \
153
+ "https://api.github.com/repos/${{ steps.clone.outputs.repo_owner }}/${{ steps.clone.outputs.repo_name }}/forks" \
154
+ > /tmp/fork.json
155
+ BOT_OWNER=$(jq -r '.owner.login' /tmp/fork.json)
156
+ BOT_FORK_URL=$(jq -r '.clone_url' /tmp/fork.json)
157
+ if [ -z "$BOT_OWNER" ] || [ "$BOT_OWNER" = "null" ]; then
158
+ echo "::error::Fork API did not return an owner; check FORGE_BOT_TOKEN"
159
+ cat /tmp/fork.json
160
+ exit 1
161
+ fi
162
+ echo "bot_owner=$BOT_OWNER" >> "$GITHUB_OUTPUT"
163
+ echo "bot_fork_url=$BOT_FORK_URL" >> "$GITHUB_OUTPUT"
164
+ # Wait for fork to be available (forks are async)
165
+ for i in $(seq 1 12); do
166
+ curl -sS -H "Authorization: token $BOT_TOKEN" \
167
+ "https://api.github.com/repos/$BOT_OWNER/${{ steps.clone.outputs.repo_name }}" \
168
+ | jq -e '.id' >/dev/null 2>&1 && break
169
+ sleep 5
170
+ done
171
+
172
+ - name: Push refactored branch to bot fork
173
+ id: push
174
+ if: steps.fork.outcome == 'success'
175
+ run: |
176
+ set -e
177
+ BRANCH="forge/refactor-$ORDER_ID"
178
+ PKG="${{ steps.forge_auto.outputs.pkg }}"
179
+ OUT_DIR="forged/$PKG"
180
+ cd target/repo
181
+ # Replace src/ with the forge auto output. forge auto writes
182
+ # forged/<pkg>/src/<package>/aN_*/... — we lift the inner
183
+ # src/ wholesale into the customer's repo root.
184
+ rm -rf src
185
+ if [ -d "$OUT_DIR/src" ]; then
186
+ mv "$OUT_DIR/src" src
187
+ else
188
+ echo "::warning::forge auto did not produce $OUT_DIR/src; copying whole $OUT_DIR"
189
+ cp -R "$OUT_DIR" src
190
+ fi
191
+ # Drop the now-empty forged/ scratch dir from the PR.
192
+ rm -rf forged
193
+ git config user.name "Atomadic Forge"
194
+ git config user.email "atomadic-forge@atomadictech.com"
195
+ git checkout -b "$BRANCH"
196
+ git add -A
197
+ git commit -m "Forge refactor — 5-tier monadic layout (order $ORDER_ID)" || echo "nothing to commit"
198
+ git remote add bot "https://x-access-token:$BOT_TOKEN@github.com/${{ steps.fork.outputs.bot_owner }}/${{ steps.clone.outputs.repo_name }}.git"
199
+ git push -u bot "$BRANCH" --force
200
+ echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"
201
+
202
+ - name: Compose PR body
203
+ id: pr_body
204
+ if: steps.push.outcome == 'success'
205
+ run: |
206
+ CB=$(jq -r '.score // "?"' /tmp/certify-before.json 2>/dev/null || echo "?")
207
+ CA=$(jq -r '.score // "?"' /tmp/certify-after.json 2>/dev/null || echo "?")
208
+ WB=$(jq -r '.violation_count // "?"' /tmp/wire-before.json 2>/dev/null || echo "?")
209
+ WA=$(jq -r '.violation_count // "?"' /tmp/wire-after.json 2>/dev/null || echo "?")
210
+ {
211
+ echo "## Forge refactor — order \`$ORDER_ID\`"
212
+ echo ""
213
+ echo "This PR applies a full Forge pass against your repo:"
214
+ echo "**recon → cherry → wire → certify → emergent**."
215
+ echo ""
216
+ echo "### Scorecard"
217
+ echo "| Metric | Before | After |"
218
+ echo "|---|---|---|"
219
+ echo "| Certify | $CB | $CA |"
220
+ echo "| Wire violations | $WB | $WA |"
221
+ echo ""
222
+ echo "### What changed"
223
+ echo "- Every public symbol classified into the 5-tier monadic"
224
+ echo " layout (a0 constants → a1 functions → a2 composites →"
225
+ echo " a3 features → a4 orchestration)."
226
+ echo "- Upward imports rewritten down-tier or split."
227
+ echo "- All file moves preserve git history via \`forge auto\`."
228
+ echo ""
229
+ echo "### How to review"
230
+ echo "1. Skim the file-tree diff — every file is now in exactly"
231
+ echo " one tier directory."
232
+ echo "2. Run \`forge wire src\` locally — should be PASS."
233
+ echo "3. Run \`forge certify .\` — should match the After number"
234
+ echo " above."
235
+ echo "4. Run your own test suite — Forge does not touch behavior."
236
+ echo ""
237
+ echo "One round of revisions is included with your $499 order."
238
+ echo "Reply to the email you received from Atomadic with anything"
239
+ echo "you want changed."
240
+ echo ""
241
+ echo "— Atomadic Forge · powered by [forge.atomadic.tech](https://forge.atomadic.tech)"
242
+ } > /tmp/pr_body.md
243
+ # GitHub Output multiline
244
+ {
245
+ echo 'body<<EOF'
246
+ cat /tmp/pr_body.md
247
+ echo 'EOF'
248
+ } >> "$GITHUB_OUTPUT"
249
+
250
+ - name: Open PR from bot fork → customer repo
251
+ id: open_pr
252
+ if: steps.push.outcome == 'success'
253
+ run: |
254
+ PAYLOAD=$(jq -nR \
255
+ --arg title "Forge refactor — 5-tier monadic layout" \
256
+ --arg body "${{ steps.pr_body.outputs.body }}" \
257
+ --arg head "${{ steps.fork.outputs.bot_owner }}:${{ steps.push.outputs.branch }}" \
258
+ --arg base "${{ steps.clone.outputs.default_branch }}" \
259
+ '{title:$title, body:$body, head:$head, base:$base, maintainer_can_modify:true, draft:false}')
260
+ curl -sS -X POST \
261
+ -H "Authorization: token $BOT_TOKEN" \
262
+ -H "Accept: application/vnd.github+json" \
263
+ "https://api.github.com/repos/${{ steps.clone.outputs.repo_owner }}/${{ steps.clone.outputs.repo_name }}/pulls" \
264
+ -d "$PAYLOAD" \
265
+ > /tmp/pr.json
266
+ PR_URL=$(jq -r '.html_url // empty' /tmp/pr.json)
267
+ PR_NUM=$(jq -r '.number // empty' /tmp/pr.json)
268
+ if [ -z "$PR_URL" ]; then
269
+ echo "::error::Failed to open PR"
270
+ jq . /tmp/pr.json || cat /tmp/pr.json
271
+ echo "status=failed" >> "$GITHUB_OUTPUT"
272
+ echo "pr_url=" >> "$GITHUB_OUTPUT"
273
+ exit 1
274
+ fi
275
+ echo "PR opened: $PR_URL"
276
+ echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
277
+ echo "pr_number=$PR_NUM" >> "$GITHUB_OUTPUT"
278
+ echo "status=opened" >> "$GITHUB_OUTPUT"
279
+
280
+ - name: Notify atomadic-cognition (success or failure)
281
+ if: always()
282
+ run: |
283
+ STATUS="${{ steps.open_pr.outputs.status }}"
284
+ PR_URL="${{ steps.open_pr.outputs.pr_url }}"
285
+ if [ "${{ steps.forge_auto.outcome }}" != "success" ]; then
286
+ STATUS="forge_auto_failed"
287
+ elif [ "${{ steps.push.outcome }}" != "success" ]; then
288
+ STATUS="push_failed"
289
+ fi
290
+ STATUS="${STATUS:-failed}"
291
+ PAYLOAD=$(jq -n \
292
+ --arg order_id "$ORDER_ID" \
293
+ --arg session_id "$SESSION_ID" \
294
+ --arg pr_url "${PR_URL:-}" \
295
+ --arg status "$STATUS" \
296
+ --arg run_url "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
297
+ '{order_id:$order_id, session_id:$session_id, pr_url:$pr_url, status:$status, run_url:$run_url}')
298
+ curl -sS -X POST \
299
+ -H "Authorization: Bearer $PURCHASE_TOKEN" \
300
+ -H "Content-Type: application/json" \
301
+ "$COGNITION_URL/refactor-completed" \
302
+ -d "$PAYLOAD" || true
@@ -33,7 +33,7 @@ jobs:
33
33
  runs-on: ubuntu-latest
34
34
  timeout-minutes: 10
35
35
  steps:
36
- - uses: actions/checkout@v4
36
+ - uses: actions/checkout@v6
37
37
 
38
38
  - name: Run Atomadic Forge
39
39
  id: forge
@@ -15,10 +15,10 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - name: Check out repository
18
- uses: actions/checkout@v4
18
+ uses: actions/checkout@v6
19
19
 
20
20
  - name: Set up Python
21
- uses: actions/setup-python@v5
21
+ uses: actions/setup-python@v6
22
22
  with:
23
23
  python-version: "3.12"
24
24
  cache: pip
@@ -31,7 +31,7 @@ jobs:
31
31
  python -m twine check dist/*
32
32
 
33
33
  - name: Upload distributions
34
- uses: actions/upload-artifact@v4
34
+ uses: actions/upload-artifact@v7
35
35
  with:
36
36
  name: release-dist
37
37
  path: dist/*
@@ -46,7 +46,7 @@ jobs:
46
46
  if: github.event_name == 'release' && !github.event.release.prerelease
47
47
  steps:
48
48
  - name: Download distributions
49
- uses: actions/download-artifact@v4
49
+ uses: actions/download-artifact@v8
50
50
  with:
51
51
  name: release-dist
52
52
  path: dist
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 — MCP stdio framing compatibility
4
+
5
+ Fixes `forge mcp serve` for MCP hosts that use LSP-style
6
+ `Content-Length` framing over stdio instead of newline-delimited JSON.
7
+ Modern Codex / VS Code MCP bridges can spawn the server, list tools,
8
+ and then send framed `tools/call` requests; before this patch Forge
9
+ could misread the frame header as JSON and leave the host waiting until
10
+ its tool-call timeout.
11
+
12
+ ### Fixed
13
+
14
+ - `forge mcp serve` now accepts both newline-delimited JSON-RPC and
15
+ `Content-Length` framed JSON-RPC on stdin.
16
+ - MCP responses are written in the same framing style as the request
17
+ that triggered them, preserving compatibility with shell smoke tests
18
+ and stricter MCP clients.
19
+ - The dispatcher now treats both `notifications/initialized` and
20
+ `initialized` as no-response initialization notifications.
21
+ - The VS Code extension manifest version now tracks the `0.5.1`
22
+ package release.
23
+
24
+ ### Tests
25
+
26
+ - Added a framed stdio regression test for initialize → initialized →
27
+ ping → shutdown.
28
+ - Verified framed `tools/call list_recipes` against the real
29
+ `forge mcp serve` command.
30
+
31
+ ---
32
+
3
33
  ## 0.3.5 — Copilot's Copilot CLI parity + GUI version sync
4
34
 
5
35
  The MCP exposes 21 tools. Until 0.3.5, only 12 of them had CLI
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.3.5
3
+ Version: 0.5.1
4
4
  Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python + JavaScript/TypeScript) architecture guardian for AI-generated code.
5
5
  Author: Atomadic
6
6
  License-Expression: BUSL-1.1
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: click<9,>=8.1
18
18
  Requires-Dist: typer<1,>=0.15
19
- Requires-Dist: rich<15,>=14
19
+ Requires-Dist: rich<16,>=14
20
20
  Requires-Dist: pyyaml<7,>=6
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: pytest>=7; extra == "dev"
@@ -41,6 +41,7 @@ Dynamic: license-file
41
41
  [![License: BSL-1.1](https://img.shields.io/badge/License-BSL--1.1-yellow.svg)](LICENSE)
42
42
  [![CI](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml/badge.svg)](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml)
43
43
  [![Forge certify](https://img.shields.io/badge/forge_certify-100%2F100-brightgreen)](docs/SHOWCASE.md)
44
+ [![Product Hunt](https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1136405&theme=light&t=1777661664916)](https://www.producthunt.com/products/atomadic-forge-mcp-architecture-copilot)
44
45
 
45
46
  > **Absorb. Enforce. Emerge.** The architecture substrate for AI-generated code — now polyglot (Python, JavaScript, TypeScript).
46
47
 
@@ -9,6 +9,7 @@
9
9
  [![License: BSL-1.1](https://img.shields.io/badge/License-BSL--1.1-yellow.svg)](LICENSE)
10
10
  [![CI](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml/badge.svg)](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml)
11
11
  [![Forge certify](https://img.shields.io/badge/forge_certify-100%2F100-brightgreen)](docs/SHOWCASE.md)
12
+ [![Product Hunt](https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1136405&theme=light&t=1777661664916)](https://www.producthunt.com/products/atomadic-forge-mcp-architecture-copilot)
12
13
 
13
14
  > **Absorb. Enforce. Emerge.** The architecture substrate for AI-generated code — now polyglot (Python, JavaScript, TypeScript).
14
15
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atomadic-forge"
7
- version = "0.3.5"
7
+ version = "0.5.1"
8
8
  description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python + JavaScript/TypeScript) architecture guardian for AI-generated code."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -24,7 +24,7 @@ classifiers = [
24
24
  dependencies = [
25
25
  "click>=8.1,<9",
26
26
  "typer>=0.15,<1",
27
- "rich>=14,<15",
27
+ "rich>=14,<16",
28
28
  # Lane D W8 — .forge sidecar parser (a1.sidecar_parser) and the
29
29
  # GitHub Action validator test surface both depend on PyYAML.
30
30
  "pyyaml>=6,<7",
@@ -9,4 +9,4 @@ Public version surface only — every symbol lives in its tier package and
9
9
  is re-exported lazily by the CLI.
10
10
  """
11
11
 
12
- __version__ = "0.3.5"
12
+ __version__ = "0.5.1"
@@ -84,6 +84,10 @@ IGNORED_DIRS: Final[frozenset[str]] = frozenset({
84
84
  ".wrangler", ".wrangler-cache",
85
85
  # Atomadic-Forge's own scratch dir
86
86
  ".atomadic-forge",
87
+ # Intentional bad-wire test fixtures shipped with the Forge package.
88
+ # These exist to demonstrate violations and must NEVER count against
89
+ # the host repo's certify score.
90
+ "demo_packages",
87
91
  })
88
92
 
89
93