atomadic-forge 0.83.0__tar.gz → 0.84.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.83.0 → atomadic_forge-0.84.1}/CHANGELOG.md +10 -0
- {atomadic_forge-0.83.0/src/atomadic_forge.egg-info → atomadic_forge-0.84.1}/PKG-INFO +1 -1
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/pyproject.toml +1 -1
- atomadic_forge-0.84.1/src/atomadic_forge/a1_at_functions/graft_extract_polyglot.py +354 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +2 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/graft_feature.py +155 -25
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
- atomadic_forge-0.84.1/tests/test_graft_polyglot.py +131 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/LICENSE +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/MANIFEST.in +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/README.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/SECURITY.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/02-commands.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/05-faq.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/README.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/config.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/create.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/setup.cfg +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/closest_match.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/graft_extract_js.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/levenshtein_distance.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/monadic_laws.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recon_cache.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.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.83.0 → atomadic_forge-0.84.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.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/recipe_replay.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_monadic_laws_shared.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/aiom_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fingerprint.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fuzz.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/graft.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/mcb_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/replay.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/token_savings.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_chat.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cherry_dedup_class_methods.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_config.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_demo.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_graft_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_graft_js.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_harvest_source_warnings.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ifwc_fuzz.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_monadic_laws.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_recipe_replay.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_recon_cache.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_repo_public_surface.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_token_savings_ledger.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/tests/test_wisdom.py +0 -0
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.84.1 — 2026-05-08
|
|
6
|
+
|
|
7
|
+
- fix(mcp): add missing `items` to `repos` and `queries` array schemas in `explore` tool — resolves VS Code MCP validator rejection
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## v0.84.0 — 2026-05-08
|
|
11
|
+
|
|
12
|
+
- feat(forge): v0.84 — full polyglot graft + dynamic capabilities SoT
|
|
13
|
+
|
|
14
|
+
|
|
5
15
|
## v0.83.0 — 2026-05-08
|
|
6
16
|
|
|
7
17
|
- feat(forge): v0.83 — JS/TS graft support; arm Atomadic with capability transfer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.84.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
|
|
@@ -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.84.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"
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"""Tier a1 — Rust + Kotlin counterparts to ``graft_extract`` and
|
|
2
|
+
``graft_extract_js``. Same brace-balancing trick as the JS extractor;
|
|
3
|
+
language-specific header regexes drive symbol detection.
|
|
4
|
+
|
|
5
|
+
Rust supported headers:
|
|
6
|
+
* ``pub fn name``, ``fn name``, ``pub async fn name``, ``async fn name``
|
|
7
|
+
* ``pub struct Name``, ``struct Name``, ``pub enum Name``, ``enum Name``
|
|
8
|
+
* ``pub trait Name``, ``trait Name``
|
|
9
|
+
* ``impl Name`` / ``impl Trait for Name`` (block grouping)
|
|
10
|
+
|
|
11
|
+
Kotlin supported headers:
|
|
12
|
+
* ``fun name``, ``suspend fun name``, ``inline fun name``
|
|
13
|
+
* ``class Name``, ``data class Name``, ``sealed class Name``,
|
|
14
|
+
``object Name``, ``interface Name``
|
|
15
|
+
* Modifiers tolerated: ``public/internal/private/protected/open/final/abstract``.
|
|
16
|
+
|
|
17
|
+
Both reuse :func:`js_parser._balance_braces` for body extraction.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import re
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from .js_parser import _balance_braces
|
|
26
|
+
|
|
27
|
+
RUST_SUFFIXES: frozenset[str] = frozenset({".rs"})
|
|
28
|
+
KOTLIN_SUFFIXES: frozenset[str] = frozenset({".kt", ".kts"})
|
|
29
|
+
|
|
30
|
+
# ── Rust ───────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
_RUST_HEADERS: tuple[tuple[str, str], ...] = (
|
|
34
|
+
("function", r"^\s*(?:pub(?:\([^)]+\))?\s+)?(?:async\s+)?fn\s+{name}\b"),
|
|
35
|
+
("struct", r"^\s*(?:pub(?:\([^)]+\))?\s+)?struct\s+{name}\b"),
|
|
36
|
+
("enum", r"^\s*(?:pub(?:\([^)]+\))?\s+)?enum\s+{name}\b"),
|
|
37
|
+
("trait", r"^\s*(?:pub(?:\([^)]+\))?\s+)?trait\s+{name}\b"),
|
|
38
|
+
("impl", r"^\s*impl(?:\s*<[^>]+>)?\s+{name}\b"),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
_RUST_USE = re.compile(
|
|
42
|
+
r"^\s*(?:pub\s+)?use\s+([^;]+);", re.MULTILINE,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# ── Kotlin ─────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
_KOTLIN_MODS = (
|
|
50
|
+
r"(?:(?:public|internal|private|protected|open|final|abstract|"
|
|
51
|
+
r"sealed|data|inline|suspend|operator|infix|tailrec|external|override)\s+)*"
|
|
52
|
+
)
|
|
53
|
+
_KOTLIN_HEADERS: tuple[tuple[str, str], ...] = (
|
|
54
|
+
("function", rf"^\s*{_KOTLIN_MODS}fun\s+(?:<[^>]+>\s+)?(?:[A-Za-z_][\w<>.,?\s]*\.)?{{name}}\s*\("),
|
|
55
|
+
("class", rf"^\s*{_KOTLIN_MODS}class\s+{{name}}\b"),
|
|
56
|
+
("object", rf"^\s*{_KOTLIN_MODS}object\s+{{name}}\b"),
|
|
57
|
+
("interface", rf"^\s*{_KOTLIN_MODS}interface\s+{{name}}\b"),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
_KOTLIN_IMPORT = re.compile(
|
|
61
|
+
r"^\s*import\s+([\w.*]+)(?:\s+as\s+(\w+))?", re.MULTILINE,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ── Shared dataclass ──────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass(frozen=True)
|
|
69
|
+
class PolyglotGraftExtract:
|
|
70
|
+
"""Language-agnostic graft slice for Rust / Kotlin."""
|
|
71
|
+
symbol_name: str
|
|
72
|
+
kind: str
|
|
73
|
+
source: str
|
|
74
|
+
imports_needed: frozenset[str]
|
|
75
|
+
sibling_refs: frozenset[str] = field(default_factory=frozenset)
|
|
76
|
+
start_line: int = 0
|
|
77
|
+
end_line: int = 0
|
|
78
|
+
language: str = ""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ── Helpers ───────────────────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _line_of(text: str, offset: int) -> int:
|
|
85
|
+
return text.count("\n", 0, offset) + 1
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _find_header(text: str, symbol_name: str,
|
|
89
|
+
patterns: tuple[tuple[str, str], ...]) -> tuple[int, str] | None:
|
|
90
|
+
safe = re.escape(symbol_name)
|
|
91
|
+
for kind, pat in patterns:
|
|
92
|
+
rx = re.compile(pat.format(name=safe), re.MULTILINE)
|
|
93
|
+
m = rx.search(text)
|
|
94
|
+
if m:
|
|
95
|
+
return (m.start(), kind)
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _slice_balanced(text: str, header_start: int) -> tuple[str, int]:
|
|
100
|
+
"""Slice from header through balanced braces. Returns (slice, end_offset)."""
|
|
101
|
+
open_idx = text.find("{", header_start)
|
|
102
|
+
if open_idx == -1:
|
|
103
|
+
# No body block — slice to next blank line or semicolon.
|
|
104
|
+
nl = text.find("\n\n", header_start)
|
|
105
|
+
end = nl if nl != -1 else len(text)
|
|
106
|
+
return text[header_start:end] + "\n", end
|
|
107
|
+
close_idx = _balance_braces(text, open_idx)
|
|
108
|
+
if close_idx == -1:
|
|
109
|
+
return text[header_start:], len(text)
|
|
110
|
+
end = close_idx + 1
|
|
111
|
+
if end < len(text) and text[end] == "\n":
|
|
112
|
+
end += 1
|
|
113
|
+
return text[header_start:end], end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _walk_idents(slice_text: str) -> set[str]:
|
|
117
|
+
"""Identifiers referenced in slice (block + line comments stripped)."""
|
|
118
|
+
s = re.sub(r"/\*.*?\*/", " ", slice_text, flags=re.DOTALL)
|
|
119
|
+
s = re.sub(r"//[^\n]*", " ", s)
|
|
120
|
+
return set(re.findall(r"\b[A-Za-z_][\w]*\b", s))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ── Rust extractor ────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _rust_import_table(text: str) -> dict[str, str]:
|
|
127
|
+
"""Map ``last_segment`` (or alias) → full ``use`` line.
|
|
128
|
+
|
|
129
|
+
``use std::collections::HashMap;`` → ``{"HashMap": "use std::collections::HashMap;"}``
|
|
130
|
+
``use foo::Bar as Quux;`` → ``{"Quux": "use foo::Bar as Quux;"}``
|
|
131
|
+
"""
|
|
132
|
+
table: dict[str, str] = {}
|
|
133
|
+
for body in _RUST_USE.findall(text):
|
|
134
|
+
full = f"use {body.strip()};"
|
|
135
|
+
last = body.strip().split("::")[-1].strip()
|
|
136
|
+
# alias form
|
|
137
|
+
m = re.match(r"(\w+)\s+as\s+(\w+)", last)
|
|
138
|
+
if m:
|
|
139
|
+
table[m.group(2)] = full
|
|
140
|
+
continue
|
|
141
|
+
# group brace form `use foo::{A, B as X}`
|
|
142
|
+
m = re.match(r"\{([^}]+)\}", last)
|
|
143
|
+
if m:
|
|
144
|
+
for piece in m.group(1).split(","):
|
|
145
|
+
piece = piece.strip()
|
|
146
|
+
am = re.match(r"(\w+)\s+as\s+(\w+)", piece)
|
|
147
|
+
if am:
|
|
148
|
+
table[am.group(2)] = full
|
|
149
|
+
else:
|
|
150
|
+
name = piece.split(" as ")[-1].strip().strip("{}")
|
|
151
|
+
if name:
|
|
152
|
+
table[name] = full
|
|
153
|
+
continue
|
|
154
|
+
if last:
|
|
155
|
+
table[last] = full
|
|
156
|
+
return table
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _rust_top_defs(text: str) -> set[str]:
|
|
160
|
+
out: set[str] = set()
|
|
161
|
+
for _kind, pat in _RUST_HEADERS:
|
|
162
|
+
rx = re.compile(
|
|
163
|
+
pat.replace("{name}", r"(?P<name>[A-Za-z_]\w*)"),
|
|
164
|
+
re.MULTILINE,
|
|
165
|
+
)
|
|
166
|
+
for m in rx.finditer(text):
|
|
167
|
+
out.add(m.group("name"))
|
|
168
|
+
return out
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _walk_back_rust_attrs(text: str, header_start: int) -> int:
|
|
172
|
+
"""Extend the slice start to include preceding ``#[...]`` attributes.
|
|
173
|
+
|
|
174
|
+
Walks each immediately-preceding non-blank line; if it starts with
|
|
175
|
+
``#[`` (or `///` doc), include it. Stops at the first non-attribute,
|
|
176
|
+
non-doc line.
|
|
177
|
+
"""
|
|
178
|
+
cursor = header_start
|
|
179
|
+
while cursor > 0:
|
|
180
|
+
line_start = text.rfind("\n", 0, cursor - 1) + 1
|
|
181
|
+
line = text[line_start:cursor].strip()
|
|
182
|
+
if line.startswith("#[") or line.startswith("///"):
|
|
183
|
+
cursor = line_start
|
|
184
|
+
else:
|
|
185
|
+
break
|
|
186
|
+
return cursor
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def extract_symbol_rust(source_file: Path,
|
|
190
|
+
symbol_name: str) -> PolyglotGraftExtract:
|
|
191
|
+
p = Path(source_file)
|
|
192
|
+
if not p.is_file():
|
|
193
|
+
raise FileNotFoundError(f"graft source not found: {p}")
|
|
194
|
+
if p.suffix.lower() not in RUST_SUFFIXES:
|
|
195
|
+
raise ValueError(f"not a Rust source: {p.suffix}")
|
|
196
|
+
text = p.read_text(encoding="utf-8", errors="replace")
|
|
197
|
+
found = _find_header(text, symbol_name, _RUST_HEADERS)
|
|
198
|
+
if found is None:
|
|
199
|
+
raise KeyError(
|
|
200
|
+
f"no top-level Rust symbol named {symbol_name!r} in {p.name}",
|
|
201
|
+
)
|
|
202
|
+
header_start, kind = found
|
|
203
|
+
header_start = _walk_back_rust_attrs(text, header_start)
|
|
204
|
+
slice_text, end_offset = _slice_balanced(text, header_start)
|
|
205
|
+
refs = _walk_idents(slice_text) - {symbol_name}
|
|
206
|
+
table = _rust_import_table(text)
|
|
207
|
+
imports_needed = frozenset(name for name in refs if name in table)
|
|
208
|
+
siblings = _rust_top_defs(text) - {symbol_name}
|
|
209
|
+
sibling_refs = frozenset(refs & siblings)
|
|
210
|
+
return PolyglotGraftExtract(
|
|
211
|
+
symbol_name=symbol_name,
|
|
212
|
+
kind=kind,
|
|
213
|
+
source=slice_text.rstrip() + "\n",
|
|
214
|
+
imports_needed=imports_needed,
|
|
215
|
+
sibling_refs=sibling_refs,
|
|
216
|
+
start_line=_line_of(text, header_start),
|
|
217
|
+
end_line=_line_of(text, end_offset),
|
|
218
|
+
language="rust",
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def render_grafted_module_rust(extract: PolyglotGraftExtract,
|
|
223
|
+
*, source_file: Path) -> str:
|
|
224
|
+
text = Path(source_file).read_text(encoding="utf-8", errors="replace")
|
|
225
|
+
table = _rust_import_table(text)
|
|
226
|
+
needed = sorted(table[n] for n in extract.imports_needed if n in table)
|
|
227
|
+
parts: list[str] = []
|
|
228
|
+
parts.append(
|
|
229
|
+
f"// Grafted from {Path(source_file).name} "
|
|
230
|
+
f"(lines {extract.start_line}–{extract.end_line}) by `forge graft`.",
|
|
231
|
+
)
|
|
232
|
+
parts.append("")
|
|
233
|
+
if needed:
|
|
234
|
+
parts.extend(needed)
|
|
235
|
+
parts.append("")
|
|
236
|
+
if extract.sibling_refs:
|
|
237
|
+
for sib in sorted(extract.sibling_refs):
|
|
238
|
+
parts.append(f"use crate::{sib}::{sib};")
|
|
239
|
+
parts.append("")
|
|
240
|
+
upper = re.sub(r"[^A-Za-z0-9]", "_", extract.symbol_name).upper().lstrip("_")
|
|
241
|
+
parts.append(
|
|
242
|
+
f'pub const SCHEMA_VERSION_GRAFT_{upper}: &str = '
|
|
243
|
+
f'"atomadic-forge.graft.{extract.symbol_name}/v1";',
|
|
244
|
+
)
|
|
245
|
+
parts.append("")
|
|
246
|
+
parts.append(extract.source.rstrip())
|
|
247
|
+
parts.append("")
|
|
248
|
+
return "\n".join(parts) + "\n"
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
# ── Kotlin extractor ──────────────────────────────────────────────
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _kotlin_import_table(text: str) -> dict[str, str]:
|
|
255
|
+
"""Bound name → ``import a.b.C [as Alias]`` line.
|
|
256
|
+
|
|
257
|
+
Wildcard imports (``import a.b.*``) are skipped — too coarse to map
|
|
258
|
+
a single bound name back to a single line.
|
|
259
|
+
"""
|
|
260
|
+
table: dict[str, str] = {}
|
|
261
|
+
for full, alias in _KOTLIN_IMPORT.findall(text):
|
|
262
|
+
if full.endswith(".*"):
|
|
263
|
+
continue
|
|
264
|
+
last = full.rsplit(".", 1)[-1]
|
|
265
|
+
local = alias or last
|
|
266
|
+
line = f"import {full}"
|
|
267
|
+
if alias:
|
|
268
|
+
line = f"import {full} as {alias}"
|
|
269
|
+
table[local] = line
|
|
270
|
+
return table
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _kotlin_top_defs(text: str) -> set[str]:
|
|
274
|
+
out: set[str] = set()
|
|
275
|
+
for _kind, pat in _KOTLIN_HEADERS:
|
|
276
|
+
rx = re.compile(
|
|
277
|
+
pat.replace("{name}", r"(?P<name>[A-Za-z_]\w*)"),
|
|
278
|
+
re.MULTILINE,
|
|
279
|
+
)
|
|
280
|
+
for m in rx.finditer(text):
|
|
281
|
+
out.add(m.group("name"))
|
|
282
|
+
return out
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def extract_symbol_kotlin(source_file: Path,
|
|
286
|
+
symbol_name: str) -> PolyglotGraftExtract:
|
|
287
|
+
p = Path(source_file)
|
|
288
|
+
if not p.is_file():
|
|
289
|
+
raise FileNotFoundError(f"graft source not found: {p}")
|
|
290
|
+
if p.suffix.lower() not in KOTLIN_SUFFIXES:
|
|
291
|
+
raise ValueError(f"not a Kotlin source: {p.suffix}")
|
|
292
|
+
text = p.read_text(encoding="utf-8", errors="replace")
|
|
293
|
+
found = _find_header(text, symbol_name, _KOTLIN_HEADERS)
|
|
294
|
+
if found is None:
|
|
295
|
+
raise KeyError(
|
|
296
|
+
f"no top-level Kotlin symbol named {symbol_name!r} in {p.name}",
|
|
297
|
+
)
|
|
298
|
+
header_start, kind = found
|
|
299
|
+
slice_text, end_offset = _slice_balanced(text, header_start)
|
|
300
|
+
refs = _walk_idents(slice_text) - {symbol_name}
|
|
301
|
+
table = _kotlin_import_table(text)
|
|
302
|
+
imports_needed = frozenset(n for n in refs if n in table)
|
|
303
|
+
siblings = _kotlin_top_defs(text) - {symbol_name}
|
|
304
|
+
sibling_refs = frozenset(refs & siblings)
|
|
305
|
+
return PolyglotGraftExtract(
|
|
306
|
+
symbol_name=symbol_name,
|
|
307
|
+
kind=kind,
|
|
308
|
+
source=slice_text.rstrip() + "\n",
|
|
309
|
+
imports_needed=imports_needed,
|
|
310
|
+
sibling_refs=sibling_refs,
|
|
311
|
+
start_line=_line_of(text, header_start),
|
|
312
|
+
end_line=_line_of(text, end_offset),
|
|
313
|
+
language="kotlin",
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def render_grafted_module_kotlin(extract: PolyglotGraftExtract,
|
|
318
|
+
*, source_file: Path,
|
|
319
|
+
package: str = "") -> str:
|
|
320
|
+
text = Path(source_file).read_text(encoding="utf-8", errors="replace")
|
|
321
|
+
table = _kotlin_import_table(text)
|
|
322
|
+
needed = sorted(table[n] for n in extract.imports_needed if n in table)
|
|
323
|
+
parts: list[str] = []
|
|
324
|
+
if package:
|
|
325
|
+
parts.append(f"package {package}")
|
|
326
|
+
parts.append("")
|
|
327
|
+
parts.append(
|
|
328
|
+
f"// Grafted from {Path(source_file).name} "
|
|
329
|
+
f"(lines {extract.start_line}–{extract.end_line}) by `forge graft`.",
|
|
330
|
+
)
|
|
331
|
+
parts.append("")
|
|
332
|
+
if needed:
|
|
333
|
+
parts.extend(needed)
|
|
334
|
+
parts.append("")
|
|
335
|
+
upper = re.sub(r"[^A-Za-z0-9]", "_", extract.symbol_name).upper().lstrip("_")
|
|
336
|
+
parts.append(
|
|
337
|
+
f'const val SCHEMA_VERSION_GRAFT_{upper} = '
|
|
338
|
+
f'"atomadic-forge.graft.{extract.symbol_name}/v1"',
|
|
339
|
+
)
|
|
340
|
+
parts.append("")
|
|
341
|
+
parts.append(extract.source.rstrip())
|
|
342
|
+
parts.append("")
|
|
343
|
+
return "\n".join(parts) + "\n"
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
__all__ = [
|
|
347
|
+
"KOTLIN_SUFFIXES",
|
|
348
|
+
"RUST_SUFFIXES",
|
|
349
|
+
"PolyglotGraftExtract",
|
|
350
|
+
"extract_symbol_kotlin",
|
|
351
|
+
"extract_symbol_rust",
|
|
352
|
+
"render_grafted_module_kotlin",
|
|
353
|
+
"render_grafted_module_rust",
|
|
354
|
+
]
|
{atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py
RENAMED
|
@@ -3087,6 +3087,7 @@ TOOLS: dict[str, dict[str, Any]] = {
|
|
|
3087
3087
|
"description": "[recon/harvest] Repo path."},
|
|
3088
3088
|
"repos": {
|
|
3089
3089
|
"type": "array",
|
|
3090
|
+
"items": {"type": "string"},
|
|
3090
3091
|
"description": "[recon] list of repo paths (max 23); [swarm] list of {src_root, package} objects.",
|
|
3091
3092
|
"minItems": 1, "maxItems": 23,
|
|
3092
3093
|
},
|
|
@@ -3121,6 +3122,7 @@ TOOLS: dict[str, dict[str, Any]] = {
|
|
|
3121
3122
|
# capability_scout params
|
|
3122
3123
|
"queries": {
|
|
3123
3124
|
"type": ["string", "array"],
|
|
3125
|
+
"items": {"type": "string"},
|
|
3124
3126
|
"description": "[capability_scout] Comma-separated or list of capability search queries.",
|
|
3125
3127
|
},
|
|
3126
3128
|
"per_query": {"type": "integer", "default": 8,
|
{atomadic_forge-0.83.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/graft_feature.py
RENAMED
|
@@ -23,6 +23,7 @@ Pipeline::
|
|
|
23
23
|
"""
|
|
24
24
|
from __future__ import annotations
|
|
25
25
|
|
|
26
|
+
import json
|
|
26
27
|
import shutil
|
|
27
28
|
from dataclasses import asdict, dataclass
|
|
28
29
|
from pathlib import Path
|
|
@@ -38,11 +39,79 @@ from ..a1_at_functions.graft_extract_js import (
|
|
|
38
39
|
extract_symbol_js,
|
|
39
40
|
render_grafted_module_js,
|
|
40
41
|
)
|
|
42
|
+
from ..a1_at_functions.graft_extract_polyglot import (
|
|
43
|
+
KOTLIN_SUFFIXES,
|
|
44
|
+
RUST_SUFFIXES,
|
|
45
|
+
extract_symbol_kotlin,
|
|
46
|
+
extract_symbol_rust,
|
|
47
|
+
render_grafted_module_kotlin,
|
|
48
|
+
render_grafted_module_rust,
|
|
49
|
+
)
|
|
41
50
|
from ..a1_at_functions.wire_check import scan_violations
|
|
42
51
|
|
|
43
52
|
SCHEMA_VERSION_GRAFT_V1 = "atomadic-forge.graft/v1"
|
|
53
|
+
SCHEMA_VERSION_CAPABILITIES_V1 = "atomadic.capabilities/v1"
|
|
44
54
|
DEFAULT_TARGET_PACKAGE = "atomadic_forge"
|
|
45
55
|
|
|
56
|
+
CAPABILITIES_RELPATH = "a0_qk_constants/capabilities.json"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _update_capabilities_sot(
|
|
60
|
+
pkg_dir: Path,
|
|
61
|
+
*,
|
|
62
|
+
symbol_name: str,
|
|
63
|
+
tier: str,
|
|
64
|
+
kind: str,
|
|
65
|
+
language: str,
|
|
66
|
+
source_file: str,
|
|
67
|
+
target_path: str,
|
|
68
|
+
) -> str | None:
|
|
69
|
+
"""Append/refresh an entry in the SoT capabilities.json under pkg_dir.
|
|
70
|
+
|
|
71
|
+
Best-effort: if the parent dir doesn't exist, do nothing (returns None).
|
|
72
|
+
The SoT is the file Atomadic loads at boot to know what powers he has;
|
|
73
|
+
keeping it dynamic means his self-awareness grows in lockstep with
|
|
74
|
+
every graft.
|
|
75
|
+
"""
|
|
76
|
+
import datetime as _dt
|
|
77
|
+
sot_path = pkg_dir / CAPABILITIES_RELPATH
|
|
78
|
+
if not sot_path.parent.is_dir():
|
|
79
|
+
return None
|
|
80
|
+
now = _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
81
|
+
payload: dict[str, Any]
|
|
82
|
+
try:
|
|
83
|
+
payload = json.loads(sot_path.read_text(encoding="utf-8"))
|
|
84
|
+
if not isinstance(payload, dict):
|
|
85
|
+
payload = {}
|
|
86
|
+
except (OSError, ValueError):
|
|
87
|
+
payload = {}
|
|
88
|
+
payload.setdefault("schema_version", SCHEMA_VERSION_CAPABILITIES_V1)
|
|
89
|
+
payload.setdefault("agent", pkg_dir.name)
|
|
90
|
+
caps = payload.setdefault("capabilities", [])
|
|
91
|
+
if not isinstance(caps, list):
|
|
92
|
+
caps = []
|
|
93
|
+
# Replace existing entry for the same symbol so re-grafts overwrite.
|
|
94
|
+
caps = [c for c in caps if c.get("name") != symbol_name]
|
|
95
|
+
caps.append({
|
|
96
|
+
"name": symbol_name,
|
|
97
|
+
"tier": tier,
|
|
98
|
+
"kind": kind,
|
|
99
|
+
"language": language,
|
|
100
|
+
"grafted_from": source_file,
|
|
101
|
+
"grafted_at_utc": now,
|
|
102
|
+
"module_path": target_path,
|
|
103
|
+
})
|
|
104
|
+
payload["capabilities"] = caps
|
|
105
|
+
payload["updated_at_utc"] = now
|
|
106
|
+
payload["count"] = len(caps)
|
|
107
|
+
try:
|
|
108
|
+
sot_path.write_text(
|
|
109
|
+
json.dumps(payload, indent=2, default=str), encoding="utf-8",
|
|
110
|
+
)
|
|
111
|
+
return str(sot_path)
|
|
112
|
+
except OSError:
|
|
113
|
+
return None
|
|
114
|
+
|
|
46
115
|
# Tier the graft lands in based on extracted symbol kind. Functions
|
|
47
116
|
# default to a1 (pure helpers); classes default to a2 (composites);
|
|
48
117
|
# the caller can override with --tier.
|
|
@@ -176,13 +245,13 @@ def graft(
|
|
|
176
245
|
source_path = Path(source_file).resolve()
|
|
177
246
|
target_path_root = Path(target_root).resolve()
|
|
178
247
|
|
|
179
|
-
# v0.83: dispatch by source suffix.
|
|
180
|
-
|
|
181
|
-
is_js =
|
|
248
|
+
# v0.83/v0.84: dispatch by source suffix.
|
|
249
|
+
suffix = source_path.suffix.lower()
|
|
250
|
+
is_js = suffix in JS_SUFFIXES
|
|
251
|
+
is_rust = suffix in RUST_SUFFIXES
|
|
252
|
+
is_kotlin = suffix in KOTLIN_SUFFIXES
|
|
182
253
|
if is_js:
|
|
183
254
|
js_extract = extract_symbol_js(source_path, symbol_name)
|
|
184
|
-
# Adapt JsGraftExtract to the same shape as GraftExtract so the
|
|
185
|
-
# rest of the pipeline (rename, write, wire) stays unchanged.
|
|
186
255
|
extract = GraftExtract(
|
|
187
256
|
symbol_name=js_extract.symbol_name,
|
|
188
257
|
kind=js_extract.kind,
|
|
@@ -192,6 +261,22 @@ def graft(
|
|
|
192
261
|
end_line=js_extract.end_line,
|
|
193
262
|
sibling_refs=js_extract.sibling_refs,
|
|
194
263
|
)
|
|
264
|
+
elif is_rust:
|
|
265
|
+
rs = extract_symbol_rust(source_path, symbol_name)
|
|
266
|
+
extract = GraftExtract(
|
|
267
|
+
symbol_name=rs.symbol_name, kind=rs.kind, source=rs.source,
|
|
268
|
+
imports_needed=rs.imports_needed,
|
|
269
|
+
start_line=rs.start_line, end_line=rs.end_line,
|
|
270
|
+
sibling_refs=rs.sibling_refs,
|
|
271
|
+
)
|
|
272
|
+
elif is_kotlin:
|
|
273
|
+
kt = extract_symbol_kotlin(source_path, symbol_name)
|
|
274
|
+
extract = GraftExtract(
|
|
275
|
+
symbol_name=kt.symbol_name, kind=kt.kind, source=kt.source,
|
|
276
|
+
imports_needed=kt.imports_needed,
|
|
277
|
+
start_line=kt.start_line, end_line=kt.end_line,
|
|
278
|
+
sibling_refs=kt.sibling_refs,
|
|
279
|
+
)
|
|
195
280
|
else:
|
|
196
281
|
extract = extract_symbol(source_path, symbol_name)
|
|
197
282
|
|
|
@@ -212,27 +297,42 @@ def graft(
|
|
|
212
297
|
end_line=extract.end_line,
|
|
213
298
|
)
|
|
214
299
|
|
|
215
|
-
#
|
|
300
|
+
# Tier defaults vary by language for class-shaped kinds.
|
|
216
301
|
if is_js:
|
|
217
|
-
|
|
302
|
+
default_tier = (
|
|
218
303
|
"a2_mo_composites" if extract.kind == "class" else "a1_at_functions"
|
|
219
304
|
)
|
|
220
|
-
|
|
305
|
+
elif is_rust:
|
|
306
|
+
default_tier = (
|
|
307
|
+
"a2_mo_composites" if extract.kind in ("struct", "enum", "trait", "impl")
|
|
308
|
+
else "a1_at_functions"
|
|
309
|
+
)
|
|
310
|
+
elif is_kotlin:
|
|
311
|
+
default_tier = (
|
|
312
|
+
"a2_mo_composites" if extract.kind in ("class", "object", "interface")
|
|
313
|
+
else "a1_at_functions"
|
|
314
|
+
)
|
|
221
315
|
else:
|
|
222
|
-
|
|
316
|
+
default_tier = _DEFAULT_TIERS.get(extract.kind, "a3_og_features")
|
|
317
|
+
chosen_tier = tier or default_tier
|
|
318
|
+
|
|
319
|
+
if is_js:
|
|
320
|
+
dest_suffix = ".js"
|
|
321
|
+
elif is_rust:
|
|
322
|
+
dest_suffix = ".rs"
|
|
323
|
+
elif is_kotlin:
|
|
324
|
+
dest_suffix = ".kt"
|
|
325
|
+
else:
|
|
326
|
+
dest_suffix = ".py"
|
|
223
327
|
dest = _resolve_target_module(
|
|
224
328
|
target_path_root, package, chosen_tier, effective_name,
|
|
225
|
-
suffix=
|
|
329
|
+
suffix=dest_suffix,
|
|
226
330
|
)
|
|
331
|
+
|
|
227
332
|
if is_js:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
js_extract = extract_symbol_js(source_path, effective_name) \
|
|
231
|
-
if effective_name == symbol_name \
|
|
232
|
-
else extract_symbol_js(source_path, symbol_name)
|
|
333
|
+
from ..a1_at_functions.graft_extract_js import JsGraftExtract
|
|
334
|
+
js_extract = extract_symbol_js(source_path, symbol_name)
|
|
233
335
|
if effective_name != symbol_name:
|
|
234
|
-
# Apply rename to the JS extract source too.
|
|
235
|
-
from ..a1_at_functions.graft_extract_js import JsGraftExtract
|
|
236
336
|
renamed = _rename_symbol_in_source(
|
|
237
337
|
js_extract.source, symbol_name, effective_name,
|
|
238
338
|
)
|
|
@@ -245,13 +345,15 @@ def graft(
|
|
|
245
345
|
start_line=js_extract.start_line,
|
|
246
346
|
end_line=js_extract.end_line,
|
|
247
347
|
)
|
|
248
|
-
rendered = render_grafted_module_js(
|
|
249
|
-
|
|
250
|
-
)
|
|
348
|
+
rendered = render_grafted_module_js(js_extract, source_file=source_path)
|
|
349
|
+
elif is_rust:
|
|
350
|
+
rs_extract = extract_symbol_rust(source_path, symbol_name)
|
|
351
|
+
rendered = render_grafted_module_rust(rs_extract, source_file=source_path)
|
|
352
|
+
elif is_kotlin:
|
|
353
|
+
kt_extract = extract_symbol_kotlin(source_path, symbol_name)
|
|
354
|
+
rendered = render_grafted_module_kotlin(kt_extract, source_file=source_path)
|
|
251
355
|
else:
|
|
252
|
-
rendered = render_grafted_module(
|
|
253
|
-
extract, source_file=source_path,
|
|
254
|
-
)
|
|
356
|
+
rendered = render_grafted_module(extract, source_file=source_path)
|
|
255
357
|
|
|
256
358
|
backup_path: str | None = None
|
|
257
359
|
written = False
|
|
@@ -274,13 +376,41 @@ def graft(
|
|
|
274
376
|
bytes_written = len(rendered.encode("utf-8"))
|
|
275
377
|
written = True
|
|
276
378
|
|
|
379
|
+
# v0.84: keep the agent's capabilities SoT current. Best-effort:
|
|
380
|
+
# if the package has an a0_qk_constants/ dir we drop a
|
|
381
|
+
# capabilities.json entry so an agent loading it knows what
|
|
382
|
+
# powers it now has. Skipped silently if no SoT directory.
|
|
383
|
+
pkg_root_dir = (
|
|
384
|
+
target_path_root / "src" / package
|
|
385
|
+
if (target_path_root / "src" / package).is_dir()
|
|
386
|
+
else target_path_root / package
|
|
387
|
+
)
|
|
388
|
+
language = (
|
|
389
|
+
"javascript" if is_js
|
|
390
|
+
else "rust" if is_rust
|
|
391
|
+
else "kotlin" if is_kotlin
|
|
392
|
+
else "python"
|
|
393
|
+
)
|
|
394
|
+
_update_capabilities_sot(
|
|
395
|
+
pkg_root_dir,
|
|
396
|
+
symbol_name=effective_name,
|
|
397
|
+
tier=chosen_tier,
|
|
398
|
+
kind=extract.kind,
|
|
399
|
+
language=language,
|
|
400
|
+
source_file=str(source_path),
|
|
401
|
+
target_path=str(dest),
|
|
402
|
+
)
|
|
403
|
+
|
|
277
404
|
# Run a focused wire scan on the package: a graft that introduces
|
|
278
405
|
# an upward import is rejected on the spot. Caller can roll back
|
|
279
406
|
# using backup_path if needed.
|
|
280
407
|
try:
|
|
281
|
-
|
|
282
|
-
target_path_root / "src" / package
|
|
408
|
+
scan_root = (
|
|
409
|
+
target_path_root / "src" / package
|
|
410
|
+
if (target_path_root / "src" / package).is_dir()
|
|
411
|
+
else target_path_root / package
|
|
283
412
|
)
|
|
413
|
+
wire_report = scan_violations(scan_root)
|
|
284
414
|
wire_violations = int(wire_report.get("violation_count", 0))
|
|
285
415
|
wire_verdict = wire_report.get("verdict", "UNKNOWN")
|
|
286
416
|
except Exception: # pragma: no cover - diagnostic only
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.84.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
|
|
@@ -184,6 +184,7 @@ src/atomadic_forge/a1_at_functions/generation_quality.py
|
|
|
184
184
|
src/atomadic_forge/a1_at_functions/git_churn.py
|
|
185
185
|
src/atomadic_forge/a1_at_functions/graft_extract.py
|
|
186
186
|
src/atomadic_forge/a1_at_functions/graft_extract_js.py
|
|
187
|
+
src/atomadic_forge/a1_at_functions/graft_extract_polyglot.py
|
|
187
188
|
src/atomadic_forge/a1_at_functions/handoff_builder.py
|
|
188
189
|
src/atomadic_forge/a1_at_functions/harvest_absorb.py
|
|
189
190
|
src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py
|
|
@@ -407,6 +408,7 @@ tests/test_generation_quality.py
|
|
|
407
408
|
tests/test_git_churn.py
|
|
408
409
|
tests/test_graft_feature.py
|
|
409
410
|
tests/test_graft_js.py
|
|
411
|
+
tests/test_graft_polyglot.py
|
|
410
412
|
tests/test_handoff.py
|
|
411
413
|
tests/test_harvest_concept_bridge.py
|
|
412
414
|
tests/test_harvest_source_warnings.py
|