atomadic-forge 0.6.1__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. atomadic_forge-0.10.0/.github/FUNDING.yml +5 -0
  2. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/actions/forge-action/README.md +130 -130
  3. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/actions/forge-action/action.yml +227 -227
  4. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/workflows/ci.yml +96 -96
  5. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/workflows/customer-refactor.yml +302 -302
  6. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/workflows/forge-self-certify.yml +54 -54
  7. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/workflows/forge-studio-ci.yml +59 -59
  8. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/workflows/release.yml +55 -55
  9. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/ARCHITECTURE.md +147 -147
  10. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/CHANGELOG.md +436 -0
  11. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/PKG-INFO +586 -510
  12. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/README.md +554 -478
  13. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/01-getting-started.md +285 -232
  14. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/02-commands.md +670 -670
  15. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/03-tutorial.md +328 -328
  16. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/04-llm-loops.md +87 -0
  17. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/05-faq.md +475 -472
  18. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/AGENTS_GUIDE.md +634 -486
  19. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/AIR_GAPPED.md +161 -161
  20. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/CI_CD.md +192 -192
  21. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/CODEX_WALKTHROUGH.md +124 -124
  22. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/COMMANDS.md +865 -794
  23. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/FIRST_10_MINUTES.md +200 -200
  24. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/FORMALIZATION.md +197 -197
  25. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/LANDSCAPE.md +111 -111
  26. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/MULTI_REPO.md +202 -202
  27. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/README.md +138 -138
  28. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/RECEIPT.md +305 -305
  29. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/ROADMAP.md +112 -112
  30. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/SHOWCASE.md +241 -241
  31. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/SIDECAR.md +139 -139
  32. atomadic_forge-0.10.0/docs/STRIPE_SETUP_HANDOFF.md +299 -0
  33. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/WHY_NOW.md +119 -119
  34. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/INDEX.md +18 -18
  35. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/chat.md +9 -9
  36. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/commandsmith.md +9 -9
  37. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/config.md +9 -9
  38. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/demo.md +9 -9
  39. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/emergent-then-synergy.md +9 -9
  40. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/emergent.md +9 -9
  41. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/evolve-then-iterate.md +9 -9
  42. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/evolve.md +9 -9
  43. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/feature-then-emergent.md +9 -9
  44. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/iterate.md +9 -9
  45. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/synergy-then-emergent.md +9 -9
  46. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/commands/synergy.md +9 -9
  47. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/compliance/CMMC_AI_MAPPING.md +157 -157
  48. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/compliance/CS-1.md +203 -203
  49. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +145 -145
  50. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/compliance/FDA_PCCP_MAPPING.md +138 -138
  51. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/compliance/SR_11-7_MAPPING.md +104 -104
  52. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/01-quickstart.md +91 -91
  53. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/03-the-five-tier-law.md +133 -133
  54. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/05-multi-repo-absorb.md +155 -155
  55. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/06-javascript-quickstart.md +242 -242
  56. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/pyproject.toml +90 -90
  57. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/setup.cfg +4 -4
  58. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/__init__.py +12 -12
  59. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +120 -120
  60. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +150 -132
  61. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +296 -296
  62. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +154 -154
  63. atomadic_forge-0.10.0/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +134 -0
  64. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +48 -48
  65. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +311 -311
  66. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +96 -96
  67. atomadic_forge-0.10.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +106 -0
  68. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +81 -81
  69. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +14 -0
  70. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/agent_context_pack.py +446 -0
  71. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +139 -139
  72. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +325 -325
  73. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +277 -277
  74. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/call_graph.py +378 -0
  75. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +210 -210
  76. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +67 -31
  77. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/chat_context.py +170 -170
  78. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/code_signature.py +197 -197
  79. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +94 -94
  80. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +228 -228
  81. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +588 -588
  82. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +37 -2
  83. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/emergent_rank.py +209 -0
  84. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +258 -208
  85. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/error_hints.py +105 -105
  86. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -188
  87. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +223 -217
  88. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/forge_locate.py +179 -0
  89. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +113 -113
  90. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/js_parser.py +539 -539
  91. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +144 -144
  92. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +107 -107
  93. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/llm_client.py +555 -555
  94. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/local_signer.py +134 -134
  95. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +379 -379
  96. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +314 -314
  97. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/mcp_protocol.py +2898 -0
  98. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +290 -272
  99. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +75 -75
  100. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +107 -107
  101. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +241 -241
  102. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +81 -81
  103. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +291 -291
  104. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/recipes.py +88 -0
  105. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +124 -124
  106. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +95 -95
  107. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +264 -264
  108. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +147 -147
  109. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +155 -155
  110. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +309 -309
  111. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +161 -161
  112. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +202 -202
  113. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/smell_scan.py +252 -0
  114. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/synergy_detect.py +352 -0
  115. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +114 -0
  116. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +334 -0
  117. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/test_runner.py +194 -194
  118. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/test_selector.py +147 -147
  119. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +168 -135
  120. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -221
  121. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +183 -183
  122. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/wire_check.py +260 -260
  123. atomadic_forge-0.10.0/src/atomadic_forge/a1_at_functions/worktree_status.py +209 -0
  124. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +266 -266
  125. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +69 -69
  126. atomadic_forge-0.10.0/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +185 -0
  127. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +254 -251
  128. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +307 -307
  129. atomadic_forge-0.10.0/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +194 -0
  130. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +122 -122
  131. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +164 -164
  132. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +231 -231
  133. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +228 -228
  134. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/cherry_hunter.py +254 -0
  135. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/cna_check.py +280 -0
  136. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +267 -267
  137. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/commit_compose.py +177 -0
  138. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +280 -220
  139. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +3 -3
  140. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +4 -4
  141. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +14 -14
  142. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +10 -10
  143. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +18 -18
  144. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/demo_runner.py +489 -489
  145. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +101 -95
  146. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/emergent_swarm.py +265 -0
  147. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +107 -107
  148. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/forge_evolve_session.py +306 -0
  149. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/forge_loop.py +528 -528
  150. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/forge_loop_session.py +271 -0
  151. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +295 -295
  152. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +222 -222
  153. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/guard_install.py +284 -0
  154. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/lsp_server.py +98 -98
  155. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/mcp_server.py +727 -0
  156. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +65 -65
  157. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/tool_factory.py +488 -0
  158. atomadic_forge-0.10.0/src/atomadic_forge/a3_og_features/verify_umbrella.py +206 -0
  159. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +1493 -1378
  160. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +263 -234
  161. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +8 -6
  162. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +159 -159
  163. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/_registry.py +36 -36
  164. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/audit.py +142 -142
  165. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/commandsmith.py +176 -176
  166. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/demo.py +82 -82
  167. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/iterate.py +140 -140
  168. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/PKG-INFO +586 -510
  169. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/SOURCES.txt +19 -0
  170. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_agent_hire_protocol.py +99 -99
  171. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_agent_plan.py +282 -282
  172. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_agent_summary.py +329 -329
  173. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_audit_verb.py +169 -169
  174. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_card_renderer.py +200 -200
  175. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_chat.py +46 -46
  176. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_cli_smoke.py +229 -199
  177. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_codex_5_complete.py +448 -448
  178. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_codex_6_enforce_polyglot.py +203 -202
  179. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_compiler_feedback.py +203 -203
  180. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_compliance_checker.py +245 -245
  181. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_copilots_copilot.py +464 -395
  182. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_cost_circuit_breaker.py +95 -95
  183. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_cs1_renderer.py +368 -368
  184. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_dedup_engine.py +157 -155
  185. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_error_codes.py +241 -241
  186. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_error_hints.py +127 -127
  187. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_exported_api_check.py +105 -150
  188. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_forge_action.py +259 -259
  189. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_forge_auth_a1.py +251 -228
  190. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_forge_auth_a2.py +391 -376
  191. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_forge_enforce.py +320 -266
  192. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_hierarchical_memory.py +90 -90
  193. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_ignore_and_docs.py +270 -270
  194. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_js_certify.py +76 -76
  195. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_js_parser.py +152 -152
  196. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_js_recon.py +101 -101
  197. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_js_wire.py +94 -94
  198. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_lineage_chain.py +255 -255
  199. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_local_signer.py +185 -185
  200. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_lsp_protocol.py +302 -302
  201. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_manifest_diff.py +201 -201
  202. atomadic_forge-0.10.0/tests/test_mcp_protocol.py +1775 -0
  203. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_plan_apply.py +378 -378
  204. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_pre_audit_smoke.py +235 -235
  205. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_precommit_hooks.py +175 -175
  206. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_progress_reporter.py +103 -103
  207. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_receipt_emitter.py +222 -222
  208. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_receipt_schema.py +206 -206
  209. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_receipt_signer.py +217 -217
  210. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_roi_calculator.py +243 -243
  211. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_sbom_emitter.py +141 -141
  212. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_scaffold.py +111 -111
  213. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_sidecar.py +188 -188
  214. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_sidecar_validate.py +196 -196
  215. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_stub_detector.py +163 -163
  216. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_synergy.py +6 -2
  217. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_test_runner.py +67 -1
  218. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_trust_gate_response.py +108 -108
  219. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_whoami_cmd.py +126 -126
  220. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_wire_certify.py +56 -56
  221. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_wire_suggest_repairs.py +145 -145
  222. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -166
  223. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -116
  224. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -1234
  225. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -166
  226. atomadic_forge-0.6.1/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -163
  227. atomadic_forge-0.6.1/src/atomadic_forge/a3_og_features/mcp_server.py +0 -356
  228. atomadic_forge-0.6.1/tests/test_mcp_protocol.py +0 -397
  229. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  230. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  231. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  232. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/dependabot.yml +0 -0
  233. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/.github/pull_request_template.md +0 -0
  234. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/CONTRIBUTING.md +0 -0
  235. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/LICENSE +0 -0
  236. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/MANIFEST.in +0 -0
  237. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/SECURITY.md +0 -0
  238. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/assets/Atomadic-Forge-01.png +0 -0
  239. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/MARKET_POSITIONING.md +0 -0
  240. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/RELEASE_CHECKLIST.md +0 -0
  241. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/RELEASE_MESSAGING.md +0 -0
  242. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/STUDIO.md +0 -0
  243. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/02-your-first-package.md +0 -0
  244. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/docs/tutorials/04-plug-in-llms.md +0 -0
  245. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/__main__.py +0 -0
  246. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
  247. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
  248. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
  249. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
  250. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
  251. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
  252. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
  253. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
  254. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
  255. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
  256. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
  257. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
  258. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
  259. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
  260. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
  261. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
  262. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
  263. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
  264. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
  265. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
  266. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
  267. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
  268. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
  269. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
  270. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
  271. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
  272. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
  273. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
  274. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
  275. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
  276. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
  277. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
  278. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
  279. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
  280. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
  281. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
  282. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
  283. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
  284. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/__init__.py +0 -0
  285. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/chat.py +0 -0
  286. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
  287. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/emergent.py +0 -0
  288. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
  289. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/evolve.py +0 -0
  290. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
  291. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
  292. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/synergy.py +0 -0
  293. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
  294. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
  295. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
  296. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
  297. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
  298. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_aaaa_nexus_client.py +0 -0
  299. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_body_extractor_repairs.py +0 -0
  300. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_certify_operational_axis.py +0 -0
  301. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_classify_tier.py +0 -0
  302. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_commandsmith.py +0 -0
  303. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_config.py +0 -0
  304. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_demo.py +0 -0
  305. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_emergent_compose.py +0 -0
  306. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_emergent_signature_extract.py +0 -0
  307. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_evolve_js.py +0 -0
  308. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_generation_quality.py +0 -0
  309. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_import_smoke.py +0 -0
  310. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_iterate_evolve.py +0 -0
  311. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_ling_provider.py +0 -0
  312. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_ollama_client.py +0 -0
  313. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_pipeline.py +0 -0
  314. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_stagnation.py +0 -0
  315. {atomadic_forge-0.6.1 → atomadic_forge-0.10.0}/tests/test_tier_init_rebuild.py +0 -0
