atomadic-forge 0.76.0__tar.gz → 0.77.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.76.0 → atomadic_forge-0.77.0}/CHANGELOG.md +6 -0
- {atomadic_forge-0.76.0/src/atomadic_forge.egg-info → atomadic_forge-0.77.0}/PKG-INFO +2 -2
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/README.md +1 -1
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/CI_CD.md +3 -3
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/COMMANDS.md +1 -1
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/FORMALIZATION.md +2 -2
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/MCP_TOOLS.md +2 -2
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/RECEIPT.md +2 -2
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/pyproject.toml +1 -1
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +27 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +199 -7
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0/src/atomadic_forge.egg-info}/PKG-INFO +2 -2
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge.egg-info/SOURCES.txt +1 -0
- atomadic_forge-0.77.0/tests/test_cherry_dedup_class_methods.py +80 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_doc_auto_update.py +103 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/LICENSE +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/SECURITY.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/README.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/setup.cfg +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.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.76.0 → atomadic_forge-0.77.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.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/graft.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_graft_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_harvest_source_warnings.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_repo_public_surface.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/tests/test_wisdom.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.77.0 — 2026-05-08
|
|
6
|
+
|
|
7
|
+
- fix(forge): cherry-pick — collapse Class.method explosion (root-cause)
|
|
8
|
+
- feat(doc-update): auto-update 6 previously missed doc files on release
|
|
9
|
+
|
|
10
|
+
|
|
5
11
|
## v0.76.0 — 2026-05-08
|
|
6
12
|
|
|
7
13
|
- feat(forge): graft — surgical single-symbol cross-repo capability transfer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.77.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
|
|
@@ -226,7 +226,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
226
226
|
| MCP tools | **10 tools · 116 actions** |
|
|
227
227
|
| CLI verbs | **59** |
|
|
228
228
|
| Source files | **232** (~47K LOC) |
|
|
229
|
-
| Tests | **
|
|
229
|
+
| Tests | **1588 passing** across **115 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 |
|
|
@@ -194,7 +194,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
194
194
|
| MCP tools | **10 tools · 116 actions** |
|
|
195
195
|
| CLI verbs | **59** |
|
|
196
196
|
| Source files | **232** (~47K LOC) |
|
|
197
|
-
| Tests | **
|
|
197
|
+
| Tests | **1588 passing** across **115 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 |
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
run: |
|
|
47
47
|
pip install atomadic-forge # PyPI (preferred)
|
|
48
48
|
# Or pin to an exact tag:
|
|
49
|
-
# pip install "git+https://github.com/atomadictech/atomadic-forge@v0.
|
|
49
|
+
# pip install "git+https://github.com/atomadictech/atomadic-forge@v0.77.0"
|
|
50
50
|
# Or vendor wheels: pip install --no-index --find-links wheels/ atomadic-forge
|
|
51
51
|
|
|
52
52
|
- name: Wire scan (upward-import discipline)
|
|
@@ -97,7 +97,7 @@ forge-certify:
|
|
|
97
97
|
image: python:3.11-slim
|
|
98
98
|
timeout: 10 minutes
|
|
99
99
|
before_script:
|
|
100
|
-
- pip install "git+https://github.com/atomadictech/atomadic-forge@v0.
|
|
100
|
+
- pip install "git+https://github.com/atomadictech/atomadic-forge@v0.77.0"
|
|
101
101
|
script:
|
|
102
102
|
- forge wire src/your_package --fail-on-violations --json > wire.json
|
|
103
103
|
- forge certify . --package your_package --fail-under 75 --json > certify.json
|
|
@@ -156,7 +156,7 @@ Then in **the consuming repo's** `.pre-commit-config.yaml`:
|
|
|
156
156
|
```yaml
|
|
157
157
|
repos:
|
|
158
158
|
- repo: https://github.com/atomadictech/atomadic-forge
|
|
159
|
-
rev: v0.
|
|
159
|
+
rev: v0.77.0
|
|
160
160
|
hooks:
|
|
161
161
|
- id: forge-wire
|
|
162
162
|
- id: forge-certify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Atomadic Forge — Command Reference
|
|
2
2
|
|
|
3
|
-
All verbs available in the `forge` CLI as of 0.
|
|
3
|
+
All verbs available in the `forge` CLI as of 0.77.0
|
|
4
4
|
|
|
5
5
|
> For the structured per-verb reference (with options, examples, and
|
|
6
6
|
> output samples), see [02-commands.md](02-commands.md). This page is
|
|
@@ -39,7 +39,7 @@ Forge certify scores out of **100** in two layers:
|
|
|
39
39
|
JS / TS packages cap at **60/100** today: they earn the four
|
|
40
40
|
structural axes, but the +25 runtime-import smoke and +30 behavioural
|
|
41
41
|
pytest are Python-only. Wiring `npm test` / Vitest into the
|
|
42
|
-
behavioural axis is on the post-v0.
|
|
42
|
+
behavioural axis is on the post-v0.77.0 roadmap.
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
@@ -131,7 +131,7 @@ runtime dependency makes the package unusable.
|
|
|
131
131
|
|
|
132
132
|
**Why JS/TS does not get this gate yet.** AAM §5.4 (Threats to
|
|
133
133
|
Validity) explicitly flags polyglot runtime gating as a roadmap
|
|
134
|
-
item (post-v0.
|
|
134
|
+
item (post-v0.77.0): the equivalent for JS would be an `npm test`
|
|
135
135
|
invocation, which requires a Node toolchain we do not yet bundle.
|
|
136
136
|
|
|
137
137
|
**Citation.** AAM §5.1 (Core Pipeline Pseudocode); AAM §5.4 (Threats
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Forge MCP Tools Reference
|
|
2
2
|
|
|
3
|
-
Forge ships a Model Context Protocol server exposing **10 tools dispatching
|
|
3
|
+
Forge ships a Model Context Protocol server exposing **10 tools dispatching 116 registry-callable actions**. Counts are auto-synced from `forge_metrics.json` by `doc-update`.
|
|
4
4
|
The per-tool table below lists the primary dispatch actions; the headline total also includes compatibility routes that keep older callers working.
|
|
5
5
|
All legacy tool names redirect automatically — existing callers keep working.
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@ All legacy tool names redirect automatically — existing callers keep working.
|
|
|
17
17
|
| Tool | Actions | Purpose |
|
|
18
18
|
|------|---------|---------|
|
|
19
19
|
| [`welcome`](#welcome) | — | Session onboarding: scan, score, narrative, capability tour |
|
|
20
|
-
| [`explore`](#explore) |
|
|
20
|
+
| [`explore`](#explore) | 17 | Analyze and understand a codebase — recon, call graphs, smells, harvest, discovery |
|
|
21
21
|
| [`audit`](#audit) | 23 | Quality gates, change safety, trust verification |
|
|
22
22
|
| [`plan`](#plan) | 10 | Dev orientation and utilities — context packs, recipes, commit messages, steersman packs |
|
|
23
23
|
| [`transmute`](#transmute) | 3 | **FLAGSHIP** spaghetti-to-certified pipeline |
|
|
@@ -30,7 +30,7 @@ referenced from the Receipt.
|
|
|
30
30
|
{
|
|
31
31
|
"schema_version": "atomadic-forge.receipt/v1",
|
|
32
32
|
"generated_at_utc": "2026-04-28T17:42:11Z",
|
|
33
|
-
"forge_version": "0.
|
|
33
|
+
"forge_version": "0.77.0",
|
|
34
34
|
"verdict": "PASS",
|
|
35
35
|
"project": { ... },
|
|
36
36
|
"certify": { ... },
|
|
@@ -108,7 +108,7 @@ cited:
|
|
|
108
108
|
{
|
|
109
109
|
"schema_version": "atomadic-forge.receipt/v1",
|
|
110
110
|
"generated_at_utc": "2026-04-28T17:42:11Z",
|
|
111
|
-
"forge_version": "0.
|
|
111
|
+
"forge_version": "0.77.0",
|
|
112
112
|
"verdict": "PASS",
|
|
113
113
|
|
|
114
114
|
"project": {
|
|
@@ -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.77.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"
|
{atomadic_forge-0.76.0 → atomadic_forge-0.77.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py
RENAMED
|
@@ -62,6 +62,7 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
|
|
|
62
62
|
"confidence": _confidence_of(s),
|
|
63
63
|
"reasons": _reasons_for(s),
|
|
64
64
|
})
|
|
65
|
+
items = _dedup_methods_under_class(items)
|
|
65
66
|
return {
|
|
66
67
|
"schema_version": "atomadic-forge.cherry/v1",
|
|
67
68
|
"source_repo": scout_report.get("repo", ""),
|
|
@@ -69,6 +70,32 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
|
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
|
|
73
|
+
def _dedup_methods_under_class(items: list[dict]) -> list[dict]:
|
|
74
|
+
"""Collapse ``Class.method`` items when ``Class`` is already selected.
|
|
75
|
+
|
|
76
|
+
The 47-file class explosion fix: scout enumerates a class plus every
|
|
77
|
+
public method as separate symbols (``IndexStore`` and
|
|
78
|
+
``IndexStore.add``, ``IndexStore.search``, ...). Without this filter,
|
|
79
|
+
finalize copies the same source file once per qualname under
|
|
80
|
+
different slugs, exploding a single class into N near-identical files.
|
|
81
|
+
|
|
82
|
+
When the parent class is in the manifest, we drop its methods —
|
|
83
|
+
they ride along inside the class body. When the parent is absent
|
|
84
|
+
(rare; scout dropped it), we keep the methods so capability isn't
|
|
85
|
+
lost.
|
|
86
|
+
"""
|
|
87
|
+
class_quals = {it["qualname"] for it in items if "." not in it["qualname"]}
|
|
88
|
+
out: list[dict] = []
|
|
89
|
+
for it in items:
|
|
90
|
+
qual = it["qualname"]
|
|
91
|
+
if "." in qual:
|
|
92
|
+
parent = qual.rsplit(".", 1)[0]
|
|
93
|
+
if parent in class_quals:
|
|
94
|
+
continue
|
|
95
|
+
out.append(it)
|
|
96
|
+
return out
|
|
97
|
+
|
|
98
|
+
|
|
72
99
|
def _confidence_of(symbol: dict) -> float:
|
|
73
100
|
# High confidence when name tokens drove the decision; lower when we fell
|
|
74
101
|
# back to the kind-default (function→a1, class→a2). Cheap proxy: complexity
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Zero LLM tokens. Reads forge_metrics.json, inspects MCP enum lists and CLI
|
|
4
4
|
command decorators, then rewrites bounded sections in README.md, CHANGELOG.md,
|
|
5
|
-
docs/IDE_INTEGRATION.md, WHITEPAPER.md,
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
docs/IDE_INTEGRATION.md, WHITEPAPER.md, docs/AGENTS_GUIDE.md,
|
|
6
|
+
tests/README.md, docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
|
|
7
|
+
docs/FORMALIZATION.md, and docs/MCP_TOOLS.md programmatically. Every value
|
|
8
|
+
is derived from live code or the metrics artifact — no human-authored prose
|
|
9
|
+
is touched.
|
|
8
10
|
|
|
9
11
|
Updateable sections
|
|
10
12
|
-------------------
|
|
@@ -29,6 +31,26 @@ WHITEPAPER.md
|
|
|
29
31
|
docs/AGENTS_GUIDE.md
|
|
30
32
|
• Summary table rows matching ``| explore | NN actions |`` pattern (if present).
|
|
31
33
|
|
|
34
|
+
tests/README.md
|
|
35
|
+
• "NN test files covering N,NNN passing tests" line.
|
|
36
|
+
|
|
37
|
+
docs/CI_CD.md
|
|
38
|
+
• Git-pinned install URLs ``atomadic-forge@vX.Y.Z`` → current version.
|
|
39
|
+
• Pre-commit ``rev: vX.Y.Z`` pin → current version.
|
|
40
|
+
|
|
41
|
+
docs/COMMANDS.md
|
|
42
|
+
• "as of X.Y.Z" version anchor in header.
|
|
43
|
+
|
|
44
|
+
docs/RECEIPT.md
|
|
45
|
+
• ``"forge_version": "X.Y.Z"`` in example JSON payloads.
|
|
46
|
+
|
|
47
|
+
docs/FORMALIZATION.md
|
|
48
|
+
• ``post-vX.Y.Z`` roadmap anchors.
|
|
49
|
+
|
|
50
|
+
docs/MCP_TOOLS.md
|
|
51
|
+
• Header line ``NN tools dispatching NN registry-callable actions``.
|
|
52
|
+
• Per-tool action counts in the summary table.
|
|
53
|
+
|
|
32
54
|
Pure: no subprocess unless git is requested. No writes when dry_run=True.
|
|
33
55
|
"""
|
|
34
56
|
from __future__ import annotations
|
|
@@ -78,6 +100,33 @@ _DRIFT_TOOLS_RE = re.compile(r'(\d+)\s+MCP\s+tools')
|
|
|
78
100
|
_DRIFT_ACTIONS_RE = re.compile(r'dispatching\s+(\d+)\s+actions')
|
|
79
101
|
_DRIFT_TESTS_RE = re.compile(r'([\d,]+)\s+passing\s+tests')
|
|
80
102
|
|
|
103
|
+
# ── version-anchor regexes (update_version_anchors) ───────────────────────────
|
|
104
|
+
# tests/README.md: "NN test files covering N,NNN passing tests"
|
|
105
|
+
_TESTS_README_RE = re.compile(r'\d+ test files covering [\d,]+ passing tests')
|
|
106
|
+
|
|
107
|
+
# docs/CI_CD.md: git-pinned install URL and pre-commit rev pin
|
|
108
|
+
_CICD_GIT_URL_RE = re.compile(r'(atomadic-forge@)v[\d.]+')
|
|
109
|
+
_CICD_REV_RE = re.compile(r'(rev:\s*)v[\d.]+')
|
|
110
|
+
|
|
111
|
+
# docs/COMMANDS.md: "as of X.Y.Z" header anchor
|
|
112
|
+
_COMMANDS_VER_RE = re.compile(r'(as of )[\d.]+')
|
|
113
|
+
|
|
114
|
+
# docs/RECEIPT.md: forge_version in example JSON blocks (both occurrences)
|
|
115
|
+
_RECEIPT_VER_RE = re.compile(r'("forge_version":\s*")[\d.]+(")')
|
|
116
|
+
|
|
117
|
+
# docs/FORMALIZATION.md: "post-vX.Y.Z" roadmap anchors
|
|
118
|
+
_FORMALIZATION_POST_VER_RE = re.compile(r'post-v[\d.]+')
|
|
119
|
+
|
|
120
|
+
# docs/MCP_TOOLS.md: header count line
|
|
121
|
+
_MCP_TOOLS_HEADER_RE = re.compile(
|
|
122
|
+
r'\d+ tools dispatching \d+ registry-callable actions'
|
|
123
|
+
)
|
|
124
|
+
# docs/MCP_TOOLS.md: per-tool summary table rows
|
|
125
|
+
# Matches: | [`toolname`](#anchor) | NN | description |
|
|
126
|
+
_MCP_TOOLS_ROW_RE = re.compile(
|
|
127
|
+
r'(\|\s*\[`(?P<tool>[^`]+)`\]\(#[^)]+\)\s*\|\s*)(?P<count>\d+)(\s*\|)'
|
|
128
|
+
)
|
|
129
|
+
|
|
81
130
|
|
|
82
131
|
# ── helpers ───────────────────────────────────────────────────────────────────
|
|
83
132
|
|
|
@@ -602,12 +651,146 @@ def detect_doc_drift(project_root: Path) -> dict[str, Any]:
|
|
|
602
651
|
}
|
|
603
652
|
|
|
604
653
|
|
|
654
|
+
# ── version-anchor updater ────────────────────────────────────────────────────
|
|
655
|
+
|
|
656
|
+
def update_version_anchors(
|
|
657
|
+
project_root: Path,
|
|
658
|
+
*,
|
|
659
|
+
dry_run: bool = False,
|
|
660
|
+
) -> dict[str, Any]:
|
|
661
|
+
"""Rewrite version-pinned strings in docs that drift on every release.
|
|
662
|
+
|
|
663
|
+
Covers tests/README.md, docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
|
|
664
|
+
docs/FORMALIZATION.md, and docs/MCP_TOOLS.md. Each pattern is keyed to
|
|
665
|
+
live forge_metrics.json so no version string needs manual updating.
|
|
666
|
+
"""
|
|
667
|
+
metrics = _load_metrics(project_root)
|
|
668
|
+
if not metrics:
|
|
669
|
+
return {
|
|
670
|
+
"schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
|
|
671
|
+
"available": False,
|
|
672
|
+
"reason": "forge_metrics.json not found or empty",
|
|
673
|
+
"changes": [],
|
|
674
|
+
"dry_run": dry_run,
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
version = metrics.get("package_version", "")
|
|
678
|
+
test_files = metrics.get("test_files", "?")
|
|
679
|
+
test_functions = metrics.get("test_functions", "?")
|
|
680
|
+
mcp_tools = metrics.get("mcp_tools", "?")
|
|
681
|
+
mcp_actions = metrics.get("mcp_actions", "?")
|
|
682
|
+
changes: list[str] = []
|
|
683
|
+
|
|
684
|
+
# ── tests/README.md ───────────────────────────────────────────────────────
|
|
685
|
+
tests_readme = project_root / "tests" / "README.md"
|
|
686
|
+
if tests_readme.exists():
|
|
687
|
+
text = tests_readme.read_text(encoding="utf-8")
|
|
688
|
+
new_text = _TESTS_README_RE.sub(
|
|
689
|
+
f"{test_files} test files covering {test_functions} passing tests",
|
|
690
|
+
text,
|
|
691
|
+
)
|
|
692
|
+
if new_text != text:
|
|
693
|
+
if not dry_run:
|
|
694
|
+
tests_readme.write_text(new_text, encoding="utf-8")
|
|
695
|
+
changes.append(
|
|
696
|
+
f"tests/README.md: test counts → {test_files} files / {test_functions} tests"
|
|
697
|
+
)
|
|
698
|
+
|
|
699
|
+
if not version:
|
|
700
|
+
return {
|
|
701
|
+
"schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
|
|
702
|
+
"available": True,
|
|
703
|
+
"changes": changes,
|
|
704
|
+
"warnings": ["package_version missing — skipped version-pinned files"],
|
|
705
|
+
"dry_run": dry_run,
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
# ── docs/CI_CD.md ─────────────────────────────────────────────────────────
|
|
709
|
+
cicd_path = project_root / "docs" / "CI_CD.md"
|
|
710
|
+
if cicd_path.exists():
|
|
711
|
+
text = cicd_path.read_text(encoding="utf-8")
|
|
712
|
+
new_text = _CICD_GIT_URL_RE.sub(rf"\g<1>v{version}", text)
|
|
713
|
+
new_text = _CICD_REV_RE.sub(rf"\g<1>v{version}", new_text)
|
|
714
|
+
if new_text != text:
|
|
715
|
+
if not dry_run:
|
|
716
|
+
cicd_path.write_text(new_text, encoding="utf-8")
|
|
717
|
+
changes.append(f"docs/CI_CD.md: pinned version → v{version}")
|
|
718
|
+
|
|
719
|
+
# ── docs/COMMANDS.md ──────────────────────────────────────────────────────
|
|
720
|
+
commands_path = project_root / "docs" / "COMMANDS.md"
|
|
721
|
+
if commands_path.exists():
|
|
722
|
+
text = commands_path.read_text(encoding="utf-8")
|
|
723
|
+
new_text = _COMMANDS_VER_RE.sub(rf"\g<1>{version}", text)
|
|
724
|
+
if new_text != text:
|
|
725
|
+
if not dry_run:
|
|
726
|
+
commands_path.write_text(new_text, encoding="utf-8")
|
|
727
|
+
changes.append(f"docs/COMMANDS.md: version anchor → {version}")
|
|
728
|
+
|
|
729
|
+
# ── docs/RECEIPT.md ───────────────────────────────────────────────────────
|
|
730
|
+
receipt_path = project_root / "docs" / "RECEIPT.md"
|
|
731
|
+
if receipt_path.exists():
|
|
732
|
+
text = receipt_path.read_text(encoding="utf-8")
|
|
733
|
+
new_text = _RECEIPT_VER_RE.sub(rf'\g<1>{version}\g<2>', text)
|
|
734
|
+
if new_text != text:
|
|
735
|
+
if not dry_run:
|
|
736
|
+
receipt_path.write_text(new_text, encoding="utf-8")
|
|
737
|
+
changes.append(f"docs/RECEIPT.md: forge_version → {version}")
|
|
738
|
+
|
|
739
|
+
# ── docs/FORMALIZATION.md ─────────────────────────────────────────────────
|
|
740
|
+
formalization_path = project_root / "docs" / "FORMALIZATION.md"
|
|
741
|
+
if formalization_path.exists():
|
|
742
|
+
text = formalization_path.read_text(encoding="utf-8")
|
|
743
|
+
new_text = _FORMALIZATION_POST_VER_RE.sub(f"post-v{version}", text)
|
|
744
|
+
if new_text != text:
|
|
745
|
+
if not dry_run:
|
|
746
|
+
formalization_path.write_text(new_text, encoding="utf-8")
|
|
747
|
+
changes.append(f"docs/FORMALIZATION.md: post-version anchors → post-v{version}")
|
|
748
|
+
|
|
749
|
+
# ── docs/MCP_TOOLS.md ─────────────────────────────────────────────────────
|
|
750
|
+
mcp_tools_path = project_root / "docs" / "MCP_TOOLS.md"
|
|
751
|
+
if mcp_tools_path.exists() and mcp_tools != "?" and mcp_actions != "?":
|
|
752
|
+
text = mcp_tools_path.read_text(encoding="utf-8")
|
|
753
|
+
# Header line
|
|
754
|
+
new_text = _MCP_TOOLS_HEADER_RE.sub(
|
|
755
|
+
f"{mcp_tools} tools dispatching {mcp_actions} registry-callable actions",
|
|
756
|
+
text,
|
|
757
|
+
)
|
|
758
|
+
# Per-tool summary table rows
|
|
759
|
+
action_counts = _count_mcp_actions_per_tool(project_root)
|
|
760
|
+
|
|
761
|
+
def _replace_mcp_tools_row(match: re.Match[str]) -> str:
|
|
762
|
+
tool = match.group("tool")
|
|
763
|
+
if tool not in action_counts:
|
|
764
|
+
return match.group(0)
|
|
765
|
+
new_count = str(action_counts[tool])
|
|
766
|
+
if match.group("count") == new_count:
|
|
767
|
+
return match.group(0)
|
|
768
|
+
return match.group(1) + new_count + match.group(4)
|
|
769
|
+
|
|
770
|
+
new_text = _MCP_TOOLS_ROW_RE.sub(_replace_mcp_tools_row, new_text)
|
|
771
|
+
if new_text != text:
|
|
772
|
+
if not dry_run:
|
|
773
|
+
mcp_tools_path.write_text(new_text, encoding="utf-8")
|
|
774
|
+
changes.append(
|
|
775
|
+
f"docs/MCP_TOOLS.md: header/rows → {mcp_tools} tools / {mcp_actions} actions"
|
|
776
|
+
)
|
|
777
|
+
|
|
778
|
+
return {
|
|
779
|
+
"schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
|
|
780
|
+
"available": True,
|
|
781
|
+
"changes": changes,
|
|
782
|
+
"dry_run": dry_run,
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
|
|
605
786
|
# ── main entry point ──────────────────────────────────────────────────────────
|
|
606
787
|
|
|
607
788
|
def run_doc_auto_update(
|
|
608
789
|
project_root: Path,
|
|
609
790
|
*,
|
|
610
|
-
sections: tuple[str, ...] = (
|
|
791
|
+
sections: tuple[str, ...] = (
|
|
792
|
+
"readme", "changelog", "extended_docs", "version_anchors"
|
|
793
|
+
),
|
|
611
794
|
dry_run: bool = False,
|
|
612
795
|
) -> dict[str, Any]:
|
|
613
796
|
"""Run all doc auto-update passes.
|
|
@@ -615,9 +798,13 @@ def run_doc_auto_update(
|
|
|
615
798
|
Args:
|
|
616
799
|
project_root: Repository root.
|
|
617
800
|
sections: Which sections to update — any combination of
|
|
618
|
-
``"readme"``, ``"changelog"``,
|
|
619
|
-
Defaults to all
|
|
620
|
-
IDE_INTEGRATION.md,
|
|
801
|
+
``"readme"``, ``"changelog"``, ``"extended_docs"``, and
|
|
802
|
+
``"version_anchors"``. Defaults to all four.
|
|
803
|
+
``"extended_docs"`` patches IDE_INTEGRATION.md,
|
|
804
|
+
WHITEPAPER.md, and AGENTS_GUIDE.md.
|
|
805
|
+
``"version_anchors"`` patches tests/README.md,
|
|
806
|
+
docs/CI_CD.md, docs/COMMANDS.md, docs/RECEIPT.md,
|
|
807
|
+
docs/FORMALIZATION.md, and docs/MCP_TOOLS.md.
|
|
621
808
|
dry_run: If True, return what would change without writing.
|
|
622
809
|
|
|
623
810
|
Returns dict with ``schema_version``, ``results`` per section,
|
|
@@ -642,6 +829,11 @@ def run_doc_auto_update(
|
|
|
642
829
|
results["extended_docs"] = r
|
|
643
830
|
total += len(r.get("changes", []))
|
|
644
831
|
|
|
832
|
+
if "version_anchors" in sections:
|
|
833
|
+
r = update_version_anchors(root, dry_run=dry_run)
|
|
834
|
+
results["version_anchors"] = r
|
|
835
|
+
total += len(r.get("changes", []))
|
|
836
|
+
|
|
645
837
|
# Self-verify: residual drift after all writes confirms every pattern fired.
|
|
646
838
|
post_drift = detect_doc_drift(root) if not dry_run else {"drift_count": 0}
|
|
647
839
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.77.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
|
|
@@ -226,7 +226,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
226
226
|
| MCP tools | **10 tools · 116 actions** |
|
|
227
227
|
| CLI verbs | **59** |
|
|
228
228
|
| Source files | **232** (~47K LOC) |
|
|
229
|
-
| Tests | **
|
|
229
|
+
| Tests | **1588 passing** across **115 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 |
|
|
@@ -355,6 +355,7 @@ tests/test_capability_scout.py
|
|
|
355
355
|
tests/test_card_renderer.py
|
|
356
356
|
tests/test_certify_operational_axis.py
|
|
357
357
|
tests/test_chat.py
|
|
358
|
+
tests/test_cherry_dedup_class_methods.py
|
|
358
359
|
tests/test_cherry_pick.py
|
|
359
360
|
tests/test_classify_tier.py
|
|
360
361
|
tests/test_classify_tier_ast_signals.py
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Tests for cherry-pick class/method dedup (47-file class explosion fix).
|
|
2
|
+
|
|
3
|
+
When scout enumerates a class plus every public method as separate
|
|
4
|
+
symbols, the cherry manifest must collapse the methods under the class
|
|
5
|
+
so finalize copies the source file once — not once per method.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from atomadic_forge.a1_at_functions.cherry_pick import select_items
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _scout_with_class_and_methods(method_count: int = 47) -> dict:
|
|
13
|
+
"""A fake scout report with one class + N public methods, all in one file."""
|
|
14
|
+
symbols = [
|
|
15
|
+
{
|
|
16
|
+
"name": "IndexStore",
|
|
17
|
+
"qualname": "IndexStore",
|
|
18
|
+
"file": "src/jcm/search_index.py",
|
|
19
|
+
"tier_guess": "a2_mo_composites",
|
|
20
|
+
"complexity": 200,
|
|
21
|
+
"has_self_assign": True,
|
|
22
|
+
"effects": ["io"],
|
|
23
|
+
"kind": "class",
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
for i in range(method_count):
|
|
27
|
+
symbols.append({
|
|
28
|
+
"name": f"method_{i}",
|
|
29
|
+
"qualname": f"IndexStore.method_{i}",
|
|
30
|
+
"file": "src/jcm/search_index.py",
|
|
31
|
+
"tier_guess": "a1_at_functions",
|
|
32
|
+
"complexity": 50,
|
|
33
|
+
"has_self_assign": False,
|
|
34
|
+
"effects": ["pure"],
|
|
35
|
+
"kind": "method",
|
|
36
|
+
})
|
|
37
|
+
return {"repo": "jcm", "symbols": symbols}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_class_picked_methods_folded():
|
|
41
|
+
"""When the class is in the manifest, none of its methods survive cherry."""
|
|
42
|
+
report = _scout_with_class_and_methods(47)
|
|
43
|
+
manifest = select_items(report, pick_all=True)
|
|
44
|
+
quals = [it["qualname"] for it in manifest["items"]]
|
|
45
|
+
assert "IndexStore" in quals
|
|
46
|
+
# Not one method survives — they ride along inside the class body.
|
|
47
|
+
assert not any("." in q for q in quals)
|
|
48
|
+
# Exactly one item, not 48.
|
|
49
|
+
assert len(manifest["items"]) == 1
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_orphan_methods_kept_when_class_absent():
|
|
53
|
+
"""If scout dropped the parent class, the methods are still cherry-picked
|
|
54
|
+
so capability isn't silently lost."""
|
|
55
|
+
report = _scout_with_class_and_methods(3)
|
|
56
|
+
# Strip the class; keep only the methods.
|
|
57
|
+
report["symbols"] = [s for s in report["symbols"] if s["kind"] == "method"]
|
|
58
|
+
manifest = select_items(report, pick_all=True)
|
|
59
|
+
quals = [it["qualname"] for it in manifest["items"]]
|
|
60
|
+
assert quals == [
|
|
61
|
+
"IndexStore.method_0", "IndexStore.method_1", "IndexStore.method_2",
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_free_function_alongside_class():
|
|
66
|
+
"""A free function in the same module is independent — kept."""
|
|
67
|
+
report = _scout_with_class_and_methods(2)
|
|
68
|
+
report["symbols"].append({
|
|
69
|
+
"name": "tokenize",
|
|
70
|
+
"qualname": "tokenize",
|
|
71
|
+
"file": "src/jcm/search_index.py",
|
|
72
|
+
"tier_guess": "a1_at_functions",
|
|
73
|
+
"complexity": 30,
|
|
74
|
+
"has_self_assign": False,
|
|
75
|
+
"effects": ["pure"],
|
|
76
|
+
"kind": "function",
|
|
77
|
+
})
|
|
78
|
+
manifest = select_items(report, pick_all=True)
|
|
79
|
+
quals = sorted(it["qualname"] for it in manifest["items"])
|
|
80
|
+
assert quals == ["IndexStore", "tokenize"]
|
|
@@ -16,6 +16,7 @@ from atomadic_forge.a1_at_functions.doc_auto_update import (
|
|
|
16
16
|
update_changelog,
|
|
17
17
|
update_extended_docs,
|
|
18
18
|
update_readme,
|
|
19
|
+
update_version_anchors,
|
|
19
20
|
)
|
|
20
21
|
|
|
21
22
|
|
|
@@ -184,6 +185,108 @@ def test_count_mcp_actions_per_tool_real_project() -> None:
|
|
|
184
185
|
assert counts.get("audit", 0) > 10
|
|
185
186
|
|
|
186
187
|
|
|
188
|
+
def test_update_version_anchors_tests_readme(tmp_project: Path) -> None:
|
|
189
|
+
tests_dir = tmp_project / "tests"
|
|
190
|
+
tests_dir.mkdir()
|
|
191
|
+
(tests_dir / "README.md").write_text(
|
|
192
|
+
"The `tests/` directory contains 111 test files covering 1,550 passing tests\n",
|
|
193
|
+
encoding="utf-8",
|
|
194
|
+
)
|
|
195
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
196
|
+
assert result["available"]
|
|
197
|
+
text = (tests_dir / "README.md").read_text(encoding="utf-8")
|
|
198
|
+
assert "106 test files covering 1490 passing tests" in text
|
|
199
|
+
assert any("tests/README.md" in c for c in result["changes"])
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_update_version_anchors_cicd(tmp_project: Path) -> None:
|
|
203
|
+
docs_dir = tmp_project / "docs"
|
|
204
|
+
docs_dir.mkdir()
|
|
205
|
+
(docs_dir / "CI_CD.md").write_text(
|
|
206
|
+
'pip install "git+https://github.com/atomadictech/atomadic-forge@v0.60.0"\n'
|
|
207
|
+
"rev: v0.60.0\n",
|
|
208
|
+
encoding="utf-8",
|
|
209
|
+
)
|
|
210
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
211
|
+
assert result["available"]
|
|
212
|
+
text = (docs_dir / "CI_CD.md").read_text(encoding="utf-8")
|
|
213
|
+
assert "@v0.55.0" in text
|
|
214
|
+
assert "rev: v0.55.0" in text
|
|
215
|
+
assert "v0.60.0" not in text
|
|
216
|
+
assert any("CI_CD.md" in c for c in result["changes"])
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_update_version_anchors_commands(tmp_project: Path) -> None:
|
|
220
|
+
docs_dir = tmp_project / "docs"
|
|
221
|
+
docs_dir.mkdir(exist_ok=True)
|
|
222
|
+
(docs_dir / "COMMANDS.md").write_text(
|
|
223
|
+
"All verbs available in the `forge` CLI as of 0.60.0.\n",
|
|
224
|
+
encoding="utf-8",
|
|
225
|
+
)
|
|
226
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
227
|
+
assert result["available"]
|
|
228
|
+
text = (docs_dir / "COMMANDS.md").read_text(encoding="utf-8")
|
|
229
|
+
assert "as of 0.55.0" in text
|
|
230
|
+
assert any("COMMANDS.md" in c for c in result["changes"])
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def test_update_version_anchors_receipt(tmp_project: Path) -> None:
|
|
234
|
+
docs_dir = tmp_project / "docs"
|
|
235
|
+
docs_dir.mkdir(exist_ok=True)
|
|
236
|
+
(docs_dir / "RECEIPT.md").write_text(
|
|
237
|
+
' "forge_version": "0.60.0",\n'
|
|
238
|
+
' "forge_version": "0.60.0",\n',
|
|
239
|
+
encoding="utf-8",
|
|
240
|
+
)
|
|
241
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
242
|
+
assert result["available"]
|
|
243
|
+
text = (docs_dir / "RECEIPT.md").read_text(encoding="utf-8")
|
|
244
|
+
assert '"forge_version": "0.55.0"' in text
|
|
245
|
+
assert "0.60.0" not in text
|
|
246
|
+
assert any("RECEIPT.md" in c for c in result["changes"])
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def test_update_version_anchors_formalization(tmp_project: Path) -> None:
|
|
250
|
+
docs_dir = tmp_project / "docs"
|
|
251
|
+
docs_dir.mkdir(exist_ok=True)
|
|
252
|
+
(docs_dir / "FORMALIZATION.md").write_text(
|
|
253
|
+
"on the post-v0.60.0 roadmap.\n"
|
|
254
|
+
"post-v0.60.0 equivalent for JS\n",
|
|
255
|
+
encoding="utf-8",
|
|
256
|
+
)
|
|
257
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
258
|
+
assert result["available"]
|
|
259
|
+
text = (docs_dir / "FORMALIZATION.md").read_text(encoding="utf-8")
|
|
260
|
+
assert "post-v0.55.0" in text
|
|
261
|
+
assert "v0.60.0" not in text
|
|
262
|
+
assert any("FORMALIZATION.md" in c for c in result["changes"])
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def test_update_version_anchors_mcp_tools_header(tmp_project: Path) -> None:
|
|
266
|
+
docs_dir = tmp_project / "docs"
|
|
267
|
+
docs_dir.mkdir(exist_ok=True)
|
|
268
|
+
(docs_dir / "MCP_TOOLS.md").write_text(
|
|
269
|
+
"Forge ships a Model Context Protocol server exposing "
|
|
270
|
+
"**10 tools dispatching 81 registry-callable actions**.\n"
|
|
271
|
+
"| [`explore`](#explore) | 14 | Analyze |\n",
|
|
272
|
+
encoding="utf-8",
|
|
273
|
+
)
|
|
274
|
+
result = update_version_anchors(tmp_project, dry_run=False)
|
|
275
|
+
assert result["available"]
|
|
276
|
+
text = (docs_dir / "MCP_TOOLS.md").read_text(encoding="utf-8")
|
|
277
|
+
assert "10 tools dispatching 78 registry-callable actions" in text
|
|
278
|
+
assert any("MCP_TOOLS.md" in c for c in result["changes"])
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def test_run_doc_auto_update_includes_version_anchors(tmp_project: Path) -> None:
|
|
282
|
+
(tmp_project / "docs").mkdir(exist_ok=True)
|
|
283
|
+
result = run_doc_auto_update(
|
|
284
|
+
tmp_project, sections=("version_anchors",), dry_run=True
|
|
285
|
+
)
|
|
286
|
+
assert result["available"]
|
|
287
|
+
assert "version_anchors" in result["results"]
|
|
288
|
+
|
|
289
|
+
|
|
187
290
|
def test_extended_docs_updates_wrapped_whitepaper_tool_phrase(tmp_project: Path) -> None:
|
|
188
291
|
(tmp_project / "WHITEPAPER.md").write_text(
|
|
189
292
|
"Traction: **10 MCP\n"
|
|
File without changes
|
|
File without changes
|