atomadic-forge 0.56.0__tar.gz → 0.57.1__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.56.0 → atomadic_forge-0.57.1}/.github/workflows/metrics-auto-regen.yml +4 -2
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/CHANGELOG.md +17 -0
- {atomadic_forge-0.56.0/src/atomadic_forge.egg-info → atomadic_forge-0.57.1}/PKG-INFO +3 -3
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/README.md +2 -2
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/AGENTS_GUIDE.md +2 -2
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/pyproject.toml +1 -1
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +57 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +36 -13
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +170 -1
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/LICENSE +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/MANIFEST.in +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/SECURITY.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/02-commands.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/05-faq.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/README.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/config.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/create.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/setup.cfg +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge.egg-info/SOURCES.txt +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_chat.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_config.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_demo.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/tests/test_wisdom.py +0 -0
|
@@ -95,10 +95,12 @@ jobs:
|
|
|
95
95
|
run: |
|
|
96
96
|
git config user.name "atomadic-bot"
|
|
97
97
|
git config user.email "bot@atomadic.tech"
|
|
98
|
-
if git diff --quiet -- forge_metrics.json README.md CHANGELOG.md
|
|
98
|
+
if git diff --quiet -- forge_metrics.json README.md CHANGELOG.md \
|
|
99
|
+
WHITEPAPER.md docs/IDE_INTEGRATION.md docs/AGENTS_GUIDE.md; then
|
|
99
100
|
echo "metrics and docs already current — no commit"
|
|
100
101
|
exit 0
|
|
101
102
|
fi
|
|
102
|
-
git add forge_metrics.json README.md CHANGELOG.md
|
|
103
|
+
git add forge_metrics.json README.md CHANGELOG.md \
|
|
104
|
+
WHITEPAPER.md docs/IDE_INTEGRATION.md docs/AGENTS_GUIDE.md
|
|
103
105
|
git commit -m "chore(metrics): auto-regenerate metrics + docs [skip ci]"
|
|
104
106
|
git push origin main
|
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.57.1 — 2026-05-08
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- 582dc31 fix(ci): repair v0.57.0 CI failures — metrics, changelog, surface
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## v0.57.0 — 2026-05-08
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- 5429260 release: v0.57.0
|
|
17
|
+
- f5243d1 feat(v0.57.0): forge bump + self-verify pipeline + context git-state
|
|
18
|
+
- 41c391e ci: extend doc-update to all sections in both workflows
|
|
19
|
+
- 93306a9 fix(docs): harden doc-drift regex + fix remaining stale values
|
|
20
|
+
|
|
21
|
+
|
|
5
22
|
## v0.56.0 — 2026-05-08 — Zero-token automation: auto-wire, doc-drift, lean preservation
|
|
6
23
|
|
|
7
24
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.57.1
|
|
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
|
|
@@ -166,7 +166,7 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
|
|
|
166
166
|
| `forge plan` | Bounded execution plan with risk + rollback |
|
|
167
167
|
| `forge chat` | Terminal copilot over forge docs |
|
|
168
168
|
|
|
169
|
-
**
|
|
169
|
+
**84 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
|
|
170
170
|
|
|
171
171
|
---
|
|
172
172
|
|
|
@@ -214,7 +214,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
214
214
|
|--------|-------|
|
|
215
215
|
|
|
216
216
|
| MCP tools | **10 tools · 79 actions** |
|
|
217
|
-
| CLI verbs | **
|
|
217
|
+
| CLI verbs | **84** |
|
|
218
218
|
| Source files | **222** (~43K LOC) |
|
|
219
219
|
| Tests | **1476 passing** across **105 test files** |
|
|
220
220
|
| Lean4 formal proofs | not yet active |
|
|
@@ -134,7 +134,7 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
|
|
|
134
134
|
| `forge plan` | Bounded execution plan with risk + rollback |
|
|
135
135
|
| `forge chat` | Terminal copilot over forge docs |
|
|
136
136
|
|
|
137
|
-
**
|
|
137
|
+
**84 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
@@ -182,7 +182,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
182
182
|
|--------|-------|
|
|
183
183
|
|
|
184
184
|
| MCP tools | **10 tools · 79 actions** |
|
|
185
|
-
| CLI verbs | **
|
|
185
|
+
| CLI verbs | **84** |
|
|
186
186
|
| Source files | **222** (~43K LOC) |
|
|
187
187
|
| Tests | **1476 passing** across **105 test files** |
|
|
188
188
|
| Lean4 formal proofs | not yet active |
|
|
@@ -341,9 +341,9 @@ agent tool-selection can route by trigger phrase. Quick reference:
|
|
|
341
341
|
|
|
342
342
|
---
|
|
343
343
|
|
|
344
|
-
## The
|
|
344
|
+
## The 10 MCP tools — by phase of an agent's lifecycle
|
|
345
345
|
|
|
346
|
-
> **v0.
|
|
346
|
+
> **v0.47.0 surface consolidation:** 66 individual tools merged into 10 umbrellas
|
|
347
347
|
> with **zero capability loss**. See
|
|
348
348
|
> [MIGRATION.md](MIGRATION.md#removed-in-v0100) for the full mapping.
|
|
349
349
|
> The retired names are listed in `surface.json` →
|
|
@@ -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.57.1"
|
|
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"
|
|
@@ -15,6 +15,7 @@ from __future__ import annotations
|
|
|
15
15
|
|
|
16
16
|
import json
|
|
17
17
|
import re
|
|
18
|
+
import subprocess
|
|
18
19
|
from collections import Counter
|
|
19
20
|
from pathlib import Path
|
|
20
21
|
from typing import TypedDict
|
|
@@ -128,6 +129,7 @@ class ContextPack(TypedDict, total=False):
|
|
|
128
129
|
release_gate: list[str]
|
|
129
130
|
risky_files: list[dict]
|
|
130
131
|
recent_lineage: list[dict]
|
|
132
|
+
git_state: dict # branch, commits_ahead, modified/staged/untracked files
|
|
131
133
|
pinned_resources: list[str]
|
|
132
134
|
focus: str
|
|
133
135
|
intent: str
|
|
@@ -140,6 +142,59 @@ class ContextPack(TypedDict, total=False):
|
|
|
140
142
|
token_estimate: int # rough token count (chars // 4); repomix synthesis
|
|
141
143
|
|
|
142
144
|
|
|
145
|
+
def _git_state(project_root: Path) -> dict:
|
|
146
|
+
"""Return branch, commits_ahead_of_main, and pending file lists.
|
|
147
|
+
|
|
148
|
+
Fails gracefully — returns ``{"available": False}`` when git is absent
|
|
149
|
+
or the directory is not a repository.
|
|
150
|
+
"""
|
|
151
|
+
def _run(*args: str) -> str:
|
|
152
|
+
try:
|
|
153
|
+
r = subprocess.run(
|
|
154
|
+
list(args), cwd=str(project_root),
|
|
155
|
+
capture_output=True, text=True, timeout=5,
|
|
156
|
+
)
|
|
157
|
+
return r.stdout.strip() if r.returncode == 0 else ""
|
|
158
|
+
except Exception:
|
|
159
|
+
return ""
|
|
160
|
+
|
|
161
|
+
branch = _run("git", "rev-parse", "--abbrev-ref", "HEAD")
|
|
162
|
+
if not branch:
|
|
163
|
+
return {"available": False}
|
|
164
|
+
|
|
165
|
+
# Commits ahead of main (or master).
|
|
166
|
+
main_branch = "main"
|
|
167
|
+
ahead_raw = _run("git", "rev-list", "--count", f"{main_branch}..HEAD")
|
|
168
|
+
if not ahead_raw:
|
|
169
|
+
main_branch = "master"
|
|
170
|
+
ahead_raw = _run("git", "rev-list", "--count", f"{main_branch}..HEAD")
|
|
171
|
+
commits_ahead = int(ahead_raw) if ahead_raw.isdigit() else 0
|
|
172
|
+
|
|
173
|
+
# Pending file state.
|
|
174
|
+
status_raw = _run("git", "status", "--porcelain")
|
|
175
|
+
modified, staged, untracked = [], [], []
|
|
176
|
+
for line in status_raw.splitlines():
|
|
177
|
+
if len(line) < 4:
|
|
178
|
+
continue
|
|
179
|
+
index_s, work_s, path = line[0], line[1], line[3:]
|
|
180
|
+
if index_s not in (" ", "?") and index_s != "?":
|
|
181
|
+
staged.append(path)
|
|
182
|
+
if work_s == "M":
|
|
183
|
+
modified.append(path)
|
|
184
|
+
if index_s == "?" and work_s == "?":
|
|
185
|
+
untracked.append(path)
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
"available": True,
|
|
189
|
+
"branch": branch,
|
|
190
|
+
"commits_ahead_of_main": commits_ahead,
|
|
191
|
+
"staged": staged,
|
|
192
|
+
"modified_unstaged": modified,
|
|
193
|
+
"untracked": untracked,
|
|
194
|
+
"clean": not (staged or modified or untracked),
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
143
198
|
def _read_repo_purpose(project_root: Path) -> str:
|
|
144
199
|
"""Best-effort: pull the first paragraph from the README, or the
|
|
145
200
|
pyproject description. Falls back to the directory name."""
|
|
@@ -427,6 +482,7 @@ def emit_context_pack(
|
|
|
427
482
|
"why": _why, "next_command": _cmd, "kind": "suggestion"}
|
|
428
483
|
|
|
429
484
|
lineage = read_lineage(project_root, last=20)
|
|
485
|
+
git_st = _git_state(project_root)
|
|
430
486
|
release_gate = _release_gate(project_root)
|
|
431
487
|
policy = _build_policy(project_root)
|
|
432
488
|
workflow_recipe = _build_workflow_recipe(intent)
|
|
@@ -458,6 +514,7 @@ def emit_context_pack(
|
|
|
458
514
|
release_gate=release_gate,
|
|
459
515
|
risky_files=_risky_files(lineage),
|
|
460
516
|
recent_lineage=lineage[-10:] if lineage else [],
|
|
517
|
+
git_state=git_st,
|
|
461
518
|
pinned_resources=[
|
|
462
519
|
"forge://docs/receipt",
|
|
463
520
|
"forge://docs/formalization",
|
|
@@ -60,19 +60,21 @@ _CHANGELOG_VER_RE = re.compile(r"^## v(\d+\.\d+\.\d+)", re.MULTILINE)
|
|
|
60
60
|
# IDE_INTEGRATION.md: matches "**NN tools**" or "**NN tools dispatching NN actions**"
|
|
61
61
|
_IDE_TOOLS_RE = re.compile(r'\*\*\d+ tools(?:\s+dispatching\s+\d+\s+actions)?\*\*')
|
|
62
62
|
|
|
63
|
-
# WHITEPAPER.md: matches "NN MCP tools dispatching NN actions" (
|
|
64
|
-
_WP_TOOLS_PHRASE_RE = re.compile(r'\d+ MCP tools dispatching \d+ actions')
|
|
65
|
-
# WHITEPAPER.md: matches "NN passing tests"
|
|
66
|
-
_WP_TESTS_RE = re.compile(r'(\d+) passing tests')
|
|
63
|
+
# WHITEPAPER.md: matches "NN MCP tools [word] dispatching NN actions" (optional mid-word)
|
|
64
|
+
_WP_TOOLS_PHRASE_RE = re.compile(r'(\d+) MCP tools(?:\s+\w+)? dispatching (\d+) actions')
|
|
65
|
+
# WHITEPAPER.md: matches "NN,NNN passing tests" or "NN passing tests"
|
|
66
|
+
_WP_TESTS_RE = re.compile(r'([\d,]+) passing tests')
|
|
67
67
|
|
|
68
68
|
# AGENTS_GUIDE.md: matches "| explore | NN actions |" style rows
|
|
69
69
|
_AG_EXPLORE_RE = re.compile(r'(\|\s*`?explore`?\s*\|\s*)(\d+)(\s*actions?\s*\|)',
|
|
70
70
|
re.IGNORECASE)
|
|
71
|
+
# AGENTS_GUIDE.md: matches "## The NN MCP tools" headings
|
|
72
|
+
_AG_HEADING_TOOLS_RE = re.compile(r'(## The )\d+( MCP tools)')
|
|
71
73
|
|
|
72
74
|
# Drift detection: broad number-before-keyword patterns
|
|
73
75
|
_DRIFT_TOOLS_RE = re.compile(r'(\d+)\s+MCP\s+tools')
|
|
74
76
|
_DRIFT_ACTIONS_RE = re.compile(r'dispatching\s+(\d+)\s+actions')
|
|
75
|
-
_DRIFT_TESTS_RE = re.compile(r'(\d+)\s+passing\s+tests')
|
|
77
|
+
_DRIFT_TESTS_RE = re.compile(r'([\d,]+)\s+passing\s+tests')
|
|
76
78
|
|
|
77
79
|
|
|
78
80
|
# ── helpers ───────────────────────────────────────────────────────────────────
|
|
@@ -350,6 +352,7 @@ def update_extended_docs(
|
|
|
350
352
|
mcp_actions = metrics.get("mcp_actions", "?")
|
|
351
353
|
test_functions = metrics.get("test_functions", "?")
|
|
352
354
|
changes: list[str] = []
|
|
355
|
+
warnings: list[str] = []
|
|
353
356
|
|
|
354
357
|
# ── 1. IDE_INTEGRATION.md ─────────────────────────────────────────────────
|
|
355
358
|
ide_path = project_root / "docs" / "IDE_INTEGRATION.md"
|
|
@@ -364,6 +367,8 @@ def update_extended_docs(
|
|
|
364
367
|
f"IDE_INTEGRATION.md: tools/actions → {mcp_tools} tools dispatching "
|
|
365
368
|
f"{mcp_actions} actions ({n} occurrence(s))"
|
|
366
369
|
)
|
|
370
|
+
elif n == 0:
|
|
371
|
+
warnings.append("IDE_INTEGRATION.md: tools pattern matched 0 — format may have changed")
|
|
367
372
|
|
|
368
373
|
# ── 2. WHITEPAPER.md ──────────────────────────────────────────────────────
|
|
369
374
|
wp_path = project_root / "WHITEPAPER.md"
|
|
@@ -376,6 +381,8 @@ def update_extended_docs(
|
|
|
376
381
|
changes.append(
|
|
377
382
|
f"WHITEPAPER.md: MCP tools phrase → {new_phrase} ({n_tools} occurrence(s))"
|
|
378
383
|
)
|
|
384
|
+
elif n_tools == 0:
|
|
385
|
+
warnings.append("WHITEPAPER.md: MCP-tools-phrase pattern matched 0 — format may have changed")
|
|
379
386
|
new_wp2, n_tests = _WP_TESTS_RE.subn(
|
|
380
387
|
lambda m: f"{test_functions} passing tests", wp_text
|
|
381
388
|
)
|
|
@@ -384,6 +391,8 @@ def update_extended_docs(
|
|
|
384
391
|
changes.append(
|
|
385
392
|
f"WHITEPAPER.md: passing tests → {test_functions} ({n_tests} occurrence(s))"
|
|
386
393
|
)
|
|
394
|
+
elif n_tests == 0:
|
|
395
|
+
warnings.append("WHITEPAPER.md: passing-tests pattern matched 0 — format may have changed")
|
|
387
396
|
if any("WHITEPAPER" in c for c in changes) and not dry_run:
|
|
388
397
|
wp_path.write_text(wp_text, encoding="utf-8")
|
|
389
398
|
|
|
@@ -395,16 +404,26 @@ def update_extended_docs(
|
|
|
395
404
|
lambda m: m.group(1) + str(mcp_actions) + m.group(3), ag_text
|
|
396
405
|
)
|
|
397
406
|
if n_ag and new_ag != ag_text:
|
|
398
|
-
if not dry_run:
|
|
399
|
-
ag_path.write_text(new_ag, encoding="utf-8")
|
|
400
407
|
changes.append(
|
|
401
408
|
f"AGENTS_GUIDE.md: explore actions → {mcp_actions} ({n_ag} occurrence(s))"
|
|
402
409
|
)
|
|
410
|
+
ag_text = new_ag
|
|
411
|
+
new_ag2, n_heading = _AG_HEADING_TOOLS_RE.subn(
|
|
412
|
+
lambda m: m.group(1) + str(mcp_tools) + m.group(2), ag_text
|
|
413
|
+
)
|
|
414
|
+
if n_heading and new_ag2 != ag_text:
|
|
415
|
+
changes.append(
|
|
416
|
+
f"AGENTS_GUIDE.md: heading tool count → {mcp_tools} ({n_heading} occurrence(s))"
|
|
417
|
+
)
|
|
418
|
+
ag_text = new_ag2
|
|
419
|
+
if any("AGENTS_GUIDE" in c for c in changes) and not dry_run:
|
|
420
|
+
ag_path.write_text(ag_text, encoding="utf-8")
|
|
403
421
|
|
|
404
422
|
return {
|
|
405
423
|
"schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
|
|
406
424
|
"available": True,
|
|
407
425
|
"changes": changes,
|
|
426
|
+
"warnings": warnings,
|
|
408
427
|
"dry_run": dry_run,
|
|
409
428
|
}
|
|
410
429
|
|
|
@@ -476,7 +495,7 @@ def detect_doc_drift(project_root: Path) -> dict[str, Any]:
|
|
|
476
495
|
"found_value": found, "expected_value": mcp_actions,
|
|
477
496
|
})
|
|
478
497
|
for m in _DRIFT_TESTS_RE.finditer(line):
|
|
479
|
-
found = int(m.group(1))
|
|
498
|
+
found = int(m.group(1).replace(",", ""))
|
|
480
499
|
if found != test_functions:
|
|
481
500
|
drift_items.append({
|
|
482
501
|
"file": rel, "line": lineno, "pattern": "passing tests",
|
|
@@ -499,7 +518,7 @@ def detect_doc_drift(project_root: Path) -> dict[str, Any]:
|
|
|
499
518
|
def run_doc_auto_update(
|
|
500
519
|
project_root: Path,
|
|
501
520
|
*,
|
|
502
|
-
sections: tuple[str, ...] = ("readme", "changelog"),
|
|
521
|
+
sections: tuple[str, ...] = ("readme", "changelog", "extended_docs"),
|
|
503
522
|
dry_run: bool = False,
|
|
504
523
|
) -> dict[str, Any]:
|
|
505
524
|
"""Run all doc auto-update passes.
|
|
@@ -508,12 +527,12 @@ def run_doc_auto_update(
|
|
|
508
527
|
project_root: Repository root.
|
|
509
528
|
sections: Which sections to update — any combination of
|
|
510
529
|
``"readme"``, ``"changelog"``, and ``"extended_docs"``.
|
|
511
|
-
``"extended_docs"``
|
|
512
|
-
WHITEPAPER.md, and
|
|
530
|
+
Defaults to all three. ``"extended_docs"`` patches
|
|
531
|
+
IDE_INTEGRATION.md, WHITEPAPER.md, and AGENTS_GUIDE.md.
|
|
513
532
|
dry_run: If True, return what would change without writing.
|
|
514
533
|
|
|
515
|
-
Returns dict with ``schema_version``, ``results`` per section,
|
|
516
|
-
aggregate ``total_changes`` count.
|
|
534
|
+
Returns dict with ``schema_version``, ``results`` per section,
|
|
535
|
+
aggregate ``total_changes`` count, and ``post_drift`` residual check.
|
|
517
536
|
"""
|
|
518
537
|
root = Path(project_root).resolve()
|
|
519
538
|
results: dict[str, Any] = {}
|
|
@@ -534,10 +553,14 @@ def run_doc_auto_update(
|
|
|
534
553
|
results["extended_docs"] = r
|
|
535
554
|
total += len(r.get("changes", []))
|
|
536
555
|
|
|
556
|
+
# Self-verify: residual drift after all writes confirms every pattern fired.
|
|
557
|
+
post_drift = detect_doc_drift(root) if not dry_run else {"drift_count": 0}
|
|
558
|
+
|
|
537
559
|
return {
|
|
538
560
|
"schema_version": SCHEMA_VERSION_DOC_AUTO_UPDATE_V1,
|
|
539
561
|
"available": True,
|
|
540
562
|
"dry_run": dry_run,
|
|
541
563
|
"total_changes": total,
|
|
542
564
|
"results": results,
|
|
565
|
+
"post_drift": post_drift,
|
|
543
566
|
}
|
{atomadic_forge-0.56.0 → atomadic_forge-0.57.1}/src/atomadic_forge/a4_sy_orchestration/cli.py
RENAMED
|
@@ -1472,6 +1472,25 @@ def auto_wire_cmd(
|
|
|
1472
1472
|
"results": results,
|
|
1473
1473
|
}
|
|
1474
1474
|
|
|
1475
|
+
# Self-verify: run ruff --fix on every file modified during a real apply.
|
|
1476
|
+
ruff_results: list[str] = []
|
|
1477
|
+
if not dry_run and wired:
|
|
1478
|
+
import subprocess as _sp
|
|
1479
|
+
patched: set[str] = set()
|
|
1480
|
+
for r in results:
|
|
1481
|
+
patched.update(r.get("files_modified", []))
|
|
1482
|
+
for rel in sorted(patched):
|
|
1483
|
+
abs_path = str(project_root / rel)
|
|
1484
|
+
rv = _sp.run(
|
|
1485
|
+
["python", "-m", "ruff", "check", "--fix", abs_path],
|
|
1486
|
+
cwd=str(project_root), capture_output=True, text=True,
|
|
1487
|
+
)
|
|
1488
|
+
if rv.returncode != 0:
|
|
1489
|
+
ruff_results.append(f"ruff WARN {rel}: {rv.stdout.strip()[:120]}")
|
|
1490
|
+
else:
|
|
1491
|
+
ruff_results.append(f"ruff OK {rel}")
|
|
1492
|
+
summary["ruff_self_verify"] = ruff_results
|
|
1493
|
+
|
|
1475
1494
|
if json_out:
|
|
1476
1495
|
typer.echo(json.dumps(summary, indent=2, default=str))
|
|
1477
1496
|
return
|
|
@@ -1487,6 +1506,8 @@ def auto_wire_cmd(
|
|
|
1487
1506
|
typer.echo(f" [{status}] {r.get('module', '?')}.{r.get('function', '?')}")
|
|
1488
1507
|
for e in r.get("errors", []):
|
|
1489
1508
|
typer.echo(f" ! {e}", err=True)
|
|
1509
|
+
for line in ruff_results:
|
|
1510
|
+
typer.echo(f" {line}")
|
|
1490
1511
|
if not dry_run and wired:
|
|
1491
1512
|
typer.echo("\n Run: forge certify --project . to verify the wiring")
|
|
1492
1513
|
|
|
@@ -1625,7 +1646,7 @@ def doc_update_cmd(
|
|
|
1625
1646
|
"extended_docs patches IDE_INTEGRATION.md, WHITEPAPER.md, "
|
|
1626
1647
|
"and docs/AGENTS_GUIDE.md."
|
|
1627
1648
|
),
|
|
1628
|
-
)] = "readme,changelog",
|
|
1649
|
+
)] = "readme,changelog,extended_docs",
|
|
1629
1650
|
dry_run: Annotated[bool, typer.Option(
|
|
1630
1651
|
"--dry-run",
|
|
1631
1652
|
help="Show what would change without writing.")] = False,
|
|
@@ -2318,6 +2339,154 @@ def _register_specialty_apps() -> None:
|
|
|
2318
2339
|
fg="yellow", err=True)
|
|
2319
2340
|
|
|
2320
2341
|
|
|
2342
|
+
@app.command("bump")
|
|
2343
|
+
def bump_cmd(
|
|
2344
|
+
part: Annotated[str, typer.Argument(
|
|
2345
|
+
help="Version part to increment: patch, minor, or major.")] = "patch",
|
|
2346
|
+
project_root: Annotated[Path, typer.Option(
|
|
2347
|
+
"--project",
|
|
2348
|
+
exists=True, file_okay=False, dir_okay=True, resolve_path=True,
|
|
2349
|
+
help="Project root.")] = Path("."),
|
|
2350
|
+
push: Annotated[bool, typer.Option(
|
|
2351
|
+
"--push/--no-push",
|
|
2352
|
+
help="Push commit + tag to origin after bumping.")] = True,
|
|
2353
|
+
tag: Annotated[bool, typer.Option(
|
|
2354
|
+
"--tag/--no-tag",
|
|
2355
|
+
help="Create an annotated git tag.")] = True,
|
|
2356
|
+
dry_run: Annotated[bool, typer.Option(
|
|
2357
|
+
"--dry-run", help="Show what would change without writing.")] = False,
|
|
2358
|
+
) -> None:
|
|
2359
|
+
"""Bump version, regenerate all docs, commit, tag, and push in one command.
|
|
2360
|
+
|
|
2361
|
+
Reads the current version from pyproject.toml, increments the requested
|
|
2362
|
+
part (default: patch), writes the new version, runs ``forge doc-update``
|
|
2363
|
+
(all sections), stages all touched files, commits, optionally tags, and
|
|
2364
|
+
pushes — with no manual steps required.
|
|
2365
|
+
|
|
2366
|
+
Examples::
|
|
2367
|
+
|
|
2368
|
+
forge bump # patch: 0.56.0 → 0.56.1
|
|
2369
|
+
forge bump minor # minor: 0.56.0 → 0.57.0
|
|
2370
|
+
forge bump major # major: 0.56.0 → 1.0.0
|
|
2371
|
+
forge bump --no-push # commit + tag locally only
|
|
2372
|
+
forge bump --dry-run # preview without writing
|
|
2373
|
+
"""
|
|
2374
|
+
import re as _re
|
|
2375
|
+
import subprocess as _sp
|
|
2376
|
+
|
|
2377
|
+
root = Path(project_root).resolve()
|
|
2378
|
+
pyproject = root / "pyproject.toml"
|
|
2379
|
+
|
|
2380
|
+
if not pyproject.exists():
|
|
2381
|
+
typer.echo("bump: pyproject.toml not found", err=True)
|
|
2382
|
+
raise typer.Exit(1)
|
|
2383
|
+
|
|
2384
|
+
text = pyproject.read_text(encoding="utf-8")
|
|
2385
|
+
m = _re.search(r'^(version\s*=\s*")(\d+)\.(\d+)\.(\d+)(")', text, _re.MULTILINE)
|
|
2386
|
+
if not m:
|
|
2387
|
+
typer.echo("bump: could not parse version from pyproject.toml", err=True)
|
|
2388
|
+
raise typer.Exit(1)
|
|
2389
|
+
|
|
2390
|
+
major, minor, patch_n = int(m.group(2)), int(m.group(3)), int(m.group(4))
|
|
2391
|
+
old_version = f"{major}.{minor}.{patch_n}"
|
|
2392
|
+
|
|
2393
|
+
if part == "major":
|
|
2394
|
+
major += 1
|
|
2395
|
+
minor = 0
|
|
2396
|
+
patch_n = 0
|
|
2397
|
+
elif part == "minor":
|
|
2398
|
+
minor += 1
|
|
2399
|
+
patch_n = 0
|
|
2400
|
+
elif part == "patch":
|
|
2401
|
+
patch_n += 1
|
|
2402
|
+
else:
|
|
2403
|
+
typer.echo(f"bump: unknown part '{part}' — use patch, minor, or major", err=True)
|
|
2404
|
+
raise typer.Exit(1)
|
|
2405
|
+
|
|
2406
|
+
new_version = f"{major}.{minor}.{patch_n}"
|
|
2407
|
+
typer.echo(f"bump: {old_version} → {new_version}")
|
|
2408
|
+
|
|
2409
|
+
if dry_run:
|
|
2410
|
+
typer.echo(f"[DRY RUN] would write pyproject.toml v{new_version}, "
|
|
2411
|
+
"run doc-update --sections readme changelog extended_docs, "
|
|
2412
|
+
f"commit, {'tag v' + new_version + ', ' if tag else ''}{'push' if push else 'no push'}")
|
|
2413
|
+
return
|
|
2414
|
+
|
|
2415
|
+
# 1. Write new version into pyproject.toml.
|
|
2416
|
+
new_text = text[: m.start(2)] + new_version + text[m.end(4):]
|
|
2417
|
+
pyproject.write_text(new_text, encoding="utf-8")
|
|
2418
|
+
|
|
2419
|
+
# 2. Recompute forge_metrics.json — must happen before doc-update so that
|
|
2420
|
+
# update_changelog() reads the correct new version, and so the committed
|
|
2421
|
+
# artifact matches the live recompute in CI's Metrics Drift Gate.
|
|
2422
|
+
metrics_rv = _sp.run(
|
|
2423
|
+
["python", "-m", "atomadic_forge.a4_sy_orchestration.cli", "metrics", "--apply"],
|
|
2424
|
+
cwd=str(root), capture_output=True, text=True,
|
|
2425
|
+
)
|
|
2426
|
+
if metrics_rv.returncode != 0:
|
|
2427
|
+
typer.echo(f"bump: metrics --apply failed:\n{metrics_rv.stderr.strip()}", err=True)
|
|
2428
|
+
raise typer.Exit(1)
|
|
2429
|
+
typer.echo("bump: forge_metrics.json updated")
|
|
2430
|
+
|
|
2431
|
+
# 2b. Regenerate surface.json — keeps Surface Drift Gate green.
|
|
2432
|
+
surface_rv = _sp.run(
|
|
2433
|
+
["python", "-m", "atomadic_forge.a4_sy_orchestration.cli",
|
|
2434
|
+
"surface", "emit", "--out", "surface.json"],
|
|
2435
|
+
cwd=str(root), capture_output=True, text=True,
|
|
2436
|
+
)
|
|
2437
|
+
if surface_rv.returncode == 0:
|
|
2438
|
+
typer.echo("bump: surface.json updated")
|
|
2439
|
+
else:
|
|
2440
|
+
typer.echo(f"bump: surface emit warning — {surface_rv.stderr.strip()[:80]}", err=True)
|
|
2441
|
+
|
|
2442
|
+
# 3. Regenerate all doc sections (changelog prepends new version entry now
|
|
2443
|
+
# that forge_metrics.json carries the correct package_version).
|
|
2444
|
+
from ..a1_at_functions.doc_auto_update import run_doc_auto_update
|
|
2445
|
+
doc_result = run_doc_auto_update(
|
|
2446
|
+
root, sections=("readme", "changelog", "extended_docs"),
|
|
2447
|
+
)
|
|
2448
|
+
doc_total = doc_result.get("total_changes", 0)
|
|
2449
|
+
typer.echo(f"bump: docs updated ({doc_total} change(s))")
|
|
2450
|
+
|
|
2451
|
+
# Report any residual drift so the user knows if a regex didn't fire.
|
|
2452
|
+
post_drift = doc_result.get("post_drift", {})
|
|
2453
|
+
if post_drift.get("drift_count", 0):
|
|
2454
|
+
typer.echo(f" ⚠ post-update drift: {post_drift['drift_count']} item(s) still stale "
|
|
2455
|
+
"— check doc_auto_update regexes", err=True)
|
|
2456
|
+
|
|
2457
|
+
# 4. Stage all potentially-modified files.
|
|
2458
|
+
candidates = [
|
|
2459
|
+
"pyproject.toml", "forge_metrics.json", "surface.json",
|
|
2460
|
+
"README.md", "CHANGELOG.md",
|
|
2461
|
+
"WHITEPAPER.md", "docs/IDE_INTEGRATION.md", "docs/AGENTS_GUIDE.md",
|
|
2462
|
+
]
|
|
2463
|
+
to_add = [c for c in candidates if (root / c).exists()]
|
|
2464
|
+
_sp.run(["git", "add"] + to_add, cwd=str(root), check=True)
|
|
2465
|
+
|
|
2466
|
+
# 5. Commit.
|
|
2467
|
+
commit_msg = f"release: v{new_version}"
|
|
2468
|
+
_sp.run(["git", "commit", "-m", commit_msg], cwd=str(root), check=True)
|
|
2469
|
+
typer.echo(f"bump: committed '{commit_msg}'")
|
|
2470
|
+
|
|
2471
|
+
# 6. Tag.
|
|
2472
|
+
tag_name = f"v{new_version}"
|
|
2473
|
+
if tag:
|
|
2474
|
+
_sp.run(
|
|
2475
|
+
["git", "tag", "-a", tag_name, "-m", f"Release {tag_name}"],
|
|
2476
|
+
cwd=str(root), check=True,
|
|
2477
|
+
)
|
|
2478
|
+
typer.echo(f"bump: tagged {tag_name}")
|
|
2479
|
+
|
|
2480
|
+
# 7. Push.
|
|
2481
|
+
if push:
|
|
2482
|
+
_sp.run(["git", "push", "origin", "main"], cwd=str(root), check=True)
|
|
2483
|
+
if tag:
|
|
2484
|
+
_sp.run(["git", "push", "origin", tag_name], cwd=str(root), check=True)
|
|
2485
|
+
typer.echo(f"bump: pushed to origin (tag: {tag_name if tag else 'none'})")
|
|
2486
|
+
|
|
2487
|
+
typer.echo(f"bump: v{new_version} live ✓")
|
|
2488
|
+
|
|
2489
|
+
|
|
2321
2490
|
_register_specialty_apps()
|
|
2322
2491
|
|
|
2323
2492
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.57.1
|
|
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
|
|
@@ -166,7 +166,7 @@ Forge enforces a **5-tier monadic law** — every source file belongs to exactly
|
|
|
166
166
|
| `forge plan` | Bounded execution plan with risk + rollback |
|
|
167
167
|
| `forge chat` | Terminal copilot over forge docs |
|
|
168
168
|
|
|
169
|
-
**
|
|
169
|
+
**84 CLI verbs total.** Full reference: [docs/02-commands.md](docs/02-commands.md)
|
|
170
170
|
|
|
171
171
|
---
|
|
172
172
|
|
|
@@ -214,7 +214,7 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
214
214
|
|--------|-------|
|
|
215
215
|
|
|
216
216
|
| MCP tools | **10 tools · 79 actions** |
|
|
217
|
-
| CLI verbs | **
|
|
217
|
+
| CLI verbs | **84** |
|
|
218
218
|
| Source files | **222** (~43K LOC) |
|
|
219
219
|
| Tests | **1476 passing** across **105 test files** |
|
|
220
220
|
| Lean4 formal proofs | not yet active |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|