atomadic-forge 0.3.4__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.4 → 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.4 → atomadic_forge-0.5.1}/.github/workflows/forge-self-certify.yml +1 -1
  4. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/workflows/release.yml +4 -4
  5. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/CHANGELOG.md +90 -0
  6. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/PKG-INFO +3 -2
  7. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/README.md +1 -0
  8. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/pyproject.toml +2 -2
  9. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/__init__.py +1 -1
  10. {atomadic_forge-0.3.4 → 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.4 → 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.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/mcp_server.py +75 -11
  15. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +7 -0
  16. atomadic_forge-0.5.1/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +234 -0
  17. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/PKG-INFO +3 -2
  18. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/SOURCES.txt +6 -0
  19. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/requires.txt +1 -1
  20. atomadic_forge-0.5.1/tests/test_exported_api_check.py +146 -0
  21. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_mcp_protocol.py +53 -0
  22. atomadic_forge-0.5.1/tests/test_trust_gate_response.py +106 -0
  23. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/actions/forge-action/README.md +0 -0
  27. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/actions/forge-action/action.yml +0 -0
  28. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/dependabot.yml +0 -0
  29. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/pull_request_template.md +0 -0
  30. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/.github/workflows/forge-studio-ci.yml +0 -0
  31. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/ARCHITECTURE.md +0 -0
  32. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/CONTRIBUTING.md +0 -0
  33. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/LICENSE +0 -0
  34. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/MANIFEST.in +0 -0
  35. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/SECURITY.md +0 -0
  36. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/assets/Atomadic-Forge-01.png +0 -0
  37. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/01-getting-started.md +0 -0
  38. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/02-commands.md +0 -0
  39. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/03-tutorial.md +0 -0
  40. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/04-llm-loops.md +0 -0
  41. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/05-faq.md +0 -0
  42. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/AGENTS_GUIDE.md +0 -0
  43. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/AIR_GAPPED.md +0 -0
  44. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/CI_CD.md +0 -0
  45. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/CODEX_WALKTHROUGH.md +0 -0
  46. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/COMMANDS.md +0 -0
  47. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/FIRST_10_MINUTES.md +0 -0
  48. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/FORMALIZATION.md +0 -0
  49. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/LANDSCAPE.md +0 -0
  50. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/MARKET_POSITIONING.md +0 -0
  51. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/MULTI_REPO.md +0 -0
  52. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/README.md +0 -0
  53. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/RECEIPT.md +0 -0
  54. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/RELEASE_CHECKLIST.md +0 -0
  55. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/RELEASE_MESSAGING.md +0 -0
  56. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/ROADMAP.md +0 -0
  57. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/SHOWCASE.md +0 -0
  58. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/SIDECAR.md +0 -0
  59. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/STUDIO.md +0 -0
  60. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/WHY_NOW.md +0 -0
  61. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/INDEX.md +0 -0
  62. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/chat.md +0 -0
  63. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/commandsmith.md +0 -0
  64. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/config.md +0 -0
  65. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/demo.md +0 -0
  66. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/emergent-then-synergy.md +0 -0
  67. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/emergent.md +0 -0
  68. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/evolve-then-iterate.md +0 -0
  69. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/evolve.md +0 -0
  70. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/feature-then-emergent.md +0 -0
  71. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/iterate.md +0 -0
  72. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/synergy-then-emergent.md +0 -0
  73. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/commands/synergy.md +0 -0
  74. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  75. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/compliance/CS-1.md +0 -0
  76. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  77. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  78. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  79. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/01-quickstart.md +0 -0
  80. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/02-your-first-package.md +0 -0
  81. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
  82. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/04-plug-in-llms.md +0 -0
  83. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  84. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
  85. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/setup.cfg +0 -0
  86. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/__main__.py +0 -0
  87. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  88. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  89. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  90. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  91. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  92. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  93. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  94. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  95. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  96. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  97. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  98. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  99. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  100. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  101. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  102. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  103. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  104. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
  105. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  106. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  107. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  108. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  109. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  110. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  111. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  112. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  113. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  114. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  115. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  116. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  117. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  118. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  119. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  120. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  121. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  122. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  123. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  124. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  125. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  126. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  127. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  128. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  129. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  130. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  131. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  132. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  133. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  134. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  135. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  136. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  137. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  138. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  139. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  140. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
  141. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  142. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  143. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
  144. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  145. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  146. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  147. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  148. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  149. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  150. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  151. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  152. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  153. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  154. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  155. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  156. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  157. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  158. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  159. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  160. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  161. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  162. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  163. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  164. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
  165. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  166. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
  167. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  168. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  169. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  170. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  171. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  172. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  173. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  174. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  175. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  176. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  177. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  178. {atomadic_forge-0.3.4 → 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
  179. {atomadic_forge-0.3.4 → 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
  180. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  181. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  182. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  183. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  184. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  185. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  186. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  187. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  188. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  189. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  190. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  191. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  192. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  193. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  194. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  195. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  196. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/__init__.py +0 -0
  197. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/_registry.py +0 -0
  198. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/audit.py +0 -0
  199. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/chat.py +0 -0
  200. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
  201. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
  202. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/demo.py +0 -0
  203. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent.py +0 -0
  204. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  205. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve.py +0 -0
  206. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  207. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  208. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/iterate.py +0 -0
  209. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy.py +0 -0
  210. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  211. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  212. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  213. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  214. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_aaaa_nexus_client.py +0 -0
  215. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_agent_plan.py +0 -0
  216. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_agent_summary.py +0 -0
  217. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_audit_verb.py +0 -0
  218. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_badge_worker.py +0 -0
  219. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_body_extractor_repairs.py +0 -0
  220. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_card_renderer.py +0 -0
  221. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_certify_operational_axis.py +0 -0
  222. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_chat.py +0 -0
  223. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_classify_tier.py +0 -0
  224. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_cli_smoke.py +0 -0
  225. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_codex_5_complete.py +0 -0
  226. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
  227. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_commandsmith.py +0 -0
  228. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_compiler_feedback.py +0 -0
  229. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_compliance_checker.py +0 -0
  230. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_config.py +0 -0
  231. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_copilots_copilot.py +0 -0
  232. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_cs1_renderer.py +0 -0
  233. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_demo.py +0 -0
  234. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_emergent_compose.py +0 -0
  235. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_emergent_signature_extract.py +0 -0
  236. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_error_codes.py +0 -0
  237. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_error_hints.py +0 -0
  238. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_evolve_js.py +0 -0
  239. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_forge_action.py +0 -0
  240. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_forge_auth_a1.py +0 -0
  241. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_forge_auth_a2.py +0 -0
  242. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_forge_enforce.py +0 -0
  243. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_generation_quality.py +0 -0
  244. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_ignore_and_docs.py +0 -0
  245. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_import_smoke.py +0 -0
  246. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_iterate_evolve.py +0 -0
  247. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_js_certify.py +0 -0
  248. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_js_parser.py +0 -0
  249. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_js_recon.py +0 -0
  250. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_js_wire.py +0 -0
  251. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_lineage_chain.py +0 -0
  252. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_local_signer.py +0 -0
  253. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_lsp_protocol.py +0 -0
  254. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_manifest_diff.py +0 -0
  255. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_ollama_client.py +0 -0
  256. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_pipeline.py +0 -0
  257. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_plan_apply.py +0 -0
  258. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_pre_audit_smoke.py +0 -0
  259. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_precommit_hooks.py +0 -0
  260. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_progress_reporter.py +0 -0
  261. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_receipt_emitter.py +0 -0
  262. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_receipt_schema.py +0 -0
  263. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_receipt_signer.py +0 -0
  264. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_roi_calculator.py +0 -0
  265. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_sbom_emitter.py +0 -0
  266. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_scaffold.py +0 -0
  267. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_sidecar.py +0 -0
  268. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_sidecar_validate.py +0 -0
  269. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_stagnation.py +0 -0
  270. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_stub_detector.py +0 -0
  271. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_synergy.py +0 -0
  272. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_test_runner.py +0 -0
  273. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_tier_init_rebuild.py +0 -0
  274. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_vscode_extension_manifest.py +0 -0
  275. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_whoami_cmd.py +0 -0
  276. {atomadic_forge-0.3.4 → atomadic_forge-0.5.1}/tests/test_wire_certify.py +0 -0
  277. {atomadic_forge-0.3.4 → 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,95 @@
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
+
33
+ ## 0.3.5 — Copilot's Copilot CLI parity + GUI version sync
34
+
35
+ The MCP exposes 21 tools. Until 0.3.5, only 12 of them had CLI
36
+ front-doors — the other 9 were JSON-RPC-only, which meant a developer
37
+ or agent shell-running `forge` couldn't sample the same intelligence
38
+ without spawning the MCP server, speaking JSON-RPC, and parsing
39
+ `content[0].text`. This release closes the gap.
40
+
41
+ ### Added — 9 new top-level CLI verbs
42
+
43
+ Every MCP-only Codex tool now has a CLI sibling that prints JSON to
44
+ stdout, suitable for piping into `jq`, scripts, or an agent's Bash
45
+ subprocess:
46
+
47
+ | Verb | Codex # | What it does |
48
+ |---|---|---|
49
+ | `forge explain-repo <root>` | #6 | Humane operational orientation: one-liner + core flow + do_not_break list + important tests + release state |
50
+ | `forge score-patch [--file diff.patch]` | #3 | Patch risk scorer: arch / test / public-API / release risk + needs_human_review boolean |
51
+ | `forge select-tests <intent> --file ... --file ...` | #7 | Minimum + full-confidence test sets per intent; mirror-name matches plus tier-mate tests |
52
+ | `forge rollback-plan --file ... --file ...` | #11 | Structured undo plan: files to remove, caches to clean, docs to restore, tests to rerun, risk level |
53
+ | `forge compose-tools <goal>` | #9 | Tool-use planner: keyword → ordered MCP tool sequence (orient / release_check / fix_violation / before_edit / verify_patch) |
54
+ | `forge why-did-this-change <file>` | #5 | Agent memory: every lineage entry + plan event that touched the file |
55
+ | `forge what-failed-last-time <area>` | #5 | Failed / rolled-back plan events matching an area substring |
56
+ | `forge adapt-plan --cap apply --cap shell` | #8 | Capability-aware card filtering: tag each card with recommended_handling |
57
+ | `forge load-policy <root>` | #10 | Read `[tool.forge.agent]` from pyproject.toml (protected_files / release_gate / max_files_per_patch / require_human_review_for) |
58
+
59
+ All verbs default to JSON output. None mutate the repo.
60
+
61
+ ### Why this matters for agents
62
+
63
+ Before 0.3.5, an agent that wanted to compose a release-check tool
64
+ chain had to either spawn `forge mcp serve`, hand-craft a tools/call
65
+ JSON-RPC envelope, send it over stdio, and parse the wrapped text
66
+ content — or skip the intelligence entirely. After 0.3.5, the same
67
+ agent runs:
68
+
69
+ ```bash
70
+ forge compose-tools "release_check" | jq .steps
71
+ forge select-tests "fix(api): rate limit" --file src/api/limit.py
72
+ forge score-patch --file my.diff
73
+ ```
74
+
75
+ Three Bash calls. Same data. Zero JSON-RPC.
76
+
77
+ ### GUI version sync
78
+
79
+ `forge-web` PWA + `forge-studio` Tauri both pull their version label
80
+ from `forge-ui-core`'s `ForgeShell.tsx` default. That default was
81
+ still pinned to `0.3.2`. Now `0.3.5` so both shells correctly identify
82
+ themselves at the bottom of the sidebar.
83
+
84
+ ### Tests
85
+
86
+ 902 passing, 2 skipped (no test changes — every new verb is a thin
87
+ wrapper around an already-tested a1 function).
88
+ `forge wire src/atomadic_forge` PASS, `forge certify .` holds at
89
+ **100/100**.
90
+
91
+ ---
92
+
3
93
  ## 0.3.4 — `forge whoami` for agents and humans
4
94
 
5
95
  Adds the agent-empowerment QOL win that 0.3.3 was missing: when the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomadic-forge
3
- Version: 0.3.4
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.4"
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.4"
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