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.
- atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/bug_report.yml +51 -0
- atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
- atomadic_forge-0.3.2/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- atomadic_forge-0.3.2/.github/actions/forge-action/README.md +130 -0
- atomadic_forge-0.3.2/.github/actions/forge-action/action.yml +227 -0
- atomadic_forge-0.3.2/.github/dependabot.yml +17 -0
- atomadic_forge-0.3.2/.github/pull_request_template.md +21 -0
- atomadic_forge-0.3.2/.github/workflows/ci.yml +96 -0
- atomadic_forge-0.3.2/.github/workflows/forge-self-certify.yml +54 -0
- atomadic_forge-0.3.2/.github/workflows/forge-studio-ci.yml +60 -0
- atomadic_forge-0.3.2/.github/workflows/release.yml +55 -0
- atomadic_forge-0.3.2/ARCHITECTURE.md +136 -0
- atomadic_forge-0.3.2/CHANGELOG.md +1050 -0
- atomadic_forge-0.3.2/CONTRIBUTING.md +71 -0
- atomadic_forge-0.3.2/LICENSE +15 -0
- atomadic_forge-0.3.2/MANIFEST.in +9 -0
- atomadic_forge-0.3.2/PKG-INFO +471 -0
- atomadic_forge-0.3.2/README.md +439 -0
- atomadic_forge-0.3.2/SECURITY.md +31 -0
- atomadic_forge-0.3.2/assets/Atomadic-Forge-01.png +0 -0
- atomadic_forge-0.3.2/docs/01-getting-started.md +232 -0
- atomadic_forge-0.3.2/docs/02-commands.md +771 -0
- atomadic_forge-0.3.2/docs/03-tutorial.md +328 -0
- atomadic_forge-0.3.2/docs/04-llm-loops.md +453 -0
- atomadic_forge-0.3.2/docs/05-faq.md +468 -0
- atomadic_forge-0.3.2/docs/AGENTS_GUIDE.md +474 -0
- atomadic_forge-0.3.2/docs/AIR_GAPPED.md +161 -0
- atomadic_forge-0.3.2/docs/CI_CD.md +192 -0
- atomadic_forge-0.3.2/docs/CODEX_WALKTHROUGH.md +124 -0
- atomadic_forge-0.3.2/docs/COMMANDS.md +765 -0
- atomadic_forge-0.3.2/docs/FIRST_10_MINUTES.md +200 -0
- atomadic_forge-0.3.2/docs/FORMALIZATION.md +197 -0
- atomadic_forge-0.3.2/docs/LANDSCAPE.md +111 -0
- atomadic_forge-0.3.2/docs/MULTI_REPO.md +202 -0
- atomadic_forge-0.3.2/docs/README.md +146 -0
- atomadic_forge-0.3.2/docs/RECEIPT.md +305 -0
- atomadic_forge-0.3.2/docs/RELEASE_CHECKLIST.md +61 -0
- atomadic_forge-0.3.2/docs/ROADMAP.md +111 -0
- atomadic_forge-0.3.2/docs/SHOWCASE.md +241 -0
- atomadic_forge-0.3.2/docs/SIDECAR.md +139 -0
- atomadic_forge-0.3.2/docs/STUDIO.md +69 -0
- atomadic_forge-0.3.2/docs/WHY_NOW.md +119 -0
- atomadic_forge-0.3.2/docs/commands/INDEX.md +18 -0
- atomadic_forge-0.3.2/docs/commands/chat.md +9 -0
- atomadic_forge-0.3.2/docs/commands/commandsmith.md +9 -0
- atomadic_forge-0.3.2/docs/commands/config.md +9 -0
- atomadic_forge-0.3.2/docs/commands/demo.md +9 -0
- atomadic_forge-0.3.2/docs/commands/emergent-then-synergy.md +9 -0
- atomadic_forge-0.3.2/docs/commands/emergent.md +9 -0
- atomadic_forge-0.3.2/docs/commands/evolve-then-iterate.md +9 -0
- atomadic_forge-0.3.2/docs/commands/evolve.md +9 -0
- atomadic_forge-0.3.2/docs/commands/feature-then-emergent.md +9 -0
- atomadic_forge-0.3.2/docs/commands/iterate.md +9 -0
- atomadic_forge-0.3.2/docs/commands/synergy-then-emergent.md +9 -0
- atomadic_forge-0.3.2/docs/commands/synergy.md +9 -0
- atomadic_forge-0.3.2/docs/compliance/CMMC_AI_MAPPING.md +157 -0
- atomadic_forge-0.3.2/docs/compliance/CS-1.md +203 -0
- atomadic_forge-0.3.2/docs/compliance/EU_AI_ACT_ANNEX_IV.md +145 -0
- atomadic_forge-0.3.2/docs/compliance/FDA_PCCP_MAPPING.md +138 -0
- atomadic_forge-0.3.2/docs/compliance/SR_11-7_MAPPING.md +104 -0
- atomadic_forge-0.3.2/docs/tutorials/01-quickstart.md +91 -0
- atomadic_forge-0.3.2/docs/tutorials/02-your-first-package.md +94 -0
- atomadic_forge-0.3.2/docs/tutorials/03-the-five-tier-law.md +133 -0
- atomadic_forge-0.3.2/docs/tutorials/04-plug-in-llms.md +198 -0
- atomadic_forge-0.3.2/docs/tutorials/05-multi-repo-absorb.md +155 -0
- atomadic_forge-0.3.2/docs/tutorials/06-javascript-quickstart.md +243 -0
- atomadic_forge-0.3.2/pyproject.toml +90 -0
- atomadic_forge-0.3.2/setup.cfg +4 -0
- atomadic_forge-0.3.2/src/atomadic_forge/__init__.py +12 -0
- atomadic_forge-0.3.2/src/atomadic_forge/__main__.py +5 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +120 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +49 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/config_defaults.py +38 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/emergent_types.py +77 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/error_codes.py +296 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/forge_types.py +89 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/gen_language.py +116 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/lang_extensions.py +150 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/policy_schema.py +48 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/receipt_schema.py +311 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/roi_constants.py +96 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/semantic_types.py +61 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +81 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/synergy_types.py +62 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a0_qk_constants/tier_names.py +47 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_context_pack.py +193 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_memory.py +139 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +324 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/agent_summary.py +277 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/body_extractor.py +306 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/card_renderer.py +210 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/certify_checks.py +445 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/chat_context.py +170 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/cherry_pick.py +71 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/classify_tier.py +115 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +167 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/commandsmith_render.py +267 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/compiler_feedback.py +94 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/compliance_checker.py +228 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/config_io.py +68 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/cs1_renderer.py +588 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +205 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_compose.py +192 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_rank.py +116 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +242 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +88 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/enforce_planner.py +208 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/error_hints.py +105 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/evolution_log.py +94 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/forge_feedback.py +433 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/generation_quality.py +322 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/import_repair.py +211 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/import_smoke.py +102 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/js_parser.py +539 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lineage_chain.py +144 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lineage_reader.py +107 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/llm_client.py +554 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/local_signer.py +134 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/lsp_protocol.py +379 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/manifest_diff.py +314 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1066 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/patch_scorer.py +267 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/plan_adapter.py +75 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/policy_loader.py +107 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/preflight_change.py +227 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/progress_reporter.py +81 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/provider_detect.py +157 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/provider_resolver.py +48 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/receipt_emitter.py +291 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/recipes.py +186 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/repo_explainer.py +124 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/roi_calculator.py +265 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/rollback_planner.py +147 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sbom_emitter.py +155 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_js.py +55 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +62 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scaffold_starter.py +94 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/scout_walk.py +309 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sidecar_parser.py +161 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/sidecar_validator.py +202 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/stub_detector.py +158 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_detect.py +166 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_render.py +252 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +163 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/test_runner.py +196 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/test_selector.py +122 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +122 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/tool_composer.py +130 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/transcript_log.py +70 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a1_at_functions/wire_check.py +260 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +122 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/manifest_store.py +46 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/plan_store.py +164 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a2_mo_composites/receipt_signer.py +231 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/commandsmith_feature.py +267 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +3 -0
- 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
- 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
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +10 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +18 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/demo_runner.py +502 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/emergent_feature.py +95 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +154 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_enforce.py +107 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_evolve.py +176 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_loop.py +528 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_pipeline.py +295 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/forge_plan_apply.py +222 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/lsp_server.py +98 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/mcp_server.py +160 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/setup_wizard.py +337 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a3_og_features/synergy_feature.py +65 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a4_sy_orchestration/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/a4_sy_orchestration/cli.py +1284 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/__init__.py +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/_registry.py +36 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/audit.py +142 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/chat.py +133 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/commandsmith.py +178 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/config_cmd.py +145 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/demo.py +142 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/emergent.py +124 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/emergent_then_synergy.py +70 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/evolve.py +122 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/evolve_then_iterate.py +70 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/feature_then_emergent.py +111 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/iterate.py +140 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/synergy.py +96 -0
- atomadic_forge-0.3.2/src/atomadic_forge/commands/synergy_then_emergent.py +70 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/PKG-INFO +471 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/SOURCES.txt +259 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/dependency_links.txt +1 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/entry_points.txt +3 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/requires.txt +18 -0
- atomadic_forge-0.3.2/src/atomadic_forge.egg-info/top_level.txt +1 -0
- atomadic_forge-0.3.2/tests/test_aaaa_nexus_client.py +251 -0
- atomadic_forge-0.3.2/tests/test_agent_plan.py +282 -0
- atomadic_forge-0.3.2/tests/test_agent_summary.py +329 -0
- atomadic_forge-0.3.2/tests/test_audit_verb.py +169 -0
- atomadic_forge-0.3.2/tests/test_badge_worker.py +143 -0
- atomadic_forge-0.3.2/tests/test_body_extractor_repairs.py +86 -0
- atomadic_forge-0.3.2/tests/test_card_renderer.py +200 -0
- atomadic_forge-0.3.2/tests/test_certify_operational_axis.py +220 -0
- atomadic_forge-0.3.2/tests/test_chat.py +46 -0
- atomadic_forge-0.3.2/tests/test_classify_tier.py +52 -0
- atomadic_forge-0.3.2/tests/test_cli_smoke.py +199 -0
- atomadic_forge-0.3.2/tests/test_codex_5_complete.py +411 -0
- atomadic_forge-0.3.2/tests/test_codex_6_enforce_polyglot.py +202 -0
- atomadic_forge-0.3.2/tests/test_commandsmith.py +103 -0
- atomadic_forge-0.3.2/tests/test_compiler_feedback.py +203 -0
- atomadic_forge-0.3.2/tests/test_compliance_checker.py +244 -0
- atomadic_forge-0.3.2/tests/test_config.py +379 -0
- atomadic_forge-0.3.2/tests/test_copilots_copilot.py +355 -0
- atomadic_forge-0.3.2/tests/test_cs1_renderer.py +368 -0
- atomadic_forge-0.3.2/tests/test_demo.py +72 -0
- atomadic_forge-0.3.2/tests/test_emergent_compose.py +66 -0
- atomadic_forge-0.3.2/tests/test_emergent_signature_extract.py +55 -0
- atomadic_forge-0.3.2/tests/test_error_codes.py +241 -0
- atomadic_forge-0.3.2/tests/test_error_hints.py +127 -0
- atomadic_forge-0.3.2/tests/test_evolve_js.py +385 -0
- atomadic_forge-0.3.2/tests/test_forge_action.py +259 -0
- atomadic_forge-0.3.2/tests/test_forge_enforce.py +266 -0
- atomadic_forge-0.3.2/tests/test_generation_quality.py +95 -0
- atomadic_forge-0.3.2/tests/test_ignore_and_docs.py +270 -0
- atomadic_forge-0.3.2/tests/test_import_smoke.py +58 -0
- atomadic_forge-0.3.2/tests/test_iterate_evolve.py +146 -0
- atomadic_forge-0.3.2/tests/test_js_certify.py +76 -0
- atomadic_forge-0.3.2/tests/test_js_parser.py +152 -0
- atomadic_forge-0.3.2/tests/test_js_recon.py +101 -0
- atomadic_forge-0.3.2/tests/test_js_wire.py +94 -0
- atomadic_forge-0.3.2/tests/test_lineage_chain.py +255 -0
- atomadic_forge-0.3.2/tests/test_local_signer.py +185 -0
- atomadic_forge-0.3.2/tests/test_lsp_protocol.py +302 -0
- atomadic_forge-0.3.2/tests/test_manifest_diff.py +201 -0
- atomadic_forge-0.3.2/tests/test_mcp_protocol.py +327 -0
- atomadic_forge-0.3.2/tests/test_ollama_client.py +74 -0
- atomadic_forge-0.3.2/tests/test_pipeline.py +114 -0
- atomadic_forge-0.3.2/tests/test_plan_apply.py +378 -0
- atomadic_forge-0.3.2/tests/test_pre_audit_smoke.py +235 -0
- atomadic_forge-0.3.2/tests/test_precommit_hooks.py +175 -0
- atomadic_forge-0.3.2/tests/test_progress_reporter.py +103 -0
- atomadic_forge-0.3.2/tests/test_receipt_emitter.py +222 -0
- atomadic_forge-0.3.2/tests/test_receipt_schema.py +206 -0
- atomadic_forge-0.3.2/tests/test_receipt_signer.py +217 -0
- atomadic_forge-0.3.2/tests/test_roi_calculator.py +242 -0
- atomadic_forge-0.3.2/tests/test_sbom_emitter.py +141 -0
- atomadic_forge-0.3.2/tests/test_scaffold.py +111 -0
- atomadic_forge-0.3.2/tests/test_sidecar.py +188 -0
- atomadic_forge-0.3.2/tests/test_sidecar_validate.py +196 -0
- atomadic_forge-0.3.2/tests/test_stagnation.py +47 -0
- atomadic_forge-0.3.2/tests/test_stub_detector.py +163 -0
- atomadic_forge-0.3.2/tests/test_synergy.py +72 -0
- atomadic_forge-0.3.2/tests/test_test_runner.py +124 -0
- atomadic_forge-0.3.2/tests/test_tier_init_rebuild.py +83 -0
- atomadic_forge-0.3.2/tests/test_vscode_extension_manifest.py +138 -0
- atomadic_forge-0.3.2/tests/test_wire_certify.py +56 -0
- 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
|
+
[](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}\` · **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 }}"
|