atomadic-forge 0.3.5__tar.gz → 0.5.2__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 (278) hide show
  1. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/ci.yml +6 -6
  2. atomadic_forge-0.5.2/.github/workflows/customer-refactor.yml +302 -0
  3. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/forge-self-certify.yml +1 -1
  4. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/release.yml +4 -4
  5. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/CHANGELOG.md +74 -0
  6. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/PKG-INFO +13 -5
  7. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/README.md +11 -3
  8. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/05-faq.md +8 -4
  9. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/AGENTS_GUIDE.md +25 -13
  10. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/COMMANDS.md +44 -16
  11. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/pyproject.toml +2 -2
  12. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/__init__.py +1 -1
  13. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +4 -0
  14. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +3 -30
  15. atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -0
  16. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +166 -2
  17. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/patch_scorer.py +14 -9
  18. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/preflight_change.py +20 -6
  19. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/test_selector.py +30 -5
  20. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/tool_composer.py +8 -3
  21. atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -0
  22. atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/validation_commands.py +183 -0
  23. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/mcp_server.py +75 -11
  24. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/cli.py +73 -0
  25. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/PKG-INFO +13 -5
  26. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/SOURCES.txt +6 -0
  27. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/requires.txt +1 -1
  28. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_codex_5_complete.py +37 -0
  29. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_copilots_copilot.py +40 -0
  30. atomadic_forge-0.5.2/tests/test_exported_api_check.py +146 -0
  31. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_mcp_protocol.py +70 -0
  32. atomadic_forge-0.5.2/tests/test_trust_gate_response.py +106 -0
  33. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  34. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  35. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  36. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/actions/forge-action/README.md +0 -0
  37. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/actions/forge-action/action.yml +0 -0
  38. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/dependabot.yml +0 -0
  39. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/pull_request_template.md +0 -0
  40. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/forge-studio-ci.yml +0 -0
  41. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/ARCHITECTURE.md +0 -0
  42. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/CONTRIBUTING.md +0 -0
  43. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/LICENSE +0 -0
  44. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/MANIFEST.in +0 -0
  45. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/SECURITY.md +0 -0
  46. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/assets/Atomadic-Forge-01.png +0 -0
  47. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/01-getting-started.md +0 -0
  48. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/02-commands.md +0 -0
  49. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/03-tutorial.md +0 -0
  50. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/04-llm-loops.md +0 -0
  51. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/AIR_GAPPED.md +0 -0
  52. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/CI_CD.md +0 -0
  53. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/CODEX_WALKTHROUGH.md +0 -0
  54. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/FIRST_10_MINUTES.md +0 -0
  55. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/FORMALIZATION.md +0 -0
  56. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/LANDSCAPE.md +0 -0
  57. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/MARKET_POSITIONING.md +0 -0
  58. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/MULTI_REPO.md +0 -0
  59. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/README.md +0 -0
  60. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RECEIPT.md +0 -0
  61. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RELEASE_CHECKLIST.md +0 -0
  62. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RELEASE_MESSAGING.md +0 -0
  63. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/ROADMAP.md +0 -0
  64. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/SHOWCASE.md +0 -0
  65. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/SIDECAR.md +0 -0
  66. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/STUDIO.md +0 -0
  67. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/WHY_NOW.md +0 -0
  68. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/INDEX.md +0 -0
  69. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/chat.md +0 -0
  70. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/commandsmith.md +0 -0
  71. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/config.md +0 -0
  72. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/demo.md +0 -0
  73. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/emergent-then-synergy.md +0 -0
  74. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/emergent.md +0 -0
  75. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/evolve-then-iterate.md +0 -0
  76. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/evolve.md +0 -0
  77. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/feature-then-emergent.md +0 -0
  78. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/iterate.md +0 -0
  79. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/synergy-then-emergent.md +0 -0
  80. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/synergy.md +0 -0
  81. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
  82. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/CS-1.md +0 -0
  83. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
  84. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
  85. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/SR_11-7_MAPPING.md +0 -0
  86. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/01-quickstart.md +0 -0
  87. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/02-your-first-package.md +0 -0
  88. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/03-the-five-tier-law.md +0 -0
  89. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/04-plug-in-llms.md +0 -0
  90. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/05-multi-repo-absorb.md +0 -0
  91. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/06-javascript-quickstart.md +0 -0
  92. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/setup.cfg +0 -0
  93. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/__main__.py +0 -0
  94. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  95. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
  96. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
  97. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  98. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  99. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  100. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
  101. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  102. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  103. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
  104. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
  105. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
  106. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  107. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
  108. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
  109. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  110. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  111. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
  112. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
  113. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
  114. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  115. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
  116. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
  117. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
  118. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  119. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  120. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  121. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  122. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
  123. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
  124. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  125. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
  126. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  127. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
  128. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
  129. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  130. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  131. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
  132. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
  133. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  134. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
  135. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  136. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  137. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  138. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  139. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
  140. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
  141. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
  142. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
  143. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
  144. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
  145. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
  146. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
  147. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
  148. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
  149. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  150. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  151. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
  152. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
  153. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
  154. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
  155. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
  156. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
  157. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  158. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  159. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  160. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
  161. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
  162. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
  163. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  164. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
  165. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
  166. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
  167. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
  168. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  169. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  170. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
  171. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  172. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
  173. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
  174. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  175. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
  176. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
  177. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  178. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
  179. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
  180. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
  181. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
  182. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
  183. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
  184. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
  185. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
  186. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  187. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
  188. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  189. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
  190. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
  191. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
  192. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
  193. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  194. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
  195. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  196. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
  197. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
  198. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
  199. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/__init__.py +0 -0
  200. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/_registry.py +0 -0
  201. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/audit.py +0 -0
  202. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/chat.py +0 -0
  203. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/commandsmith.py +0 -0
  204. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/config_cmd.py +0 -0
  205. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/demo.py +0 -0
  206. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/emergent.py +0 -0
  207. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  208. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/evolve.py +0 -0
  209. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  210. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  211. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/iterate.py +0 -0
  212. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/synergy.py +0 -0
  213. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  214. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  215. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  216. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  217. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_aaaa_nexus_client.py +0 -0
  218. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_agent_plan.py +0 -0
  219. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_agent_summary.py +0 -0
  220. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_audit_verb.py +0 -0
  221. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_badge_worker.py +0 -0
  222. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_body_extractor_repairs.py +0 -0
  223. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_card_renderer.py +0 -0
  224. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_certify_operational_axis.py +0 -0
  225. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_chat.py +0 -0
  226. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_classify_tier.py +0 -0
  227. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_cli_smoke.py +0 -0
  228. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_codex_6_enforce_polyglot.py +0 -0
  229. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_commandsmith.py +0 -0
  230. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_compiler_feedback.py +0 -0
  231. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_compliance_checker.py +0 -0
  232. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_config.py +0 -0
  233. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_cs1_renderer.py +0 -0
  234. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_demo.py +0 -0
  235. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_emergent_compose.py +0 -0
  236. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_emergent_signature_extract.py +0 -0
  237. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_error_codes.py +0 -0
  238. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_error_hints.py +0 -0
  239. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_evolve_js.py +0 -0
  240. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_action.py +0 -0
  241. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_auth_a1.py +0 -0
  242. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_auth_a2.py +0 -0
  243. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_enforce.py +0 -0
  244. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_generation_quality.py +0 -0
  245. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_ignore_and_docs.py +0 -0
  246. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_import_smoke.py +0 -0
  247. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_iterate_evolve.py +0 -0
  248. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_certify.py +0 -0
  249. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_parser.py +0 -0
  250. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_recon.py +0 -0
  251. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_wire.py +0 -0
  252. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_lineage_chain.py +0 -0
  253. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_local_signer.py +0 -0
  254. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_lsp_protocol.py +0 -0
  255. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_manifest_diff.py +0 -0
  256. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_ollama_client.py +0 -0
  257. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_pipeline.py +0 -0
  258. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_plan_apply.py +0 -0
  259. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_pre_audit_smoke.py +0 -0
  260. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_precommit_hooks.py +0 -0
  261. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_progress_reporter.py +0 -0
  262. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_emitter.py +0 -0
  263. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_schema.py +0 -0
  264. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_signer.py +0 -0
  265. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_roi_calculator.py +0 -0
  266. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sbom_emitter.py +0 -0
  267. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_scaffold.py +0 -0
  268. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sidecar.py +0 -0
  269. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sidecar_validate.py +0 -0
  270. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_stagnation.py +0 -0
  271. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_stub_detector.py +0 -0
  272. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_synergy.py +0 -0
  273. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_test_runner.py +0 -0
  274. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_tier_init_rebuild.py +0 -0
  275. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_vscode_extension_manifest.py +0 -0
  276. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_whoami_cmd.py +0 -0
  277. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_wire_certify.py +0 -0
  278. {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/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,79 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.2 - Agent ergonomics and language-aware guidance
4
+
5
+ Implements the first round of quality-of-life improvements from the
6
+ Forge agent review. This release makes Forge friendlier when an agent
7
+ uses it on JavaScript repos, documentation/research patches, or live
8
+ MCP connections.
9
+
10
+ ### Added
11
+
12
+ - `forge mcp doctor` smoke-tests MCP stdio with framed `initialize`,
13
+ `tools/list`, and `shutdown` requests. It reports version, project
14
+ root, tool count, framed-stdio status, server exit code, and a
15
+ recovery hint.
16
+ - `tools/list` entries now include a `cli_command` fallback so agents
17
+ can switch from MCP to shell without guessing command names.
18
+ - Shared validation heuristics now detect `package.json` scripts,
19
+ JS/TS tests, tier roots, and release-gate commands.
20
+
21
+ ### Improved
22
+
23
+ - `context-pack` prefers `npm run verify` / `npm test` for JavaScript
24
+ projects and derives `forge wire` gates from real tier roots.
25
+ - `preflight` recognizes non-code artifacts such as `docs/`,
26
+ `research/`, `.github/`, and `cognition/guides/` as valid project
27
+ memory instead of misplaced source.
28
+ - `select-tests` discovers JS/TS test files and avoids mirror pytest
29
+ requirements for documentation-only changes.
30
+ - `score-patch` no longer treats docs/research-only diffs as code
31
+ changes without tests, and emits language-aware validation commands
32
+ when a project root is provided.
33
+ - `compose-tools verify_patch` now maps to
34
+ `score_patch -> select_tests -> wire -> certify`.
35
+ - Hidden worktrees, experiment directories, build output, and
36
+ `node_modules` are skipped when deriving release-gate wire roots.
37
+
38
+ ### Tests
39
+
40
+ - Added regression tests for JavaScript validation selection,
41
+ non-code artifact preflight, docs-only patch scoring, exact
42
+ `verify_patch` recipe matching, MCP CLI fallback metadata, and
43
+ `forge mcp doctor`.
44
+
45
+ ---
46
+
47
+ ## 0.5.1 — MCP stdio framing compatibility
48
+
49
+ Fixes `forge mcp serve` for MCP hosts that use LSP-style
50
+ `Content-Length` framing over stdio instead of newline-delimited JSON.
51
+ Modern Codex / VS Code MCP bridges can spawn the server, list tools,
52
+ and then send framed `tools/call` requests; before this patch Forge
53
+ could misread the frame header as JSON and leave the host waiting until
54
+ its tool-call timeout.
55
+
56
+ ### Fixed
57
+
58
+ - `forge mcp serve` now accepts both newline-delimited JSON-RPC and
59
+ `Content-Length` framed JSON-RPC on stdin.
60
+ - MCP responses are written in the same framing style as the request
61
+ that triggered them, preserving compatibility with shell smoke tests
62
+ and stricter MCP clients.
63
+ - The dispatcher now treats both `notifications/initialized` and
64
+ `initialized` as no-response initialization notifications.
65
+ - The VS Code extension manifest version now tracks the `0.5.1`
66
+ package release.
67
+
68
+ ### Tests
69
+
70
+ - Added a framed stdio regression test for initialize → initialized →
71
+ ping → shutdown.
72
+ - Verified framed `tools/call list_recipes` against the real
73
+ `forge mcp serve` command.
74
+
75
+ ---
76
+
3
77
  ## 0.3.5 — Copilot's Copilot CLI parity + GUI version sync
4
78
 
5
79
  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.2
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
 
@@ -215,14 +216,21 @@ Forge ships a **Model Context Protocol server** — add it to Cursor, Claude Cod
215
216
  }