@@ -0,0 +1,5 @@
1
+ # Atomadic Forge — Support & Funding
2
+ ko_fi: []
3
+ custom:
4
+ - https://buymeacoffee.com/atomadic
5
+ - https://forge.atomadic.tech
@@ -1,130 +1,130 @@
1
- # forge-action
2
-
3
- [![Atomadic Forge](https://img.shields.io/badge/atomadic-forge-purple)](https://github.com/atomadictech/atomadic-forge)
4
-
5
- A GitHub Action that runs **`forge wire` + `forge certify`** on a
6
- tier-organized package and posts a **sticky PR comment** with the
7
- rendered Receipt card. Composite action — no Docker, no extra runtime.
8
-
9
- This is the Lane C W1 deliverable from the Atomadic Forge Golden Path.
10
- Eventually moves to its own repo (`atomadictech/forge-action`); today
11
- it ships in-tree under `.github/actions/forge-action/` so the action's
12
- ref tracks the Forge release that emitted it.
13
-
14
- ---
15
-
16
- ## One-line install
17
-
18
- In a consuming repo, add `.github/workflows/forge.yml`:
19
-
20
- ```yaml
21
- name: Atomadic Forge — architecture gate
22
- on:
23
- pull_request:
24
- push:
25
- branches: [main]
26
-
27
- permissions:
28
- contents: read
29
- pull-requests: write # required to post the sticky comment
30
-
31
- jobs:
32
- forge:
33
- runs-on: ubuntu-latest
34
- steps:
35
- - uses: actions/checkout@v4
36
- - uses: atomadictech/atomadic-forge/.github/actions/forge-action@main
37
- with:
38
- package_root: src/your_package
39
- package_name: your_package
40
- fail_under: '75'
41
- ```
42
-
43
- That's it. The action will:
44
-
45
- 1. Install Forge from the same ref the action checked out at.
46
- 2. Run `forge wire <package_root> --fail-on-violations --json` —
47
- exits 1 on any upward-import violation.
48
- 3. Run `forge certify . --fail-under <N> --emit-receipt
49
- .atomadic-forge/receipt.json --print-card --json` — exits 1 below
50
- the threshold.
51
- 4. Upload `wire.json`, `certify.json`, `receipt.json`, and the
52
- rendered card as a 14-day build artifact.
53
- 5. Post (or update) a single sticky PR comment with the rendered card
54
- and a one-line verdict summary.
55
-
56
- ---
57
-
58
- ## Inputs
59
-
60
- | Name | Required | Default | Notes |
61
- |---|---|---|---|
62
- | `package_root` | yes | – | Tier-organized package path (e.g. `src/your_package`) |
63
- | `project_root` | no | `.` | Project root passed to `forge certify` |
64
- | `package_name` | no | `''` | Forwarded to `forge certify --package` |
65
- | `fail_under` | no | `'75'` | Certify threshold; below this, the job fails |
66
- | `receipt_path` | no | `.atomadic-forge/receipt.json` | Receipt JSON emit path (relative to `project_root`) |
67
- | `python_version` | no | `'3.11'` | Python for the Forge install |
68
- | `forge_ref` | no | (action ref) | Override which `atomadic-forge` ref to install |
69
- | `comment_on_pr` | no | `'true'` | Set to `'false'` to skip the sticky comment |
70
- | `upload_artifacts` | no | `'true'` | Set to `'false'` to skip the artifact upload |
71
-
72
- ## Outputs
73
-
74
- | Name | Type | Notes |
75
- |---|---|---|
76
- | `certify_score` | string | The certify score (0–100) as text |
77
- | `wire_verdict` | string | `PASS` or `FAIL` |
78
- | `receipt_path` | string | Echoes back the input `receipt_path` |
79
-
80
- ---
81
-
82
- ## Soft-fail discipline
83
-
84
- - **Wire and certify gates fail the job by themselves.** The
85
- `--fail-on-violations` and `--fail-under` flags are native (shipped
86
- in 0.2.x); no `python -c` workarounds.
87
- - **The PR comment is best-effort.** When the workflow runs from a
88
- fork or without `pull-requests: write`, the comment step is skipped
89
- and the job still reports its real verdict via exit code.
90
- - **The Receipt is signable.** When `AAAA_NEXUS_API_KEY` is available
91
- in the environment and the consuming workflow re-invokes `forge
92
- certify --sign`, the Receipt's `signatures.aaaa_nexus` field is
93
- populated. `forge-action` does not call `--sign` by default — most
94
- CI runs are unsigned dev attestations.
95
-
96
- ---
97
-
98
- ## What the sticky comment looks like
99
-
100
- ```
101
- ### Atomadic Forge — wire + certify
102
-
103
- **wire:** `PASS` · **certify:** `100.0/100`
104
-
105
- ╔══════════════════════════════════════════════════════════╗
106
- │ Atomadic Forge Receipt atomadic-forge.receipt/v1 │
107
- │ ✓ PASS forge 0.2.2 │
108
- │ atomadic-forge │
109
- │ CERTIFY 100.0 / 100 │
110
- │ docs ✓ tests ✓ layout ✓ wire ✓ │
111
- │ WIRE PASS (0 violations) │
112
- │ SCOUT 952 symbols (python) 952 tier-placed │
113
- ╚══════════════════════════════════════════════════════════╝
114
-
115
- Posted by forge-action. The card and JSON receipt are also uploaded
116
- as build artifacts on this run.
117
- ```
118
-
119
- Updated in place on every push — never spams the PR.
120
-
121
- ---
122
-
123
- ## Status
124
-
125
- - **Today (Lane C W1):** in-tree under `.github/actions/forge-action/`,
126
- ref-pinned to the consuming Forge release.
127
- - **Lane C W12 (planned):** dedicated repo `atomadictech/forge-action`
128
- + Marketplace listing.
129
- - **Lane C W16+ (planned):** GitHub App variant that opens weekly
130
- drift-PRs via `forge iterate --dry-run`.
1
+ # forge-action
2
+
3
+ [![Atomadic Forge](https://img.shields.io/badge/atomadic-forge-purple)](https://github.com/atomadictech/atomadic-forge)
4
+
5
+ A GitHub Action that runs **`forge wire` + `forge certify`** on a
6
+ tier-organized package and posts a **sticky PR comment** with the
7
+ rendered Receipt card. Composite action — no Docker, no extra runtime.
8
+
9
+ This is the Lane C W1 deliverable from the Atomadic Forge Golden Path.
10
+ Eventually moves to its own repo (`atomadictech/forge-action`); today
11
+ it ships in-tree under `.github/actions/forge-action/` so the action's
12
+ ref tracks the Forge release that emitted it.
13
+
14
+ ---
15
+
16
+ ## One-line install
17
+
18
+ In a consuming repo, add `.github/workflows/forge.yml`:
19
+
20
+ ```yaml
21
+ name: Atomadic Forge — architecture gate
22
+ on:
23
+ pull_request:
24
+ push:
25
+ branches: [main]
26
+
27
+ permissions:
28
+ contents: read
29
+ pull-requests: write # required to post the sticky comment
30
+
31
+ jobs:
32
+ forge:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - uses: atomadictech/atomadic-forge/.github/actions/forge-action@main
37
+ with:
38
+ package_root: src/your_package
39
+ package_name: your_package
40
+ fail_under: '75'
41
+ ```
42
+
43
+ That's it. The action will:
44
+
45
+ 1. Install Forge from the same ref the action checked out at.
46
+ 2. Run `forge wire <package_root> --fail-on-violations --json` —
47
+ exits 1 on any upward-import violation.
48
+ 3. Run `forge certify . --fail-under <N> --emit-receipt
49
+ .atomadic-forge/receipt.json --print-card --json` — exits 1 below
50
+ the threshold.
51
+ 4. Upload `wire.json`, `certify.json`, `receipt.json`, and the
52
+ rendered card as a 14-day build artifact.
53
+ 5. Post (or update) a single sticky PR comment with the rendered card
54
+ and a one-line verdict summary.
55
+
56
+ ---
57
+
58
+ ## Inputs
59
+
60
+ | Name | Required | Default | Notes |
61
+ |---|---|---|---|
62
+ | `package_root` | yes | – | Tier-organized package path (e.g. `src/your_package`) |
63
+ | `project_root` | no | `.` | Project root passed to `forge certify` |
64
+ | `package_name` | no | `''` | Forwarded to `forge certify --package` |
65
+ | `fail_under` | no | `'75'` | Certify threshold; below this, the job fails |
66
+ | `receipt_path` | no | `.atomadic-forge/receipt.json` | Receipt JSON emit path (relative to `project_root`) |
67
+ | `python_version` | no | `'3.11'` | Python for the Forge install |
68
+ | `forge_ref` | no | (action ref) | Override which `atomadic-forge` ref to install |
69
+ | `comment_on_pr` | no | `'true'` | Set to `'false'` to skip the sticky comment |
70
+ | `upload_artifacts` | no | `'true'` | Set to `'false'` to skip the artifact upload |
71
+
72
+ ## Outputs
73
+
74
+ | Name | Type | Notes |
75
+ |---|---|---|
76
+ | `certify_score` | string | The certify score (0–100) as text |
77
+ | `wire_verdict` | string | `PASS` or `FAIL` |
78
+ | `receipt_path` | string | Echoes back the input `receipt_path` |
79
+
80
+ ---
81
+
82
+ ## Soft-fail discipline
83
+
84
+ - **Wire and certify gates fail the job by themselves.** The
85
+ `--fail-on-violations` and `--fail-under` flags are native (shipped
86
+ in 0.2.x); no `python -c` workarounds.
87
+ - **The PR comment is best-effort.** When the workflow runs from a
88
+ fork or without `pull-requests: write`, the comment step is skipped
89
+ and the job still reports its real verdict via exit code.
90
+ - **The Receipt is signable.** When `AAAA_NEXUS_API_KEY` is available
91
+ in the environment and the consuming workflow re-invokes `forge
92
+ certify --sign`, the Receipt's `signatures.aaaa_nexus` field is
93
+ populated. `forge-action` does not call `--sign` by default — most
94
+ CI runs are unsigned dev attestations.
95
+
96
+ ---
97
+
98
+ ## What the sticky comment looks like
99
+
100
+ ```
101
+ ### Atomadic Forge — wire + certify
102
+
103
+ **wire:** `PASS` · **certify:** `100.0/100`
104
+
105
+ ╔══════════════════════════════════════════════════════════╗
106
+ │ Atomadic Forge Receipt atomadic-forge.receipt/v1 │
107
+ │ ✓ PASS forge 0.2.2 │
108
+ │ atomadic-forge │
109
+ │ CERTIFY 100.0 / 100 │
110
+ │ docs ✓ tests ✓ layout ✓ wire ✓ │
111
+ │ WIRE PASS (0 violations) │
112
+ │ SCOUT 952 symbols (python) 952 tier-placed │
113
+ ╚══════════════════════════════════════════════════════════╝
114
+
115
+ Posted by forge-action. The card and JSON receipt are also uploaded
116
+ as build artifacts on this run.
117
+ ```
118
+
119
+ Updated in place on every push — never spams the PR.
120
+
121
+ ---
122
+
123
+ ## Status
124
+
125
+ - **Today (Lane C W1):** in-tree under `.github/actions/forge-action/`,
126
+ ref-pinned to the consuming Forge release.
127
+ - **Lane C W12 (planned):** dedicated repo `atomadictech/forge-action`
128
+ + Marketplace listing.
129
+ - **Lane C W16+ (planned):** GitHub App variant that opens weekly
130
+ drift-PRs via `forge iterate --dry-run`.