atomadic-forge 0.82.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.82.0 → atomadic_forge-0.84.1}/CHANGELOG.md +15 -0
- {atomadic_forge-0.82.0/src/atomadic_forge.egg-info → atomadic_forge-0.84.1}/PKG-INFO +8 -44
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/README.md +7 -43
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/pyproject.toml +1 -1
- atomadic_forge-0.84.1/src/atomadic_forge/a1_at_functions/graft_extract_js.py +270 -0
- atomadic_forge-0.84.1/src/atomadic_forge/a1_at_functions/graft_extract_polyglot.py +354 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +2 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/graft_feature.py +210 -8
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1/src/atomadic_forge.egg-info}/PKG-INFO +8 -44
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/SOURCES.txt +4 -0
- atomadic_forge-0.84.1/tests/test_graft_js.py +102 -0
- atomadic_forge-0.84.1/tests/test_graft_polyglot.py +131 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/LICENSE +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/MANIFEST.in +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/SECURITY.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/02-commands.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/05-faq.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/README.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/config.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/create.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/setup.cfg +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/abstract_method_repair.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/closest_match.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cosine_similarity.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/graft_extract.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/ifwc_fuzz.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/levenshtein_distance.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/monadic_laws.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/recon_cache.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/repo_public_surface.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a2_mo_composites/repo_public_surface_sync.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.82.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.82.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.82.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.82.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.82.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.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/recipe_replay.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_monadic_laws_shared.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/aiom_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fingerprint.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/fuzz.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/graft.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/mcb_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/replay.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/token_savings.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_abstract_method_repair.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_chat.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cherry_dedup_class_methods.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cherry_pick.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_config.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_demo.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_finalize_scaffold.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_graft_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_harvest_source_warnings.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_ifwc_fuzz.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_monadic_laws.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_recipe_replay.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_recon_cache.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_repo_public_surface.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_token_savings_ledger.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.82.0 → atomadic_forge-0.84.1}/tests/test_wisdom.py +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
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
|
+
|
|
15
|
+
## v0.83.0 — 2026-05-08
|
|
16
|
+
|
|
17
|
+
- feat(forge): v0.83 — JS/TS graft support; arm Atomadic with capability transfer
|
|
18
|
+
|
|
19
|
+
|
|
5
20
|
## v0.82.0 — 2026-05-08
|
|
6
21
|
|
|
7
22
|
- feat(forge): v0.82 — graft sibling-ref auto-import + 2 grafted helpers
|
|
@@ -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
|
|
@@ -69,44 +69,6 @@ AI agents write code **10x faster** than humans can review it. Pattern violation
|
|
|
69
69
|
|
|
70
70
|
---
|
|
71
71
|
|
|
72
|
-
## What's New — v0.76 through v0.81
|
|
73
|
-
|
|
74
|
-
### v0.81 — Auto-wire Coercion + Recon Cache
|
|
75
|
-
|
|
76
|
-
- CLI stubs are now type-aware on `list[T]` args. `forge cosine-similarity --a 1.0,0.0 --b 1.0,0.0` resolves without manual casting.
|
|
77
|
-
- `run_recon(use_cache=True)` skips the AST walk on unchanged trees using a `(file_count, max_mtime, total_bytes)` fingerprint — eliminates redundant recon passes in harvest pipelines.
|
|
78
|
-
|
|
79
|
-
### v0.80 — Monadic Laws (4 advisory verbs)
|
|
80
|
-
|
|
81
|
-
- `forge mcb-check` — flags unbounded `while` loops and recursion in tier-a1 atoms.
|
|
82
|
-
- `forge aiom-check` — flags forbidden I/O imports (`requests`, `urllib`, `socket`, `subprocess`) in tier-a1.
|
|
83
|
-
- `forge fingerprint` — SHA-256 of every a1 module's normalised AST; stable across whitespace, tamper-evident.
|
|
84
|
-
- `forge fuzz <module>` — hypothesis property tests on any a1 callable carrying `__invariants__`.
|
|
85
|
-
- All four ship advisory by default; `--fail-on-violations` to make them block CI.
|
|
86
|
-
|
|
87
|
-
### v0.79 — Recipe Replayer
|
|
88
|
-
|
|
89
|
-
- `forge replay <recipe>` runs a golden recipe's `validation_gate` as subprocesses — zero LLM round-trips per step.
|
|
90
|
-
- Available recipes: `release_hardening`, `add_cli_command`, `fix_wire_violation`, `add_feature`, `publish_mcp`.
|
|
91
|
-
- Flags: `--dry-run`, `--keep-going`, `--list`, `--json`. Pass/fail automatically logged (×80 tokens) to the token-savings ledger.
|
|
92
|
-
|
|
93
|
-
### v0.78 — Token-Savings Auto-Ledger
|
|
94
|
-
|
|
95
|
-
- Every Forge verb that calls `enrich_response` now appends to a lifetime savings ledger at `<project>/.atomadic-forge/lifetime_savings.jsonl`. Covered verbs: recon, certify, wire, verify, auto, emergent, synergy.
|
|
96
|
-
- `forge token-savings` shows lifetime total + per-tool breakdown. File-backed, verifiable, auditable JSONL.
|
|
97
|
-
|
|
98
|
-
### v0.77 — Class/Method Dedup Fix
|
|
99
|
-
|
|
100
|
-
- Cherry-pick folds method qualnames whose parent class is already selected, collapsing the 47-file class explosion observed during large-repo absorptions (root-cause fix in `cherry_pick._dedup_methods_under_class`).
|
|
101
|
-
|
|
102
|
-
### v0.76 — Graft (surgical capability transfer)
|
|
103
|
-
|
|
104
|
-
- `forge graft --source-file <f> --symbol <name>` extracts one function or class from any Python source and lands it in the target's correct tier.
|
|
105
|
-
- `--rename` flag handles private-to-public conversion. Auto-wires CLI + MCP via `auto-wire` integration.
|
|
106
|
-
- Closes the gap between `transmute auto` (whole-repo) and single-symbol surgical absorption.
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
72
|
> 🎯 **300+ public OSS Python repositories absorbed end-to-end.** fastapi
|
|
111
73
|
> (98k★), scrapy (61k★), django-rest-framework (30k★), pytest (13.8k★),
|
|
112
74
|
> langgraph (31k★), openai-agents-python (26k★), cookiecutter (25k★),
|
|
@@ -117,9 +79,11 @@ AI agents write code **10x faster** than humans can review it. Pattern violation
|
|
|
117
79
|
> wire-clean, scaffold-complete, deterministic. Wire-PASS holds across
|
|
118
80
|
> the entire 300-seed corpus. Receipts in [`HARVEST_LEDGER.md`](HARVEST_LEDGER.md).
|
|
119
81
|
|
|
120
|
-
- **Catches architectural violations AI agents leave behind.** Deterministic tier-law enforcement — no LLM in the loop, no hallucinations.
|
|
121
|
-
- **
|
|
122
|
-
- **
|
|
82
|
+
- **Catches architectural violations AI agents leave behind.** Deterministic tier-law enforcement — no LLM in the loop, no hallucinations. Four monadic laws (MCB, AIOM, AHLP, IFWC) shipped as advisory AST scanners; promote to `--fail-on-violations` when ready.
|
|
83
|
+
- **Verifiable token savings.** Every Forge verb auto-appends to a file-backed JSONL ledger at `<project>/.atomadic-forge/lifetime_savings.jsonl`. `forge token-savings` prints the running total and per-tool breakdown. Auditable line-by-line — not a marketing claim.
|
|
84
|
+
- **Surgical capability grafting.** `forge graft --source-file X --symbol Y` extracts a single function or class from any Python source, lands it in the right tier, and auto-wires CLI + MCP. Sibling references resolve automatically. Closes the gap between whole-repo `transmute auto` and one-shot surgical absorption.
|
|
85
|
+
- **Deterministic recipe replay.** `forge replay <recipe>` runs a golden command chain (release hardening, add-cli-command, fix-wire-violation, add-feature, publish-mcp) as subprocesses — zero LLM round-trips per step.
|
|
86
|
+
- **One command: spaghetti -> certified architecture.** Python, JavaScript, TypeScript, **Rust, Go, Swift, Kotlin** — full pipeline (recon, wire, certify, scaffold, evolve) on every language. Recon cache short-circuits the AST walk on unchanged trees via tree fingerprint.
|
|
123
87
|
- **Bring your own LLM.** Built-in presets for OpenAI, Anthropic, Gemini, OpenRouter, DeepSeek, Groq, Together, Fireworks, xAI, Mistral, Perplexity, Cerebras, Hyperbolic, AAAA-Nexus, and Ollama — plus `forge config provider add` for any custom OpenAI-compatible endpoint. See [docs/PROVIDERS.md](docs/PROVIDERS.md).
|
|
124
88
|
- **IDE-native.** VS Code extension (`vscode-extension/`), MCP server for Claude Code / Cursor / Cowork / Windsurf, four ready-to-use Claude Code skills. See [docs/IDE_INTEGRATION.md](docs/IDE_INTEGRATION.md).
|
|
125
89
|
|
|
@@ -277,8 +241,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
277
241
|
|
|
278
242
|
| MCP tools | **10 tools · 116 actions** |
|
|
279
243
|
| CLI verbs | **79** |
|
|
280
|
-
| Source files | **
|
|
281
|
-
| Tests | **
|
|
244
|
+
| Source files | **246** (~49K LOC) |
|
|
245
|
+
| Tests | **1625 passing** across **121 test files** |
|
|
282
246
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
283
247
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
284
248
|
| Languages | Python, JS/TS, Swift, Kotlin, Go, Rust |
|
|
@@ -37,44 +37,6 @@ AI agents write code **10x faster** than humans can review it. Pattern violation
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
## What's New — v0.76 through v0.81
|
|
41
|
-
|
|
42
|
-
### v0.81 — Auto-wire Coercion + Recon Cache
|
|
43
|
-
|
|
44
|
-
- CLI stubs are now type-aware on `list[T]` args. `forge cosine-similarity --a 1.0,0.0 --b 1.0,0.0` resolves without manual casting.
|
|
45
|
-
- `run_recon(use_cache=True)` skips the AST walk on unchanged trees using a `(file_count, max_mtime, total_bytes)` fingerprint — eliminates redundant recon passes in harvest pipelines.
|
|
46
|
-
|
|
47
|
-
### v0.80 — Monadic Laws (4 advisory verbs)
|
|
48
|
-
|
|
49
|
-
- `forge mcb-check` — flags unbounded `while` loops and recursion in tier-a1 atoms.
|
|
50
|
-
- `forge aiom-check` — flags forbidden I/O imports (`requests`, `urllib`, `socket`, `subprocess`) in tier-a1.
|
|
51
|
-
- `forge fingerprint` — SHA-256 of every a1 module's normalised AST; stable across whitespace, tamper-evident.
|
|
52
|
-
- `forge fuzz <module>` — hypothesis property tests on any a1 callable carrying `__invariants__`.
|
|
53
|
-
- All four ship advisory by default; `--fail-on-violations` to make them block CI.
|
|
54
|
-
|
|
55
|
-
### v0.79 — Recipe Replayer
|
|
56
|
-
|
|
57
|
-
- `forge replay <recipe>` runs a golden recipe's `validation_gate` as subprocesses — zero LLM round-trips per step.
|
|
58
|
-
- Available recipes: `release_hardening`, `add_cli_command`, `fix_wire_violation`, `add_feature`, `publish_mcp`.
|
|
59
|
-
- Flags: `--dry-run`, `--keep-going`, `--list`, `--json`. Pass/fail automatically logged (×80 tokens) to the token-savings ledger.
|
|
60
|
-
|
|
61
|
-
### v0.78 — Token-Savings Auto-Ledger
|
|
62
|
-
|
|
63
|
-
- Every Forge verb that calls `enrich_response` now appends to a lifetime savings ledger at `<project>/.atomadic-forge/lifetime_savings.jsonl`. Covered verbs: recon, certify, wire, verify, auto, emergent, synergy.
|
|
64
|
-
- `forge token-savings` shows lifetime total + per-tool breakdown. File-backed, verifiable, auditable JSONL.
|
|
65
|
-
|
|
66
|
-
### v0.77 — Class/Method Dedup Fix
|
|
67
|
-
|
|
68
|
-
- Cherry-pick folds method qualnames whose parent class is already selected, collapsing the 47-file class explosion observed during large-repo absorptions (root-cause fix in `cherry_pick._dedup_methods_under_class`).
|
|
69
|
-
|
|
70
|
-
### v0.76 — Graft (surgical capability transfer)
|
|
71
|
-
|
|
72
|
-
- `forge graft --source-file <f> --symbol <name>` extracts one function or class from any Python source and lands it in the target's correct tier.
|
|
73
|
-
- `--rename` flag handles private-to-public conversion. Auto-wires CLI + MCP via `auto-wire` integration.
|
|
74
|
-
- Closes the gap between `transmute auto` (whole-repo) and single-symbol surgical absorption.
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
40
|
> 🎯 **300+ public OSS Python repositories absorbed end-to-end.** fastapi
|
|
79
41
|
> (98k★), scrapy (61k★), django-rest-framework (30k★), pytest (13.8k★),
|
|
80
42
|
> langgraph (31k★), openai-agents-python (26k★), cookiecutter (25k★),
|
|
@@ -85,9 +47,11 @@ AI agents write code **10x faster** than humans can review it. Pattern violation
|
|
|
85
47
|
> wire-clean, scaffold-complete, deterministic. Wire-PASS holds across
|
|
86
48
|
> the entire 300-seed corpus. Receipts in [`HARVEST_LEDGER.md`](HARVEST_LEDGER.md).
|
|
87
49
|
|
|
88
|
-
- **Catches architectural violations AI agents leave behind.** Deterministic tier-law enforcement — no LLM in the loop, no hallucinations.
|
|
89
|
-
- **
|
|
90
|
-
- **
|
|
50
|
+
- **Catches architectural violations AI agents leave behind.** Deterministic tier-law enforcement — no LLM in the loop, no hallucinations. Four monadic laws (MCB, AIOM, AHLP, IFWC) shipped as advisory AST scanners; promote to `--fail-on-violations` when ready.
|
|
51
|
+
- **Verifiable token savings.** Every Forge verb auto-appends to a file-backed JSONL ledger at `<project>/.atomadic-forge/lifetime_savings.jsonl`. `forge token-savings` prints the running total and per-tool breakdown. Auditable line-by-line — not a marketing claim.
|
|
52
|
+
- **Surgical capability grafting.** `forge graft --source-file X --symbol Y` extracts a single function or class from any Python source, lands it in the right tier, and auto-wires CLI + MCP. Sibling references resolve automatically. Closes the gap between whole-repo `transmute auto` and one-shot surgical absorption.
|
|
53
|
+
- **Deterministic recipe replay.** `forge replay <recipe>` runs a golden command chain (release hardening, add-cli-command, fix-wire-violation, add-feature, publish-mcp) as subprocesses — zero LLM round-trips per step.
|
|
54
|
+
- **One command: spaghetti -> certified architecture.** Python, JavaScript, TypeScript, **Rust, Go, Swift, Kotlin** — full pipeline (recon, wire, certify, scaffold, evolve) on every language. Recon cache short-circuits the AST walk on unchanged trees via tree fingerprint.
|
|
91
55
|
- **Bring your own LLM.** Built-in presets for OpenAI, Anthropic, Gemini, OpenRouter, DeepSeek, Groq, Together, Fireworks, xAI, Mistral, Perplexity, Cerebras, Hyperbolic, AAAA-Nexus, and Ollama — plus `forge config provider add` for any custom OpenAI-compatible endpoint. See [docs/PROVIDERS.md](docs/PROVIDERS.md).
|
|
92
56
|
- **IDE-native.** VS Code extension (`vscode-extension/`), MCP server for Claude Code / Cursor / Cowork / Windsurf, four ready-to-use Claude Code skills. See [docs/IDE_INTEGRATION.md](docs/IDE_INTEGRATION.md).
|
|
93
57
|
|
|
@@ -245,8 +209,8 @@ Full tool reference: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) | First call: `welco
|
|
|
245
209
|
|
|
246
210
|
| MCP tools | **10 tools · 116 actions** |
|
|
247
211
|
| CLI verbs | **79** |
|
|
248
|
-
| Source files | **
|
|
249
|
-
| Tests | **
|
|
212
|
+
| Source files | **246** (~49K LOC) |
|
|
213
|
+
| Tests | **1625 passing** across **121 test files** |
|
|
250
214
|
| Lean4 formal proofs | **872 theorems** (mathematically verified core logic) |
|
|
251
215
|
| Monadic tiers | **5** (a0 → a4, strict upward-only composition) |
|
|
252
216
|
| 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.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,270 @@
|
|
|
1
|
+
"""Tier a1 — JavaScript / TypeScript counterpart to ``graft_extract``.
|
|
2
|
+
|
|
3
|
+
Extract one named function or class slice from a ``.js`` / ``.ts`` /
|
|
4
|
+
``.mjs`` / ``.cjs`` source file. Reuses Forge's existing JS regex
|
|
5
|
+
parser (``js_parser._balance_braces``, ``parse_imports``) — no
|
|
6
|
+
external AST dependency.
|
|
7
|
+
|
|
8
|
+
Recognized headers (top-level only):
|
|
9
|
+
* ``export function foo(...)``
|
|
10
|
+
* ``export async function foo(...)``
|
|
11
|
+
* ``async function foo(...)``
|
|
12
|
+
* ``function foo(...)``
|
|
13
|
+
* ``export const foo = (...) =>``
|
|
14
|
+
* ``const foo = (...) =>``
|
|
15
|
+
* ``export class Foo``
|
|
16
|
+
* ``class Foo``
|
|
17
|
+
|
|
18
|
+
The extractor returns the verbatim source slice including the header
|
|
19
|
+
and balanced body braces. Imports referenced by the body are
|
|
20
|
+
resolved against the module's import table (ES6 + CommonJS) so the
|
|
21
|
+
rendered output module compiles standalone.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import re
|
|
26
|
+
from dataclasses import dataclass, field
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
from .js_parser import _balance_braces, parse_imports
|
|
30
|
+
|
|
31
|
+
JS_SUFFIXES: frozenset[str] = frozenset({".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx"})
|
|
32
|
+
|
|
33
|
+
_HEADER_PATTERNS: tuple[tuple[str, str], ...] = (
|
|
34
|
+
# (kind, regex) — first match wins. \b{name}\b prevents partial hits.
|
|
35
|
+
("function", r"^\s*(?:export\s+(?:default\s+)?)?(?:async\s+)?function\s+{name}\s*\("),
|
|
36
|
+
("arrow_const", r"^\s*(?:export\s+(?:default\s+)?)?const\s+{name}\s*=\s*(?:async\s+)?\("),
|
|
37
|
+
("arrow_let", r"^\s*(?:export\s+)?let\s+{name}\s*=\s*(?:async\s+)?\("),
|
|
38
|
+
("class", r"^\s*(?:export\s+(?:default\s+)?)?class\s+{name}\b"),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass(frozen=True)
|
|
43
|
+
class JsGraftExtract:
|
|
44
|
+
"""One extracted JS/TS symbol slice."""
|
|
45
|
+
symbol_name: str
|
|
46
|
+
kind: str # function | arrow_const | arrow_let | class
|
|
47
|
+
source: str
|
|
48
|
+
imports_needed: frozenset[str]
|
|
49
|
+
sibling_refs: frozenset[str] = field(default_factory=frozenset)
|
|
50
|
+
start_line: int = 0
|
|
51
|
+
end_line: int = 0
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _find_header(text: str, symbol_name: str) -> tuple[int, str] | None:
|
|
55
|
+
"""Locate the first matching header. Returns (start_offset, kind) or None."""
|
|
56
|
+
safe = re.escape(symbol_name)
|
|
57
|
+
for kind, pat in _HEADER_PATTERNS:
|
|
58
|
+
rx = re.compile(pat.format(name=safe), re.MULTILINE)
|
|
59
|
+
m = rx.search(text)
|
|
60
|
+
if m:
|
|
61
|
+
return (m.start(), kind)
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _line_of(text: str, offset: int) -> int:
|
|
66
|
+
"""1-based line number of the given character offset."""
|
|
67
|
+
return text.count("\n", 0, offset) + 1
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _slice_balanced(text: str, header_start: int, kind: str) -> tuple[str, int]:
|
|
71
|
+
"""Return (slice_text, end_offset_exclusive) starting at ``header_start``.
|
|
72
|
+
|
|
73
|
+
``function`` / ``class`` ⇒ find the next ``{`` and balance braces.
|
|
74
|
+
``arrow_*`` ⇒ same — assumes a block-bodied arrow ``= (...) => { ... }``.
|
|
75
|
+
"""
|
|
76
|
+
open_idx = text.find("{", header_start)
|
|
77
|
+
if open_idx == -1:
|
|
78
|
+
# Single-expression arrow ``= (...) => expr;`` — slice to next ``;``.
|
|
79
|
+
semi = text.find(";", header_start)
|
|
80
|
+
if semi == -1:
|
|
81
|
+
return text[header_start:], len(text)
|
|
82
|
+
return text[header_start:semi + 1] + "\n", semi + 1
|
|
83
|
+
close_idx = _balance_braces(text, open_idx)
|
|
84
|
+
if close_idx == -1:
|
|
85
|
+
return text[header_start:], len(text)
|
|
86
|
+
end = close_idx + 1
|
|
87
|
+
# Include trailing newline if present.
|
|
88
|
+
while end < len(text) and text[end] in (";", " ", "\t"):
|
|
89
|
+
end += 1
|
|
90
|
+
if end < len(text) and text[end] == "\n":
|
|
91
|
+
end += 1
|
|
92
|
+
return text[header_start:end], end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _walk_identifier_refs(slice_text: str) -> set[str]:
|
|
96
|
+
"""Return the set of bare identifiers referenced inside ``slice_text``.
|
|
97
|
+
|
|
98
|
+
Cheap regex scan — sufficient for "is this name from the module's
|
|
99
|
+
imports?" matching. Strips block comments and ``//`` lines first
|
|
100
|
+
so commented-out names don't pollute the set.
|
|
101
|
+
"""
|
|
102
|
+
s = re.sub(r"/\*.*?\*/", " ", slice_text, flags=re.DOTALL)
|
|
103
|
+
s = re.sub(r"//[^\n]*", " ", s)
|
|
104
|
+
return set(re.findall(r"\b[A-Za-z_$][\w$]*\b", s))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
_IMPORT_NAMED = re.compile(
|
|
108
|
+
r"^\s*import\s*(?:type\s+)?\{([^}]+)\}\s*from\s*['\"]([^'\"]+)['\"]",
|
|
109
|
+
re.MULTILINE,
|
|
110
|
+
)
|
|
111
|
+
_IMPORT_DEFAULT = re.compile(
|
|
112
|
+
r"^\s*import\s*(?:type\s+)?(\w+)\s*from\s*['\"]([^'\"]+)['\"]",
|
|
113
|
+
re.MULTILINE,
|
|
114
|
+
)
|
|
115
|
+
_IMPORT_NS = re.compile(
|
|
116
|
+
r"^\s*import\s*\*\s*as\s*(\w+)\s*from\s*['\"]([^'\"]+)['\"]",
|
|
117
|
+
re.MULTILINE,
|
|
118
|
+
)
|
|
119
|
+
_REQUIRE_DESTRUCT = re.compile(
|
|
120
|
+
r"^\s*(?:const|let|var)\s*\{([^}]+)\}\s*=\s*require\(\s*['\"]([^'\"]+)['\"]\s*\)",
|
|
121
|
+
re.MULTILINE,
|
|
122
|
+
)
|
|
123
|
+
_REQUIRE_BARE = re.compile(
|
|
124
|
+
r"^\s*(?:const|let|var)\s*(\w+)\s*=\s*require\(\s*['\"]([^'\"]+)['\"]\s*\)",
|
|
125
|
+
re.MULTILINE,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _import_table(text: str) -> dict[str, str]:
|
|
130
|
+
"""Return ``{bound_name: import_source_line}`` for the module."""
|
|
131
|
+
table: dict[str, str] = {}
|
|
132
|
+
for names_blob, src in _IMPORT_NAMED.findall(text):
|
|
133
|
+
names = [n.strip().split(" as ") for n in names_blob.split(",") if n.strip()]
|
|
134
|
+
for parts in names:
|
|
135
|
+
if not parts[0]:
|
|
136
|
+
continue
|
|
137
|
+
local = (parts[1] if len(parts) > 1 else parts[0]).strip()
|
|
138
|
+
orig = parts[0].strip()
|
|
139
|
+
if local == orig:
|
|
140
|
+
table[local] = f'import {{ {orig} }} from "{src}";'
|
|
141
|
+
else:
|
|
142
|
+
table[local] = f'import {{ {orig} as {local} }} from "{src}";'
|
|
143
|
+
for name, src in _IMPORT_DEFAULT.findall(text):
|
|
144
|
+
if name not in table:
|
|
145
|
+
table[name] = f'import {name} from "{src}";'
|
|
146
|
+
for name, src in _IMPORT_NS.findall(text):
|
|
147
|
+
table[name] = f'import * as {name} from "{src}";'
|
|
148
|
+
for names_blob, src in _REQUIRE_DESTRUCT.findall(text):
|
|
149
|
+
for n in names_blob.split(","):
|
|
150
|
+
n = n.strip()
|
|
151
|
+
if n:
|
|
152
|
+
table[n] = f'const {{ {n} }} = require("{src}");'
|
|
153
|
+
for name, src in _REQUIRE_BARE.findall(text):
|
|
154
|
+
if name not in table:
|
|
155
|
+
table[name] = f'const {name} = require("{src}");'
|
|
156
|
+
return table
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _top_level_def_names(text: str) -> set[str]:
|
|
160
|
+
"""Names of every top-level function / class / const-arrow / let-arrow."""
|
|
161
|
+
names: set[str] = set()
|
|
162
|
+
for _kind, pat in _HEADER_PATTERNS:
|
|
163
|
+
rx = re.compile(
|
|
164
|
+
pat.replace("{name}", r"(?P<name>[A-Za-z_$][\w$]*)"),
|
|
165
|
+
re.MULTILINE,
|
|
166
|
+
)
|
|
167
|
+
for m in rx.finditer(text):
|
|
168
|
+
names.add(m.group("name"))
|
|
169
|
+
return names
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def extract_symbol_js(source_file: Path, symbol_name: str) -> JsGraftExtract:
|
|
173
|
+
"""Extract a top-level JS/TS symbol slice from ``source_file``.
|
|
174
|
+
|
|
175
|
+
Raises:
|
|
176
|
+
FileNotFoundError: source file missing.
|
|
177
|
+
KeyError: no top-level symbol with ``symbol_name``.
|
|
178
|
+
"""
|
|
179
|
+
p = Path(source_file)
|
|
180
|
+
if not p.is_file():
|
|
181
|
+
raise FileNotFoundError(f"graft source not found: {p}")
|
|
182
|
+
if p.suffix.lower() not in JS_SUFFIXES:
|
|
183
|
+
raise ValueError(f"not a JS/TS source: {p.suffix}")
|
|
184
|
+
text = p.read_text(encoding="utf-8", errors="replace")
|
|
185
|
+
|
|
186
|
+
found = _find_header(text, symbol_name)
|
|
187
|
+
if found is None:
|
|
188
|
+
raise KeyError(
|
|
189
|
+
f"no top-level symbol named {symbol_name!r} in {p.name}",
|
|
190
|
+
)
|
|
191
|
+
header_start, kind = found
|
|
192
|
+
slice_text, end_offset = _slice_balanced(text, header_start, kind)
|
|
193
|
+
|
|
194
|
+
refs = _walk_identifier_refs(slice_text) - {symbol_name}
|
|
195
|
+
table = _import_table(text)
|
|
196
|
+
imports_needed = frozenset(name for name in refs if name in table)
|
|
197
|
+
|
|
198
|
+
siblings = _top_level_def_names(text) - {symbol_name}
|
|
199
|
+
sibling_refs = frozenset(refs & siblings)
|
|
200
|
+
|
|
201
|
+
return JsGraftExtract(
|
|
202
|
+
symbol_name=symbol_name,
|
|
203
|
+
kind=kind,
|
|
204
|
+
source=slice_text.rstrip() + "\n",
|
|
205
|
+
imports_needed=imports_needed,
|
|
206
|
+
sibling_refs=sibling_refs,
|
|
207
|
+
start_line=_line_of(text, header_start),
|
|
208
|
+
end_line=_line_of(text, end_offset),
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def render_grafted_module_js(
|
|
213
|
+
extract: JsGraftExtract,
|
|
214
|
+
*,
|
|
215
|
+
source_file: Path,
|
|
216
|
+
sibling_dir: str = ".",
|
|
217
|
+
) -> str:
|
|
218
|
+
"""Render a stand-alone JS module wrapping the extracted symbol.
|
|
219
|
+
|
|
220
|
+
Emits an ES6 module: file-level docstring banner (JSDoc), the
|
|
221
|
+
needed third-party imports verbatim, relative imports for any
|
|
222
|
+
sibling top-level defs the body references (``./<name>.js``),
|
|
223
|
+
a SCHEMA_VERSION marker constant, then the verbatim slice + a
|
|
224
|
+
named export.
|
|
225
|
+
"""
|
|
226
|
+
text = Path(source_file).read_text(encoding="utf-8", errors="replace")
|
|
227
|
+
table = _import_table(text)
|
|
228
|
+
needed = sorted(table[name] for name in extract.imports_needed if name in table)
|
|
229
|
+
|
|
230
|
+
parts: list[str] = []
|
|
231
|
+
parts.append(
|
|
232
|
+
f"/**\n * Grafted from {Path(source_file).name} "
|
|
233
|
+
f"(lines {extract.start_line}–{extract.end_line}) by `forge graft`.\n */",
|
|
234
|
+
)
|
|
235
|
+
parts.append("")
|
|
236
|
+
if needed:
|
|
237
|
+
parts.extend(needed)
|
|
238
|
+
parts.append("")
|
|
239
|
+
if extract.sibling_refs:
|
|
240
|
+
for sib in sorted(extract.sibling_refs):
|
|
241
|
+
parts.append(
|
|
242
|
+
f'import {{ {sib} }} from "{sibling_dir}/{sib}.js";',
|
|
243
|
+
)
|
|
244
|
+
parts.append("")
|
|
245
|
+
upper = re.sub(r"[^A-Za-z0-9]", "_", extract.symbol_name).upper().lstrip("_")
|
|
246
|
+
parts.append(
|
|
247
|
+
f'export const SCHEMA_VERSION_GRAFT_{upper} = '
|
|
248
|
+
f'"atomadic-forge.graft.{extract.symbol_name}/v1";',
|
|
249
|
+
)
|
|
250
|
+
parts.append("")
|
|
251
|
+
# Strip a leading ``export`` from the slice if present — we'll re-export
|
|
252
|
+
# ourselves at the bottom to keep the module shape predictable.
|
|
253
|
+
body = re.sub(r"^\s*export\s+(default\s+)?", "", extract.source, count=1)
|
|
254
|
+
parts.append(body.rstrip())
|
|
255
|
+
parts.append("")
|
|
256
|
+
parts.append(f"export {{ {extract.symbol_name} }};")
|
|
257
|
+
parts.append("")
|
|
258
|
+
return "\n".join(parts) + "\n"
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
# Re-import for callers wanting symbol surface.
|
|
262
|
+
_ = parse_imports # noqa: F401 (re-export hint)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
__all__ = [
|
|
266
|
+
"JS_SUFFIXES",
|
|
267
|
+
"JsGraftExtract",
|
|
268
|
+
"extract_symbol_js",
|
|
269
|
+
"render_grafted_module_js",
|
|
270
|
+
]
|