atomadic-forge 0.3.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 (261) hide show
  1. atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/bug_report.yml +51 -0
  2. atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  4. atomadic_forge-0.3.2/.github/actions/forge-action/README.md +130 -0
  5. atomadic_forge-0.3.2/.github/actions/forge-action/action.yml +227 -0
  6. atomadic_forge-0.3.2/.github/dependabot.yml +17 -0
  7. atomadic_forge-0.3.2/.github/pull_request_template.md +21 -0
  8. atomadic_forge-0.3.2/.github/workflows/ci.yml +96 -0
  9. atomadic_forge-0.3.2/.github/workflows/forge-self-certify.yml +54 -0
  10. atomadic_forge-0.3.2/.github/workflows/forge-studio-ci.yml +60 -0
  11. atomadic_forge-0.3.2/.github/workflows/release.yml +55 -0
  12. atomadic_forge-0.3.2/ARCHITECTURE.md +136 -0
  13. atomadic_forge-0.3.2/CHANGELOG.md +1050 -0
  14. atomadic_forge-0.3.2/CONTRIBUTING.md +71 -0
  15. atomadic_forge-0.3.2/LICENSE +15 -0
  16. atomadic_forge-0.3.2/MANIFEST.in +9 -0
  17. atomadic_forge-0.3.2/PKG-INFO +471 -0
  18. atomadic_forge-0.3.2/README.md +439 -0
  19. atomadic_forge-0.3.2/SECURITY.md +31 -0
  20. atomadic_forge-0.3.2/assets/Atomadic-Forge-01.png +0 -0
  21. atomadic_forge-0.3.2/docs/01-getting-started.md +232 -0
  22. atomadic_forge-0.3.2/docs/02-commands.md +771 -0
  23. atomadic_forge-0.3.2/docs/03-tutorial.md +328 -0
  24. atomadic_forge-0.3.2/docs/04-llm-loops.md +453 -0
  25. atomadic_forge-0.3.2/docs/05-faq.md +468 -0
  26. atomadic_forge-0.3.2/docs/AGENTS_GUIDE.md +474 -0
  27. atomadic_forge-0.3.2/docs/AIR_GAPPED.md +161 -0
  28. atomadic_forge-0.3.2/docs/CI_CD.md +192 -0
  29. atomadic_forge-0.3.2/docs/CODEX_WALKTHROUGH.md +124 -0
  30. atomadic_forge-0.3.2/docs/COMMANDS.md +765 -0
  31. atomadic_forge-0.3.2/docs/FIRST_10_MINUTES.md +200 -0
  32. atomadic_forge-0.3.2/docs/FORMALIZATION.md +197 -0
  33. atomadic_forge-0.3.2/docs/LANDSCAPE.md +111 -0
  34. atomadic_forge-0.3.2/docs/MULTI_REPO.md +202 -0
  35. atomadic_forge-0.3.2/docs/README.md +146 -0
  36. atomadic_forge-0.3.2/docs/RECEIPT.md +305 -0
  37. atomadic_forge-0.3.2/docs/RELEASE_CHECKLIST.md +61 -0
  38. atomadic_forge-0.3.2/docs/ROADMAP.md +111 -0
  39. atomadic_forge-0.3.2/docs/SHOWCASE.md +241 -0
  40. atomadic_forge-0.3.2/docs/SIDECAR.md +139 -0
  41. atomadic_forge-0.3.2/docs/STUDIO.md +69 -0
  42. atomadic_forge-0.3.2/docs/WHY_NOW.md +119 -0
  43. atomadic_forge-0.3.2/docs/commands/INDEX.md +18 -0
  44. atomadic_forge-0.3.2/docs/commands/chat.md +9 -0
  45. atomadic_forge-0.3.2/docs/commands/commandsmith.md +9 -0
  46. atomadic_forge-0.3.2/docs/commands/config.md +9 -0
  47. atomadic_forge-0.3.2/docs/commands/demo.md +9 -0
  48. atomadic_forge-0.3.2/docs/commands/emergent-then-synergy.md +9 -0
  49. atomadic_forge-0.3.2/docs/commands/emergent.md +9 -0
  50. atomadic_forge-0.3.2/docs/commands/evolve-then-iterate.md +9 -0
  51. atomadic_forge-0.3.2/docs/commands/evolve.md +9 -0
  52. atomadic_forge-0.3.2/docs/commands/feature-then-emergent.md +9 -0
  53. atomadic_forge-0.3.2/docs/commands/iterate.md +9 -0
  54. atomadic_forge-0.3.2/docs/commands/synergy-then-emergent.md +9 -0
  55. atomadic_forge-0.3.2/docs/commands/synergy.md +9 -0
  56. atomadic_forge-0.3.2/docs/compliance/CMMC_AI_MAPPING.md +157 -0
  57. atomadic_forge-0.3.2/docs/compliance/CS-1.md +203 -0
  58. atomadic_forge-0.3.2/docs/compliance/EU_AI_ACT_ANNEX_IV.md +145 -0
  59. atomadic_forge-0.3.2/docs/compliance/FDA_PCCP_MAPPING.md +138 -0
  60. atomadic_forge-0.3.2/docs/compliance/SR_11-7_MAPPING.md +104 -0
  61. atomadic_forge-0.3.2/docs/tutorials/01-quickstart.md +91 -0
  62. atomadic_forge-0.3.2/docs/tutorials/02-your-first-package.md +94 -0
  63. atomadic_forge-0.3.2/docs/tutorials/03-the-five-tier-law.md +133 -0
  64. atomadic_forge-0.3.2/docs/tutorials/04-plug-in-llms.md +198 -0
  65. atomadic_forge-0.3.2/docs/tutorials/05-multi-repo-absorb.md +155 -0
  66. atomadic_forge-0.3.2/docs/tutorials/06-javascript-quickstart.md +243 -0
  67. atomadic_forge-0.3.2/pyproject.toml +90 -0
  68. atomadic_forge-0.3.2/setup.cfg +4 -0
  69. atomadic_forge-0.3.2/src/atomadic_forge/__init__.py +12 -0
  70. atomadic_forge-0.3.2/src/atomadic_forge/__main__.py +5 -0
  71. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/__init__.py +1 -0
  72. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +120 -0
  73. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +49 -0
  74. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/config_defaults.py +38 -0
  75. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/emergent_types.py +77 -0
  76. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/error_codes.py +296 -0
  77. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/forge_types.py +89 -0
  78. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/gen_language.py +116 -0
  79. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/lang_extensions.py +150 -0
  80. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/policy_schema.py +48 -0
  81. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/receipt_schema.py +311 -0
  82. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/roi_constants.py +96 -0
  83. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/semantic_types.py +61 -0
  84. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +81 -0
  85. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/synergy_types.py +62 -0
  86. atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/tier_names.py +47 -0
  87. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/__init__.py +1 -0
  88. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_context_pack.py +193 -0
  89. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_memory.py +139 -0
  90. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +324 -0
  91. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_summary.py +277 -0
  92. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/body_extractor.py +306 -0
  93. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/card_renderer.py +210 -0
  94. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/certify_checks.py +445 -0
  95. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/chat_context.py +170 -0
  96. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/cherry_pick.py +71 -0
  97. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/classify_tier.py +115 -0
  98. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +167 -0
  99. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/commandsmith_render.py +267 -0
  100. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/compiler_feedback.py +94 -0
  101. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/compliance_checker.py +228 -0
  102. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/config_io.py +68 -0
  103. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/cs1_renderer.py +588 -0
  104. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +205 -0
  105. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_compose.py +192 -0
  106. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_rank.py +116 -0
  107. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +242 -0
  108. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +88 -0
  109. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/enforce_planner.py +208 -0
  110. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/error_hints.py +105 -0
  111. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/evolution_log.py +94 -0
  112. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/forge_feedback.py +433 -0
  113. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/generation_quality.py +322 -0
  114. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/import_repair.py +211 -0
  115. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/import_smoke.py +102 -0
  116. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/js_parser.py +539 -0
  117. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lineage_chain.py +144 -0
  118. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lineage_reader.py +107 -0
  119. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/llm_client.py +554 -0
  120. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/local_signer.py +134 -0
  121. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lsp_protocol.py +379 -0
  122. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/manifest_diff.py +314 -0
  123. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1066 -0
  124. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/patch_scorer.py +267 -0
  125. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/plan_adapter.py +75 -0
  126. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/policy_loader.py +107 -0
  127. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/preflight_change.py +227 -0
  128. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/progress_reporter.py +81 -0
  129. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/provider_detect.py +157 -0
  130. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/provider_resolver.py +48 -0
  131. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/receipt_emitter.py +291 -0
  132. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/recipes.py +186 -0
  133. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/repo_explainer.py +124 -0
  134. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/roi_calculator.py +265 -0
  135. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/rollback_planner.py +147 -0
  136. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sbom_emitter.py +155 -0
  137. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_js.py +55 -0
  138. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +62 -0
  139. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_starter.py +94 -0
  140. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scout_walk.py +309 -0
  141. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sidecar_parser.py +161 -0
  142. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sidecar_validator.py +202 -0
  143. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/stub_detector.py +158 -0
  144. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_detect.py +166 -0
  145. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_render.py +252 -0
  146. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +163 -0
  147. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/test_runner.py +196 -0
  148. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/test_selector.py +122 -0
  149. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +122 -0
  150. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/tool_composer.py +130 -0
  151. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/transcript_log.py +70 -0
  152. atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/wire_check.py +260 -0
  153. atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/__init__.py +1 -0
  154. atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +122 -0
  155. atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/manifest_store.py +46 -0
  156. atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/plan_store.py +164 -0
  157. atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/receipt_signer.py +231 -0
  158. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/__init__.py +1 -0
  159. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/commandsmith_feature.py +267 -0
  160. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +3 -0
  161. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +4 -0
  162. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +14 -0
  163. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +10 -0
  164. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +18 -0
  165. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_runner.py +502 -0
  166. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/emergent_feature.py +95 -0
  167. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +154 -0
  168. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_enforce.py +107 -0
  169. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_evolve.py +176 -0
  170. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_loop.py +528 -0
  171. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_pipeline.py +295 -0
  172. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_plan_apply.py +222 -0
  173. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/lsp_server.py +98 -0
  174. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/mcp_server.py +160 -0
  175. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/setup_wizard.py +337 -0
  176. atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/synergy_feature.py +65 -0
  177. atomadic_forge-0.3.2/src/atomadic_forge/a4_sy_orchestration/__init__.py +1 -0
  178. atomadic_forge-0.3.2/src/atomadic_forge/a4_sy_orchestration/cli.py +1284 -0
  179. atomadic_forge-0.3.2/src/atomadic_forge/commands/__init__.py +1 -0
  180. atomadic_forge-0.3.2/src/atomadic_forge/commands/_registry.py +36 -0
  181. atomadic_forge-0.3.2/src/atomadic_forge/commands/audit.py +142 -0
  182. atomadic_forge-0.3.2/src/atomadic_forge/commands/chat.py +133 -0
  183. atomadic_forge-0.3.2/src/atomadic_forge/commands/commandsmith.py +178 -0
  184. atomadic_forge-0.3.2/src/atomadic_forge/commands/config_cmd.py +145 -0
  185. atomadic_forge-0.3.2/src/atomadic_forge/commands/demo.py +142 -0
  186. atomadic_forge-0.3.2/src/atomadic_forge/commands/emergent.py +124 -0
  187. atomadic_forge-0.3.2/src/atomadic_forge/commands/emergent_then_synergy.py +70 -0
  188. atomadic_forge-0.3.2/src/atomadic_forge/commands/evolve.py +122 -0
  189. atomadic_forge-0.3.2/src/atomadic_forge/commands/evolve_then_iterate.py +70 -0
  190. atomadic_forge-0.3.2/src/atomadic_forge/commands/feature_then_emergent.py +111 -0
  191. atomadic_forge-0.3.2/src/atomadic_forge/commands/iterate.py +140 -0
  192. atomadic_forge-0.3.2/src/atomadic_forge/commands/synergy.py +96 -0
  193. atomadic_forge-0.3.2/src/atomadic_forge/commands/synergy_then_emergent.py +70 -0
  194. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/PKG-INFO +471 -0
  195. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/SOURCES.txt +259 -0
  196. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/dependency_links.txt +1 -0
  197. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/entry_points.txt +3 -0
  198. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/requires.txt +18 -0
  199. atomadic_forge-0.3.2/src/atomadic_forge.egg-info/top_level.txt +1 -0
  200. atomadic_forge-0.3.2/tests/test_aaaa_nexus_client.py +251 -0
  201. atomadic_forge-0.3.2/tests/test_agent_plan.py +282 -0
  202. atomadic_forge-0.3.2/tests/test_agent_summary.py +329 -0
  203. atomadic_forge-0.3.2/tests/test_audit_verb.py +169 -0
  204. atomadic_forge-0.3.2/tests/test_badge_worker.py +143 -0
  205. atomadic_forge-0.3.2/tests/test_body_extractor_repairs.py +86 -0
  206. atomadic_forge-0.3.2/tests/test_card_renderer.py +200 -0
  207. atomadic_forge-0.3.2/tests/test_certify_operational_axis.py +220 -0
  208. atomadic_forge-0.3.2/tests/test_chat.py +46 -0
  209. atomadic_forge-0.3.2/tests/test_classify_tier.py +52 -0
  210. atomadic_forge-0.3.2/tests/test_cli_smoke.py +199 -0
  211. atomadic_forge-0.3.2/tests/test_codex_5_complete.py +411 -0
  212. atomadic_forge-0.3.2/tests/test_codex_6_enforce_polyglot.py +202 -0
  213. atomadic_forge-0.3.2/tests/test_commandsmith.py +103 -0
  214. atomadic_forge-0.3.2/tests/test_compiler_feedback.py +203 -0
  215. atomadic_forge-0.3.2/tests/test_compliance_checker.py +244 -0
  216. atomadic_forge-0.3.2/tests/test_config.py +379 -0
  217. atomadic_forge-0.3.2/tests/test_copilots_copilot.py +355 -0
  218. atomadic_forge-0.3.2/tests/test_cs1_renderer.py +368 -0
  219. atomadic_forge-0.3.2/tests/test_demo.py +72 -0
  220. atomadic_forge-0.3.2/tests/test_emergent_compose.py +66 -0
  221. atomadic_forge-0.3.2/tests/test_emergent_signature_extract.py +55 -0
  222. atomadic_forge-0.3.2/tests/test_error_codes.py +241 -0
  223. atomadic_forge-0.3.2/tests/test_error_hints.py +127 -0
  224. atomadic_forge-0.3.2/tests/test_evolve_js.py +385 -0
  225. atomadic_forge-0.3.2/tests/test_forge_action.py +259 -0
  226. atomadic_forge-0.3.2/tests/test_forge_enforce.py +266 -0
  227. atomadic_forge-0.3.2/tests/test_generation_quality.py +95 -0
  228. atomadic_forge-0.3.2/tests/test_ignore_and_docs.py +270 -0
  229. atomadic_forge-0.3.2/tests/test_import_smoke.py +58 -0
  230. atomadic_forge-0.3.2/tests/test_iterate_evolve.py +146 -0
  231. atomadic_forge-0.3.2/tests/test_js_certify.py +76 -0
  232. atomadic_forge-0.3.2/tests/test_js_parser.py +152 -0
  233. atomadic_forge-0.3.2/tests/test_js_recon.py +101 -0
  234. atomadic_forge-0.3.2/tests/test_js_wire.py +94 -0
  235. atomadic_forge-0.3.2/tests/test_lineage_chain.py +255 -0
  236. atomadic_forge-0.3.2/tests/test_local_signer.py +185 -0
  237. atomadic_forge-0.3.2/tests/test_lsp_protocol.py +302 -0
  238. atomadic_forge-0.3.2/tests/test_manifest_diff.py +201 -0
  239. atomadic_forge-0.3.2/tests/test_mcp_protocol.py +327 -0
  240. atomadic_forge-0.3.2/tests/test_ollama_client.py +74 -0
  241. atomadic_forge-0.3.2/tests/test_pipeline.py +114 -0
  242. atomadic_forge-0.3.2/tests/test_plan_apply.py +378 -0
  243. atomadic_forge-0.3.2/tests/test_pre_audit_smoke.py +235 -0
  244. atomadic_forge-0.3.2/tests/test_precommit_hooks.py +175 -0
  245. atomadic_forge-0.3.2/tests/test_progress_reporter.py +103 -0
  246. atomadic_forge-0.3.2/tests/test_receipt_emitter.py +222 -0
  247. atomadic_forge-0.3.2/tests/test_receipt_schema.py +206 -0
  248. atomadic_forge-0.3.2/tests/test_receipt_signer.py +217 -0
  249. atomadic_forge-0.3.2/tests/test_roi_calculator.py +242 -0
  250. atomadic_forge-0.3.2/tests/test_sbom_emitter.py +141 -0
  251. atomadic_forge-0.3.2/tests/test_scaffold.py +111 -0
  252. atomadic_forge-0.3.2/tests/test_sidecar.py +188 -0
  253. atomadic_forge-0.3.2/tests/test_sidecar_validate.py +196 -0
  254. atomadic_forge-0.3.2/tests/test_stagnation.py +47 -0
  255. atomadic_forge-0.3.2/tests/test_stub_detector.py +163 -0
  256. atomadic_forge-0.3.2/tests/test_synergy.py +72 -0
  257. atomadic_forge-0.3.2/tests/test_test_runner.py +124 -0
  258. atomadic_forge-0.3.2/tests/test_tier_init_rebuild.py +83 -0
  259. atomadic_forge-0.3.2/tests/test_vscode_extension_manifest.py +138 -0
  260. atomadic_forge-0.3.2/tests/test_wire_certify.py +56 -0
  261. atomadic_forge-0.3.2/tests/test_wire_suggest_repairs.py +145 -0