216
217
  ```
217
218
 
218
- **21 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe`
219
+ **23 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe` · `trust_gate_response` · `exported_api_check`
219
220
 
220
221
  **5 resources:** Receipt schema · formalization docs · lineage chain · blocker summary · verdicts
221
222
 
222
223
  ```bash
223
224
  forge mcp serve --help # full tool + resource listing with examples
225
+ forge mcp doctor --project . --json
224
226
  ```
225
227
 
228
+ As of `0.5.2`, `tools/list` includes a `cli_command` fallback for
229
+ each MCP tool. `context-pack`, `preflight`, `select-tests`, and
230
+ `score-patch` also use language-aware validation commands so
231
+ JavaScript projects get `npm run verify` / `npm test` guidance and
232
+ documentation/research paths are treated as non-code project memory.
233
+
226
234
  ### Subscription required for `forge mcp serve`
227
235
 
228
236
  Every `tools/call` against the MCP server is gated behind a paid Forge
@@ -369,7 +377,7 @@ Forge waits before returning a clear provider error.
369
377
 
370
378
  | Command | Purpose |
371
379
  |---------|---------|
372
- | `forge mcp serve` | Stdio JSON-RPC MCP server — 21 tools for Cursor / Claude Code / Aider / Devin. |
380
+ | `forge mcp serve` | Stdio JSON-RPC MCP server — 23 tools for Cursor / Claude Code / Aider / Devin. |
373
381
  | `forge plan / plan-list / plan-show / plan-step / plan-apply` | Agent plan persistence and step-by-step apply. |
374
382
  | `forge iterate` | LLM loop: intent → code → absorb → wire → score → iterate. Single shot. |
375
383
  | `forge evolve` | Recursive improvement: N rounds, catalog grows each round. |
@@ -491,7 +499,7 @@ forge commandsmith smoke # Smoke-test all 36+ registered verbs
491
499
  - ✓ **100/100 certify** — forge scores itself on every CI run
492
500
  - ✓ **0 wire violations** — forge passes its own import-law scan
493
501
  - ✓ **On PyPI** — `pip install atomadic-forge`
494
- - ✓ **MCP server** — 21 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
502
+ - ✓ **MCP server** — 23 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
495
503
  - ✓ **Desktop GUI** — Forge Studio (Tauri 2 + React)
496
504
  - ✓ **Ed25519 signing** — `forge certify --local-sign`
497
505
  - ✓ **CycloneDX SBOM** — `forge sbom`
@@ -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
 
@@ -183,14 +184,21 @@ Forge ships a **Model Context Protocol server** — add it to Cursor, Claude Cod
183
184
  }
184
185
  ```
