atomadic-forge 0.19.0__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.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.19.0 → atomadic_forge-0.50.0}/CHANGELOG.md +288 -0
- {atomadic_forge-0.19.0/src/atomadic_forge.egg-info → atomadic_forge-0.50.0}/PKG-INFO +39 -12
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/README.md +38 -11
- 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.19.0 → atomadic_forge-0.50.0}/pyproject.toml +1 -1
- atomadic_forge-0.50.0/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +114 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +18 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a1_at_functions/forge_metrics.py +257 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +1394 -1793
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commit_compose.py +2 -0
- atomadic_forge-0.50.0/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +192 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/mcp_server.py +94 -10
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/surface_export.py +89 -9
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +33 -25
- atomadic_forge-0.50.0/src/atomadic_forge/commands/metrics.py +126 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0/src/atomadic_forge.egg-info}/PKG-INFO +39 -12
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/SOURCES.txt +9 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_summary.py +6 -6
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_codex_5_complete.py +19 -15
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_copilots_copilot.py +11 -8
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_enhancement_proposal.py +5 -5
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_handoff.py +5 -5
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_mcp_protocol.py +175 -181
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_plan_apply.py +9 -6
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_trust_gate_response.py +12 -8
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_welcome.py +2 -2
- 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.50.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/LICENSE +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/SECURITY.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/README.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/setup.cfg +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.19.0 → 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.19.0 → 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.19.0 → 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.19.0 → atomadic_forge-0.50.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.50.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.50.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.19.0 → atomadic_forge-0.50.0}/tests/test_wisdom.py +0 -0
|
@@ -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
|
|
@@ -2,6 +2,294 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.50.0 — 2026-05-07 — one tag publishes everywhere
|
|
6
|
+
|
|
7
|
+
### feat: full single-tag publish chain (PyPI + worker + badges in lockstep)
|
|
8
|
+
|
|
9
|
+
Pushing a single `vX.Y.Z` tag now drives the whole pipeline:
|
|
10
|
+
|
|
11
|
+
1. `publish-on-tag.yml` verifies `forge_metrics.json` is current at the
|
|
12
|
+
tag (fail-loud if stale — no shipping wrong numbers to public surfaces).
|
|
13
|
+
2. GitHub Release is created from the matching CHANGELOG section.
|
|
14
|
+
3. `release.yml` builds + publishes to PyPI.
|
|
15
|
+
4. `repository_dispatch` fires `forge-released` to the worker repo,
|
|
16
|
+
which redeploys via `wrangler deploy` with the matching version env.
|
|
17
|
+
|
|
18
|
+
Public surfaces (atomadic.tech, shields.io badges, MCP endpoint, doctor
|
|
19
|
+
response, package version banner) all reflect the same tag within ~30s.
|
|
20
|
+
|
|
21
|
+
### feat: shields.io endpoint badges
|
|
22
|
+
|
|
23
|
+
The Cloudflare Worker now serves shields.io v1 endpoint badges:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
https://img.shields.io/endpoint?url=https://forge.atomadic.tech/badge/<metric>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Available metrics: `mcp_tools`, `mcp_actions`, `cli_verbs`, `tests_passing`,
|
|
30
|
+
`test_files`, `test_functions`, `source_files`, `source_lines`,
|
|
31
|
+
`monadic_tiers`, `lean_theorems`, `package_version`.
|
|
32
|
+
|
|
33
|
+
Each badge reads `forge_metrics.json` (5-min edge cache). Drop one in any
|
|
34
|
+
README, docs site, or status page — the number updates without anyone
|
|
35
|
+
editing the file.
|
|
36
|
+
|
|
37
|
+
README header gained a row of live badges: tools, actions, CLI verbs,
|
|
38
|
+
tests passing, source files, Lean4 theorem count. Static "100/100
|
|
39
|
+
certify" badge retired in favor of dynamic numbers.
|
|
40
|
+
|
|
41
|
+
### feat: auto-regen on every push to main
|
|
42
|
+
|
|
43
|
+
`metrics-auto-regen.yml`: any push to `main` that touches source, tests,
|
|
44
|
+
or `pyproject.toml` triggers a regeneration. If the artifact drifted, a
|
|
45
|
+
follow-up `chore(metrics): auto-regenerate [skip ci]` commit is pushed
|
|
46
|
+
back to main. Stale numbers self-heal — no human intervention.
|
|
47
|
+
|
|
48
|
+
When the `MHED_CODEX_DEPLOY_KEY` org secret is configured, the
|
|
49
|
+
auto-regen also clones the IP-protected mhed-codex over deploy-key
|
|
50
|
+
SSH and refreshes the Lean theorem count. Without the secret, the prior
|
|
51
|
+
lean count is preserved (never zeroed by a routine push).
|
|
52
|
+
|
|
53
|
+
### chore: corrected misnamed metric units
|
|
54
|
+
|
|
55
|
+
Earlier responses cited "1,493 passing" alongside "test_files: 96" and
|
|
56
|
+
"124/124 passed" — three different units (full-suite passes, file count,
|
|
57
|
+
targeted-subset passes). The artifact now carries all three explicitly:
|
|
58
|
+
`test_files`, `test_functions`, `tests_passing`.
|
|
59
|
+
|
|
60
|
+
## v0.49.0 — 2026-05-07 — single source of truth: `forge_metrics.json`
|
|
61
|
+
|
|
62
|
+
### feat: canonical metrics artifact for every public surface
|
|
63
|
+
|
|
64
|
+
Every public number Forge claims about itself — MCP tool count, action
|
|
65
|
+
count, CLI verb count, source/test files, lines of code, and the count
|
|
66
|
+
of formally-verified Lean4 theorems in the IP-protected mhed-codex
|
|
67
|
+
moat — now lives in one canonical artifact: `forge_metrics.json` at the
|
|
68
|
+
repo root, regenerated on every push by `forge metrics --apply`.
|
|
69
|
+
|
|
70
|
+
Public surfaces (README, CHANGELOG badges, the welcome handshake, the
|
|
71
|
+
Cloudflare Worker, shields.io endpoints, atomadic.tech site) read from
|
|
72
|
+
this file. CI gate (`metrics-drift.yml`) fails any PR that lets the
|
|
73
|
+
artifact drift out of sync with the live forge surface.
|
|
74
|
+
|
|
75
|
+
**Live numbers (this commit):**
|
|
76
|
+
- 10 MCP tools · 64 actions
|
|
77
|
+
- 71 CLI verbs
|
|
78
|
+
- 211 source files · ~40,110 LOC
|
|
79
|
+
- 96 test files
|
|
80
|
+
- **886 Lean4 theorems across 38 files** (mhed-codex moat)
|
|
81
|
+
- monadic tiers = 5
|
|
82
|
+
|
|
83
|
+
### feat(cli/mcp): `forge metrics` verb — print or write the artifact
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
forge metrics # print live metrics summary
|
|
87
|
+
forge metrics --apply # rewrite forge_metrics.json
|
|
88
|
+
forge metrics --json # machine-readable JSON to stdout
|
|
89
|
+
forge metrics --self-cert # also embed certify score (slower)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The verb composes a pure tier-a1 aggregator (`forge_metrics.py`) with
|
|
93
|
+
the live MCP TOOLS dict and CLI registry. Source paths from the
|
|
94
|
+
IP-protected mhed-codex repo are NEVER written into the public
|
|
95
|
+
artifact — only aggregate counts. Path resolution is via the
|
|
96
|
+
`FORGE_MHED_CODEX` env var; gitignore protects `mhed-codex/` from
|
|
97
|
+
ever being checked in.
|
|
98
|
+
|
|
99
|
+
### chore: corrected stale README numbers
|
|
100
|
+
|
|
101
|
+
The "By the Numbers" table previously cited Lean4=624 (stale by 262)
|
|
102
|
+
and source files=193 (stale by 18). Now derived live from
|
|
103
|
+
`forge_metrics.json` and verified against the IP repo.
|
|
104
|
+
|
|
105
|
+
## v0.48.0 — 2026-05-07 — flagship `transmute` + `loop` split out of plan (8→10 tools)
|
|
106
|
+
|
|
107
|
+
### refactor(mcp): surface the flagship pipeline; reduce plan overload
|
|
108
|
+
|
|
109
|
+
The v0.46.0 consolidation buried the flagship `auto` pipeline inside
|
|
110
|
+
`plan(action='auto')` — semantically wrong (`plan` means *planning*, not
|
|
111
|
+
*executing the absorption pipeline*) and bad for discoverability (agents
|
|
112
|
+
reading `tools/list` couldn't see "auto" at all).
|
|
113
|
+
|
|
114
|
+
**v0.48.0 splits two semantic clusters back out:**
|
|
115
|
+
|
|
116
|
+
- **`transmute` (3 actions)** — the spaghetti→certified flagship:
|
|
117
|
+
`auto` (single-shot scout→cherry→assimilate→wire→certify) ·
|
|
118
|
+
`cherry` (produce cherry.json manifest) ·
|
|
119
|
+
`finalize` (materialize a cherry.json into a package).
|
|
120
|
+
This is the headline Forge capability and now appears at the top level
|
|
121
|
+
of `tools/list` again.
|
|
122
|
+
|
|
123
|
+
- **`loop` (4 actions)** — LLM-driven iteration sessions:
|
|
124
|
+
`iterate` · `resume` · `evolve` · `evolve_step`.
|
|
125
|
+
Distinct from `plan` because these REQUIRE an external LLM client —
|
|
126
|
+
Forge has no embedded LLM. Splitting clarifies that contract.
|
|
127
|
+
|
|
128
|
+
**`plan` (16 → 9 actions)** — now cleanly scoped to "orient + dev utilities":
|
|
129
|
+
context, compose, policy, recipes, generate, apply, locate, commit, scaffold.
|
|
130
|
+
|
|
131
|
+
**Backward compat:** every legacy name still works.
|
|
132
|
+
`LEGACY_ENDPOINT_MAP` updated: `auto/cherry/finalize/transmute → transmute`,
|
|
133
|
+
`iterate/evolve/loop → loop`. Schema bumps: `transmute → /v2`, `loop → /v2`,
|
|
134
|
+
`plan → /v6` (action enum changed). Total tool count: **10**.
|
|
135
|
+
|
|
136
|
+
### chore: schema registry & surface map updated
|
|
137
|
+
|
|
138
|
+
`transmute` → `/v2`, `loop` → `/v2` restored in registry. `plan` schema bumped
|
|
139
|
+
implicitly via action enum change.
|
|
140
|
+
|
|
141
|
+
## v0.47.0 — 2026-05-07 — `create` exposed as MCP tool (7→8 tools)
|
|
142
|
+
|
|
143
|
+
### feat(mcp): forge create now callable over MCP
|
|
144
|
+
|
|
145
|
+
`create` was previously CLI-only. Exposes `create_from_intent` (intent + seed_repos → pip package)
|
|
146
|
+
as a standalone MCP tool — runs the full Phase 1 pipeline (emergent_swarm cross-repo composition
|
|
147
|
+
discovery → materialize top-N candidates → optional certify). Returns the create receipt with
|
|
148
|
+
scan_summary, materialize report, and scan_report_path for re-runs without re-scanning.
|
|
149
|
+
|
|
150
|
+
Schema: `atomadic-forge.create/v1`. Total tool count: **8**.
|
|
151
|
+
|
|
152
|
+
## v0.46.0 — 2026-05-07 — MCP Surface Redesign: 66→7 tools, 64 actions
|
|
153
|
+
|
|
154
|
+
### feat(mcp): complete tool surface consolidation with action-dispatch architecture
|
|
155
|
+
|
|
156
|
+
Reduced the MCP tool count from **66 to 7** by consolidating related operations
|
|
157
|
+
under action-dispatch. Each of the 66 original tool names redirects automatically
|
|
158
|
+
via `LEGACY_ENDPOINT_MAP` — zero callers broken, zero migrations required.
|
|
159
|
+
|
|
160
|
+
**Measured token savings: ~8,630 tokens per `tools/list` call (−51%)** vs the prior
|
|
161
|
+
66-tool surface (`tools/list` payload dropped from 67.7 KB → 33.2 KB, measured
|
|
162
|
+
on v0.23.0 vs v0.47.0 by dispatching the actual JSON-RPC call). Per-session
|
|
163
|
+
savings depend on how many `tools/list` calls a client issues — typically
|
|
164
|
+
~8.6K–26K tokens. The earlier draft of these notes claimed ~250K tokens/session
|
|
165
|
+
and ~99 KB → ~25 KB; both were estimates that didn't survive measurement.
|
|
166
|
+
Response-size caps across high-volume tools (smell_scan, wisdom_list, etc.)
|
|
167
|
+
saved an additional ~189 KB per heavy round-trip — those numbers were
|
|
168
|
+
verified directly and stand.
|
|
169
|
+
|
|
170
|
+
**Final 7-tool surface (64 actions):**
|
|
171
|
+
|
|
172
|
+
| Tool | Actions | Scope |
|
|
173
|
+
|------|---------|-------|
|
|
174
|
+
| `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, safety net |
|
|
175
|
+
| `explore` | 9 | Codebase analysis & discovery: `recon` · `explain` · `call_graph` · `smell_scan` · `lineage` · `harvest` · `synergy` · `scan` · `swarm` |
|
|
176
|
+
| `audit` | 14 | Quality gates & change safety: `certify` · `wire` · `enforce` · `validate` · `guard` · `composite` · `gate` · `health` · `check` · `score` · `tests` · `cna` · `rollback` · `diff` |
|
|
177
|
+
| `plan` | 16 | Orient + plan + execute: `context` · `compose` · `policy` · `recipes` · `generate` · `apply` · `locate` · `commit` · `iterate` · `resume` · `evolve` · `evolve_step` · `auto` · `cherry` · `finalize` · `scaffold` |
|
|
178
|
+
| `hive` | 13 | Multi-agent coordination: `register` · `list` · `deactivate` · `observe` · `propose` · `vote` · `needs_vote` · `result` · `recap` · `handoff_create` · `handoff_list` · `enhance_propose` · `enhance_list` |
|
|
179
|
+
| `wisdom` | 5 | Institutional memory DB: `record` · `query` · `list` · `recall` · `promote` |
|
|
180
|
+
| `nexus` | 7 | AAAA-Nexus auth primitives (via `op=`): `identity_verify` · `federation_mint` · `authorize_action` · `sys_trust_gate` · `contract_verify` · `lineage_record` · `ratchet_register` |
|
|
181
|
+
|
|
182
|
+
Each tool uses `action=` dispatch; `nexus` uses `op=` to avoid collision with
|
|
183
|
+
`authorize_action`'s pass-through `action` parameter.
|
|
184
|
+
|
|
185
|
+
### perf: response-size caps across high-volume tools
|
|
186
|
+
|
|
187
|
+
Default payload sizes reduced at the source so agents never receive multi-KB
|
|
188
|
+
responses they didn't ask for:
|
|
189
|
+
|
|
190
|
+
| Tool | Before | After | Mechanism |
|
|
191
|
+
|------|--------|-------|-----------|
|
|
192
|
+
| `emergent_scan` | 32 KB | 7.5 KB | `top_n` 25→10, optional `include_chains` |
|
|
193
|
+
| `synergy_scan` | 14 KB | 5.7 KB | `top_n` 25→10, optional `include_details` |
|
|
194
|
+
| `smell_scan` | 61 KB | 12 KB | `top_n_findings=20` cap, always emits `*_count` |
|
|
195
|
+
| `wisdom_list` | 71 KB | ~5 KB | `limit=20` default, `limit=0` for full dump |
|
|
196
|
+
| `wisdom_promote` | 46 KB | 5 KB | `include_bodies=false` default |
|
|
197
|
+
|
|
198
|
+
Full detail always recoverable via the respective opt-in params.
|
|
199
|
+
|
|
200
|
+
## v0.23.0 — 2026-05-07 — wisdom_promote body trim (46 KB → 5 KB)
|
|
201
|
+
|
|
202
|
+
### perf(wisdom_promote): strip draft_markdown bodies from default response
|
|
203
|
+
|
|
204
|
+
`wisdom_promote` response was 46 KB (3 drafts × full markdown). Default now
|
|
205
|
+
returns metadata only — `body_chars`, `body_omitted: true` — at ~5 KB.
|
|
206
|
+
|
|
207
|
+
- `include_bodies=true` restores full markdown in the response.
|
|
208
|
+
- `write=true` also implicitly includes bodies (you're persisting them anyway).
|
|
209
|
+
- Added `hint` field explaining the param when bodies are omitted.
|
|
210
|
+
|
|
211
|
+
Response reduction: 46,352 → 4,759 bytes (90%).
|
|
212
|
+
|
|
213
|
+
## v0.22.0 — 2026-05-07 — plan maintenance hints, CLI map completions, description fixes
|
|
214
|
+
|
|
215
|
+
### feat(plan): inject maintenance_hints when repo already passes at 100/100
|
|
216
|
+
|
|
217
|
+
When `certify=100` and `wire=PASS`, the `plan` tool now emits `maintenance_hints`
|
|
218
|
+
— top-5 CC complexity hotspots from `smell_scan` — so agents always have an
|
|
219
|
+
actionable next step even on a clean repo. Adds `maintenance_hint_count` field.
|
|
220
|
+
No change to existing fields; no impact on repos with real actions to take.
|
|
221
|
+
|
|
222
|
+
### fix(CLI map): complete _CLI_FALLBACKS for 15 previously missing tools
|
|
223
|
+
|
|
224
|
+
`trust_gate_response` was incorrectly listed as "MCP-only" — the CLI is
|
|
225
|
+
`forge trust-gate`. Added correct CLI equivalents (or intentional MCP-only
|
|
226
|
+
annotations) for: `guard_install`, `tool_factory`, `iterate_start`,
|
|
227
|
+
`iterate_continue`, `evolve_start`, `evolve_step`, `lineage`, `harvest`,
|
|
228
|
+
and all 9 hive subtools.
|
|
229
|
+
|
|
230
|
+
### fix(lineage): add CLI equivalent to description
|
|
231
|
+
|
|
232
|
+
Description now notes `forge surface list/show/log` as the CLI counterpart,
|
|
233
|
+
fixing the gap where agents had no way to discover the CLI equivalent.
|
|
234
|
+
|
|
235
|
+
## v0.21.0 — 2026-05-07 — wisdom_list limit, commit_compose prefix fix
|
|
236
|
+
|
|
237
|
+
### perf(wisdom_list): cap default response at 20 entries (71 KB → ~5 KB)
|
|
238
|
+
|
|
239
|
+
New `limit` parameter (default 20) prevents `wisdom_list` from dumping the
|
|
240
|
+
entire wisdom DB in one call. Always emits:
|
|
241
|
+
|
|
242
|
+
- `total_count` — full entry count regardless of cap.
|
|
243
|
+
- `returned_count` — entries actually returned.
|
|
244
|
+
- `truncated: true` + `hint` string when the DB exceeds the limit.
|
|
245
|
+
|
|
246
|
+
Pass `limit=0` to retrieve all entries. Mirrors the `top_n_findings` pattern
|
|
247
|
+
added to `smell_scan` in v0.20.0.
|
|
248
|
+
|
|
249
|
+
### fix(commit_compose): strip duplicate conventional-commit prefix from intent
|
|
250
|
+
|
|
251
|
+
`commit_compose` now strips any leading `TYPE:` or `TYPE(scope):` prefix from
|
|
252
|
+
`intent` before prepending the `commit_type` label. Prevents double-prefix
|
|
253
|
+
subjects like `fix: fix(scope): add param` when callers pass a
|
|
254
|
+
conventionally-formatted intent string.
|
|
255
|
+
|
|
256
|
+
## v0.20.0 — 2026-05-07 — context_pack synthesis, synergy_scan fix, smell_scan token reduction
|
|
257
|
+
|
|
258
|
+
### feat(context_pack): embed policy + workflow_recipe — replaces two extra tool calls
|
|
259
|
+
|
|
260
|
+
`context_pack` now returns two new fields on every call:
|
|
261
|
+
|
|
262
|
+
- **`policy`** — the full `[tool.forge.agent]` policy dict (`protected_files`,
|
|
263
|
+
`max_files_per_patch`, `require_human_review_for`). Agents no longer need a
|
|
264
|
+
separate `load_policy` call on first connect.
|
|
265
|
+
- **`workflow_recipe`** — when `intent` is provided, `compose_tools` is run
|
|
266
|
+
automatically and the matched recipe (step-by-step tool sequence) is embedded.
|
|
267
|
+
Agents that pass `intent` get both grounding and a workflow plan in one call.
|
|
268
|
+
|
|
269
|
+
`load_policy` and `compose_tools` remain available as standalone tools for
|
|
270
|
+
targeted use. Their descriptions updated to note the context_pack embedding.
|
|
271
|
+
|
|
272
|
+
Extracted `_build_policy` and `_build_workflow_recipe` helpers, keeping
|
|
273
|
+
`emit_context_pack` CC below the 10-threshold flagged by smell_scan.
|
|
274
|
+
|
|
275
|
+
### fix(synergy_scan): MCP returned 0 candidates vs 20 from CLI
|
|
276
|
+
|
|
277
|
+
`_bound_synergy_scan` in `mcp_server.py` was passing `project_root` as
|
|
278
|
+
`src_root` to `SynergyScan`. The scanner expects the `src/` directory, not the
|
|
279
|
+
repo root. Fixed: now uses `root/"src"` when that directory exists, falling back
|
|
280
|
+
to `root`. Result: 0 → 20 synergy candidates in MCP calls (parity with CLI).
|
|
281
|
+
|
|
282
|
+
### perf(smell_scan): response slimmed from 61.6 KB to ~12 KB
|
|
283
|
+
|
|
284
|
+
New `top_n_findings` parameter (default 20) caps the findings arrays returned
|
|
285
|
+
while always emitting `*_count` summary fields so agents see the full totals:
|
|
286
|
+
|
|
287
|
+
- `complexity_findings_count`, `long_function_findings_count`,
|
|
288
|
+
`duplication_findings_count` — always present regardless of cap.
|
|
289
|
+
- Returned findings are sorted by worst score (highest CC / longest LOC).
|
|
290
|
+
- `findings_capped_at` field indicates the cap in effect.
|
|
291
|
+
- `top_n_findings: 0` disables the cap entirely for full reports.
|
|
292
|
+
|
|
5
293
|
## v0.19.0 — 2026-05-07 — MCP/CLI parity sweep: 8 tool fixes, call_graph overhaul, smell improvements
|
|
6
294
|
|
|
7
295
|
### fix(recon): MCP recon now returns prior_wisdom
|