atomadic-forge 0.75.2__tar.gz → 0.75.3__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.75.2 → atomadic_forge-0.75.3}/CHANGELOG.md +7 -0
- {atomadic_forge-0.75.2/src/atomadic_forge.egg-info → atomadic_forge-0.75.3}/PKG-INFO +1 -1
- atomadic_forge-0.75.3/docs/commands/metrics.md +91 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/pyproject.toml +1 -1
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +163 -7
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +63 -1
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/metrics.py +84 -2
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_repo_public_surface.py +72 -0
- atomadic_forge-0.75.2/docs/commands/metrics.md +0 -46
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/LICENSE +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/MANIFEST.in +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/README.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/SECURITY.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/02-commands.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/05-faq.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/README.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/config.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/create.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/setup.cfg +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/SOURCES.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_chat.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_config.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_demo.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.75.3}/tests/test_wisdom.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.75.
|
|
3
|
+
Version: 0.75.3
|
|
4
4
|
Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
|
|
5
5
|
Author: Atomadic
|
|
6
6
|
License-Expression: BUSL-1.1
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# `atomadic-forge metrics`
|
|
2
|
+
|
|
3
|
+
_Emit forge_metrics.json — canonical metrics for README/CHANGELOG/welcome/worker._
|
|
4
|
+
|
|
5
|
+
- **Module**: `atomadic_forge.commands.metrics`
|
|
6
|
+
- **Surface**: `typer_app`
|
|
7
|
+
- **Source root**: `atomadic_forge_seed`
|
|
8
|
+
- **Hidden**: `False`
|
|
9
|
+
|
|
10
|
+
## Forge metrics
|
|
11
|
+
|
|
12
|
+
Use the top-level command when updating Forge's own public counters.
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
forge metrics
|
|
16
|
+
forge metrics --apply
|
|
17
|
+
forge metrics --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`--apply` rewrites `forge_metrics.json`. This artifact is Forge-specific:
|
|
21
|
+
README badges, release automation, and Worker metadata read from it.
|
|
22
|
+
|
|
23
|
+
## Product repo metrics
|
|
24
|
+
|
|
25
|
+
Use the `repo` subcommand when updating any product repository's own public
|
|
26
|
+
surface.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
forge metrics repo --project /path/to/product
|
|
30
|
+
forge metrics repo --project /path/to/product --apply
|
|
31
|
+
forge metrics repo --project /path/to/product --json
|
|
32
|
+
forge metrics repo --project /path/to/product --init-config --apply
|
|
33
|
+
forge metrics repo --project /path/to/product --apply --commit --push
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The repo sync is intentionally separate from Forge metrics. It computes the
|
|
37
|
+
target repo's source files, source lines, test files, languages, name, and
|
|
38
|
+
version, then plans these bounded writes:
|
|
39
|
+
|
|
40
|
+
| File | Update |
|
|
41
|
+
|------|--------|
|
|
42
|
+
| `repo_metrics.json` | Canonical product metrics artifact |
|
|
43
|
+
| `README.md` | Metrics copy block between `<!-- forge:metrics:start -->` markers |
|
|
44
|
+
| `server.json` | MCP registry version and description, when present |
|
|
45
|
+
|
|
46
|
+
Dry-run is the default. Passing `--apply` writes the product surface and does
|
|
47
|
+
not mutate `forge_metrics.json`.
|
|
48
|
+
|
|
49
|
+
### Config and live external surfaces
|
|
50
|
+
|
|
51
|
+
Repos can opt into a custom metrics surface with
|
|
52
|
+
`.atomadic-forge/repo-metrics.config.json`:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"schema_version": "atomadic-forge.repo_metrics_config/v1",
|
|
57
|
+
"artifact_path": "public/metrics.json",
|
|
58
|
+
"document_globs": ["README.md", "docs/**/*.md", "website/**/*.mdx"],
|
|
59
|
+
"readme_block": true,
|
|
60
|
+
"sync_server_json": true,
|
|
61
|
+
"extra_metrics": {
|
|
62
|
+
"customer_count": 42
|
|
63
|
+
},
|
|
64
|
+
"aliases": {
|
|
65
|
+
"customers": "customer_count"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`artifact_path` is the JSON file your site or Worker can serve. For example,
|
|
71
|
+
set it to `public/metrics.json`, deploy that folder, and the website can fetch
|
|
72
|
+
the same live repo metrics as ordinary JSON.
|
|
73
|
+
|
|
74
|
+
Any configured document can contain inline metric markers:
|
|
75
|
+
|
|
76
|
+
```md
|
|
77
|
+
Source files: <!-- forge:metric key=source_file_count format=comma -->0<!-- /forge:metric -->
|
|
78
|
+
Customers: <!-- forge:metric customers -->0<!-- /forge:metric -->
|
|
79
|
+
Languages: <!-- forge:metric languages -->unknown<!-- /forge:metric -->
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
On `forge metrics repo --apply`, Forge scans the configured document globs,
|
|
83
|
+
updates every marker it finds, writes the metrics artifact, and leaves
|
|
84
|
+
unmarked prose alone. Supported marker formats are `plain`, `comma`,
|
|
85
|
+
`compact`, and `json`. Markers inside fenced code blocks are treated as
|
|
86
|
+
examples and are not updated.
|
|
87
|
+
|
|
88
|
+
For release automation, pass `--commit` to stage and commit only the files
|
|
89
|
+
Forge planned to write. Pass `--push` to commit if needed and push the current
|
|
90
|
+
branch after the metrics surface is refreshed.
|
|
91
|
+
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "atomadic-forge"
|
|
7
|
-
version = "0.75.
|
|
7
|
+
version = "0.75.3"
|
|
8
8
|
description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -12,6 +12,8 @@ import re
|
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
14
|
SCHEMA_VERSION_REPO_METRICS_V1 = "atomadic-forge.repo_metrics/v1"
|
|
15
|
+
SCHEMA_VERSION_REPO_METRICS_CONFIG_V1 = "atomadic-forge.repo_metrics_config/v1"
|
|
16
|
+
DEFAULT_REPO_METRICS_CONFIG_PATH = ".atomadic-forge/repo-metrics.config.json"
|
|
15
17
|
|
|
16
18
|
_SOURCE_EXTS = {
|
|
17
19
|
".py": "Python",
|
|
@@ -44,6 +46,32 @@ _SKIP_PARTS = {
|
|
|
44
46
|
_TEST_NAME_RE = re.compile(r"(^test_|_test\.|\.test\.|\.spec\.)")
|
|
45
47
|
_PYPROJECT_VERSION_RE = re.compile(r'(?m)^version\s*=\s*"([^"]+)"')
|
|
46
48
|
_PYPROJECT_NAME_RE = re.compile(r'(?m)^name\s*=\s*"([^"]+)"')
|
|
49
|
+
_METRIC_MARKER_RE = re.compile(
|
|
50
|
+
r"(?P<open><!--\s*forge:metric(?P<attrs>[^>]*)-->)"
|
|
51
|
+
r"(?P<body>.*?)"
|
|
52
|
+
r"(?P<close><!--\s*/forge:metric\s*-->)",
|
|
53
|
+
re.DOTALL,
|
|
54
|
+
)
|
|
55
|
+
_FENCED_CODE_RE = re.compile(r"(```.*?```)", re.DOTALL)
|
|
56
|
+
_ATTR_RE = re.compile(r"\b(?P<key>[a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*"
|
|
57
|
+
r"(?P<quote>['\"]?)(?P<value>[^'\"\s]+)(?P=quote)")
|
|
58
|
+
|
|
59
|
+
DEFAULT_REPO_METRICS_CONFIG: dict[str, Any] = {
|
|
60
|
+
"schema_version": SCHEMA_VERSION_REPO_METRICS_CONFIG_V1,
|
|
61
|
+
"artifact_path": "repo_metrics.json",
|
|
62
|
+
"document_globs": [
|
|
63
|
+
"README.md",
|
|
64
|
+
"docs/**/*.md",
|
|
65
|
+
"site/**/*.md",
|
|
66
|
+
"website/**/*.md",
|
|
67
|
+
"app/**/*.mdx",
|
|
68
|
+
"src/**/*.mdx",
|
|
69
|
+
],
|
|
70
|
+
"readme_block": True,
|
|
71
|
+
"sync_server_json": True,
|
|
72
|
+
"extra_metrics": {},
|
|
73
|
+
"aliases": {},
|
|
74
|
+
}
|
|
47
75
|
|
|
48
76
|
|
|
49
77
|
def should_skip_public_metric_path(path_parts: tuple[str, ...]) -> bool:
|
|
@@ -117,6 +145,40 @@ def compute_repo_public_metrics_from_records(
|
|
|
117
145
|
}
|
|
118
146
|
|
|
119
147
|
|
|
148
|
+
def normalize_repo_metrics_config(raw: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
149
|
+
"""Return a forward-compatible repo metrics config."""
|
|
150
|
+
config = dict(DEFAULT_REPO_METRICS_CONFIG)
|
|
151
|
+
incoming = raw or {}
|
|
152
|
+
for key, value in incoming.items():
|
|
153
|
+
if key in {"document_globs"} and isinstance(value, list):
|
|
154
|
+
config[key] = [str(item) for item in value if str(item).strip()]
|
|
155
|
+
elif key in {"readme_block", "sync_server_json"}:
|
|
156
|
+
config[key] = bool(value)
|
|
157
|
+
elif key in {"extra_metrics", "aliases"} and isinstance(value, dict):
|
|
158
|
+
config[key] = dict(value)
|
|
159
|
+
elif key == "artifact_path" and str(value).strip():
|
|
160
|
+
config[key] = str(value)
|
|
161
|
+
elif key == "schema_version":
|
|
162
|
+
config[key] = str(value)
|
|
163
|
+
if not config["document_globs"]:
|
|
164
|
+
config["document_globs"] = list(DEFAULT_REPO_METRICS_CONFIG["document_globs"])
|
|
165
|
+
return config
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def render_repo_metrics_config_json(config: dict[str, Any] | None = None) -> str:
|
|
169
|
+
"""Stable starter config for any repo using ``forge metrics repo``."""
|
|
170
|
+
return json.dumps(normalize_repo_metrics_config(config), indent=2, sort_keys=True) + "\n"
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def metrics_with_config(metrics: dict[str, Any], config: dict[str, Any]) -> dict[str, Any]:
|
|
174
|
+
"""Overlay configured customer metrics onto computed repo metrics."""
|
|
175
|
+
combined = dict(metrics)
|
|
176
|
+
extra = config.get("extra_metrics", {})
|
|
177
|
+
if isinstance(extra, dict):
|
|
178
|
+
combined.update(extra)
|
|
179
|
+
return combined
|
|
180
|
+
|
|
181
|
+
|
|
120
182
|
def render_repo_metrics_json(metrics: dict[str, Any]) -> str:
|
|
121
183
|
"""Stable JSON for ``repo_metrics.json``."""
|
|
122
184
|
return json.dumps(metrics, indent=2, sort_keys=True) + "\n"
|
|
@@ -160,6 +222,72 @@ def render_readme_with_metrics(readme_text: str, metrics: dict[str, Any]) -> str
|
|
|
160
222
|
return readme_text.rstrip() + "\n\n" + block
|
|
161
223
|
|
|
162
224
|
|
|
225
|
+
def _parse_marker_attrs(attrs: str) -> dict[str, str]:
|
|
226
|
+
parsed = {m.group("key"): m.group("value") for m in _ATTR_RE.finditer(attrs)}
|
|
227
|
+
if "key" not in parsed:
|
|
228
|
+
for token in attrs.strip().split():
|
|
229
|
+
if "=" not in token:
|
|
230
|
+
parsed["key"] = token.strip()
|
|
231
|
+
break
|
|
232
|
+
return parsed
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def _resolve_metric_value(metrics: dict[str, Any], aliases: dict[str, Any], key: str) -> Any:
|
|
236
|
+
target = aliases.get(key, key)
|
|
237
|
+
current: Any = metrics
|
|
238
|
+
for part in str(target).split("."):
|
|
239
|
+
if isinstance(current, dict) and part in current:
|
|
240
|
+
current = current[part]
|
|
241
|
+
else:
|
|
242
|
+
return None
|
|
243
|
+
return current
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def format_metric_value(value: Any, fmt: str = "plain") -> str:
|
|
247
|
+
"""Render a metric value for inline docs/site markers."""
|
|
248
|
+
if fmt == "json":
|
|
249
|
+
return json.dumps(value, sort_keys=True)
|
|
250
|
+
if isinstance(value, list):
|
|
251
|
+
value = ", ".join(str(item) for item in value)
|
|
252
|
+
if fmt == "comma" and isinstance(value, int):
|
|
253
|
+
return f"{value:,}"
|
|
254
|
+
if fmt == "compact" and isinstance(value, int):
|
|
255
|
+
if abs(value) >= 1_000_000:
|
|
256
|
+
return f"{value / 1_000_000:.1f}M".replace(".0M", "M")
|
|
257
|
+
if abs(value) >= 1_000:
|
|
258
|
+
return f"{value / 1_000:.0f}K"
|
|
259
|
+
return str(value)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def render_text_with_metric_markers(
|
|
263
|
+
text: str,
|
|
264
|
+
metrics: dict[str, Any],
|
|
265
|
+
config: dict[str, Any] | None = None,
|
|
266
|
+
) -> str:
|
|
267
|
+
"""Refresh inline ``forge:metric`` markers in arbitrary text."""
|
|
268
|
+
normalized = normalize_repo_metrics_config(config)
|
|
269
|
+
aliases = normalized.get("aliases", {})
|
|
270
|
+
if not isinstance(aliases, dict):
|
|
271
|
+
aliases = {}
|
|
272
|
+
|
|
273
|
+
def replace(match: re.Match[str]) -> str:
|
|
274
|
+
attrs = _parse_marker_attrs(match.group("attrs"))
|
|
275
|
+
key = attrs.get("key")
|
|
276
|
+
if not key:
|
|
277
|
+
return match.group(0)
|
|
278
|
+
value = _resolve_metric_value(metrics, aliases, key)
|
|
279
|
+
if value is None:
|
|
280
|
+
return match.group(0)
|
|
281
|
+
rendered = format_metric_value(value, attrs.get("format", "plain"))
|
|
282
|
+
return f"{match.group('open')}{rendered}{match.group('close')}"
|
|
283
|
+
|
|
284
|
+
parts = _FENCED_CODE_RE.split(text)
|
|
285
|
+
for idx, part in enumerate(parts):
|
|
286
|
+
if idx % 2 == 0:
|
|
287
|
+
parts[idx] = _METRIC_MARKER_RE.sub(replace, part)
|
|
288
|
+
return "".join(parts)
|
|
289
|
+
|
|
290
|
+
|
|
163
291
|
def render_server_json_with_metrics(server_text: str, metrics: dict[str, Any]) -> str:
|
|
164
292
|
"""Update MCP registry/server metadata from repo metrics."""
|
|
165
293
|
data = json.loads(server_text)
|
|
@@ -184,32 +312,53 @@ def plan_repo_public_surface_from_inputs(
|
|
|
184
312
|
metrics: dict[str, Any],
|
|
185
313
|
readme_text: str | None = None,
|
|
186
314
|
server_text: str | None = None,
|
|
315
|
+
documents: dict[str, str] | None = None,
|
|
316
|
+
config: dict[str, Any] | None = None,
|
|
187
317
|
) -> dict[str, Any]:
|
|
188
318
|
"""Return planned public-surface writes from already-loaded inputs."""
|
|
319
|
+
normalized = normalize_repo_metrics_config(config)
|
|
320
|
+
rendered_metrics = metrics_with_config(metrics, normalized)
|
|
189
321
|
writes: list[dict[str, str]] = [{
|
|
190
|
-
"path": "repo_metrics.json",
|
|
322
|
+
"path": str(normalized.get("artifact_path") or "repo_metrics.json"),
|
|
191
323
|
"reason": "canonical product metrics",
|
|
192
|
-
"content": render_repo_metrics_json(
|
|
324
|
+
"content": render_repo_metrics_json(rendered_metrics),
|
|
193
325
|
}]
|
|
194
|
-
|
|
326
|
+
document_texts = dict(documents or {})
|
|
327
|
+
if readme_text is not None and "README.md" not in document_texts:
|
|
328
|
+
document_texts["README.md"] = readme_text
|
|
329
|
+
for path, text in sorted(document_texts.items()):
|
|
330
|
+
if path == "README.md" and normalized.get("readme_block", True):
|
|
331
|
+
continue
|
|
332
|
+
updated = render_text_with_metric_markers(text, rendered_metrics, normalized)
|
|
333
|
+
if updated != text:
|
|
334
|
+
writes.append({
|
|
335
|
+
"path": path,
|
|
336
|
+
"reason": "Forge metric markers",
|
|
337
|
+
"content": updated,
|
|
338
|
+
})
|
|
339
|
+
if readme_text is not None and normalized.get("readme_block", True):
|
|
340
|
+
marked_readme = render_text_with_metric_markers(
|
|
341
|
+
readme_text, rendered_metrics, normalized
|
|
342
|
+
)
|
|
195
343
|
writes.append({
|
|
196
344
|
"path": "README.md",
|
|
197
345
|
"reason": "Forge-managed public metrics copy block",
|
|
198
|
-
"content": render_readme_with_metrics(
|
|
346
|
+
"content": render_readme_with_metrics(marked_readme, rendered_metrics),
|
|
199
347
|
})
|
|
200
|
-
if server_text is not None:
|
|
348
|
+
if server_text is not None and normalized.get("sync_server_json", True):
|
|
201
349
|
try:
|
|
202
350
|
writes.append({
|
|
203
351
|
"path": "server.json",
|
|
204
352
|
"reason": "MCP registry metadata version/description sync",
|
|
205
|
-
"content": render_server_json_with_metrics(server_text,
|
|
353
|
+
"content": render_server_json_with_metrics(server_text, rendered_metrics),
|
|
206
354
|
})
|
|
207
355
|
except json.JSONDecodeError:
|
|
208
356
|
pass
|
|
209
357
|
return {
|
|
210
358
|
"schema_version": "atomadic-forge.repo_public_surface_plan/v1",
|
|
211
359
|
"project_root": project_root,
|
|
212
|
-
"
|
|
360
|
+
"config": normalized,
|
|
361
|
+
"metrics": rendered_metrics,
|
|
213
362
|
"writes": writes,
|
|
214
363
|
"write_count": len(writes),
|
|
215
364
|
}
|
|
@@ -217,12 +366,19 @@ def plan_repo_public_surface_from_inputs(
|
|
|
217
366
|
|
|
218
367
|
__all__ = [
|
|
219
368
|
"SCHEMA_VERSION_REPO_METRICS_V1",
|
|
369
|
+
"SCHEMA_VERSION_REPO_METRICS_CONFIG_V1",
|
|
370
|
+
"DEFAULT_REPO_METRICS_CONFIG_PATH",
|
|
220
371
|
"compute_repo_public_metrics_from_records",
|
|
372
|
+
"format_metric_value",
|
|
221
373
|
"infer_project_identity_from_metadata",
|
|
374
|
+
"metrics_with_config",
|
|
375
|
+
"normalize_repo_metrics_config",
|
|
222
376
|
"plan_repo_public_surface_from_inputs",
|
|
223
377
|
"render_readme_metrics_block",
|
|
224
378
|
"render_readme_with_metrics",
|
|
379
|
+
"render_repo_metrics_config_json",
|
|
225
380
|
"render_repo_metrics_json",
|
|
226
381
|
"render_server_json_with_metrics",
|
|
382
|
+
"render_text_with_metric_markers",
|
|
227
383
|
"should_skip_public_metric_path",
|
|
228
384
|
]
|
|
@@ -6,13 +6,17 @@ metric computation/rendering to ``a1_at_functions/repo_public_surface.py``.
|
|
|
6
6
|
"""
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
+
import json
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
from typing import Any
|
|
11
12
|
|
|
12
13
|
from atomadic_forge.a1_at_functions.repo_public_surface import (
|
|
14
|
+
DEFAULT_REPO_METRICS_CONFIG_PATH,
|
|
13
15
|
compute_repo_public_metrics_from_records,
|
|
14
16
|
infer_project_identity_from_metadata,
|
|
17
|
+
normalize_repo_metrics_config,
|
|
15
18
|
plan_repo_public_surface_from_inputs,
|
|
19
|
+
render_repo_metrics_config_json,
|
|
16
20
|
should_skip_public_metric_path,
|
|
17
21
|
)
|
|
18
22
|
|
|
@@ -34,6 +38,38 @@ def _identity_for_root(root: Path) -> dict[str, str]:
|
|
|
34
38
|
)
|
|
35
39
|
|
|
36
40
|
|
|
41
|
+
def _safe_relative_path(path_text: str, fallback: str) -> str:
|
|
42
|
+
path = Path(path_text)
|
|
43
|
+
if path.is_absolute() or ".." in path.parts:
|
|
44
|
+
return fallback
|
|
45
|
+
return path.as_posix()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def load_repo_metrics_config(
|
|
49
|
+
project_root: Path | str,
|
|
50
|
+
config_path: Path | str | None = None,
|
|
51
|
+
) -> dict[str, Any]:
|
|
52
|
+
"""Load optional repo metrics config, falling back to defaults."""
|
|
53
|
+
root = Path(project_root).resolve()
|
|
54
|
+
path = Path(config_path) if config_path else root / DEFAULT_REPO_METRICS_CONFIG_PATH
|
|
55
|
+
if not path.is_absolute():
|
|
56
|
+
path = root / path
|
|
57
|
+
raw: dict[str, Any] = {}
|
|
58
|
+
if path.exists():
|
|
59
|
+
try:
|
|
60
|
+
loaded = json.loads(_read_text(path))
|
|
61
|
+
if isinstance(loaded, dict):
|
|
62
|
+
raw = loaded
|
|
63
|
+
except json.JSONDecodeError:
|
|
64
|
+
raw = {}
|
|
65
|
+
config = normalize_repo_metrics_config(raw)
|
|
66
|
+
config["artifact_path"] = _safe_relative_path(
|
|
67
|
+
str(config.get("artifact_path") or "repo_metrics.json"),
|
|
68
|
+
"repo_metrics.json",
|
|
69
|
+
)
|
|
70
|
+
return config
|
|
71
|
+
|
|
72
|
+
|
|
37
73
|
def compute_repo_public_metrics(project_root: Path | str) -> dict[str, Any]:
|
|
38
74
|
"""Compute product-facing metrics for any source repository."""
|
|
39
75
|
root = Path(project_root).resolve()
|
|
@@ -52,9 +88,31 @@ def compute_repo_public_metrics(project_root: Path | str) -> dict[str, Any]:
|
|
|
52
88
|
return compute_repo_public_metrics_from_records(_identity_for_root(root), records)
|
|
53
89
|
|
|
54
90
|
|
|
55
|
-
def
|
|
91
|
+
def _configured_documents(root: Path, config: dict[str, Any]) -> dict[str, str]:
|
|
92
|
+
documents: dict[str, str] = {}
|
|
93
|
+
for pattern in config.get("document_globs") or []:
|
|
94
|
+
pattern_text = str(pattern)
|
|
95
|
+
if not pattern_text or Path(pattern_text).is_absolute():
|
|
96
|
+
continue
|
|
97
|
+
for path in root.glob(pattern_text):
|
|
98
|
+
if not path.is_file():
|
|
99
|
+
continue
|
|
100
|
+
rel_path = path.relative_to(root)
|
|
101
|
+
if should_skip_public_metric_path(tuple(rel_path.parts)):
|
|
102
|
+
continue
|
|
103
|
+
if path.suffix.lower() not in {".md", ".mdx", ".html", ".htm"}:
|
|
104
|
+
continue
|
|
105
|
+
documents[rel_path.as_posix()] = _read_text(path)
|
|
106
|
+
return documents
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def plan_repo_public_surface_sync(
|
|
110
|
+
project_root: Path | str,
|
|
111
|
+
config_path: Path | str | None = None,
|
|
112
|
+
) -> dict[str, Any]:
|
|
56
113
|
"""Return planned public-surface writes for any product repo."""
|
|
57
114
|
root = Path(project_root).resolve()
|
|
115
|
+
config = load_repo_metrics_config(root, config_path=config_path)
|
|
58
116
|
readme = root / "README.md"
|
|
59
117
|
server = root / "server.json"
|
|
60
118
|
return plan_repo_public_surface_from_inputs(
|
|
@@ -62,10 +120,14 @@ def plan_repo_public_surface_sync(project_root: Path | str) -> dict[str, Any]:
|
|
|
62
120
|
metrics=compute_repo_public_metrics(root),
|
|
63
121
|
readme_text=_read_text(readme) if readme.exists() else None,
|
|
64
122
|
server_text=_read_text(server) if server.exists() else None,
|
|
123
|
+
documents=_configured_documents(root, config),
|
|
124
|
+
config=config,
|
|
65
125
|
)
|
|
66
126
|
|
|
67
127
|
|
|
68
128
|
__all__ = [
|
|
69
129
|
"compute_repo_public_metrics",
|
|
130
|
+
"load_repo_metrics_config",
|
|
70
131
|
"plan_repo_public_surface_sync",
|
|
132
|
+
"render_repo_metrics_config_json",
|
|
71
133
|
]
|
|
@@ -18,13 +18,16 @@ Usage::
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
20
|
import json
|
|
21
|
+
import subprocess
|
|
21
22
|
from pathlib import Path
|
|
22
23
|
from typing import Annotated
|
|
23
24
|
|
|
24
25
|
import typer
|
|
25
26
|
|
|
26
27
|
from atomadic_forge.a2_mo_composites.repo_public_surface_sync import (
|
|
28
|
+
DEFAULT_REPO_METRICS_CONFIG_PATH,
|
|
27
29
|
plan_repo_public_surface_sync,
|
|
30
|
+
render_repo_metrics_config_json,
|
|
28
31
|
)
|
|
29
32
|
from atomadic_forge.a3_og_features.forge_metrics_feature import emit_forge_metrics
|
|
30
33
|
|
|
@@ -140,6 +143,30 @@ def repo_cmd(
|
|
|
140
143
|
"--json",
|
|
141
144
|
help="Emit the plan as JSON.",
|
|
142
145
|
)] = False,
|
|
146
|
+
config: Annotated[Path | None, typer.Option(
|
|
147
|
+
"--config",
|
|
148
|
+
help="Optional repo metrics config JSON path.",
|
|
149
|
+
exists=False,
|
|
150
|
+
file_okay=True,
|
|
151
|
+
dir_okay=False,
|
|
152
|
+
resolve_path=False,
|
|
153
|
+
)] = None,
|
|
154
|
+
init_config: Annotated[bool, typer.Option(
|
|
155
|
+
"--init-config",
|
|
156
|
+
help="Create a starter .atomadic-forge/repo-metrics.config.json.",
|
|
157
|
+
)] = False,
|
|
158
|
+
commit: Annotated[bool, typer.Option(
|
|
159
|
+
"--commit",
|
|
160
|
+
help="After --apply, commit the repo metrics surface changes.",
|
|
161
|
+
)] = False,
|
|
162
|
+
push: Annotated[bool, typer.Option(
|
|
163
|
+
"--push",
|
|
164
|
+
help="After --apply, commit if needed and push the current branch.",
|
|
165
|
+
)] = False,
|
|
166
|
+
message: Annotated[str, typer.Option(
|
|
167
|
+
"--message",
|
|
168
|
+
help="Commit message used with --commit/--push.",
|
|
169
|
+
)] = "docs(metrics): sync repo public metrics",
|
|
143
170
|
) -> None:
|
|
144
171
|
"""Update a product repo's own public metrics and copy surface.
|
|
145
172
|
|
|
@@ -148,7 +175,29 @@ def repo_cmd(
|
|
|
148
175
|
README block between ``<!-- forge:metrics:start -->`` markers, and
|
|
149
176
|
syncs MCP ``server.json`` version/description when present.
|
|
150
177
|
"""
|
|
151
|
-
|
|
178
|
+
root = project.resolve()
|
|
179
|
+
if init_config:
|
|
180
|
+
target = config if config is not None else Path(DEFAULT_REPO_METRICS_CONFIG_PATH)
|
|
181
|
+
target_path = target if target.is_absolute() else root / target
|
|
182
|
+
content = render_repo_metrics_config_json()
|
|
183
|
+
if json_out:
|
|
184
|
+
typer.echo(json.dumps({
|
|
185
|
+
"schema_version": "atomadic-forge.repo_metrics_config_plan/v1",
|
|
186
|
+
"path": str(target_path),
|
|
187
|
+
"content": content,
|
|
188
|
+
"would_write": not apply,
|
|
189
|
+
}, indent=2, sort_keys=True))
|
|
190
|
+
return
|
|
191
|
+
if apply:
|
|
192
|
+
target_path.parent.mkdir(parents=True, exist_ok=True)
|
|
193
|
+
target_path.write_text(content, encoding="utf-8")
|
|
194
|
+
typer.echo(f"wrote {target_path}")
|
|
195
|
+
else:
|
|
196
|
+
typer.echo(f"would write {target_path}")
|
|
197
|
+
typer.echo("\n(dry-run; pass --apply to create the config)")
|
|
198
|
+
return
|
|
199
|
+
|
|
200
|
+
plan = plan_repo_public_surface_sync(root, config_path=config)
|
|
152
201
|
if json_out:
|
|
153
202
|
typer.echo(json.dumps(plan, indent=2, sort_keys=True))
|
|
154
203
|
return
|
|
@@ -167,12 +216,45 @@ def repo_cmd(
|
|
|
167
216
|
" languages : "
|
|
168
217
|
+ ", ".join(plan["metrics"].get("languages") or ["unknown"])
|
|
169
218
|
)
|
|
219
|
+
written_paths: list[str] = []
|
|
170
220
|
for write in plan["writes"]:
|
|
171
|
-
target =
|
|
221
|
+
target = (root / write["path"]).resolve()
|
|
222
|
+
try:
|
|
223
|
+
target.relative_to(root)
|
|
224
|
+
except ValueError:
|
|
225
|
+
typer.echo(f" skipped {write['path']} — outside project root", err=True)
|
|
226
|
+
continue
|
|
172
227
|
if apply:
|
|
228
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
173
229
|
target.write_text(write["content"], encoding="utf-8")
|
|
230
|
+
written_paths.append(write["path"])
|
|
174
231
|
typer.echo(f" wrote {write['path']} — {write['reason']}")
|
|
175
232
|
else:
|
|
176
233
|
typer.echo(f" would write {write['path']} — {write['reason']}")
|
|
177
234
|
if not apply:
|
|
178
235
|
typer.echo("\n(dry-run; pass --apply to update the product surface)")
|
|
236
|
+
return
|
|
237
|
+
if (commit or push) and written_paths:
|
|
238
|
+
subprocess.run(["git", "add", *written_paths], cwd=str(root), check=True)
|
|
239
|
+
diff = subprocess.run(
|
|
240
|
+
["git", "diff", "--cached", "--quiet"],
|
|
241
|
+
cwd=str(root),
|
|
242
|
+
)
|
|
243
|
+
if diff.returncode == 0:
|
|
244
|
+
typer.echo(" no metric changes to commit")
|
|
245
|
+
else:
|
|
246
|
+
subprocess.run(["git", "commit", "-m", message], cwd=str(root), check=True)
|
|
247
|
+
typer.echo(f" committed — {message}")
|
|
248
|
+
if push:
|
|
249
|
+
branch = subprocess.run(
|
|
250
|
+
["git", "branch", "--show-current"],
|
|
251
|
+
cwd=str(root),
|
|
252
|
+
capture_output=True,
|
|
253
|
+
text=True,
|
|
254
|
+
check=True,
|
|
255
|
+
).stdout.strip()
|
|
256
|
+
if not branch:
|
|
257
|
+
typer.echo(" push skipped — detached HEAD", err=True)
|
|
258
|
+
return
|
|
259
|
+
subprocess.run(["git", "push", "-u", "origin", branch], cwd=str(root), check=True)
|
|
260
|
+
typer.echo(f" pushed origin/{branch}")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.75.
|
|
3
|
+
Version: 0.75.3
|
|
4
4
|
Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
|
|
5
5
|
Author: Atomadic
|
|
6
6
|
License-Expression: BUSL-1.1
|