185
186
 
186
- **21 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe`
187
+ **23 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe` · `trust_gate_response` · `exported_api_check`
187
188
 
188
189
  **5 resources:** Receipt schema · formalization docs · lineage chain · blocker summary · verdicts
189
190
 
190
191
  ```bash
191
192
  forge mcp serve --help # full tool + resource listing with examples
193
+ forge mcp doctor --project . --json
192
194
  ```
193
195
 
196
+ As of `0.5.2`, `tools/list` includes a `cli_command` fallback for
197
+ each MCP tool. `context-pack`, `preflight`, `select-tests`, and
198
+ `score-patch` also use language-aware validation commands so
199
+ JavaScript projects get `npm run verify` / `npm test` guidance and
200
+ documentation/research paths are treated as non-code project memory.
201
+
194
202
  ### Subscription required for `forge mcp serve`
195
203
 
196
204
  Every `tools/call` against the MCP server is gated behind a paid Forge
@@ -337,7 +345,7 @@ Forge waits before returning a clear provider error.
337
345
 
338
346
  | Command | Purpose |
339
347
  |---------|---------|
340
- | `forge mcp serve` | Stdio JSON-RPC MCP server — 21 tools for Cursor / Claude Code / Aider / Devin. |
348
+ | `forge mcp serve` | Stdio JSON-RPC MCP server — 23 tools for Cursor / Claude Code / Aider / Devin. |
341
349
  | `forge plan / plan-list / plan-show / plan-step / plan-apply` | Agent plan persistence and step-by-step apply. |