@@ -0,0 +1,51 @@
1
+ name: Bug report
2
+ description: Report a reproducible Forge problem.
3
+ title: "[Bug]: "
4
+ labels: ["bug", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for helping harden Forge. Please include the smallest repro you can.
10
+
11
+ - type: textarea
12
+ id: summary
13
+ attributes:
14
+ label: Summary
15
+ description: What happened, and what did you expect instead?
16
+ validations:
17
+ required: true
18
+
19
+ - type: textarea
20
+ id: reproduce
21
+ attributes:
22
+ label: Reproduction
23
+ description: Exact commands, sample files, or a minimal repo layout.
24
+ placeholder: |
25
+ python -m atomadic_forge.a4_sy_orchestration.cli ...
26
+ validations:
27
+ required: true
28
+
29
+ - type: textarea
30
+ id: output
31
+ attributes:
32
+ label: Output
33
+ description: Paste relevant terminal output. Redact secrets.
34
+ render: shell
35
+
36
+ - type: textarea
37
+ id: environment
38
+ attributes:
39
+ label: Environment
40
+ description: Output from `forge doctor --json`, Python version, OS, provider/model if relevant.
41
+ render: json
42
+
43
+ - type: checkboxes
44
+ id: checks
45
+ attributes:
46
+ label: Checks
47
+ options:
48
+ - label: I searched existing issues.
49
+ required: true
50
+ - label: I removed secrets, API keys, and local-only paths from the report.
51
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security issue
4
+ url: https://github.com/atomadictech/atomadic-forge/security/advisories/new
5
+ about: Please report vulnerabilities privately through GitHub Security Advisories.
6
+ - name: Docs and command reference
7
+ url: https://github.com/atomadictech/atomadic-forge/tree/main/docs
8
+ about: Check the docs before opening a usage question.
@@ -0,0 +1,42 @@
1
+ name: Feature request
2
+ description: Suggest a new Forge capability or workflow.
3
+ title: "[Feature]: "
4
+ labels: ["enhancement", "needs-triage"]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: Problem
10
+ description: What workflow is painful today?
11
+ validations:
12
+ required: true
13
+
14
+ - type: textarea
15
+ id: proposal
16
+ attributes:
17
+ label: Proposal
18
+ description: What would a good solution look like?
19
+ validations:
20
+ required: true
21
+
22
+ - type: dropdown
23
+ id: area
24
+ attributes:
25
+ label: Area
26
+ options:
27
+ - absorption pipeline
28
+ - LLM iterate/evolve
29
+ - chat/copilot
30
+ - docs/test generation
31
+ - JavaScript/TypeScript support
32
+ - CLI UX
33
+ - CI/GitHub integration
34
+ - other
35
+ validations:
36
+ required: true
37
+
38
+ - type: textarea
39
+ id: alternatives
40
+ attributes:
41
+ label: Alternatives
42
+ description: Any workaround or alternative design you considered?
@@ -0,0 +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`.
@@ -0,0 +1,227 @@
1
+ # Atomadic Forge — composite GitHub Action.
2
+ #
3
+ # Golden Path Lane C W1 deliverable. One-line install for any repo:
4
+ #
5
+ # - uses: atomadictech/atomadic-forge/.github/actions/forge-action@main
6
+ # with:
7
+ # package_root: src/your_package
8
+ # fail_under: '75'
9
+ #
10
+ # What it does:
11
+ # 1. Installs Forge from the same ref the action shipped from.
12
+ # 2. Runs the full wire + certify chain with native fail flags.
13
+ # 3. Writes a Forge Receipt v1 + a 60-wide rendered card.
14
+ # 4. Uploads wire.json / certify.json / receipt.json as artifacts.
15
+ # 5. Posts (or updates) a sticky PR comment with the rendered card +
16
+ # a one-line per-axis verdict.
17
+ #
18
+ # Soft-fail discipline:
19
+ # * The wire and certify gates fail the job non-zero by themselves
20
+ # when their thresholds are breached.
21
+ # * The PR-comment step is best-effort: when the action runs from a
22
+ # fork or without `pull-requests: write` permission, the comment
23
+ # is skipped and the job still reports its real verdict via exit
24
+ # code.
25
+
26
+ name: 'Atomadic Forge — wire + certify gate'
27
+ description: 'Run forge wire + certify on a tier-organized package and post a sticky PR comment with the Receipt card.'
28
+ author: 'Atomadic Tech'
29
+ branding:
30
+ icon: 'shield'
31
+ color: 'purple'
32
+
33
+ inputs:
34
+ package_root:
35
+ description: 'Tier-organized package root (e.g. src/your_package).'
36
+ required: true
37
+ project_root:
38
+ description: 'Project root for forge certify (defaults to ".").'
39
+ required: false
40
+ default: '.'
41
+ package_name:
42
+ description: 'Python package name (forwarded to --package).'
43
+ required: false
44
+ default: ''
45
+ fail_under:
46
+ description: 'Certify threshold; the job fails when the score is below.'
47
+ required: false
48
+ default: '75'
49
+ receipt_path:
50
+ description: 'Where to write the emitted Receipt JSON (relative to project_root).'
51
+ required: false
52
+ default: '.atomadic-forge/receipt.json'
53
+ python_version:
54
+ description: 'Python version to install before running Forge.'
55
+ required: false
56
+ default: '3.11'
57
+ forge_ref:
58
+ description: 'Git ref (tag/branch/sha) of atomadic-forge to install. Defaults to the action ref.'
59
+ required: false
60
+ default: ''
61
+ comment_on_pr:
62
+ description: 'Post / update a sticky PR comment with the Receipt card. Set to "false" to skip.'
63
+ required: false
64
+ default: 'true'
65
+ upload_artifacts:
66
+ description: 'Upload wire/certify/receipt JSON as a build artifact.'
67
+ required: false
68
+ default: 'true'
69
+
70
+ outputs:
71
+ certify_score:
72
+ description: 'Final certify score (0-100), as a string.'
73
+ value: ${{ steps.certify.outputs.score }}
74
+ wire_verdict:
75
+ description: 'Wire scan verdict (PASS / FAIL).'
76
+ value: ${{ steps.wire.outputs.verdict }}
77
+ receipt_path:
78
+ description: 'Path to the emitted Receipt JSON (relative to project_root).'
79
+ value: ${{ inputs.receipt_path }}
80
+
81
+ runs:
82
+ using: 'composite'
83
+ steps:
84
+ - name: Set up Python
85
+ uses: actions/setup-python@v5
86
+ with:
87
+ python-version: ${{ inputs.python_version }}
88
+
89
+ - name: Install Atomadic Forge
90
+ shell: bash
91
+ run: |
92
+ set -euo pipefail
93
+ ref="${{ inputs.forge_ref }}"
94
+ if [ -z "$ref" ]; then
95
+ # Default: pin to the same ref the action repo is checked
96
+ # out at. GITHUB_ACTION_REF is set for actions invoked via
97
+ # `uses: owner/repo/.github/actions/...@ref`.
98
+ ref="${GITHUB_ACTION_REF:-main}"
99
+ fi
100
+ echo "Installing atomadic-forge from ref: $ref"
101
+ pip install --upgrade pip
102
+ pip install "atomadic-forge[dev] @ git+https://github.com/atomadictech/atomadic-forge@${ref}"
103
+ # Self-certify needs pytest/cryptography on PATH for the runtime + signing axes.
104
+ forge --version || python -m atomadic_forge --version || true
105
+
106
+ - name: Forge wire (upward-import discipline)
107
+ id: wire
108
+ shell: bash
109
+ working-directory: ${{ inputs.project_root }}
110
+ env:
111
+ PACKAGE_ROOT: ${{ inputs.package_root }}
112
+ run: |
113
+ set -euo pipefail
114
+ mkdir -p .atomadic-forge
115
+ # Native gate (Lane G1): exits 1 on any violation.
116
+ forge wire "$PACKAGE_ROOT" \
117
+ --fail-on-violations \
118
+ --json > .atomadic-forge/wire.json
119
+ verdict=$(python -c "import json; print(json.load(open('.atomadic-forge/wire.json'))['verdict'])")
120
+ echo "verdict=$verdict" >> "$GITHUB_OUTPUT"
121
+
122
+ - name: Forge certify (architecture conformance)
123
+ id: certify
124
+ shell: bash
125
+ working-directory: ${{ inputs.project_root }}
126
+ env:
127
+ PACKAGE_NAME: ${{ inputs.package_name }}
128
+ FAIL_UNDER: ${{ inputs.fail_under }}
129
+ RECEIPT_PATH: ${{ inputs.receipt_path }}
130
+ run: |
131
+ set -euo pipefail
132
+ package_arg=""
133
+ if [ -n "$PACKAGE_NAME" ]; then
134
+ package_arg="--package $PACKAGE_NAME"
135
+ fi
136
+ # Native gate + Receipt emission + card render.
137
+ forge certify . \
138
+ $package_arg \
139
+ --fail-under "$FAIL_UNDER" \
140
+ --emit-receipt "$RECEIPT_PATH" \
141
+ --print-card \
142
+ --json > .atomadic-forge/certify.json
143
+ score=$(python -c "import json; r=json.load(open('.atomadic-forge/certify.json')); print(r.get('score', r.get('total_score', 0)))")
144
+ echo "score=$score" >> "$GITHUB_OUTPUT"
145
+
146
+ - name: Render Receipt card (separate stdout for PR comment)
147
+ id: render
148
+ shell: bash
149
+ working-directory: ${{ inputs.project_root }}
150
+ env:
151
+ PACKAGE_NAME: ${{ inputs.package_name }}
152
+ run: |
153
+ set -euo pipefail
154
+ package_arg=""
155
+ if [ -n "$PACKAGE_NAME" ]; then
156
+ package_arg="--package $PACKAGE_NAME"
157
+ fi
158
+ # Re-render the card into a file we can read in the PR-comment step.
159
+ forge certify . $package_arg --print-card > .atomadic-forge/card.txt 2>&1 || true
160
+
161
+ - name: Post Receipt card as sticky PR comment
162
+ if: github.event_name == 'pull_request' && inputs.comment_on_pr == 'true'
163
+ uses: actions/github-script@v7
164
+ with:
165
+ github-token: ${{ github.token }}
166
+ script: |
167
+ const fs = require('fs');
168
+ const path = require('path');
169
+ const projectRoot = '${{ inputs.project_root }}';
170
+ const cardPath = path.join(projectRoot, '.atomadic-forge', 'card.txt');
171
+ let card = '(card unavailable)';
172
+ try {
173
+ card = fs.readFileSync(cardPath, 'utf8');
174
+ } catch (e) {
175
+ console.log(`Could not read ${cardPath}: ${e.message}`);
176
+ }
177
+ const score = '${{ steps.certify.outputs.score }}';
178
+ const verdict = '${{ steps.wire.outputs.verdict }}';
179
+ const marker = '<!-- atomadic-forge:receipt-card -->';
180
+ const body = [
181
+ marker,
182
+ '### Atomadic Forge — wire + certify',
183
+ '',
184
+ `**wire:** \`${verdict}\` &nbsp;·&nbsp; **certify:** \`${score}/100\``,
185
+ '',
186
+ '```',
187
+ card.trim(),
188
+ '```',
189
+ '',
190
+ '<sub>Posted by [forge-action](https://github.com/atomadictech/atomadic-forge/tree/main/.github/actions/forge-action). The card and JSON receipt are also uploaded as build artifacts on this run.</sub>'
191
+ ].join('\n');
192
+
193
+ const { owner, repo } = context.repo;
194
+ const issue_number = context.issue.number;
195
+ if (!issue_number) {
196
+ console.log('No PR number on this event; skipping comment.');
197
+ return;
198
+ }
199
+ // Find an existing sticky comment by marker.
200
+ const existing = await github.paginate(github.rest.issues.listComments, {
201
+ owner, repo, issue_number,
202
+ });
203
+ const prior = existing.find(c => c.body && c.body.includes(marker));
204
+ if (prior) {
205
+ await github.rest.issues.updateComment({
206
+ owner, repo, comment_id: prior.id, body,
207
+ });
208
+ console.log(`Updated sticky comment ${prior.id}.`);
209
+ } else {
210
+ await github.rest.issues.createComment({
211
+ owner, repo, issue_number, body,
212
+ });
213
+ console.log('Created sticky comment.');
214
+ }
215
+
216
+ - name: Upload Forge artifacts
217
+ if: always() && inputs.upload_artifacts == 'true'
218
+ uses: actions/upload-artifact@v4
219
+ with:
220
+ name: atomadic-forge-${{ github.run_id }}-${{ github.run_attempt }}
221
+ path: |
222
+ ${{ inputs.project_root }}/.atomadic-forge/wire.json
223
+ ${{ inputs.project_root }}/.atomadic-forge/certify.json
224
+ ${{ inputs.project_root }}/${{ inputs.receipt_path }}
225
+ ${{ inputs.project_root }}/.atomadic-forge/card.txt
226
+ if-no-files-found: warn
227
+ retention-days: 14
@@ -0,0 +1,17 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ time: "10:00"
9
+ open-pull-requests-limit: 5
10
+
11
+ - package-ecosystem: pip
12
+ directory: /
13
+ schedule:
14
+ interval: weekly
15
+ day: monday
16
+ time: "10:30"
17
+ open-pull-requests-limit: 5
@@ -0,0 +1,21 @@
1
+ ## Summary
2
+
3
+ -
4
+
5
+ ## Verification
6
+
7
+ - [ ] `python -m pytest --basetemp .pytest_tmp_run`
8
+ - [ ] `ruff check .`
9
+ - [ ] `lint-imports`
10
+ - [ ] `python -m atomadic_forge.a4_sy_orchestration.cli wire src/atomadic_forge --json`
11
+ - [ ] `python -m atomadic_forge.a4_sy_orchestration.cli commandsmith smoke --json`
12
+
13
+ ## Release Notes
14
+
15
+ - [ ] Updated `CHANGELOG.md` for user-facing behavior.
16
+ - [ ] Updated docs for new commands, flags, schemas, or generated artifacts.
17
+ - [ ] No secrets, generated outputs, or local transcripts are committed.
18
+
19
+ ## Risk
20
+
21
+ -
@@ -0,0 +1,96 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ name: Python ${{ matrix.python-version }}
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ python-version: ["3.10", "3.11", "3.12"]
24
+
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Set up Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+ cache: pip
34
+
35
+ - name: Install package
36
+ run: |
37
+ python -m pip install --upgrade pip
38
+ python -m pip install -e ".[dev]"
39
+
40
+ - name: Run tests
41
+ run: python -m pytest --basetemp .pytest_tmp_run
42
+
43
+ - name: Remove pytest scratch output
44
+ if: always()
45
+ run: rm -rf .pytest_tmp_run
46
+
47
+ - name: Ruff
48
+ run: ruff check .
49
+
50
+ - name: Import-layer contract
51
+ run: lint-imports
52
+
53
+ - name: Forge wire
54
+ run: python -m atomadic_forge.a4_sy_orchestration.cli wire src/atomadic_forge --json
55
+
56
+ - name: Forge command smoke
57
+ run: python -m atomadic_forge.a4_sy_orchestration.cli commandsmith smoke --json
58
+
59
+ - name: Forge self-certify (BEP self-hosting proof — gate at 100/100)
60
+ run: |
61
+ python -m atomadic_forge.a4_sy_orchestration.cli certify . --json --fail-under 100 > certify_self.json
62
+ python -c "import json, sys; d = json.load(open('certify_self.json')); s = d['score']; print(f'forge self-certify: {s}/100 (components: {d[\"score_components\"]})'); sys.exit(0 if s >= 100 else 1)"
63
+
64
+ - name: Upload self-certify report
65
+ if: always()
66
+ uses: actions/upload-artifact@v4
67
+ with:
68
+ name: forge-certify-self-${{ matrix.python-version }}
69
+ path: certify_self.json
70
+ if-no-files-found: ignore
71
+
72
+ package:
73
+ name: Build package
74
+ runs-on: ubuntu-latest
75
+ steps:
76
+ - name: Check out repository
77
+ uses: actions/checkout@v4
78
+
79
+ - name: Set up Python
80
+ uses: actions/setup-python@v5
81
+ with:
82
+ python-version: "3.12"
83
+ cache: pip
84
+
85
+ - name: Build distributions
86
+ run: |
87
+ python -m pip install --upgrade pip
88
+ python -m pip install build twine
89
+ python -m build
90
+ python -m twine check dist/*
91
+
92
+ - name: Upload distributions
93
+ uses: actions/upload-artifact@v4
94
+ with:
95
+ name: atomadic-forge-dist
96
+ path: dist/*
@@ -0,0 +1,54 @@
1
+ # Atomadic Forge — self-certify
2
+ #
3
+ # Runs the in-tree forge-action against the Forge repo itself on every
4
+ # push and pull request. This is the dogfood gate: if Forge cannot pass
5
+ # its own architecture conformance check, the offending change must be
6
+ # fixed before merge.
7
+ #
8
+ # Golden Path Lane C W1 acceptance criterion: 'Marketplace-listed; one-
9
+ # line install -> sticky PR comment with Receipt rendered'. The
10
+ # Marketplace listing is W12 (separate repo); today's deliverable is
11
+ # the action itself + the dogfood proof that it works on the Forge repo.
12
+
13
+ name: forge self-certify
14
+
15
+ on:
16
+ push:
17
+ branches: [main, master]
18
+ pull_request:
19
+ branches: [main, master]
20
+ workflow_dispatch:
21
+
22
+ permissions:
23
+ contents: read
24
+ pull-requests: write # for the sticky comment
25
+
26
+ concurrency:
27
+ group: forge-self-certify-${{ github.ref }}
28
+ cancel-in-progress: true
29
+
30
+ jobs:
31
+ forge:
32
+ name: forge wire + certify
33
+ runs-on: ubuntu-latest
34
+ timeout-minutes: 10
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+
38
+ - name: Run Atomadic Forge
39
+ id: forge
40
+ uses: ./.github/actions/forge-action
41
+ with:
42
+ package_root: src/atomadic_forge
43
+ package_name: atomadic_forge
44
+ # Forge holds its own bar at 100; if it slips below this we
45
+ # have ate our own dogfood with a side of regression.
46
+ fail_under: '100'
47
+ forge_ref: ${{ github.sha }}
48
+
49
+ - name: Echo outputs
50
+ if: always()
51
+ run: |
52
+ echo "wire verdict: ${{ steps.forge.outputs.wire_verdict }}"
53
+ echo "certify score: ${{ steps.forge.outputs.certify_score }}"
54
+ echo "receipt path: ${{ steps.forge.outputs.receipt_path }}"