atomadic-forge 0.19.0__tar.gz → 0.51.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.19.0 → atomadic_forge-0.51.0}/.github/workflows/ci.yml +5 -20
- atomadic_forge-0.51.0/.github/workflows/mcp-registry-publish.yml +104 -0
- atomadic_forge-0.51.0/.github/workflows/metrics-auto-regen.yml +101 -0
- atomadic_forge-0.51.0/.github/workflows/metrics-drift.yml +67 -0
- atomadic_forge-0.51.0/.github/workflows/publish-on-tag.yml +111 -0
- atomadic_forge-0.51.0/.github/workflows/uptime.yml +72 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/CHANGELOG.md +331 -0
- {atomadic_forge-0.19.0/src/atomadic_forge.egg-info → atomadic_forge-0.51.0}/PKG-INFO +39 -12
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/README.md +38 -11
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/04-llm-loops.md +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/AGENTS_GUIDE.md +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/FORMALIZATION.md +10 -10
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/HIVE_PRIMITIVES.md +5 -5
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/RECEIPT.md +3 -3
- atomadic_forge-0.51.0/docs/V0.46.0_JUSTIFICATION_REPORT.md +148 -0
- atomadic_forge-0.51.0/docs/V0.47.0_SELF_TEST_REPORT.md +167 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/compliance/CMMC_AI_MAPPING.md +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +2 -2
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/compliance/FDA_PCCP_MAPPING.md +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/compliance/SR_11-7_MAPPING.md +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/pyproject.toml +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +1 -1
- atomadic_forge-0.51.0/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +114 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +1 -1
- atomadic_forge-0.51.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +114 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +18 -0
- atomadic_forge-0.51.0/src/atomadic_forge/a1_at_functions/forge_metrics.py +257 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1396 -1795
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +2 -2
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +16 -16
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/commit_compose.py +2 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +7 -6
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +8 -7
- atomadic_forge-0.51.0/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +192 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/mcp_server.py +95 -11
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/surface_export.py +89 -9
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +35 -27
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/harvest.py +3 -3
- atomadic_forge-0.51.0/src/atomadic_forge/commands/metrics.py +126 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0/src/atomadic_forge.egg-info}/PKG-INFO +39 -12
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge.egg-info/SOURCES.txt +10 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_agent_summary.py +6 -6
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_card_renderer.py +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_codex_5_complete.py +19 -15
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_compliance_checker.py +1 -1
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_copilots_copilot.py +11 -8
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_cs1_renderer.py +2 -2
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_enhancement_proposal.py +5 -5
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_handoff.py +5 -5
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_mcp_protocol.py +190 -196
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_plan_apply.py +9 -6
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_trust_gate_response.py +12 -8
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_welcome.py +2 -2
- atomadic_forge-0.19.0/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -134
- atomadic_forge-0.19.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -146
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/LICENSE +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/SECURITY.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/README.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/setup.cfg +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.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.19.0 → atomadic_forge-0.51.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.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.51.0}/tests/test_wisdom.py +0 -0
|
@@ -95,23 +95,8 @@ jobs:
|
|
|
95
95
|
name: atomadic-forge-dist
|
|
96
96
|
path: dist/*
|
|
97
97
|
|
|
98
|
-
metrics
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
98
|
+
# v0.49.0+ — the canonical metrics gate now lives in
|
|
99
|
+
# .github/workflows/metrics-drift.yml using `forge metrics --apply`
|
|
100
|
+
# against the live TOOLS dict. The legacy scripts/update_metrics.py
|
|
101
|
+
# ships only the propagation helper for site repos; it is no longer
|
|
102
|
+
# the gate.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: MCP Registry Publish
|
|
2
|
+
|
|
3
|
+
# v0.50.0 — every tag automatically publishes server.json to the MCP
|
|
4
|
+
# Official Registry (registry.modelcontextprotocol.io). The version
|
|
5
|
+
# field in server.json is rewritten to match the tag, the description
|
|
6
|
+
# is refreshed from forge_metrics.json so the registry's listing always
|
|
7
|
+
# carries the live tool count, and the published artifact is uploaded
|
|
8
|
+
# via mcp-publisher's GitHub OIDC flow (no PAT or manual publishing).
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
tags:
|
|
13
|
+
- 'v*'
|
|
14
|
+
workflow_dispatch:
|
|
15
|
+
inputs:
|
|
16
|
+
version:
|
|
17
|
+
description: "Version to publish (defaults to the tag name without v prefix)"
|
|
18
|
+
required: false
|
|
19
|
+
default: ''
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
id-token: write # OIDC auth to the MCP registry
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
publish:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
timeout-minutes: 6
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v4
|
|
31
|
+
|
|
32
|
+
- name: Resolve version
|
|
33
|
+
id: ver
|
|
34
|
+
run: |
|
|
35
|
+
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
|
36
|
+
v="${GITHUB_REF_NAME#v}"
|
|
37
|
+
elif [ -n "${{ inputs.version }}" ]; then
|
|
38
|
+
v="${{ inputs.version }}"
|
|
39
|
+
else
|
|
40
|
+
v="$(python -c 'import re,pathlib; t=pathlib.Path("pyproject.toml").read_text(); m=re.search(r"^version\\s*=\\s*\"([^\"]+)\"", t.split("[project]",1)[1], re.M); print(m.group(1))')"
|
|
41
|
+
fi
|
|
42
|
+
echo "version=$v" >> "$GITHUB_OUTPUT"
|
|
43
|
+
|
|
44
|
+
- name: Sync server.json with tag + live metrics
|
|
45
|
+
run: |
|
|
46
|
+
set -euo pipefail
|
|
47
|
+
v="${{ steps.ver.outputs.version }}"
|
|
48
|
+
# Pull live numbers so the registry description always cites
|
|
49
|
+
# the current MCP tool / action count instead of drifting.
|
|
50
|
+
tools=$(jq -r '.mcp_tools // 10' forge_metrics.json)
|
|
51
|
+
actions=$(jq -r '.mcp_actions // 64' forge_metrics.json)
|
|
52
|
+
theorems=$(jq -r '.lean_theorems.count // 886' forge_metrics.json)
|
|
53
|
+
# Rewrite version (top-level + first package entry) and refresh
|
|
54
|
+
# the description string with the live numbers.
|
|
55
|
+
# Registry caps description at 100 chars — keep it punchy +
|
|
56
|
+
# carry live numbers. Long form lives in README/website.
|
|
57
|
+
jq \
|
|
58
|
+
--arg v "$v" \
|
|
59
|
+
--arg tools "$tools" \
|
|
60
|
+
--arg actions "$actions" \
|
|
61
|
+
--arg theorems "$theorems" \
|
|
62
|
+
'.version = $v
|
|
63
|
+
| .packages[0].version = $v
|
|
64
|
+
| .description = "Architecture compiler for AI code. \($tools) tools, \($actions) actions, \($theorems) Lean4 proofs, 100/100 self-cert."' \
|
|
65
|
+
server.json > /tmp/server.json
|
|
66
|
+
mv /tmp/server.json server.json
|
|
67
|
+
echo "── server.json after sync ──"
|
|
68
|
+
cat server.json
|
|
69
|
+
|
|
70
|
+
- name: Install mcp-publisher
|
|
71
|
+
run: |
|
|
72
|
+
# Pre-built CLI; falls back to building from source on miss.
|
|
73
|
+
set -euo pipefail
|
|
74
|
+
curl -fsSL "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64" \
|
|
75
|
+
-o /usr/local/bin/mcp-publisher || {
|
|
76
|
+
echo "binary unavailable, building from source"
|
|
77
|
+
go install github.com/modelcontextprotocol/registry/cmd/publisher@latest
|
|
78
|
+
cp "$(go env GOPATH)/bin/publisher" /usr/local/bin/mcp-publisher
|
|
79
|
+
}
|
|
80
|
+
chmod +x /usr/local/bin/mcp-publisher
|
|
81
|
+
mcp-publisher --version || true
|
|
82
|
+
|
|
83
|
+
- name: Authenticate via GitHub OIDC
|
|
84
|
+
run: mcp-publisher login github-oidc
|
|
85
|
+
|
|
86
|
+
- name: Publish to MCP Registry
|
|
87
|
+
run: mcp-publisher publish
|
|
88
|
+
|
|
89
|
+
- name: Smoke-check published version
|
|
90
|
+
run: |
|
|
91
|
+
set -euo pipefail
|
|
92
|
+
v="${{ steps.ver.outputs.version }}"
|
|
93
|
+
# Allow up to ~30s for the registry to propagate.
|
|
94
|
+
for i in 1 2 3 4 5 6; do
|
|
95
|
+
sleep 5
|
|
96
|
+
got=$(curl -fsS "https://registry.modelcontextprotocol.io/v0/servers?search=atomadic-forge" \
|
|
97
|
+
| jq -r '.servers[0].server.version' || echo "")
|
|
98
|
+
echo "registry reports version: $got (want $v)"
|
|
99
|
+
if [ "$got" = "$v" ]; then
|
|
100
|
+
echo "PASS: registry shows v$v"
|
|
101
|
+
exit 0
|
|
102
|
+
fi
|
|
103
|
+
done
|
|
104
|
+
echo "::warning::registry did not propagate v$v within 30s; check registry.modelcontextprotocol.io manually"
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
# GitHub Actions disallows `secrets.*` in `if` — runtime check
|
|
57
|
+
# inside the script instead. No-op if the deploy key is unset.
|
|
58
|
+
env:
|
|
59
|
+
MHED_CODEX_DEPLOY_KEY: ${{ secrets.MHED_CODEX_DEPLOY_KEY }}
|
|
60
|
+
run: |
|
|
61
|
+
if [ -z "${MHED_CODEX_DEPLOY_KEY:-}" ]; then
|
|
62
|
+
echo "MHED_CODEX_DEPLOY_KEY not set — skipping mhed-codex clone."
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
|
66
|
+
echo "$MHED_CODEX_DEPLOY_KEY" > ~/.ssh/mhed_key && chmod 600 ~/.ssh/mhed_key
|
|
67
|
+
GIT_SSH_COMMAND="ssh -i ~/.ssh/mhed_key -o StrictHostKeyChecking=no" \
|
|
68
|
+
git clone --depth 1 git@github.com:atomadictech/mhed-codex.git /tmp/mhed-codex
|
|
69
|
+
echo "FORGE_MHED_CODEX=/tmp/mhed-codex" >> "$GITHUB_ENV"
|
|
70
|
+
- name: Regenerate forge_metrics.json
|
|
71
|
+
run: |
|
|
72
|
+
# Save the previous lean_theorems block so we can preserve it
|
|
73
|
+
# when no mhed-codex is attached (avoid zeroing the public
|
|
74
|
+
# number on a routine source-only push).
|
|
75
|
+
python -c "import json; d=json.load(open('forge_metrics.json')); print(json.dumps(d.get('lean_theorems', {})))" > /tmp/prev_lean.json
|
|
76
|
+
forge metrics --apply --tests-passing ${{ steps.pytest.outputs.passed }}
|
|
77
|
+
# If no mhed-codex was attached this run, restore prior lean block.
|
|
78
|
+
if [ -z "${FORGE_MHED_CODEX:-}" ]; then
|
|
79
|
+
python <<'PY'
|
|
80
|
+
import json, pathlib
|
|
81
|
+
p = pathlib.Path("forge_metrics.json")
|
|
82
|
+
d = json.loads(p.read_text())
|
|
83
|
+
prev = json.loads(pathlib.Path("/tmp/prev_lean.json").read_text())
|
|
84
|
+
# Only restore if the freshly-computed block reports found=False
|
|
85
|
+
# (i.e. mhed-codex unavailable) AND the prior had a real count.
|
|
86
|
+
if not d.get("lean_theorems", {}).get("found") and prev.get("count"):
|
|
87
|
+
d["lean_theorems"] = prev
|
|
88
|
+
p.write_text(json.dumps(d, indent=2, sort_keys=True) + "\n")
|
|
89
|
+
PY
|
|
90
|
+
fi
|
|
91
|
+
- name: Commit if drifted
|
|
92
|
+
run: |
|
|
93
|
+
git config user.name "atomadic-bot"
|
|
94
|
+
git config user.email "bot@atomadic.tech"
|
|
95
|
+
if git diff --quiet -- forge_metrics.json; then
|
|
96
|
+
echo "metrics already current — no commit"
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
git add forge_metrics.json
|
|
100
|
+
git commit -m "chore(metrics): auto-regenerate forge_metrics.json [skip ci]"
|
|
101
|
+
git push origin main
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
# Always strip `tests_passing` from the diff — that field is
|
|
51
|
+
# populated externally (CI test job + --tests-passing flag) and
|
|
52
|
+
# the committed artifact carries the full pytest count, while
|
|
53
|
+
# this gate doesn't run pytest. Comparing them is meaningless.
|
|
54
|
+
jq 'del(.tests_passing)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
|
|
55
|
+
jq 'del(.tests_passing)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
|
|
56
|
+
# If FORGE_MHED_CODEX is not set, also ignore the lean_theorems
|
|
57
|
+
# block (will be 0 in CI but the committed artifact has the real
|
|
58
|
+
# count from the IP repo).
|
|
59
|
+
if [ -z "${FORGE_MHED_CODEX:-}" ]; then
|
|
60
|
+
jq 'del(.lean_theorems)' /tmp/a.json > /tmp/a2.json && mv /tmp/a2.json /tmp/a.json
|
|
61
|
+
jq 'del(.lean_theorems)' /tmp/b.json > /tmp/b2.json && mv /tmp/b2.json /tmp/b.json
|
|
62
|
+
fi
|
|
63
|
+
if ! diff -u /tmp/a.json /tmp/b.json; then
|
|
64
|
+
echo "::error::forge_metrics.json is stale. Run 'forge metrics --apply' and commit the result."
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
echo "metrics drift check: OK"
|
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
# GitHub Actions does not allow `secrets.*` in `if` expressions —
|
|
95
|
+
# we check at runtime instead. If the secret is unset, the
|
|
96
|
+
# dispatch step is a no-op (worker can be redeployed manually
|
|
97
|
+
# via its own workflow_dispatch).
|
|
98
|
+
env:
|
|
99
|
+
PAT: ${{ secrets.WORKER_DEPLOY_PAT }}
|
|
100
|
+
run: |
|
|
101
|
+
if [ -z "$PAT" ]; then
|
|
102
|
+
echo "WORKER_DEPLOY_PAT not set — skipping cross-repo dispatch."
|
|
103
|
+
exit 0
|
|
104
|
+
fi
|
|
105
|
+
curl -fsS -X POST \
|
|
106
|
+
-H "Accept: application/vnd.github+json" \
|
|
107
|
+
-H "Authorization: Bearer ${PAT}" \
|
|
108
|
+
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
109
|
+
https://api.github.com/repos/atomadictech/atomadic-forge-cloudflare-workers/dispatches \
|
|
110
|
+
-d "{\"event_type\":\"forge-released\",\"client_payload\":{\"version\":\"${{ steps.version.outputs.version }}\"}}"
|
|
111
|
+
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
|