atomadic-forge 0.16.2__tar.gz → 0.50.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.
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/ci.yml +21 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/customer-refactor.yml +4 -4
- atomadic_forge-0.50.0/.github/workflows/metrics-auto-regen.yml +96 -0
- atomadic_forge-0.50.0/.github/workflows/metrics-drift.yml +61 -0
- atomadic_forge-0.50.0/.github/workflows/publish-on-tag.yml +104 -0
- atomadic_forge-0.50.0/.github/workflows/uptime.yml +72 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/CHANGELOG.md +529 -0
- atomadic_forge-0.50.0/PKG-INFO +262 -0
- atomadic_forge-0.50.0/README.md +230 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/01-getting-started.md +4 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/02-commands.md +6 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/AGENTS_GUIDE.md +71 -4
- atomadic_forge-0.50.0/docs/IDE_INTEGRATION.md +83 -0
- atomadic_forge-0.50.0/docs/PROVIDERS.md +153 -0
- atomadic_forge-0.50.0/docs/V0.46.0_JUSTIFICATION_REPORT.md +148 -0
- atomadic_forge-0.50.0/docs/V0.47.0_SELF_TEST_REPORT.md +167 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/pyproject.toml +17 -2
- atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/config_defaults.py +61 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/gen_language.py +192 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +8 -1
- atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +114 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +35 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/call_graph.py +47 -4
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +11 -2
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/custom_provider_client.py +259 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/forge_metrics.py +257 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1527 -1789
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_classify.py +111 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_imports.py +208 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/polyglot_surface.py +418 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/provider_resolver.py +141 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +273 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +129 -18
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +4 -1
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_selector.py +9 -1
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wire_check.py +92 -4
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commit_compose.py +2 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop.py +137 -15
- atomadic_forge-0.50.0/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +192 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/mcp_server.py +94 -10
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/surface_export.py +89 -9
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +41 -2
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +6 -3
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +45 -31
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +7 -1
- atomadic_forge-0.50.0/src/atomadic_forge/commands/config_cmd.py +322 -0
- atomadic_forge-0.50.0/src/atomadic_forge/commands/metrics.py +126 -0
- atomadic_forge-0.50.0/src/atomadic_forge.egg-info/PKG-INFO +262 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/SOURCES.txt +22 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_summary.py +6 -6
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_codex_5_complete.py +19 -15
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_copilots_copilot.py +11 -8
- atomadic_forge-0.50.0/tests/test_custom_provider.py +248 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_enhancement_proposal.py +5 -5
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_evolve_js.py +8 -3
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_handoff.py +5 -5
- atomadic_forge-0.50.0/tests/test_mcp_lazy_bootstrap.py +114 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_mcp_protocol.py +175 -181
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_plan_apply.py +9 -6
- atomadic_forge-0.50.0/tests/test_polyglot_cli_mcp.py +343 -0
- atomadic_forge-0.50.0/tests/test_polyglot_full_pipeline.py +477 -0
- atomadic_forge-0.50.0/tests/test_polyglot_hardening.py +479 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_polyglot_swift_kotlin_go.py +20 -10
- atomadic_forge-0.50.0/tests/test_polyglot_symbol_parity.py +425 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_trust_gate_response.py +12 -8
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_welcome.py +2 -2
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_whoami_cmd.py +8 -2
- atomadic_forge-0.16.2/PKG-INFO +0 -808
- atomadic_forge-0.16.2/README.md +0 -776
- atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -38
- atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -116
- atomadic_forge-0.16.2/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -146
- atomadic_forge-0.16.2/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -50
- atomadic_forge-0.16.2/src/atomadic_forge/commands/config_cmd.py +0 -145
- atomadic_forge-0.16.2/src/atomadic_forge.egg-info/PKG-INFO +0 -808
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/LICENSE +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/SECURITY.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/README.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/setup.cfg +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.16.2 → atomadic_forge-0.50.0}/tests/test_wisdom.py +0 -0
|
@@ -94,3 +94,24 @@ jobs:
|
|
|
94
94
|
with:
|
|
95
95
|
name: atomadic-forge-dist
|
|
96
96
|
path: dist/*
|
|
97
|
+
|
|
98
|
+
metrics:
|
|
99
|
+
name: Metrics freshness
|
|
100
|
+
runs-on: ubuntu-latest
|
|
101
|
+
steps:
|
|
102
|
+
- name: Check out repository
|
|
103
|
+
uses: actions/checkout@v6
|
|
104
|
+
|
|
105
|
+
- name: Set up Python
|
|
106
|
+
uses: actions/setup-python@v6
|
|
107
|
+
with:
|
|
108
|
+
python-version: "3.12"
|
|
109
|
+
cache: pip
|
|
110
|
+
|
|
111
|
+
- name: Install package
|
|
112
|
+
run: |
|
|
113
|
+
python -m pip install --upgrade pip
|
|
114
|
+
python -m pip install -e ".[dev]"
|
|
115
|
+
|
|
116
|
+
- name: Verify forge_metrics.json is current
|
|
117
|
+
run: python scripts/update_metrics.py --check
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Customer Refactor — fully automated $
|
|
1
|
+
# Customer Refactor — fully automated $149/$99 forge.atomadic.tech fulfillment.
|
|
2
2
|
#
|
|
3
3
|
# Triggered by Atomadic's REFACTOR_REPO action via the GitHub
|
|
4
4
|
# repository_dispatch API. The cognition worker POSTs:
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
# The cognition endpoint emails the customer (apology + refund offer) and
|
|
29
29
|
# pings Dad on Discord so the order can be retried manually.
|
|
30
30
|
|
|
31
|
-
name: Customer Refactor (forge.atomadic.tech $
|
|
31
|
+
name: Customer Refactor (forge.atomadic.tech $149/$99 fulfillment)
|
|
32
32
|
|
|
33
33
|
on:
|
|
34
34
|
repository_dispatch:
|
|
@@ -55,7 +55,7 @@ on:
|
|
|
55
55
|
description: "Amount paid (cents)"
|
|
56
56
|
required: false
|
|
57
57
|
type: string
|
|
58
|
-
default: "
|
|
58
|
+
default: "9900"
|
|
59
59
|
|
|
60
60
|
permissions:
|
|
61
61
|
contents: read
|
|
@@ -234,7 +234,7 @@ jobs:
|
|
|
234
234
|
echo " above."
|
|
235
235
|
echo "4. Run your own test suite — Forge does not touch behavior."
|
|
236
236
|
echo ""
|
|
237
|
-
echo "One round of revisions is included with your
|
|
237
|
+
echo "One round of revisions is included with your order."
|
|
238
238
|
echo "Reply to the email you received from Atomadic with anything"
|
|
239
239
|
echo "you want changed."
|
|
240
240
|
echo ""
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
name: Metrics Auto-Regenerate
|
|
2
|
+
|
|
3
|
+
# Single-source-of-truth pipeline. On every push to main, recomputes the
|
|
4
|
+
# canonical forge_metrics.json artifact and pushes a follow-up commit if
|
|
5
|
+
# the artifact drifted from what the source tree should produce.
|
|
6
|
+
#
|
|
7
|
+
# Together with metrics-drift.yml (CI gate on PRs), this means:
|
|
8
|
+
# - PRs are blocked on stale metrics.
|
|
9
|
+
# - Direct pushes to main self-heal automatically.
|
|
10
|
+
# - Public surfaces (atomadic.tech, shields.io endpoints proxied by
|
|
11
|
+
# the worker) always read live numbers from the same JSON.
|
|
12
|
+
#
|
|
13
|
+
# Lean theorem count requires the IP-protected mhed-codex repo. The
|
|
14
|
+
# FORGE_MHED_CODEX_REPO secret (org-level) provides a deploy-key URL;
|
|
15
|
+
# without it the lean_theorems block is preserved from the prior commit
|
|
16
|
+
# (see surgical merge step below) so this workflow never destroys real
|
|
17
|
+
# numbers when running without the IP repo attached.
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
push:
|
|
21
|
+
branches: [main]
|
|
22
|
+
paths:
|
|
23
|
+
- "src/atomadic_forge/**"
|
|
24
|
+
- "tests/**"
|
|
25
|
+
- "pyproject.toml"
|
|
26
|
+
- "src/atomadic_forge/a1_at_functions/forge_metrics.py"
|
|
27
|
+
- "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
|
|
28
|
+
|
|
29
|
+
permissions:
|
|
30
|
+
contents: write
|
|
31
|
+
|
|
32
|
+
jobs:
|
|
33
|
+
regen:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 8
|
|
36
|
+
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'chore(metrics): auto-regenerate') }}
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
with:
|
|
40
|
+
fetch-depth: 0
|
|
41
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
+
- uses: actions/setup-python@v5
|
|
43
|
+
with:
|
|
44
|
+
python-version: "3.12"
|
|
45
|
+
- name: Install package
|
|
46
|
+
run: pip install -e . --quiet
|
|
47
|
+
- name: Run pytest to count live passing
|
|
48
|
+
id: pytest
|
|
49
|
+
run: |
|
|
50
|
+
set +e
|
|
51
|
+
out=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
|
|
52
|
+
echo "$out"
|
|
53
|
+
passed=$(echo "$out" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
|
|
54
|
+
echo "passed=${passed:-0}" >> "$GITHUB_OUTPUT"
|
|
55
|
+
- name: Optionally clone IP-protected mhed-codex (preserves lean count)
|
|
56
|
+
if: ${{ env.MHED_CODEX_DEPLOY_KEY != '' }}
|
|
57
|
+
env:
|
|
58
|
+
MHED_CODEX_DEPLOY_KEY: ${{ secrets.MHED_CODEX_DEPLOY_KEY }}
|
|
59
|
+
run: |
|
|
60
|
+
mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
|
61
|
+
echo "$MHED_CODEX_DEPLOY_KEY" > ~/.ssh/mhed_key && chmod 600 ~/.ssh/mhed_key
|
|
62
|
+
GIT_SSH_COMMAND="ssh -i ~/.ssh/mhed_key -o StrictHostKeyChecking=no" \
|
|
63
|
+
git clone --depth 1 git@github.com:atomadictech/mhed-codex.git /tmp/mhed-codex
|
|
64
|
+
echo "FORGE_MHED_CODEX=/tmp/mhed-codex" >> "$GITHUB_ENV"
|
|
65
|
+
- name: Regenerate forge_metrics.json
|
|
66
|
+
run: |
|
|
67
|
+
# Save the previous lean_theorems block so we can preserve it
|
|
68
|
+
# when no mhed-codex is attached (avoid zeroing the public
|
|
69
|
+
# number on a routine source-only push).
|
|
70
|
+
python -c "import json; d=json.load(open('forge_metrics.json')); print(json.dumps(d.get('lean_theorems', {})))" > /tmp/prev_lean.json
|
|
71
|
+
forge metrics --apply --tests-passing ${{ steps.pytest.outputs.passed }}
|
|
72
|
+
# If no mhed-codex was attached this run, restore prior lean block.
|
|
73
|
+
if [ -z "${FORGE_MHED_CODEX:-}" ]; then
|
|
74
|
+
python <<'PY'
|
|
75
|
+
import json, pathlib
|
|
76
|
+
p = pathlib.Path("forge_metrics.json")
|
|
77
|
+
d = json.loads(p.read_text())
|
|
78
|
+
prev = json.loads(pathlib.Path("/tmp/prev_lean.json").read_text())
|
|
79
|
+
# Only restore if the freshly-computed block reports found=False
|
|
80
|
+
# (i.e. mhed-codex unavailable) AND the prior had a real count.
|
|
81
|
+
if not d.get("lean_theorems", {}).get("found") and prev.get("count"):
|
|
82
|
+
d["lean_theorems"] = prev
|
|
83
|
+
p.write_text(json.dumps(d, indent=2, sort_keys=True) + "\n")
|
|
84
|
+
PY
|
|
85
|
+
fi
|
|
86
|
+
- name: Commit if drifted
|
|
87
|
+
run: |
|
|
88
|
+
git config user.name "atomadic-bot"
|
|
89
|
+
git config user.email "bot@atomadic.tech"
|
|
90
|
+
if git diff --quiet -- forge_metrics.json; then
|
|
91
|
+
echo "metrics already current — no commit"
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
git add forge_metrics.json
|
|
95
|
+
git commit -m "chore(metrics): auto-regenerate forge_metrics.json [skip ci]"
|
|
96
|
+
git push origin main
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Metrics Drift Gate
|
|
2
|
+
|
|
3
|
+
# CI gate that keeps forge_metrics.json in sync with the live forge surface.
|
|
4
|
+
# Any PR that changes TOOLS, CLI registry, source/test counts, or
|
|
5
|
+
# pyproject.toml WITHOUT regenerating forge_metrics.json fails this check.
|
|
6
|
+
#
|
|
7
|
+
# Lean theorem count is recomputed only when the FORGE_MHED_CODEX repo is
|
|
8
|
+
# accessible (CI env var). When not set, the lean_theorems block is
|
|
9
|
+
# preserved from the in-tree forge_metrics.json so PRs that don't touch
|
|
10
|
+
# mhed-codex don't get blocked here.
|
|
11
|
+
#
|
|
12
|
+
# Fix when this fails: forge metrics --apply && git add forge_metrics.json
|
|
13
|
+
|
|
14
|
+
on:
|
|
15
|
+
pull_request:
|
|
16
|
+
paths:
|
|
17
|
+
- "src/atomadic_forge/a0_qk_constants/schema_version_registry.py"
|
|
18
|
+
- "src/atomadic_forge/a1_at_functions/mcp_protocol.py"
|
|
19
|
+
- "src/atomadic_forge/a1_at_functions/forge_metrics.py"
|
|
20
|
+
- "src/atomadic_forge/a3_og_features/forge_metrics_feature.py"
|
|
21
|
+
- "src/atomadic_forge/a4_sy_orchestration/cli.py"
|
|
22
|
+
- "src/atomadic_forge/commands/**"
|
|
23
|
+
- "pyproject.toml"
|
|
24
|
+
- "forge_metrics.json"
|
|
25
|
+
push:
|
|
26
|
+
branches: [main]
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
metrics-drift:
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
timeout-minutes: 5
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.12"
|
|
37
|
+
- name: Install package (editable)
|
|
38
|
+
run: pip install -e . --quiet
|
|
39
|
+
- name: Compute live metrics + diff vs. checked-in artifact
|
|
40
|
+
run: |
|
|
41
|
+
set -euo pipefail
|
|
42
|
+
# Save committed copy.
|
|
43
|
+
cp forge_metrics.json /tmp/forge_metrics.committed.json
|
|
44
|
+
# Recompute (Lean count zero in CI unless FORGE_MHED_CODEX is wired).
|
|
45
|
+
forge metrics --apply
|
|
46
|
+
# If the only delta is the timestamp, that's expected — strip it
|
|
47
|
+
# before diffing so we only fail on substantive drift.
|
|
48
|
+
jq 'del(.generated_at_utc)' /tmp/forge_metrics.committed.json > /tmp/a.json
|
|
49
|
+
jq 'del(.generated_at_utc)' forge_metrics.json > /tmp/b.json
|
|
50
|
+
# If FORGE_MHED_CODEX is not set, also ignore the lean_theorems
|
|
51
|
+
# block (will be 0 in CI but the committed artifact has the real
|
|
52
|
+
# count from the IP repo).
|
|
53
|
+
if [ -z "${FORGE_MHED_CODEX:-}" ]; then
|
|
54
|
+
jq 'del(.lean_theorems)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
|
|
55
|
+
jq 'del(.lean_theorems)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
|
|
56
|
+
fi
|
|
57
|
+
if ! diff -u /tmp/a.json /tmp/b.json; then
|
|
58
|
+
echo "::error::forge_metrics.json is stale. Run 'forge metrics --apply' and commit the result."
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
echo "metrics drift check: OK"
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: Publish on tag
|
|
2
|
+
|
|
3
|
+
# v0.50.0 — single tag → full publish chain.
|
|
4
|
+
#
|
|
5
|
+
# Pushing a v* tag fires this workflow, which:
|
|
6
|
+
# 1. Verifies forge_metrics.json is current at the tag (no stale numbers
|
|
7
|
+
# shipping to PyPI / atomadic.tech / shields.io).
|
|
8
|
+
# 2. Creates a GitHub Release using the matching CHANGELOG section.
|
|
9
|
+
# The GH-Release event triggers release.yml which builds + publishes
|
|
10
|
+
# to PyPI.
|
|
11
|
+
# 3. Fires a `repository_dispatch` to atomadic-forge-cloudflare-workers
|
|
12
|
+
# so the MCP worker redeploys with the same version. Public
|
|
13
|
+
# surfaces (badges, metrics.json proxy, MCP endpoint) are then in
|
|
14
|
+
# lockstep with the PyPI release.
|
|
15
|
+
#
|
|
16
|
+
# Required secrets:
|
|
17
|
+
# GH_TOKEN — automatic (github.token)
|
|
18
|
+
# WORKER_DEPLOY_PAT — PAT with `repo` scope on the worker repo;
|
|
19
|
+
# grants permission to fire repository_dispatch. If unset, the
|
|
20
|
+
# cross-repo dispatch is skipped (worker can be redeployed
|
|
21
|
+
# manually via its own workflow_dispatch).
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
push:
|
|
25
|
+
tags:
|
|
26
|
+
- 'v*'
|
|
27
|
+
|
|
28
|
+
permissions:
|
|
29
|
+
contents: write
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
publish:
|
|
33
|
+
name: Publish chain (metrics → GH Release → worker dispatch)
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 10
|
|
36
|
+
steps:
|
|
37
|
+
- name: Check out repository
|
|
38
|
+
uses: actions/checkout@v4
|
|
39
|
+
with:
|
|
40
|
+
fetch-depth: 0
|
|
41
|
+
|
|
42
|
+
- name: Extract version from tag
|
|
43
|
+
id: version
|
|
44
|
+
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
|
|
45
|
+
|
|
46
|
+
- uses: actions/setup-python@v5
|
|
47
|
+
with:
|
|
48
|
+
python-version: "3.12"
|
|
49
|
+
|
|
50
|
+
- name: Install package
|
|
51
|
+
run: pip install -e . --quiet
|
|
52
|
+
|
|
53
|
+
- name: Verify forge_metrics.json is current at this tag
|
|
54
|
+
run: |
|
|
55
|
+
set -euo pipefail
|
|
56
|
+
# Save the in-tree artifact, recompute, diff (ignoring
|
|
57
|
+
# generated_at_utc and lean_theorems — Lean count requires
|
|
58
|
+
# the IP-protected mhed-codex repo, not present in CI).
|
|
59
|
+
cp forge_metrics.json /tmp/forge_metrics.committed.json
|
|
60
|
+
# Use the most recent passing test count from the suite.
|
|
61
|
+
set +e
|
|
62
|
+
ptout=$(python -m pytest tests/ -q --no-header 2>&1 | tail -3)
|
|
63
|
+
set -e
|
|
64
|
+
passed=$(echo "$ptout" | grep -oE '[0-9]+ passed' | head -1 | grep -oE '[0-9]+')
|
|
65
|
+
forge metrics --apply --tests-passing "${passed:-0}"
|
|
66
|
+
jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
|
|
67
|
+
/tmp/forge_metrics.committed.json > /tmp/a.json
|
|
68
|
+
jq 'del(.generated_at_utc) | del(.lean_theorems) | del(.tests_passing)' \
|
|
69
|
+
forge_metrics.json > /tmp/b.json
|
|
70
|
+
if ! diff -u /tmp/a.json /tmp/b.json; then
|
|
71
|
+
echo "::error::forge_metrics.json is stale at tag ${GITHUB_REF_NAME}. Re-run \`forge metrics --apply\` and re-tag."
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
- name: Extract changelog for this version
|
|
76
|
+
id: changelog
|
|
77
|
+
run: |
|
|
78
|
+
version="${{ steps.version.outputs.version }}"
|
|
79
|
+
changelog=$(sed -n "/^## .*${version}/,/^## /{/^## .*${version}/d;/^## /d;p}" CHANGELOG.md | head -100)
|
|
80
|
+
if [ -z "$changelog" ]; then
|
|
81
|
+
changelog="Release v${version}"
|
|
82
|
+
fi
|
|
83
|
+
echo "$changelog" > /tmp/release_notes.md
|
|
84
|
+
|
|
85
|
+
- name: Create GitHub Release
|
|
86
|
+
env:
|
|
87
|
+
GH_TOKEN: ${{ github.token }}
|
|
88
|
+
run: |
|
|
89
|
+
gh release create "${{ github.ref_name }}" \
|
|
90
|
+
--title "Atomadic Forge ${{ github.ref_name }}" \
|
|
91
|
+
--notes-file /tmp/release_notes.md
|
|
92
|
+
|
|
93
|
+
- name: Dispatch worker redeploy
|
|
94
|
+
if: ${{ secrets.WORKER_DEPLOY_PAT != '' }}
|
|
95
|
+
env:
|
|
96
|
+
PAT: ${{ secrets.WORKER_DEPLOY_PAT }}
|
|
97
|
+
run: |
|
|
98
|
+
curl -fsS -X POST \
|
|
99
|
+
-H "Accept: application/vnd.github+json" \
|
|
100
|
+
-H "Authorization: Bearer ${PAT}" \
|
|
101
|
+
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
102
|
+
https://api.github.com/repos/atomadictech/atomadic-forge-cloudflare-workers/dispatches \
|
|
103
|
+
-d "{\"event_type\":\"forge-released\",\"client_payload\":{\"version\":\"${{ steps.version.outputs.version }}\"}}"
|
|
104
|
+
echo "dispatched forge-released v${{ steps.version.outputs.version }} → worker repo"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: Uptime monitor
|
|
2
|
+
|
|
3
|
+
# Runs every 30 minutes. Pings all Atomadic services and opens an
|
|
4
|
+
# issue if any are down. Free uptime monitoring via GitHub Actions.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: '*/30 * * * *'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
issues: write
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
check:
|
|
17
|
+
name: Health check
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
timeout-minutes: 3
|
|
20
|
+
steps:
|
|
21
|
+
- name: Ping all services
|
|
22
|
+
id: ping
|
|
23
|
+
run: |
|
|
24
|
+
failed=""
|
|
25
|
+
for entry in \
|
|
26
|
+
"forge.atomadic.tech|https://forge.atomadic.tech" \
|
|
27
|
+
"forge-mcp|https://forge.atomadic.tech/mcp" \
|
|
28
|
+
"chat.atomadic.tech|https://chat.atomadic.tech" \
|
|
29
|
+
"forge-auth|https://forge-auth.atomadic.tech" \
|
|
30
|
+
; do
|
|
31
|
+
name="${entry%%|*}"
|
|
32
|
+
url="${entry##*|}"
|
|
33
|
+
status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$url" 2>/dev/null || echo "000")
|
|
34
|
+
# 200, 401, 405 are all "alive" responses for various endpoints
|
|
35
|
+
if [[ "$status" =~ ^(200|301|302|401|403|405)$ ]]; then
|
|
36
|
+
echo "OK $status $name"
|
|
37
|
+
else
|
|
38
|
+
echo "ERR $status $name"
|
|
39
|
+
failed="$failed $name($status)"
|
|
40
|
+
fi
|
|
41
|
+
done
|
|
42
|
+
|
|
43
|
+
if [ -n "$failed" ]; then
|
|
44
|
+
echo "failed=$failed" >> "$GITHUB_OUTPUT"
|
|
45
|
+
echo "has_failure=true" >> "$GITHUB_OUTPUT"
|
|
46
|
+
else
|
|
47
|
+
echo "has_failure=false" >> "$GITHUB_OUTPUT"
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
- name: Open issue if services are down
|
|
51
|
+
if: steps.ping.outputs.has_failure == 'true'
|
|
52
|
+
uses: actions/checkout@v6
|
|
53
|
+
|
|
54
|
+
- name: Create or update issue
|
|
55
|
+
if: steps.ping.outputs.has_failure == 'true'
|
|
56
|
+
env:
|
|
57
|
+
GH_TOKEN: ${{ github.token }}
|
|
58
|
+
run: |
|
|
59
|
+
title="Uptime alert: services down"
|
|
60
|
+
body="The following services are unreachable: ${{ steps.ping.outputs.failed }}
|
|
61
|
+
|
|
62
|
+
Detected at $(date -u +'%Y-%m-%d %H:%M UTC')
|
|
63
|
+
|
|
64
|
+
Run \`make uptime\` locally to verify."
|
|
65
|
+
|
|
66
|
+
# Check if an open uptime issue already exists
|
|
67
|
+
existing=$(gh issue list --label uptime --state open --json number -q '.[0].number' 2>/dev/null || true)
|
|
68
|
+
if [ -n "$existing" ]; then
|
|
69
|
+
gh issue comment "$existing" --body "$body"
|
|
70
|
+
else
|
|
71
|
+
gh issue create --title "$title" --body "$body" --label uptime
|
|
72
|
+
fi
|