atomadic-forge 0.57.1__tar.gz → 0.59.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {atomadic_forge-0.57.1/src/atomadic_forge.egg-info → atomadic_forge-0.59.0}/PKG-INFO +1 -1
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/pyproject.toml +1 -1
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +19 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +28 -2
- atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +253 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +24 -1
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +83 -3
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +15 -8
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/git_churn.py +6 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +159 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +167 -7
- atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +268 -0
- atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/steersman_pack.py +198 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +50 -4
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +65 -7
- atomadic_forge-0.59.0/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +180 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +23 -5
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/create_feature.py +45 -4
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +125 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +22 -18
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/mcp_server.py +83 -8
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +55 -2
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/create.py +4 -4
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/SOURCES.txt +8 -0
- atomadic_forge-0.59.0/tests/test_ast_scope_lock.py +119 -0
- atomadic_forge-0.59.0/tests/test_cherry_pick.py +68 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cli_smoke.py +33 -0
- atomadic_forge-0.59.0/tests/test_create_feature.py +368 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_signature_extract.py +21 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_synthesize_imports.py +23 -0
- atomadic_forge-0.59.0/tests/test_finalize_scaffold.py +110 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_git_churn.py +2 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_materialize_feature.py +18 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_mcp_protocol.py +31 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_nexus_bridge.py +88 -9
- atomadic_forge-0.59.0/tests/test_remote_seed_store.py +108 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_scaffold.py +25 -0
- atomadic_forge-0.59.0/tests/test_steersman_pack.py +150 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_stub_detector.py +98 -2
- atomadic_forge-0.57.1/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -94
- atomadic_forge-0.57.1/tests/test_create_feature.py +0 -183
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/CHANGELOG.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/LICENSE +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/README.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/SECURITY.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/README.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/setup.cfg +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/tests/test_wisdom.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.59.0
|
|
4
4
|
Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code.
|
|
5
5
|
Author: Atomadic
|
|
6
6
|
License-Expression: BUSL-1.1
|
|
@@ -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.59.0"
|
|
8
8
|
description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python · JavaScript/TypeScript · Rust · Go · Swift · Kotlin) architecture guardian for AI-generated code."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
{atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/error_codes.py
RENAMED
|
@@ -63,6 +63,25 @@ class FCode(TypedDict):
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
F_CODE_REGISTRY: dict[str, FCode] = {
|
|
66
|
+
# ---- Cherry-pick / remote seed hydration (F0010-F0019) ----
|
|
67
|
+
"F0017": FCode(
|
|
68
|
+
code="F0017",
|
|
69
|
+
name="remote-seed-url-invalid",
|
|
70
|
+
severity="warn",
|
|
71
|
+
title="Remote seed URL could not be normalized for harvest/create.",
|
|
72
|
+
hint_key="",
|
|
73
|
+
auto_fixable=False,
|
|
74
|
+
doc_anchor="f0017-remote-seed-url-invalid",
|
|
75
|
+
),
|
|
76
|
+
"F0018": FCode(
|
|
77
|
+
code="F0018",
|
|
78
|
+
name="remote-seed-hydration-failed",
|
|
79
|
+
severity="warn",
|
|
80
|
+
title="Remote seed repository could not be cloned or refreshed.",
|
|
81
|
+
hint_key="",
|
|
82
|
+
auto_fixable=False,
|
|
83
|
+
doc_anchor="f0018-remote-seed-hydration-failed",
|
|
84
|
+
),
|
|
66
85
|
# ---- Wire / upward-import violations (F0040-F0049) ----
|
|
67
86
|
"F0040": FCode(
|
|
68
87
|
code="F0040",
|
|
@@ -22,11 +22,32 @@ DEFAULT_NEXUS_BASE_URL: Final[str] = "https://atomadic.tech"
|
|
|
22
22
|
DEFAULT_NEXUS_MCP_PATH: Final[str] = "/mcp"
|
|
23
23
|
|
|
24
24
|
# Auth: caller supplies ATOMADIC_MASTER_KEY (or per-agent subscription
|
|
25
|
-
# key once the auth-worker side ships per-agent scoping).
|
|
26
|
-
#
|
|
25
|
+
# key once the auth-worker side ships per-agent scoping). Forge's
|
|
26
|
+
# public/auth gateway keys are accepted as aliases so paid users can
|
|
27
|
+
# run Forge and Nexus from the same master key. The bridge never embeds
|
|
28
|
+
# keys in source.
|
|
27
29
|
ENV_NEXUS_BASE_URL: Final[str] = "ATOMADIC_NEXUS_URL"
|
|
28
30
|
ENV_NEXUS_MASTER_KEY: Final[str] = "ATOMADIC_MASTER_KEY"
|
|
29
31
|
ENV_NEXUS_SUBSCRIPTION_KEY: Final[str] = "ATOMADIC_SUBSCRIPTION_KEY"
|
|
32
|
+
ENV_NEXUS_BASE_URL_ALIASES: Final[tuple[str, ...]] = (
|
|
33
|
+
"ATOMADIC_NEXUS_URL",
|
|
34
|
+
"AAAA_NEXUS_URL",
|
|
35
|
+
)
|
|
36
|
+
ENV_NEXUS_MASTER_KEY_ALIASES: Final[tuple[str, ...]] = (
|
|
37
|
+
"ATOMADIC_MASTER_KEY",
|
|
38
|
+
"FORGE_MASTER_API_KEY",
|
|
39
|
+
"AAAA_NEXUS_API_KEY",
|
|
40
|
+
)
|
|
41
|
+
ENV_NEXUS_SUBSCRIPTION_KEY_ALIASES: Final[tuple[str, ...]] = (
|
|
42
|
+
"ATOMADIC_SUBSCRIPTION_KEY",
|
|
43
|
+
"FORGE_API_KEY",
|
|
44
|
+
)
|
|
45
|
+
ENV_NEXUS_VAULT_PATH: Final[str] = "ATOMADIC_VAULT_ENV"
|
|
46
|
+
NEXUS_PREMIUM_HINT: Final[str] = (
|
|
47
|
+
"Nexus attestation skipped. Purchase or configure a Nexus key, reuse "
|
|
48
|
+
"FORGE_MASTER_API_KEY as a master key, or wire x402 payments for "
|
|
49
|
+
"metered access."
|
|
50
|
+
)
|
|
30
51
|
|
|
31
52
|
# ── LIVE primitives we wire against (verified 2026-05-06) ────────────
|
|
32
53
|
# Each is a tools/call name on the Nexus MCP. The bridge exposes
|
|
@@ -57,6 +78,11 @@ __all__ = [
|
|
|
57
78
|
"SCHEMA_VERSION_NEXUS_CALL_V1",
|
|
58
79
|
"DEFAULT_NEXUS_BASE_URL", "DEFAULT_NEXUS_MCP_PATH",
|
|
59
80
|
"ENV_NEXUS_BASE_URL", "ENV_NEXUS_MASTER_KEY", "ENV_NEXUS_SUBSCRIPTION_KEY",
|
|
81
|
+
"ENV_NEXUS_BASE_URL_ALIASES",
|
|
82
|
+
"ENV_NEXUS_MASTER_KEY_ALIASES",
|
|
83
|
+
"ENV_NEXUS_SUBSCRIPTION_KEY_ALIASES",
|
|
84
|
+
"ENV_NEXUS_VAULT_PATH",
|
|
85
|
+
"NEXUS_PREMIUM_HINT",
|
|
60
86
|
"NEXUS_TOOL_IDENTITY_VERIFY", "NEXUS_TOOL_FEDERATION_MINT",
|
|
61
87
|
"NEXUS_TOOL_AUTHORIZE_ACTION", "NEXUS_TOOL_SYS_TRUST_GATE",
|
|
62
88
|
"NEXUS_TOOL_CONTRACT_VERIFY", "NEXUS_TOOL_LINEAGE_RECORD",
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"""Tier a1 — pure AST scope locks for multi-repo swarms.
|
|
2
|
+
|
|
3
|
+
Golden Path Lane C W6 follow-on deliverable. ``audit(action='ast_scope')``
|
|
4
|
+
uses this module to compress a proposed multi-repo mutation into exact
|
|
5
|
+
function/class node envelopes before any agent edits files. AAAA-Nexus can
|
|
6
|
+
attest the returned lock payload through existing lineage primitives, while
|
|
7
|
+
the math here stays local, deterministic, and dependency-free.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import ast
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
SCHEMA_VERSION_AST_SCOPE_V1 = "atomadic-forge.ast_scope/v1"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _tier_for_path(path: str) -> str:
|
|
21
|
+
for part in Path(path).parts:
|
|
22
|
+
if part.startswith("a") and part in {
|
|
23
|
+
"a0_qk_constants",
|
|
24
|
+
"a1_at_functions",
|
|
25
|
+
"a2_mo_composites",
|
|
26
|
+
"a3_og_features",
|
|
27
|
+
"a4_sy_orchestration",
|
|
28
|
+
}:
|
|
29
|
+
return part
|
|
30
|
+
return ""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _sha(payload: Any, *, size: int = 16) -> str:
|
|
34
|
+
raw = json.dumps(payload, sort_keys=True, separators=(",", ":"), default=str)
|
|
35
|
+
return hashlib.sha256(raw.encode("utf-8")).hexdigest()[:size]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _module_for(rel: str) -> str:
|
|
39
|
+
p = Path(rel).with_suffix("")
|
|
40
|
+
parts = [part for part in p.parts if part != "src"]
|
|
41
|
+
if parts and parts[-1] == "__init__":
|
|
42
|
+
parts.pop()
|
|
43
|
+
return ".".join(parts)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _node_source_digest(source_lines: list[str], start: int, end: int) -> str:
|
|
47
|
+
text = "\n".join(source_lines[max(0, start - 1): max(start - 1, end)])
|
|
48
|
+
return hashlib.sha256(text.encode("utf-8")).hexdigest()[:16]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _collect_python_nodes(path: Path, *, project_root: Path) -> list[dict[str, Any]]:
|
|
52
|
+
rel = path.relative_to(project_root).as_posix()
|
|
53
|
+
try:
|
|
54
|
+
text = path.read_text(encoding="utf-8", errors="replace")
|
|
55
|
+
tree = ast.parse(text, filename=str(path))
|
|
56
|
+
except (OSError, SyntaxError):
|
|
57
|
+
return []
|
|
58
|
+
lines = text.splitlines()
|
|
59
|
+
module = _module_for(rel)
|
|
60
|
+
out: list[dict[str, Any]] = []
|
|
61
|
+
|
|
62
|
+
def add_node(node: ast.AST, *, name: str, kind: str) -> None:
|
|
63
|
+
start = int(getattr(node, "lineno", 1))
|
|
64
|
+
end = int(getattr(node, "end_lineno", start))
|
|
65
|
+
qualname = f"{module}.{name}" if module else name
|
|
66
|
+
out.append({
|
|
67
|
+
"node_id": "ast-" + _sha({"file": rel, "qualname": qualname, "start": start, "end": end}),
|
|
68
|
+
"file": rel,
|
|
69
|
+
"qualname": qualname,
|
|
70
|
+
"kind": kind,
|
|
71
|
+
"tier": _tier_for_path(rel),
|
|
72
|
+
"start_line": start,
|
|
73
|
+
"end_line": end,
|
|
74
|
+
"line_span": max(1, end - start + 1),
|
|
75
|
+
"source_digest": _node_source_digest(lines, start, end),
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
for node in tree.body:
|
|
79
|
+
if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
80
|
+
add_node(node, name=node.name, kind="function")
|
|
81
|
+
elif isinstance(node, ast.ClassDef):
|
|
82
|
+
add_node(node, name=node.name, kind="class")
|
|
83
|
+
for sub in node.body:
|
|
84
|
+
if isinstance(sub, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
85
|
+
add_node(sub, name=f"{node.name}.{sub.name}", kind="method")
|
|
86
|
+
return out
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _target_matches(node: dict[str, Any], targets: set[str]) -> bool:
|
|
90
|
+
if not targets:
|
|
91
|
+
return True
|
|
92
|
+
qual = str(node.get("qualname", ""))
|
|
93
|
+
return qual in targets or any(qual.endswith("." + t) for t in targets)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def build_ast_scope_blueprint(
|
|
97
|
+
*,
|
|
98
|
+
project_roots: list[Path | str],
|
|
99
|
+
targets: list[str] | None = None,
|
|
100
|
+
max_nodes: int = 200,
|
|
101
|
+
) -> dict[str, Any]:
|
|
102
|
+
"""Return compressed AST node scope for one or more repos.
|
|
103
|
+
|
|
104
|
+
``targets`` may contain full qualnames or suffixes such as
|
|
105
|
+
``AuthClient.refresh``. When omitted, the blueprint inventories up to
|
|
106
|
+
``max_nodes`` nodes per portfolio pass.
|
|
107
|
+
"""
|
|
108
|
+
target_set = {t for t in (targets or []) if t}
|
|
109
|
+
repos: list[dict[str, Any]] = []
|
|
110
|
+
all_nodes: list[dict[str, Any]] = []
|
|
111
|
+
raw_py_file_count = 0
|
|
112
|
+
raw_line_count = 0
|
|
113
|
+
for root_raw in project_roots:
|
|
114
|
+
root = Path(root_raw).resolve()
|
|
115
|
+
repo_nodes: list[dict[str, Any]] = []
|
|
116
|
+
repo_py_file_count = 0
|
|
117
|
+
repo_line_count = 0
|
|
118
|
+
if root.exists():
|
|
119
|
+
for py_file in sorted(root.rglob("*.py")):
|
|
120
|
+
rel_parts = py_file.relative_to(root).parts
|
|
121
|
+
if any(part in {"__pycache__", ".venv", "venv", ".git"} for part in rel_parts):
|
|
122
|
+
continue
|
|
123
|
+
repo_py_file_count += 1
|
|
124
|
+
raw_py_file_count += 1
|
|
125
|
+
try:
|
|
126
|
+
lines_here = py_file.read_text(
|
|
127
|
+
encoding="utf-8",
|
|
128
|
+
errors="replace",
|
|
129
|
+
).count("\n") + 1
|
|
130
|
+
except OSError:
|
|
131
|
+
lines_here = 0
|
|
132
|
+
repo_line_count += lines_here
|
|
133
|
+
raw_line_count += lines_here
|
|
134
|
+
for node in _collect_python_nodes(py_file, project_root=root):
|
|
135
|
+
if _target_matches(node, target_set):
|
|
136
|
+
node = {**node, "repo_root": str(root)}
|
|
137
|
+
repo_nodes.append(node)
|
|
138
|
+
all_nodes.append(node)
|
|
139
|
+
if len(all_nodes) >= max_nodes:
|
|
140
|
+
break
|
|
141
|
+
if len(all_nodes) >= max_nodes:
|
|
142
|
+
break
|
|
143
|
+
repos.append({
|
|
144
|
+
"repo_root": str(root),
|
|
145
|
+
"exists": root.exists(),
|
|
146
|
+
"node_count": len(repo_nodes),
|
|
147
|
+
"python_file_count": repo_py_file_count,
|
|
148
|
+
"python_line_count": repo_line_count,
|
|
149
|
+
})
|
|
150
|
+
if len(all_nodes) >= max_nodes:
|
|
151
|
+
break
|
|
152
|
+
scanned_lines = sum(int(n["line_span"]) for n in all_nodes)
|
|
153
|
+
compressed_tokens = max(1, len(json.dumps(all_nodes, default=str)) // 4)
|
|
154
|
+
raw_token_estimate = max(compressed_tokens, raw_line_count * 4)
|
|
155
|
+
savings_pct = round(100.0 * (1.0 - (compressed_tokens / raw_token_estimate)), 1)
|
|
156
|
+
return {
|
|
157
|
+
"schema_version": SCHEMA_VERSION_AST_SCOPE_V1,
|
|
158
|
+
"project_roots": [str(Path(p).resolve()) for p in project_roots],
|
|
159
|
+
"targets": sorted(target_set),
|
|
160
|
+
"repos": repos,
|
|
161
|
+
"node_count": len(all_nodes),
|
|
162
|
+
"nodes": all_nodes,
|
|
163
|
+
"compressed_context": {
|
|
164
|
+
"ast_lines_retained": scanned_lines,
|
|
165
|
+
"raw_python_files": raw_py_file_count,
|
|
166
|
+
"raw_python_lines": raw_line_count,
|
|
167
|
+
"compressed_tokens_estimate": compressed_tokens,
|
|
168
|
+
"raw_tokens_estimate": raw_token_estimate,
|
|
169
|
+
"token_savings_pct": savings_pct,
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def mint_ast_locks(
|
|
175
|
+
blueprint: dict[str, Any],
|
|
176
|
+
*,
|
|
177
|
+
agent_ids: list[str] | None = None,
|
|
178
|
+
ttl_secs: int = 3600,
|
|
179
|
+
) -> dict[str, Any]:
|
|
180
|
+
"""Mint deterministic local locks over blueprint nodes.
|
|
181
|
+
|
|
182
|
+
These are not remote AAAA-Nexus tokens. They are scope payloads suitable
|
|
183
|
+
for Nexus ``lineage_record`` attestation or ``authorize_action`` resource
|
|
184
|
+
checks with today's live Nexus surface.
|
|
185
|
+
"""
|
|
186
|
+
agents = agent_ids or ["agent-0"]
|
|
187
|
+
locks: list[dict[str, Any]] = []
|
|
188
|
+
nodes = list(blueprint.get("nodes") or [])
|
|
189
|
+
for idx, node in enumerate(nodes):
|
|
190
|
+
agent_id = agents[idx % len(agents)]
|
|
191
|
+
resource = (
|
|
192
|
+
f"{node.get('repo_root')}::{node.get('file')}:"
|
|
193
|
+
f"{node.get('start_line')}-{node.get('end_line')}::{node.get('qualname')}"
|
|
194
|
+
)
|
|
195
|
+
payload = {
|
|
196
|
+
"agent_id": agent_id,
|
|
197
|
+
"node_id": node.get("node_id"),
|
|
198
|
+
"resource": resource,
|
|
199
|
+
"ttl_secs": ttl_secs,
|
|
200
|
+
"source_digest": node.get("source_digest"),
|
|
201
|
+
}
|
|
202
|
+
locks.append({
|
|
203
|
+
"lock_id": "lock-" + _sha(payload, size=20),
|
|
204
|
+
**payload,
|
|
205
|
+
"allowed_file": node.get("file"),
|
|
206
|
+
"allowed_line_range": [node.get("start_line"), node.get("end_line")],
|
|
207
|
+
"tier": node.get("tier"),
|
|
208
|
+
"nexus_attestable": True,
|
|
209
|
+
"nexus_live_op": "lineage_record",
|
|
210
|
+
})
|
|
211
|
+
return {
|
|
212
|
+
"schema_version": "atomadic-forge.ast_locks/v1",
|
|
213
|
+
"blueprint_hash": _sha(blueprint, size=20),
|
|
214
|
+
"lock_count": len(locks),
|
|
215
|
+
"locks": locks,
|
|
216
|
+
"ttl_secs": ttl_secs,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def ast_scope_plan(
|
|
221
|
+
*,
|
|
222
|
+
project_roots: list[Path | str],
|
|
223
|
+
targets: list[str] | None = None,
|
|
224
|
+
agent_ids: list[str] | None = None,
|
|
225
|
+
ttl_secs: int = 3600,
|
|
226
|
+
max_nodes: int = 200,
|
|
227
|
+
) -> dict[str, Any]:
|
|
228
|
+
"""Return blueprint + locks in one MCP-friendly envelope."""
|
|
229
|
+
blueprint = build_ast_scope_blueprint(
|
|
230
|
+
project_roots=project_roots,
|
|
231
|
+
targets=targets,
|
|
232
|
+
max_nodes=max_nodes,
|
|
233
|
+
)
|
|
234
|
+
locks = mint_ast_locks(blueprint, agent_ids=agent_ids, ttl_secs=ttl_secs)
|
|
235
|
+
return {
|
|
236
|
+
"schema_version": "atomadic-forge.ast_scope_plan/v1",
|
|
237
|
+
"blueprint": blueprint,
|
|
238
|
+
"locks": locks,
|
|
239
|
+
"verdict": "PASS" if locks["lock_count"] else "REFINE",
|
|
240
|
+
"summary": (
|
|
241
|
+
f"{blueprint['node_count']} AST node(s), "
|
|
242
|
+
f"{locks['lock_count']} lock(s), "
|
|
243
|
+
f"{blueprint['compressed_context']['token_savings_pct']}% estimated token savings"
|
|
244
|
+
),
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
__all__ = (
|
|
249
|
+
"SCHEMA_VERSION_AST_SCOPE_V1",
|
|
250
|
+
"ast_scope_plan",
|
|
251
|
+
"build_ast_scope_blueprint",
|
|
252
|
+
"mint_ast_locks",
|
|
253
|
+
)
|
{atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py
RENAMED
|
@@ -8,11 +8,28 @@ the assimilate phase; this layer just records intent.
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
from collections.abc import Iterable
|
|
11
|
+
from pathlib import PurePosixPath
|
|
12
|
+
|
|
13
|
+
from ..a0_qk_constants.lang_extensions import NON_TIER_SOURCE_DIRS
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _is_in_non_tier_dir(file_rel: str) -> bool:
|
|
17
|
+
"""True when the relative file path lives under a non-tier source dir.
|
|
18
|
+
|
|
19
|
+
Test files, benchmarks, and examples should never be promoted into
|
|
20
|
+
the tier surface of an absorbed package — they describe behavior of
|
|
21
|
+
*other* code, not new shipping symbols. Closes GAP-004.
|
|
22
|
+
"""
|
|
23
|
+
if not file_rel:
|
|
24
|
+
return False
|
|
25
|
+
parts = PurePosixPath(file_rel.replace("\\", "/")).parts
|
|
26
|
+
return any(p in NON_TIER_SOURCE_DIRS for p in parts)
|
|
11
27
|
|
|
12
28
|
|
|
13
29
|
def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
|
|
14
30
|
pick_all: bool = False, min_confidence: float = 0.0,
|
|
15
|
-
only_tier: str | None = None
|
|
31
|
+
only_tier: str | None = None,
|
|
32
|
+
include_non_tier_dirs: bool = False) -> dict:
|
|
16
33
|
"""Build a cherry_pick manifest from a scout report.
|
|
17
34
|
|
|
18
35
|
Filters:
|
|
@@ -22,6 +39,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
|
|
|
22
39
|
(Forge currently emits 0.0 for hard hits and 0.5 for fallbacks; future
|
|
23
40
|
versions will produce richer signals.)
|
|
24
41
|
* ``only_tier`` — restrict to symbols already classified to this tier.
|
|
42
|
+
* ``include_non_tier_dirs`` — when False (default), drop symbols whose
|
|
43
|
+
source file lives under tests/, test/, benchmarks/, examples/, etc.
|
|
44
|
+
Pass True only when you explicitly want to absorb test fixtures.
|
|
25
45
|
"""
|
|
26
46
|
syms = scout_report.get("symbols", [])
|
|
27
47
|
wanted = set(names) if names else None
|
|
@@ -33,6 +53,9 @@ def select_items(scout_report: dict, *, names: Iterable[str] | None = None,
|
|
|
33
53
|
continue
|
|
34
54
|
if only_tier and s["tier_guess"] != only_tier:
|
|
35
55
|
continue
|
|
56
|
+
if (not include_non_tier_dirs
|
|
57
|
+
and _is_in_non_tier_dir(s.get("file", ""))):
|
|
58
|
+
continue
|
|
36
59
|
items.append({
|
|
37
60
|
"qualname": s["qualname"],
|
|
38
61
|
"target_tier": s["tier_guess"],
|
|
@@ -14,6 +14,7 @@ from collections.abc import Iterable
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
16
|
from ..a0_qk_constants.emergent_types import SymbolSignatureCard
|
|
17
|
+
from ..a0_qk_constants.lang_extensions import PYTHON_EXTS
|
|
17
18
|
|
|
18
19
|
_TIERS = (
|
|
19
20
|
"a0_qk_constants", "a1_at_functions", "a2_mo_composites",
|
|
@@ -35,9 +36,17 @@ def _module_for(file: Path, src_root: Path, package: str) -> str:
|
|
|
35
36
|
parts = list(rel.parts)
|
|
36
37
|
if parts and parts[-1] == "__init__":
|
|
37
38
|
parts.pop()
|
|
39
|
+
if not package:
|
|
40
|
+
return ".".join(parts)
|
|
38
41
|
return ".".join([package, *parts]) if parts else package
|
|
39
42
|
|
|
40
43
|
|
|
44
|
+
def _join_flat_module(package: str, module_parts: list[str]) -> str:
|
|
45
|
+
if not package:
|
|
46
|
+
return ".".join(module_parts)
|
|
47
|
+
return ".".join([package, *module_parts]) if module_parts else package
|
|
48
|
+
|
|
49
|
+
|
|
41
50
|
def _tier_of(file: Path, src_root: Path) -> str:
|
|
42
51
|
parts = file.relative_to(src_root).parts
|
|
43
52
|
for p in parts:
|
|
@@ -58,6 +67,55 @@ def _domain_of(stem: str) -> str:
|
|
|
58
67
|
return parts[0].lower() if parts else "misc"
|
|
59
68
|
|
|
60
69
|
|
|
70
|
+
def _identifier_token(value: str, fallback: str = "symbol") -> str:
|
|
71
|
+
value = re.sub(r"[^A-Za-z0-9_]+", "_", value).strip("_")
|
|
72
|
+
if not value or value[0].isdigit():
|
|
73
|
+
value = f"{fallback}_{value}" if value else fallback
|
|
74
|
+
return value
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _module_from_rel(file: str, package: str) -> str:
|
|
78
|
+
rel = Path(file).with_suffix("")
|
|
79
|
+
parts = [_identifier_token(p, "mod") for p in rel.parts]
|
|
80
|
+
if parts and parts[-1] == "__init__":
|
|
81
|
+
parts.pop()
|
|
82
|
+
if package:
|
|
83
|
+
return ".".join([_identifier_token(package, "pkg"), *parts])
|
|
84
|
+
return ".".join(parts)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _signature_from_scout_symbol(sym: dict, *, package: str) -> SymbolSignatureCard | None:
|
|
88
|
+
if sym.get("language") in (None, "python"):
|
|
89
|
+
return None
|
|
90
|
+
name = str(sym.get("name") or sym.get("qualname") or "").strip()
|
|
91
|
+
if not name:
|
|
92
|
+
return None
|
|
93
|
+
qual_tail = ".".join(_identifier_token(part, "member")
|
|
94
|
+
for part in name.split(".") if part)
|
|
95
|
+
module = _module_from_rel(str(sym.get("file") or ""), package)
|
|
96
|
+
if not module or not qual_tail:
|
|
97
|
+
return None
|
|
98
|
+
effects = sym.get("effects") or []
|
|
99
|
+
output = (
|
|
100
|
+
"Callable"
|
|
101
|
+
if sym.get("kind") in {"function", "method"}
|
|
102
|
+
else "Mapping[str, Any]"
|
|
103
|
+
if sym.get("kind") == "class"
|
|
104
|
+
else "Any"
|
|
105
|
+
)
|
|
106
|
+
return SymbolSignatureCard(
|
|
107
|
+
name=qual_tail,
|
|
108
|
+
qualname=f"{module}.{qual_tail}",
|
|
109
|
+
module=module,
|
|
110
|
+
tier=str(sym.get("suggested_tier") or sym.get("tier_guess") or "a1_at_functions"),
|
|
111
|
+
domain=_domain_of(Path(str(sym.get("file") or name)).stem),
|
|
112
|
+
inputs=[("value", "Any")],
|
|
113
|
+
output=output,
|
|
114
|
+
is_pure="io" not in effects and "state" not in effects,
|
|
115
|
+
docstring=f"{sym.get('language')} {sym.get('kind')} surface",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
61
119
|
def _ann_text(node: ast.AST | None) -> str:
|
|
62
120
|
if node is None:
|
|
63
121
|
return "Any"
|
|
@@ -212,8 +270,18 @@ def harvest_signatures(
|
|
|
212
270
|
# Caller passed a repo root, not a src layout. Use the repo as the
|
|
213
271
|
# walk root and fabricate a one-level package alias from the directory.
|
|
214
272
|
walk_root = src_root
|
|
215
|
-
|
|
216
|
-
|
|
273
|
+
if package and (src_root / f"{package}.py").is_file():
|
|
274
|
+
# PEP-621/setuptools py-modules layout: files are importable as
|
|
275
|
+
# top-level modules, not as ``repo_name.<module>``.
|
|
276
|
+
package_for_module = ""
|
|
277
|
+
elif package:
|
|
278
|
+
package_for_module = package
|
|
279
|
+
else:
|
|
280
|
+
package_for_module = src_root.name.replace("-", "_")
|
|
281
|
+
for py_file in sorted(
|
|
282
|
+
p for p in walk_root.rglob("*")
|
|
283
|
+
if p.is_file() and p.suffix.lower() in PYTHON_EXTS
|
|
284
|
+
):
|
|
217
285
|
if py_file.name.startswith("_"):
|
|
218
286
|
continue
|
|
219
287
|
# Use parts RELATIVE to walk_root so a hidden parent like
|
|
@@ -232,11 +300,23 @@ def harvest_signatures(
|
|
|
232
300
|
module_parts = list(rel.parts)
|
|
233
301
|
if module_parts and module_parts[-1] == "__init__":
|
|
234
302
|
module_parts.pop()
|
|
235
|
-
module =
|
|
303
|
+
module = _join_flat_module(package_for_module, module_parts)
|
|
236
304
|
except ValueError:
|
|
237
305
|
module = package_for_module
|
|
238
306
|
tier = _flat_tier_for(py_file)
|
|
239
307
|
domain = _domain_of(py_file.stem)
|
|
240
308
|
cards.extend(_harvest_one_file(py_file, module=module,
|
|
241
309
|
tier=tier, domain=domain))
|
|
310
|
+
|
|
311
|
+
try:
|
|
312
|
+
from .scout_walk import harvest_repo
|
|
313
|
+
scout = harvest_repo(walk_root)
|
|
314
|
+
except Exception:
|
|
315
|
+
scout = {"symbols": []}
|
|
316
|
+
seen = {card["qualname"] for card in cards}
|
|
317
|
+
for sym in scout.get("symbols") or []:
|
|
318
|
+
card = _signature_from_scout_symbol(sym, package=package_for_module)
|
|
319
|
+
if card and card["qualname"] not in seen:
|
|
320
|
+
cards.append(card)
|
|
321
|
+
seen.add(card["qualname"])
|
|
242
322
|
return cards
|
|
@@ -36,12 +36,19 @@ def _imports_for(chain_qualnames: list[str]) -> list[str]:
|
|
|
36
36
|
return out
|
|
37
37
|
|
|
38
38
|
|
|
39
|
+
def _is_class_method_qualname(q: str) -> bool:
|
|
40
|
+
module, _, _name = q.rpartition(".")
|
|
41
|
+
if not module:
|
|
42
|
+
return False
|
|
43
|
+
last_seg = module.rsplit(".", 1)[-1]
|
|
44
|
+
return bool(last_seg and last_seg[0].isupper())
|
|
45
|
+
|
|
46
|
+
|
|
39
47
|
def render_emergent_feature(card: EmergentCandidateCard) -> str:
|
|
40
48
|
chain = card["chain"]
|
|
41
49
|
qualnames = chain["chain"]
|
|
42
50
|
bridges = chain["bridges"]
|
|
43
51
|
name = card["name"].replace("-", "_")
|
|
44
|
-
imports = _imports_for(qualnames)
|
|
45
52
|
summary = card["summary"].replace('"""', "'''")
|
|
46
53
|
novelty = "; ".join(card["novelty_signals"]) or "(none)"
|
|
47
54
|
score = card["score"]
|
|
@@ -70,8 +77,6 @@ def render_emergent_feature(card: EmergentCandidateCard) -> str:
|
|
|
70
77
|
"from typing import Any",
|
|
71
78
|
"",
|
|
72
79
|
])
|
|
73
|
-
lines.extend(imports)
|
|
74
|
-
lines.append("")
|
|
75
80
|
lines.append(f"def run_{name}(seed: Any) -> dict[str, Any]:")
|
|
76
81
|
lines.append(f' """Wired composition for {card["name"]}.')
|
|
77
82
|
lines.append("")
|
|
@@ -80,17 +85,19 @@ def render_emergent_feature(card: EmergentCandidateCard) -> str:
|
|
|
80
85
|
lines.append(" trace: list[Any] = []")
|
|
81
86
|
lines.append(" value = seed")
|
|
82
87
|
for i, q in enumerate(qualnames):
|
|
83
|
-
|
|
84
|
-
if
|
|
85
|
-
#
|
|
86
|
-
# the receiver.
|
|
88
|
+
module, _, callable_name = q.rpartition(".")
|
|
89
|
+
if _is_class_method_qualname(q):
|
|
90
|
+
# Method case — fall back to a noop trace step rather than guessing
|
|
91
|
+
# the receiver. Manual wiring required.
|
|
87
92
|
lines.append(
|
|
88
93
|
f" # NOTE: step {i+1} is a method ({callable_name}); "
|
|
89
94
|
"wire the receiver manually."
|
|
90
95
|
)
|
|
91
96
|
lines.append(f" trace.append(({q!r}, 'unwired-method'))")
|
|
92
97
|
continue
|
|
93
|
-
|
|
98
|
+
alias = f"_step_{i+1}_{callable_name}"
|
|
99
|
+
lines.append(f" from {module} import {callable_name} as {alias}")
|
|
100
|
+
lines.append(f" value = {alias}(value)")
|
|
94
101
|
lines.append(f" trace.append(({q!r}, value))")
|
|
95
102
|
lines.append(" return {'final': value, 'trace': trace}")
|
|
96
103
|
lines.append("")
|
{atomadic_forge-0.57.1 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/git_churn.py
RENAMED
|
@@ -87,6 +87,12 @@ def compute_git_churn(
|
|
|
87
87
|
stats. Returns a minimal error dict if git is unavailable.
|
|
88
88
|
"""
|
|
89
89
|
root = Path(project_root).resolve()
|
|
90
|
+
if not (root / ".git").exists():
|
|
91
|
+
return {
|
|
92
|
+
"schema_version": SCHEMA_VERSION_GIT_CHURN_V1,
|
|
93
|
+
"available": False,
|
|
94
|
+
"reason": "not a git repository root",
|
|
95
|
+
}
|
|
90
96
|
counts = _commit_count_per_file(root, since=since)
|
|
91
97
|
if not counts:
|
|
92
98
|
return {
|