atomadic-forge 0.75.2__tar.gz → 0.76.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.75.2 → atomadic_forge-0.76.0}/CHANGELOG.md +15 -0
- {atomadic_forge-0.75.2/src/atomadic_forge.egg-info → atomadic_forge-0.76.0}/PKG-INFO +8 -8
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/README.md +7 -7
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/IDE_INTEGRATION.md +1 -1
- atomadic_forge-0.76.0/docs/commands/metrics.md +91 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/pyproject.toml +1 -1
- atomadic_forge-0.76.0/src/atomadic_forge/a1_at_functions/cosine_similarity.py +22 -0
- atomadic_forge-0.76.0/src/atomadic_forge/a1_at_functions/graft_extract.py +221 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +186 -1
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +163 -7
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +63 -1
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +31 -0
- atomadic_forge-0.76.0/src/atomadic_forge/a3_og_features/graft_feature.py +234 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +442 -0
- atomadic_forge-0.76.0/src/atomadic_forge/commands/graft.py +139 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/harvest.py +22 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/metrics.py +84 -2
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0/src/atomadic_forge.egg-info}/PKG-INFO +8 -8
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/SOURCES.txt +6 -0
- atomadic_forge-0.76.0/tests/test_graft_feature.py +150 -0
- atomadic_forge-0.76.0/tests/test_harvest_source_warnings.py +78 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/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.76.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/LICENSE +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/SECURITY.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/README.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/setup.cfg +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/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.76.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.75.2 → atomadic_forge-0.76.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.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/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.76.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/tests/test_wisdom.py +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.76.0 — 2026-05-08
|
|
6
|
+
|
|
7
|
+
- feat(forge): graft — surgical single-symbol cross-repo capability transfer
|
|
8
|
+
- fix(lint): clear 14 ruff violations blocking CI
|
|
9
|
+
- release: v0.75.3
|
|
10
|
+
- fix(forge): GAP-014 — harvest fail-loud on missing/empty sources
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v0.75.3 — 2026-05-08
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- d4b631b feat(metrics): sync tagged repo metrics surfaces (GP Lane C W6)
|
|
18
|
+
|
|
19
|
+
|
|
5
20
|
## v0.75.2 — 2026-05-08
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.76.0
|
|
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
|
|
@@ -176,11 +176,11 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
|
|
|
176
176
|
| `forge plan` | Bounded execution plan with risk + rollback |
|
|
177
177
|
| `forge chat` | Terminal copilot over forge docs |
|
|
178
178
|
|
|
179
|
-
**
|
|
179
|
+
**59 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
|
|
180
180
|
|
|
181
181
|
---
|
|
182
182
|
|
|
183
|
-
## MCP Server — 10 Tools,
|
|
183
|
+
## MCP Server — 10 Tools, 116 Actions
|
|
184
184
|
|
|
185
185
|
Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aider, Devin, or any MCP-compatible agent:
|
|
186
186
|
|
|
@@ -200,7 +200,7 @@ Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aide
|
|
|
200
200
|
| Tool | Actions | What it does |
|
|
201
201
|
|------|---------|-------------|
|
|
202
202
|
| `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, capability tour |
|
|
203
|
-
| `explore` |
|
|
203
|
+
| `explore` | 17 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
|
|
204
204
|
| `audit` | 23 | Quality gates, change safety, trust |
|
|
205
205
|
| `plan` | 10 | Orient + dev utilities — context/compose/policy/recipes/generate/apply/locate/commit/scaffold/steersman |
|
|
206
206
|
| `transmute` | 3 | **FLAGSHIP** spaghetti→certified pipeline — auto/cherry/finalize |
|
|
@@ -223,10 +223,10 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
223
223
|
| Metric | Value |
|
|
224
224
|
|--------|-------|
|
|
225
225
|
|
|
226
|
-
| MCP tools | **10 tools ·
|
|
227
|
-
| CLI verbs | **
|
|
228
|
-
| Source files | **
|
|
229
|
-
| Tests | **
|
|
226
|
+
| MCP tools | **10 tools · 116 actions** |
|
|
227
|
+
| CLI verbs | **59** |
|
|
228
|
+
| Source files | **232** (~47K LOC) |
|
|
229
|
+
| Tests | **1578 passing** across **114 test files** |
|
|
230
230
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
231
231
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
232
232
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
@@ -144,11 +144,11 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
|
|
|
144
144
|
| `forge plan` | Bounded execution plan with risk + rollback |
|
|
145
145
|
| `forge chat` | Terminal copilot over forge docs |
|
|
146
146
|
|
|
147
|
-
**
|
|
147
|
+
**59 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
151
|
-
## MCP Server — 10 Tools,
|
|
151
|
+
## MCP Server — 10 Tools, 116 Actions
|
|
152
152
|
|
|
153
153
|
Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aider, Devin, or any MCP-compatible agent:
|
|
154
154
|
|
|
@@ -168,7 +168,7 @@ Forge ships a Model Context Protocol server. Add it to Cursor, Claude Code, Aide
|
|
|
168
168
|
| Tool | Actions | What it does |
|
|
169
169
|
|------|---------|-------------|
|
|
170
170
|
| `welcome` | — | RECOMMENDED FIRST CALL: onboarding scan, score, narrative, capability tour |
|
|
171
|
-
| `explore` |
|
|
171
|
+
| `explore` | 17 | Analyze, understand, discover — recon/explain/call_graph/call_graph_summary/smell/lineage/harvest/synergy/scan/swarm/churn/surface_gaps/capability_scout/dead_code/maintainability/concept_bridge |
|
|
172
172
|
| `audit` | 23 | Quality gates, change safety, trust |
|
|
173
173
|
| `plan` | 10 | Orient + dev utilities — context/compose/policy/recipes/generate/apply/locate/commit/scaffold/steersman |
|
|
174
174
|
| `transmute` | 3 | **FLAGSHIP** spaghetti→certified pipeline — auto/cherry/finalize |
|
|
@@ -191,10 +191,10 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
191
191
|
| Metric | Value |
|
|
192
192
|
|--------|-------|
|
|
193
193
|
|
|
194
|
-
| MCP tools | **10 tools ·
|
|
195
|
-
| CLI verbs | **
|
|
196
|
-
| Source files | **
|
|
197
|
-
| Tests | **
|
|
194
|
+
| MCP tools | **10 tools · 116 actions** |
|
|
195
|
+
| CLI verbs | **59** |
|
|
196
|
+
| Source files | **232** (~47K LOC) |
|
|
197
|
+
| Tests | **1578 passing** across **114 test files** |
|
|
198
198
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
199
199
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
200
200
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
@@ -16,7 +16,7 @@ See `vscode-extension/README.md` for settings + usage.
|
|
|
16
16
|
|
|
17
17
|
## 2. MCP server (works with any MCP-aware assistant)
|
|
18
18
|
|
|
19
|
-
Forge ships a fully-typed MCP server with **10 tools dispatching
|
|
19
|
+
Forge ships a fully-typed MCP server with **10 tools dispatching 116 actions** spanning recon, wire, certify, plan, enforce, emergent, synergy, wisdom, lineage, hive coordination, and AAAA-Nexus trust gates. Any of these clients can attach:
|
|
20
20
|
|
|
21
21
|
- **Claude Code** (Anthropic CLI) — `claude mcp add atomadic-forge -- forge mcp serve --project ${workspaceFolder}`
|
|
22
22
|
- **Cursor** — Settings → MCP Servers → add the same command above
|
|
@@ -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.
|
|
7
|
+
version = "0.76.0"
|
|
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"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Grafted from search_symbols.py (lines 410–423) by `forge graft`."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import math
|
|
5
|
+
|
|
6
|
+
SCHEMA_VERSION_GRAFT_COSINE_SIMILARITY = "atomadic-forge.graft.cosine_similarity/v1"
|
|
7
|
+
|
|
8
|
+
def cosine_similarity(a: list[float], b: list[float]) -> float:
|
|
9
|
+
"""Cosine similarity in pure Python (no numpy).
|
|
10
|
+
|
|
11
|
+
Returns 0.0 if either vector is zero-length or the lists differ in size.
|
|
12
|
+
Uses ``math.sqrt`` and ``sum()`` — no external deps.
|
|
13
|
+
"""
|
|
14
|
+
if not a or not b or len(a) != len(b):
|
|
15
|
+
return 0.0
|
|
16
|
+
dot = sum(x * y for x, y in zip(a, b, strict=False))
|
|
17
|
+
norm_a = math.sqrt(sum(x * x for x in a))
|
|
18
|
+
norm_b = math.sqrt(sum(y * y for y in b))
|
|
19
|
+
if norm_a == 0.0 or norm_b == 0.0:
|
|
20
|
+
return 0.0
|
|
21
|
+
return dot / (norm_a * norm_b)
|
|
22
|
+
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"""Tier a1 — pure source-extraction helpers for ``forge graft``.
|
|
2
|
+
|
|
3
|
+
Given a Python source file and a top-level symbol name (function or class),
|
|
4
|
+
return the exact source slice for that symbol — with its docstring,
|
|
5
|
+
decorators, and trailing whitespace preserved. No imports, no deps,
|
|
6
|
+
no I/O beyond the input read. AST-based: deterministic and reproducible.
|
|
7
|
+
|
|
8
|
+
This is the read-only half of the graft pipeline. The write half lives
|
|
9
|
+
in a3 (``graft_feature``) so this module stays a pure-tier-1 helper.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import ast
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class GraftExtract:
|
|
20
|
+
"""One extracted symbol slice ready to drop into a target file.
|
|
21
|
+
|
|
22
|
+
* ``symbol_name`` — the bare top-level name (no qualifier dotting).
|
|
23
|
+
* ``kind`` — ``"function"`` (def) | ``"async_function"`` (async def) |
|
|
24
|
+
``"class"`` (class).
|
|
25
|
+
* ``source`` — the verbatim source slice, INCLUDING any preceding
|
|
26
|
+
decorators and the body. Ends with a trailing newline.
|
|
27
|
+
* ``imports_needed`` — the set of bare module names the symbol's body
|
|
28
|
+
references. Caller resolves these against the source file's import
|
|
29
|
+
table to build the new module's import block.
|
|
30
|
+
* ``start_line`` / ``end_line`` — 1-based line numbers in the source
|
|
31
|
+
file (for diagnostics and lineage).
|
|
32
|
+
"""
|
|
33
|
+
symbol_name: str
|
|
34
|
+
kind: str
|
|
35
|
+
source: str
|
|
36
|
+
imports_needed: frozenset[str]
|
|
37
|
+
start_line: int
|
|
38
|
+
end_line: int
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _walk_imports_used(node: ast.AST) -> set[str]:
|
|
42
|
+
"""Return the set of bare module names that the AST subtree references.
|
|
43
|
+
|
|
44
|
+
Recognizes ``ast.Name`` references (e.g. ``math.sqrt`` → ``math``) and
|
|
45
|
+
``ast.Attribute`` chains (e.g. ``math.pi`` → ``math``). The result is
|
|
46
|
+
a superset of "names that look like modules" — the caller is
|
|
47
|
+
responsible for filtering against the source file's actual imports.
|
|
48
|
+
"""
|
|
49
|
+
used: set[str] = set()
|
|
50
|
+
for sub in ast.walk(node):
|
|
51
|
+
if isinstance(sub, ast.Name):
|
|
52
|
+
used.add(sub.id)
|
|
53
|
+
elif isinstance(sub, ast.Attribute):
|
|
54
|
+
# Walk to the leftmost Name in the attribute chain.
|
|
55
|
+
cur: ast.AST = sub
|
|
56
|
+
while isinstance(cur, ast.Attribute):
|
|
57
|
+
cur = cur.value
|
|
58
|
+
if isinstance(cur, ast.Name):
|
|
59
|
+
used.add(cur.id)
|
|
60
|
+
return used
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _import_table(tree: ast.Module) -> dict[str, str]:
|
|
64
|
+
"""Build a mapping from bound name → "import statement source".
|
|
65
|
+
|
|
66
|
+
Records every ``import X`` and ``from Y import Z [as W]`` at module
|
|
67
|
+
level. The bound name is what shows up in code; the source is the
|
|
68
|
+
one-liner we'd emit verbatim into the new module. Aliased imports
|
|
69
|
+
(``import numpy as np``) bind ``np``, not ``numpy``.
|
|
70
|
+
"""
|
|
71
|
+
table: dict[str, str] = {}
|
|
72
|
+
for node in tree.body:
|
|
73
|
+
if isinstance(node, ast.Import):
|
|
74
|
+
for alias in node.names:
|
|
75
|
+
bound = alias.asname or alias.name.split(".")[0]
|
|
76
|
+
if alias.asname:
|
|
77
|
+
table[bound] = f"import {alias.name} as {alias.asname}"
|
|
78
|
+
else:
|
|
79
|
+
table[bound] = f"import {alias.name}"
|
|
80
|
+
elif isinstance(node, ast.ImportFrom):
|
|
81
|
+
module = node.module or ""
|
|
82
|
+
level = node.level or 0
|
|
83
|
+
prefix = "." * level + module if level or module else ""
|
|
84
|
+
for alias in node.names:
|
|
85
|
+
bound = alias.asname or alias.name
|
|
86
|
+
if alias.asname:
|
|
87
|
+
table[bound] = (
|
|
88
|
+
f"from {prefix} import {alias.name} as {alias.asname}"
|
|
89
|
+
)
|
|
90
|
+
else:
|
|
91
|
+
table[bound] = f"from {prefix} import {alias.name}"
|
|
92
|
+
return table
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def extract_symbol(source_file: Path, symbol_name: str) -> GraftExtract:
|
|
96
|
+
"""Extract a top-level function or class slice from ``source_file``.
|
|
97
|
+
|
|
98
|
+
Returns a :class:`GraftExtract` carrying the verbatim source plus the
|
|
99
|
+
set of stdlib/third-party imports the symbol's body references that
|
|
100
|
+
are bound at module scope in ``source_file``.
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
FileNotFoundError: ``source_file`` does not exist.
|
|
104
|
+
KeyError: no top-level symbol named ``symbol_name`` was
|
|
105
|
+
found in the AST. Mismatched casing or nested
|
|
106
|
+
definitions are not silently substituted.
|
|
107
|
+
SyntaxError: ``source_file`` does not parse as Python.
|
|
108
|
+
"""
|
|
109
|
+
src_path = Path(source_file)
|
|
110
|
+
if not src_path.is_file():
|
|
111
|
+
raise FileNotFoundError(f"graft source not found: {src_path}")
|
|
112
|
+
text = src_path.read_text(encoding="utf-8")
|
|
113
|
+
tree = ast.parse(text, filename=str(src_path))
|
|
114
|
+
lines = text.splitlines(keepends=True)
|
|
115
|
+
|
|
116
|
+
target = None
|
|
117
|
+
for node in tree.body:
|
|
118
|
+
if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef):
|
|
119
|
+
if node.name == symbol_name:
|
|
120
|
+
target = node
|
|
121
|
+
break
|
|
122
|
+
|
|
123
|
+
if target is None:
|
|
124
|
+
raise KeyError(
|
|
125
|
+
f"no top-level symbol named {symbol_name!r} in {src_path.name}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# AST start_lineno points at the `def`/`class` line. Decorators are
|
|
129
|
+
# stored separately; their source precedes the def by one line each.
|
|
130
|
+
if getattr(target, "decorator_list", None):
|
|
131
|
+
start = min(d.lineno for d in target.decorator_list)
|
|
132
|
+
else:
|
|
133
|
+
start = target.lineno
|
|
134
|
+
end = getattr(target, "end_lineno", start)
|
|
135
|
+
slice_lines = lines[start - 1 : end]
|
|
136
|
+
source = "".join(slice_lines)
|
|
137
|
+
if not source.endswith("\n"):
|
|
138
|
+
source = source + "\n"
|
|
139
|
+
|
|
140
|
+
# Resolve imports: walk the symbol body for names used, intersect with
|
|
141
|
+
# the source file's import table. Stdlib refs like ``math.sqrt`` come
|
|
142
|
+
# back as needing ``import math``.
|
|
143
|
+
used = _walk_imports_used(target)
|
|
144
|
+
table = _import_table(tree)
|
|
145
|
+
imports_needed = frozenset(name for name in used if name in table)
|
|
146
|
+
|
|
147
|
+
if isinstance(target, ast.AsyncFunctionDef):
|
|
148
|
+
kind = "async_function"
|
|
149
|
+
elif isinstance(target, ast.FunctionDef):
|
|
150
|
+
kind = "function"
|
|
151
|
+
else:
|
|
152
|
+
kind = "class"
|
|
153
|
+
|
|
154
|
+
return GraftExtract(
|
|
155
|
+
symbol_name=symbol_name,
|
|
156
|
+
kind=kind,
|
|
157
|
+
source=source,
|
|
158
|
+
imports_needed=imports_needed,
|
|
159
|
+
start_line=start,
|
|
160
|
+
end_line=end,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def render_grafted_module(
|
|
165
|
+
extract: GraftExtract,
|
|
166
|
+
*,
|
|
167
|
+
source_file: Path,
|
|
168
|
+
import_table: dict[str, str] | None = None,
|
|
169
|
+
docstring_prefix: str = "",
|
|
170
|
+
) -> str:
|
|
171
|
+
"""Render a stand-alone Python module that wraps the extracted symbol.
|
|
172
|
+
|
|
173
|
+
The output module:
|
|
174
|
+
* starts with a triple-quoted docstring describing the graft origin;
|
|
175
|
+
* imports only what the symbol body actually uses (resolved via
|
|
176
|
+
``import_table`` or a fresh scan of ``source_file``);
|
|
177
|
+
* embeds the extracted source slice verbatim.
|
|
178
|
+
|
|
179
|
+
The resulting text is ready to write to disk and pass through
|
|
180
|
+
``forge wire`` / ``forge certify`` without manual edits.
|
|
181
|
+
"""
|
|
182
|
+
if import_table is None:
|
|
183
|
+
text = Path(source_file).read_text(encoding="utf-8")
|
|
184
|
+
tree = ast.parse(text)
|
|
185
|
+
import_table = _import_table(tree)
|
|
186
|
+
|
|
187
|
+
needed_imports = sorted(
|
|
188
|
+
import_table[name]
|
|
189
|
+
for name in extract.imports_needed
|
|
190
|
+
if name in import_table
|
|
191
|
+
)
|
|
192
|
+
# Skip relative imports — they don't resolve in the new module.
|
|
193
|
+
needed_imports = [imp for imp in needed_imports
|
|
194
|
+
if not imp.startswith("from .")]
|
|
195
|
+
|
|
196
|
+
parts: list[str] = []
|
|
197
|
+
docstring_body = (
|
|
198
|
+
f'"""{docstring_prefix}Grafted from '
|
|
199
|
+
f'{Path(source_file).name} (lines '
|
|
200
|
+
f'{extract.start_line}–{extract.end_line}) by `forge graft`."""'
|
|
201
|
+
)
|
|
202
|
+
parts.append(docstring_body)
|
|
203
|
+
parts.append("from __future__ import annotations")
|
|
204
|
+
parts.append("")
|
|
205
|
+
if needed_imports:
|
|
206
|
+
parts.extend(needed_imports)
|
|
207
|
+
parts.append("")
|
|
208
|
+
# Surface-gap-discoverable: emit a SCHEMA_VERSION_GRAFT_<NAME>
|
|
209
|
+
# constant so the existing entry-point walker recognizes the grafted
|
|
210
|
+
# symbol as a wireable a1 function. Without this, auto-wire skips
|
|
211
|
+
# the graft because the heuristic only inspects modules carrying
|
|
212
|
+
# a structured-output contract marker.
|
|
213
|
+
upper_name = extract.symbol_name.upper().lstrip("_")
|
|
214
|
+
parts.append(
|
|
215
|
+
f'SCHEMA_VERSION_GRAFT_{upper_name} = '
|
|
216
|
+
f'"atomadic-forge.graft.{extract.symbol_name}/v1"'
|
|
217
|
+
)
|
|
218
|
+
parts.append("")
|
|
219
|
+
parts.append(extract.source.rstrip())
|
|
220
|
+
parts.append("") # trailing newline
|
|
221
|
+
return "\n".join(parts) + "\n"
|
{atomadic_forge-0.75.2 → atomadic_forge-0.76.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py
RENAMED
|
@@ -1397,6 +1397,150 @@ def _tool_doc_drift(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
|
1397
1397
|
return detect_doc_drift(root)
|
|
1398
1398
|
|
|
1399
1399
|
|
|
1400
|
+
|
|
1401
|
+
def _tool_agent_plan(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1402
|
+
"""Auto-generated MCP handler for agent_plan_emitter.emit_agent_plan."""
|
|
1403
|
+
from .agent_plan_emitter import emit_agent_plan
|
|
1404
|
+
return emit_agent_plan(args)
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
def _tool_ast_scope_blueprint(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1408
|
+
"""Auto-generated MCP handler for ast_scope_lock.build_ast_scope_blueprint."""
|
|
1409
|
+
from .ast_scope_lock import build_ast_scope_blueprint
|
|
1410
|
+
return build_ast_scope_blueprint(args)
|
|
1411
|
+
|
|
1412
|
+
|
|
1413
|
+
def _tool_mint_ast_locks(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1414
|
+
"""Auto-generated MCP handler for ast_scope_lock.mint_ast_locks."""
|
|
1415
|
+
from .ast_scope_lock import mint_ast_locks
|
|
1416
|
+
blueprint = str(args.get('blueprint', ''))
|
|
1417
|
+
return mint_ast_locks(blueprint=blueprint)
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
def _tool_add_node(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1421
|
+
"""Auto-generated MCP handler for ast_scope_lock.add_node."""
|
|
1422
|
+
from .ast_scope_lock import add_node
|
|
1423
|
+
node = args.get('node')
|
|
1424
|
+
return add_node(node=node)
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
def _tool_class_signals(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1428
|
+
"""Auto-generated MCP handler for body_extractor.detect_class_signals."""
|
|
1429
|
+
from .body_extractor import detect_class_signals
|
|
1430
|
+
target = args.get('target')
|
|
1431
|
+
return detect_class_signals(target=target)
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
def _tool_body(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1435
|
+
"""Auto-generated MCP handler for body_extractor.extract_body."""
|
|
1436
|
+
from .body_extractor import extract_body
|
|
1437
|
+
source_path = str(args.get('source_path', ''))
|
|
1438
|
+
symbol_name = str(args.get('symbol_name', ''))
|
|
1439
|
+
language = str(args.get('language', ''))
|
|
1440
|
+
return extract_body(source_path=source_path, symbol_name=symbol_name, language=language)
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
def _tool_documentation(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1444
|
+
"""Auto-generated MCP handler for certify_checks.check_documentation."""
|
|
1445
|
+
from .certify_checks import check_documentation
|
|
1446
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1447
|
+
return check_documentation(root)
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
def _tool_tests_present(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1451
|
+
"""Auto-generated MCP handler for certify_checks.check_tests_present."""
|
|
1452
|
+
from .certify_checks import check_tests_present
|
|
1453
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1454
|
+
return check_tests_present(root)
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
def _tool_count_untiered_source_files(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1458
|
+
"""Auto-generated MCP handler for certify_checks.count_untiered_source_files."""
|
|
1459
|
+
from .certify_checks import count_untiered_source_files
|
|
1460
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1461
|
+
return count_untiered_source_files(root)
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
def _tool_tier_layout(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1465
|
+
"""Auto-generated MCP handler for certify_checks.check_tier_layout."""
|
|
1466
|
+
from .certify_checks import check_tier_layout
|
|
1467
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1468
|
+
package = str(args.get('package', ''))
|
|
1469
|
+
return check_tier_layout(root, package=package)
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
def _tool_no_upward_imports(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1473
|
+
"""Auto-generated MCP handler for certify_checks.check_no_upward_imports."""
|
|
1474
|
+
from .certify_checks import check_no_upward_imports
|
|
1475
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1476
|
+
package = str(args.get('package', ''))
|
|
1477
|
+
return check_no_upward_imports(root, package=package)
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
def _tool_ci_workflow(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1481
|
+
"""Auto-generated MCP handler for certify_checks.check_ci_workflow."""
|
|
1482
|
+
from .certify_checks import check_ci_workflow
|
|
1483
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1484
|
+
return check_ci_workflow(root)
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
def _tool_changelog(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1488
|
+
"""Auto-generated MCP handler for certify_checks.check_changelog."""
|
|
1489
|
+
from .certify_checks import check_changelog
|
|
1490
|
+
root = Path(args.get('project_root', project_root)).resolve()
|
|
1491
|
+
return check_changelog(root)
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
def _tool_chat_context(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1495
|
+
"""Auto-generated MCP handler for chat_context.build_chat_context."""
|
|
1496
|
+
from .chat_context import build_chat_context
|
|
1497
|
+
paths = list(args.get('paths', []))
|
|
1498
|
+
return build_chat_context(paths=paths)
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
def _tool_effects(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1502
|
+
"""Auto-generated MCP handler for classify_tier.detect_effects."""
|
|
1503
|
+
from .classify_tier import detect_effects
|
|
1504
|
+
node = args.get('node')
|
|
1505
|
+
return detect_effects(node=node)
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
def _tool_compliance(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1509
|
+
"""Auto-generated MCP handler for compliance_checker.check_compliance."""
|
|
1510
|
+
from .compliance_checker import check_compliance
|
|
1511
|
+
receipt = args.get('receipt')
|
|
1512
|
+
return check_compliance(receipt=receipt)
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
def _tool_compliance_framework(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1516
|
+
"""Auto-generated MCP handler for compliance_checker.check_compliance_framework."""
|
|
1517
|
+
from .compliance_checker import check_compliance_framework
|
|
1518
|
+
receipt = args.get('receipt')
|
|
1519
|
+
framework = str(args.get('framework', ''))
|
|
1520
|
+
return check_compliance_framework(receipt=receipt, framework=framework)
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
def _tool_cosine_similarity(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1524
|
+
"""Auto-generated MCP handler for cosine_similarity.cosine_similarity."""
|
|
1525
|
+
from .cosine_similarity import cosine_similarity
|
|
1526
|
+
a = list(args.get('a', []))
|
|
1527
|
+
b = list(args.get('b', []))
|
|
1528
|
+
return cosine_similarity(a=a, b=b)
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
def _tool_update_readme(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1532
|
+
"""Auto-generated MCP handler for doc_auto_update.update_readme."""
|
|
1533
|
+
from .doc_auto_update import update_readme
|
|
1534
|
+
project_root = Path(args.get('project_root', project_root)).resolve()
|
|
1535
|
+
return update_readme(project_root)
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
def _tool_update_extended_docs(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1539
|
+
"""Auto-generated MCP handler for doc_auto_update.update_extended_docs."""
|
|
1540
|
+
from .doc_auto_update import update_extended_docs
|
|
1541
|
+
project_root = Path(args.get('project_root', project_root)).resolve()
|
|
1542
|
+
return update_extended_docs(project_root)
|
|
1543
|
+
|
|
1400
1544
|
def _tool_smell_scan(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
1401
1545
|
"""Run code-smell detection (cyclomatic complexity + long functions
|
|
1402
1546
|
+ duplicated bodies). Pure: composes the a1 ``smell_scan`` walker."""
|
|
@@ -2418,6 +2562,46 @@ def _tool_explore(project_root: Path, args: dict[str, Any]) -> dict[str, Any]:
|
|
|
2418
2562
|
return _tool_dead_code(project_root, inner)
|
|
2419
2563
|
elif action == "maintainability":
|
|
2420
2564
|
return _tool_maintainability(project_root, inner)
|
|
2565
|
+
elif action == "agent_plan":
|
|
2566
|
+
return _tool_agent_plan(project_root, inner)
|
|
2567
|
+
elif action == "ast_scope_blueprint":
|
|
2568
|
+
return _tool_ast_scope_blueprint(project_root, inner)
|
|
2569
|
+
elif action == "mint_ast_locks":
|
|
2570
|
+
return _tool_mint_ast_locks(project_root, inner)
|
|
2571
|
+
elif action == "add_node":
|
|
2572
|
+
return _tool_add_node(project_root, inner)
|
|
2573
|
+
elif action == "class_signals":
|
|
2574
|
+
return _tool_class_signals(project_root, inner)
|
|
2575
|
+
elif action == "body":
|
|
2576
|
+
return _tool_body(project_root, inner)
|
|
2577
|
+
elif action == "documentation":
|
|
2578
|
+
return _tool_documentation(project_root, inner)
|
|
2579
|
+
elif action == "tests_present":
|
|
2580
|
+
return _tool_tests_present(project_root, inner)
|
|
2581
|
+
elif action == "count_untiered_source_files":
|
|
2582
|
+
return _tool_count_untiered_source_files(project_root, inner)
|
|
2583
|
+
elif action == "tier_layout":
|
|
2584
|
+
return _tool_tier_layout(project_root, inner)
|
|
2585
|
+
elif action == "no_upward_imports":
|
|
2586
|
+
return _tool_no_upward_imports(project_root, inner)
|
|
2587
|
+
elif action == "ci_workflow":
|
|
2588
|
+
return _tool_ci_workflow(project_root, inner)
|
|
2589
|
+
elif action == "changelog":
|
|
2590
|
+
return _tool_changelog(project_root, inner)
|
|
2591
|
+
elif action == "chat_context":
|
|
2592
|
+
return _tool_chat_context(project_root, inner)
|
|
2593
|
+
elif action == "effects":
|
|
2594
|
+
return _tool_effects(project_root, inner)
|
|
2595
|
+
elif action == "compliance":
|
|
2596
|
+
return _tool_compliance(project_root, inner)
|
|
2597
|
+
elif action == "compliance_framework":
|
|
2598
|
+
return _tool_compliance_framework(project_root, inner)
|
|
2599
|
+
elif action == "cosine_similarity":
|
|
2600
|
+
return _tool_cosine_similarity(project_root, inner)
|
|
2601
|
+
elif action == "update_readme":
|
|
2602
|
+
return _tool_update_readme(project_root, inner)
|
|
2603
|
+
elif action == "update_extended_docs":
|
|
2604
|
+
return _tool_update_extended_docs(project_root, inner)
|
|
2421
2605
|
elif action == "concept_bridge":
|
|
2422
2606
|
return _tool_concept_bridge(project_root, inner)
|
|
2423
2607
|
elif action == "lineage":
|
|
@@ -2698,7 +2882,8 @@ TOOLS: dict[str, dict[str, Any]] = {
|
|
|
2698
2882
|
"enum": ["recon", "explain", "call_graph", "call_graph_summary",
|
|
2699
2883
|
"smell_scan", "churn", "surface_gaps", "capability_scout",
|
|
2700
2884
|
"dead_code", "maintainability", "concept_bridge",
|
|
2701
|
-
"lineage", "harvest", "synergy", "scan", "swarm"
|
|
2885
|
+
"lineage", "harvest", "synergy", "scan", "swarm",
|
|
2886
|
+
"agent_plan"],
|
|
2702
2887
|
"default": "recon",
|
|
2703
2888
|
"description": (
|
|
2704
2889
|
"'recon' — tier map; 'explain' — narrative; "
|