atomadic-forge 0.77.0__tar.gz → 0.78.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.77.0 → atomadic_forge-0.78.0}/CHANGELOG.md +5 -0
- {atomadic_forge-0.77.0/src/atomadic_forge.egg-info → atomadic_forge-0.78.0}/PKG-INFO +3 -3
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/README.md +2 -2
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/pyproject.toml +1 -1
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +22 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_check.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +2 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +5 -0
- atomadic_forge-0.78.0/src/atomadic_forge/commands/token_savings.py +70 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0/src/atomadic_forge.egg-info}/PKG-INFO +3 -3
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
- atomadic_forge-0.78.0/tests/test_token_savings_ledger.py +76 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_welcome_enhancements.py +10 -7
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/LICENSE +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/SECURITY.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/README.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/setup.cfg +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.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.77.0 → atomadic_forge-0.78.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.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/graft_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/graft.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cherry_dedup_class_methods.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_graft_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_harvest_source_warnings.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_repo_public_surface.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/tests/test_wisdom.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.78.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
|
|
@@ -225,8 +225,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
225
225
|
|
|
226
226
|
| MCP tools | **10 tools · 116 actions** |
|
|
227
227
|
| CLI verbs | **59** |
|
|
228
|
-
| Source files | **
|
|
229
|
-
| Tests | **
|
|
228
|
+
| Source files | **233** (~47K LOC) |
|
|
229
|
+
| Tests | **1592 passing** across **116 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 |
|
|
@@ -193,8 +193,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
193
193
|
|
|
194
194
|
| MCP tools | **10 tools · 116 actions** |
|
|
195
195
|
| CLI verbs | **59** |
|
|
196
|
-
| Source files | **
|
|
197
|
-
| Tests | **
|
|
196
|
+
| Source files | **233** (~47K LOC) |
|
|
197
|
+
| Tests | **1592 passing** across **116 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 |
|
|
@@ -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.78.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"
|
|
@@ -90,18 +90,40 @@ def enrich_response(
|
|
|
90
90
|
*,
|
|
91
91
|
scope: dict[str, Any] | None = None,
|
|
92
92
|
summary: str = "",
|
|
93
|
+
project_root: Any = None,
|
|
94
|
+
tool: str = "",
|
|
93
95
|
) -> dict[str, Any]:
|
|
94
96
|
"""Return ``report`` with ``scope`` and ``summary`` injected.
|
|
95
97
|
|
|
96
98
|
Existing keys are not modified. If the report already carries a
|
|
97
99
|
``scope`` or ``summary`` from upstream, the new values overwrite
|
|
98
100
|
(callers control the order).
|
|
101
|
+
|
|
102
|
+
When ``project_root`` and ``tool`` are provided AND the supplied
|
|
103
|
+
``scope.tokens_saved_estimate`` is positive, this also appends an
|
|
104
|
+
entry to the project's lifetime-savings ledger so every verb
|
|
105
|
+
contributes to the boastable total. Best-effort: a ledger write
|
|
106
|
+
failure never affects the returned report.
|
|
99
107
|
"""
|
|
100
108
|
out = dict(report)
|
|
101
109
|
if scope is not None:
|
|
102
110
|
out["scope"] = scope
|
|
103
111
|
if summary:
|
|
104
112
|
out["summary"] = summary
|
|
113
|
+
if project_root is not None and tool:
|
|
114
|
+
try:
|
|
115
|
+
est = int((scope or {}).get("tokens_saved_estimate") or 0)
|
|
116
|
+
except (TypeError, ValueError):
|
|
117
|
+
est = 0
|
|
118
|
+
if est > 0:
|
|
119
|
+
try:
|
|
120
|
+
from pathlib import Path as _P
|
|
121
|
+
|
|
122
|
+
from .lifetime_savings import append_savings as _append
|
|
123
|
+
_append(project_root=_P(str(project_root)),
|
|
124
|
+
tool=tool, tokens_saved=est)
|
|
125
|
+
except Exception: # pragma: no cover - never break tool response
|
|
126
|
+
pass
|
|
105
127
|
return out
|
|
106
128
|
|
|
107
129
|
|
{atomadic_forge-0.77.0 → atomadic_forge-0.78.0}/src/atomadic_forge/a4_sy_orchestration/cli.py
RENAMED
|
@@ -2734,6 +2734,11 @@ def _register_specialty_apps() -> None:
|
|
|
2734
2734
|
("atomadic_forge.commands.graft", "graft",
|
|
2735
2735
|
"Pull one symbol from a source file into the target's tier "
|
|
2736
2736
|
"surface and optionally auto-wire CLI + MCP."),
|
|
2737
|
+
# v0.78.0 — token-savings: lifetime ledger of LLM round-trips
|
|
2738
|
+
# spared. Every enriched verb appends to .atomadic-forge/
|
|
2739
|
+
# lifetime_savings.jsonl automatically.
|
|
2740
|
+
("atomadic_forge.commands.token_savings", "token-savings",
|
|
2741
|
+
"Show the project's lifetime token-savings ledger."),
|
|
2737
2742
|
("atomadic_forge.commands.emergent_swarm", "emergent-swarm",
|
|
2738
2743
|
"Round-5: cross-repo emergent composition discovery."),
|
|
2739
2744
|
("atomadic_forge.commands.emergent_swarm", "emergent_swarm",
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Tier a4 — `forge token-savings` CLI surface.
|
|
2
|
+
|
|
3
|
+
Display the lifetime token-savings ledger for a project. Every Forge
|
|
4
|
+
verb that reports a ``scope.tokens_saved_estimate`` automatically
|
|
5
|
+
appends to this ledger via ``response_enricher.enrich_response``, so
|
|
6
|
+
the running total is the cumulative LLM round-trip cost the Forge has
|
|
7
|
+
spared the caller — boastable, verifiable, file-backed.
|
|
8
|
+
|
|
9
|
+
The ledger lives at ``<project>/.atomadic-forge/lifetime_savings.jsonl``.
|
|
10
|
+
One JSON object per line, append-only. Read it directly to audit.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Annotated
|
|
17
|
+
|
|
18
|
+
import typer
|
|
19
|
+
|
|
20
|
+
from atomadic_forge.a1_at_functions.lifetime_savings import (
|
|
21
|
+
read_savings_summary,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
COMMAND_NAME = "token-savings"
|
|
25
|
+
COMMAND_HELP = (
|
|
26
|
+
"Show the project's lifetime token-savings ledger — the cumulative "
|
|
27
|
+
"LLM round-trips the Forge has spared, broken down by tool."
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
app = typer.Typer(no_args_is_help=False, help=COMMAND_HELP)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@app.callback(invoke_without_command=True)
|
|
34
|
+
def run(
|
|
35
|
+
project: Annotated[Path, typer.Option(
|
|
36
|
+
"--project", "-p",
|
|
37
|
+
help="Project root (must contain .atomadic-forge/).",
|
|
38
|
+
exists=True, file_okay=False, dir_okay=True, resolve_path=True)] = (
|
|
39
|
+
Path(".")),
|
|
40
|
+
json_out: Annotated[bool, typer.Option(
|
|
41
|
+
"--json", help="Emit machine-readable JSON.")] = False,
|
|
42
|
+
) -> None:
|
|
43
|
+
"""Show lifetime token-savings for the project."""
|
|
44
|
+
summary = read_savings_summary(project_root=project)
|
|
45
|
+
|
|
46
|
+
if json_out:
|
|
47
|
+
typer.echo(json.dumps(summary, indent=2, default=str))
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
typer.echo("")
|
|
51
|
+
typer.echo("Forge — lifetime token-savings ledger")
|
|
52
|
+
typer.echo("-" * 60)
|
|
53
|
+
typer.echo(f" project: {project}")
|
|
54
|
+
typer.echo(f" ledger: {summary['ledger_file']}")
|
|
55
|
+
if not summary["ledger_present"]:
|
|
56
|
+
typer.secho(" (no ledger yet — run any verb to start logging)",
|
|
57
|
+
fg="yellow")
|
|
58
|
+
return
|
|
59
|
+
total = int(summary["tokens_saved_lifetime"])
|
|
60
|
+
typer.echo(f" entries: {summary['entry_count']}")
|
|
61
|
+
typer.echo(f" tokens saved: {total:,}")
|
|
62
|
+
typer.echo(f" first seen: {summary['first_seen_at']}")
|
|
63
|
+
typer.echo(f" last seen: {summary['last_seen_at']}")
|
|
64
|
+
by_tool = summary.get("by_tool") or {}
|
|
65
|
+
if by_tool:
|
|
66
|
+
typer.echo("")
|
|
67
|
+
typer.echo(" by tool:")
|
|
68
|
+
for tool, n in sorted(by_tool.items(), key=lambda kv: -kv[1]):
|
|
69
|
+
pct = (100.0 * n / total) if total else 0.0
|
|
70
|
+
typer.echo(f" {tool:<14} {n:>10,} ({pct:5.1f}%)")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.78.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
|
|
@@ -225,8 +225,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
225
225
|
|
|
226
226
|
| MCP tools | **10 tools · 116 actions** |
|
|
227
227
|
| CLI verbs | **59** |
|
|
228
|
-
| Source files | **
|
|
229
|
-
| Tests | **
|
|
228
|
+
| Source files | **233** (~47K LOC) |
|
|
229
|
+
| Tests | **1592 passing** across **116 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 |
|
|
@@ -339,6 +339,7 @@ src/atomadic_forge/commands/relay.py
|
|
|
339
339
|
src/atomadic_forge/commands/surface.py
|
|
340
340
|
src/atomadic_forge/commands/synergy.py
|
|
341
341
|
src/atomadic_forge/commands/synergy_then_emergent.py
|
|
342
|
+
src/atomadic_forge/commands/token_savings.py
|
|
342
343
|
src/atomadic_forge/commands/welcome.py
|
|
343
344
|
src/atomadic_forge/commands/wisdom.py
|
|
344
345
|
tests/test_aaaa_nexus_client.py
|
|
@@ -446,6 +447,7 @@ tests/test_surface_gap_check.py
|
|
|
446
447
|
tests/test_synergy.py
|
|
447
448
|
tests/test_test_runner.py
|
|
448
449
|
tests/test_tier_init_rebuild.py
|
|
450
|
+
tests/test_token_savings_ledger.py
|
|
449
451
|
tests/test_trust_gate_response.py
|
|
450
452
|
tests/test_verify_suggested_recipe.py
|
|
451
453
|
tests/test_welcome.py
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Tests for the auto-ledger token-savings flow.
|
|
2
|
+
|
|
3
|
+
Every Forge verb that calls ``enrich_response`` with a positive
|
|
4
|
+
``tokens_saved_estimate`` should automatically append a ledger entry.
|
|
5
|
+
The total surfaced via ``read_savings_summary`` is the boastable
|
|
6
|
+
public metric.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from atomadic_forge.a1_at_functions.lifetime_savings import (
|
|
13
|
+
read_savings_summary,
|
|
14
|
+
)
|
|
15
|
+
from atomadic_forge.a1_at_functions.response_enricher import (
|
|
16
|
+
enrich_response,
|
|
17
|
+
make_scope,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_enrich_writes_ledger_entry(tmp_path: Path) -> None:
|
|
22
|
+
"""Positive scope + project_root + tool ⇒ ledger row appended."""
|
|
23
|
+
scope = make_scope(files_scanned=10, basis_kind="files")
|
|
24
|
+
out = enrich_response(
|
|
25
|
+
{"schema_version": "test/v1"},
|
|
26
|
+
scope=scope,
|
|
27
|
+
summary="tested",
|
|
28
|
+
project_root=tmp_path,
|
|
29
|
+
tool="recon",
|
|
30
|
+
)
|
|
31
|
+
assert out["scope"]["tokens_saved_estimate"] > 0
|
|
32
|
+
summary = read_savings_summary(project_root=tmp_path)
|
|
33
|
+
assert summary["ledger_present"]
|
|
34
|
+
assert summary["entry_count"] == 1
|
|
35
|
+
assert summary["tokens_saved_lifetime"] == out["scope"]["tokens_saved_estimate"]
|
|
36
|
+
assert summary["by_tool"]["recon"] == out["scope"]["tokens_saved_estimate"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_enrich_without_project_root_skips_ledger(tmp_path: Path) -> None:
|
|
40
|
+
"""Old-style call (no project_root) must not write to any ledger."""
|
|
41
|
+
enrich_response(
|
|
42
|
+
{"schema_version": "test/v1"},
|
|
43
|
+
scope=make_scope(files_scanned=10, basis_kind="files"),
|
|
44
|
+
summary="tested",
|
|
45
|
+
)
|
|
46
|
+
summary = read_savings_summary(project_root=tmp_path)
|
|
47
|
+
assert summary["ledger_present"] is False
|
|
48
|
+
assert summary["tokens_saved_lifetime"] == 0
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_enrich_zero_estimate_skips_ledger(tmp_path: Path) -> None:
|
|
52
|
+
"""An estimate of 0 must not create a ledger entry."""
|
|
53
|
+
enrich_response(
|
|
54
|
+
{"schema_version": "test/v1"},
|
|
55
|
+
scope=make_scope(basis_kind="none"),
|
|
56
|
+
summary="tested",
|
|
57
|
+
project_root=tmp_path,
|
|
58
|
+
tool="recon",
|
|
59
|
+
)
|
|
60
|
+
summary = read_savings_summary(project_root=tmp_path)
|
|
61
|
+
assert summary["ledger_present"] is False
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_multiple_calls_accumulate(tmp_path: Path) -> None:
|
|
65
|
+
"""Three enriched calls land three entries; totals add."""
|
|
66
|
+
for i in range(3):
|
|
67
|
+
enrich_response(
|
|
68
|
+
{},
|
|
69
|
+
scope=make_scope(files_scanned=5 + i, basis_kind="files"),
|
|
70
|
+
project_root=tmp_path,
|
|
71
|
+
tool=f"tool_{i}",
|
|
72
|
+
)
|
|
73
|
+
summary = read_savings_summary(project_root=tmp_path)
|
|
74
|
+
assert summary["entry_count"] == 3
|
|
75
|
+
# by_tool keys should be the three distinct tool names
|
|
76
|
+
assert set(summary["by_tool"].keys()) == {"tool_0", "tool_1", "tool_2"}
|
|
@@ -191,25 +191,28 @@ def test_read_savings_summary_skips_malformed_lines(tmp_path: Path) -> None:
|
|
|
191
191
|
|
|
192
192
|
|
|
193
193
|
def test_welcome_logs_session_to_ledger_and_reads_lifetime(tmp_path: Path) -> None:
|
|
194
|
-
# First run — establishes the ledger.
|
|
194
|
+
# First run — establishes the ledger. As of v0.78 every constituent
|
|
195
|
+
# verb (recon, wire) auto-ledgers via enrich_response in addition
|
|
196
|
+
# to welcome's own session aggregate, so entry_count >= 1.
|
|
195
197
|
out1 = welcome(project_root=tmp_path, skip_certify=True)
|
|
196
198
|
assert out1["session_tokens_saved_estimate"] >= 0
|
|
197
|
-
|
|
199
|
+
n1 = out1["lifetime_savings"]["entry_count"]
|
|
200
|
+
assert n1 >= 1
|
|
198
201
|
# Second run — lifetime grows.
|
|
199
202
|
out2 = welcome(project_root=tmp_path, skip_certify=True)
|
|
200
|
-
assert out2["lifetime_savings"]["entry_count"]
|
|
203
|
+
assert out2["lifetime_savings"]["entry_count"] > n1
|
|
201
204
|
assert (out2["lifetime_savings"]["tokens_saved_lifetime"]
|
|
202
205
|
>= out1["lifetime_savings"]["tokens_saved_lifetime"])
|
|
203
206
|
|
|
204
207
|
|
|
205
208
|
def test_welcome_narrative_surfaces_lifetime_after_two_sessions(tmp_path: Path) -> None:
|
|
206
|
-
# First run
|
|
207
|
-
#
|
|
209
|
+
# First run will already show lifetime as of v0.78 because constituent
|
|
210
|
+
# verbs auto-ledger; subsequent runs continue to show it.
|
|
208
211
|
out1 = welcome(project_root=tmp_path, skip_certify=True)
|
|
209
|
-
assert "Lifetime savings" not in out1["narrative"]
|
|
210
|
-
# Second run shows it.
|
|
211
212
|
out2 = welcome(project_root=tmp_path, skip_certify=True)
|
|
212
213
|
assert "Lifetime savings" in out2["narrative"]
|
|
214
|
+
# First-run narrative may or may not show — just guard the second one.
|
|
215
|
+
assert out1["lifetime_savings"]["entry_count"] >= 1
|
|
213
216
|
|
|
214
217
|
|
|
215
218
|
# ---------- 4. polished failing-repo narrative -------------------------
|
|
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
|
|
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
|
|
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
|