342
350
  | `forge iterate` | LLM loop: intent → code → absorb → wire → score → iterate. Single shot. |
343
351
  | `forge evolve` | Recursive improvement: N rounds, catalog grows each round. |
@@ -459,7 +467,7 @@ forge commandsmith smoke # Smoke-test all 36+ registered verbs
459
467
  - ✓ **100/100 certify** — forge scores itself on every CI run
460
468
  - ✓ **0 wire violations** — forge passes its own import-law scan
461
469
  - ✓ **On PyPI** — `pip install atomadic-forge`
462
- - ✓ **MCP server** — 21 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
470
+ - ✓ **MCP server** — 23 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
463
471
  - ✓ **Desktop GUI** — Forge Studio (Tauri 2 + React)
464
472
  - ✓ **Ed25519 signing** — `forge certify --local-sign`
465
473
  - ✓ **CycloneDX SBOM** — `forge sbom`
@@ -429,27 +429,31 @@ config:
429
429
  }
430
430
  ```
431
431
 
432
- Once registered, the agent gets **21 tools** + **5 resources** (the
433
- full Codex-1..5 surface as of `v0.3.0`). The 21 tools group into
432
+ Once registered, the agent gets **23 tools** + **5 resources** (the
433
+ full Codex-1..5 surface plus response/API trust gates). The 23 tools group into
434
434
  *inventory* (`recon` / `wire` / `certify` / `enforce` / `audit_list` /
435
435
  `agent_summary`), *action loop* (`auto_plan` / `auto_step` /
436
436
  `auto_apply`), and *Copilot's Copilot* (`context_pack` /
437
437
  `preflight_change` / `score_patch` / `select_tests` / `rollback_plan` /
438
438
  `explain_repo` / `adapt_plan` / `compose_tools` / `load_policy` /
439
439
  `why_did_this_change` / `what_failed_last_time` / `list_recipes` /
440
- `get_recipe`). See the full **[Agents Guide](AGENTS_GUIDE.md)** for
440
+ `get_recipe` / `trust_gate_response` / `exported_api_check`). See the full **[Agents Guide](AGENTS_GUIDE.md)** for
441
441
  integration patterns, the agent-friendly `agent_summary` /
442
442
  `context_pack` tools, the Forge Receipt schema agents should
443
443
  consume, F-code routing for mechanical fixes, the proposal-engine
444
444
  flow, and best practices.
445
445
 
446
+ For MCP troubleshooting, run `forge mcp doctor --project . --json`.
447
+ As of `0.5.2`, `tools/list` also includes a `cli_command` fallback for
448
+ each MCP tool, and validation hints are language-aware.
449
+
446
450
  ### What's the difference between AGENTS.md and the Agents Guide?
447
451
 
448
452
  - **`AGENTS.md`** at the repo root is for agents *building* Forge —
449
453
  the dev contract: tier discipline, F-code namespace, schema
450
454
  versioning, branch hygiene, the verification lane.
451
455
  - **`docs/AGENTS_GUIDE.md`** is for agents *using* Forge — Cursor /
452
- Claude Code / Aider / etc. integrating via MCP, calling the 21
456
+ Claude Code / Aider / etc. integrating via MCP, calling the 23
453
457
  tools, consuming Receipts, running `preflight_change` /
454
458
  `score_patch` guardrails, applying mechanical fixes via `enforce`.
455
459