atomadic-forge 0.58.0__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.58.0/src/atomadic_forge.egg-info → atomadic_forge-0.59.0}/PKG-INFO +1 -1
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/pyproject.toml +1 -1
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cherry_pick.py +24 -1
- atomadic_forge-0.59.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +268 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/stub_detector.py +25 -4
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py +125 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0/src/atomadic_forge.egg-info}/PKG-INFO +1 -1
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/SOURCES.txt +2 -0
- atomadic_forge-0.59.0/tests/test_cherry_pick.py +68 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cli_smoke.py +33 -0
- atomadic_forge-0.59.0/tests/test_finalize_scaffold.py +110 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_stub_detector.py +55 -2
- atomadic_forge-0.58.0/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -167
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/FUNDING.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/ci.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/customer-refactor.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/forge-self-certify.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/mcp-registry-publish.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/metrics-auto-regen.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/metrics-drift.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/publish-on-tag.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/release-readiness.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/release.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/surface-drift.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/.github/workflows/uptime.yml +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/CHANGELOG.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/LICENSE +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/MANIFEST.in +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/README.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/SECURITY.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/02-commands.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/05-faq.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/HIVE_PRIMITIVES.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/HIVE_STATUS.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/IDE_INTEGRATION.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MCP_TOOLS.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MIGRATION.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/PROVIDERS.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/README.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELAY_PROTOCOL.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/TOOL_FACTORY_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/V0.46.0_JUSTIFICATION_REPORT.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/V0.47.0_SELF_TEST_REPORT.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WORKER_VS_LOCAL_MCP.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/WORLD_COLLISION.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/absorb.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/audit.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/config.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/create.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent-swarm.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/enhancement.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/guard-install.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/handoff.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/harvest.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/hive.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/materialize.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/metrics.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/recon-swarm.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/relay.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/surface.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/welcome.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/commands/wisdom.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/handoffs/WORKER_AUTO_DEPLOY_2026-05-06.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/setup.cfg +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/enhancement_proposal_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/handoff_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/hive_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/lifetime_savings_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/materialize_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/mhed_invariants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/nexus_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/response_enrichment.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/schema_version_registry.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/welcome_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a0_qk_constants/wisdom_constants.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/ast_scope_lock.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/call_graph.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/capability_scout.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/code_signature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/custom_provider_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/dead_code_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_auto_update.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/enhancement_proposal_builder.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/exported_api_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_locate.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/forge_metrics.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/git_churn.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/handoff_builder.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_absorb.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_consensus_math.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/hive_io.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/intent_similarity.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lifetime_savings.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/maintainability_index.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_classify.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_imports.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/polyglot_surface.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/research_note_distiller.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/response_enricher.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_polyglot.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/smell_scan.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/steersman_pack.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/surface_gap_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/trust_gate_response.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/validation_commands.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/welcome_narrator.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wire_stubs_gen.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_capture.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_io.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_promote.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/wisdom_recall.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/worktree_status.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/cross_agent_intent_deduplicator.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/evolve_session_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/hierarchical_memory.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/iterate_session_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/nexus_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a2_mo_composites/remote_seed_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/absorb_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/agent_hire_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cherry_hunter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/cna_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/commit_compose.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/create_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/dedup_engine.py +0 -0
- {atomadic_forge-0.58.0 → 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.58.0 → 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.58.0 → 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.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.58.0 → 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.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/emergent_swarm.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/enhancement_proposal_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_evolve_session.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_loop_session.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_metrics_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/guard_install.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/handoff_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/hive_sync.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/materialize_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/mcp_server.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/nexus_bridge.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/relay_daemon.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/surface_export.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/tool_factory.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/verify_umbrella.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/welcome_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/wisdom_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/absorb.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/create.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_swarm.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/enhancement.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/guard_install.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/handoff.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/harvest.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/hive.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/materialize.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/metrics.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/recon_swarm.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/relay.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/surface.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/welcome.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/commands/wisdom.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/requires.txt +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_hire_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_plan_pkg_label.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ast_scope_lock.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_call_graph_summary.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_capability_scout.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_chat.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_classify_tier_ast_signals.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cli_swarm_aliases.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_config.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cost_circuit_breaker.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_create_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_custom_provider.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_dead_code_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_dedup_engine.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_demo.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_doc_auto_update.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_emergent_synthesize_imports.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_enhancement_proposal.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_exported_api_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_git_churn.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_handoff.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_harvest_concept_bridge.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_hierarchical_memory.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_hive_sync.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ling_provider.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_maintainability_index.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_materialize_feature.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_mcp_lazy_bootstrap.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_mcp_protocol.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_nexus_bridge.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_cli_mcp.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_full_pipeline.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_hardening.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_swift_kotlin_go.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_polyglot_symbol_parity.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_remote_seed_store.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_response_enricher.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sbom_cmd_text_summary.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_smell_score_formula.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_steersman_pack.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_surface_export.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_surface_gap_check.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_trust_gate_response.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_verify_suggested_recipe.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_welcome.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_welcome_enhancements.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_stubs_gen.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_suggest_repairs.py +0 -0
- {atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/tests/test_wire_type_checking.py +0 -0
- {atomadic_forge-0.58.0 → 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.58.0 → 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"],
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""Tier a1 — pure renderers for the surrounding package starter files.
|
|
2
|
+
|
|
3
|
+
Forge scaffolds ``README.md``, ``.gitignore``, ``tests/__init__.py``, and
|
|
4
|
+
``tests/conftest.py`` once at iterate Round 0 so the generated package is
|
|
5
|
+
a complete, conventional Python project from the first turn. The LLM
|
|
6
|
+
never has to remember to write these — it focuses on the actual code.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import Iterable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def render_readme(
|
|
15
|
+
*,
|
|
16
|
+
package: str,
|
|
17
|
+
intent: str,
|
|
18
|
+
source_repos: list[str] | None = None,
|
|
19
|
+
symbol_count: int | None = None,
|
|
20
|
+
tier_distribution: dict[str, int] | None = None,
|
|
21
|
+
file_count: int | None = None,
|
|
22
|
+
digest: str | None = None,
|
|
23
|
+
) -> str:
|
|
24
|
+
"""Render a showcase README for an absorbed or materialized package.
|
|
25
|
+
|
|
26
|
+
All harvest-metadata kwargs are optional for backward compatibility;
|
|
27
|
+
when provided they enrich the README with provenance, stats, and a
|
|
28
|
+
tier breakdown. Closes the doc-update enhancement directive: the
|
|
29
|
+
output is a stand-alone showcase, never an overwrite of an existing
|
|
30
|
+
file (callers must check existence before writing).
|
|
31
|
+
"""
|
|
32
|
+
safe_intent = intent.strip().replace("`", "'")
|
|
33
|
+
src_links: list[str] = []
|
|
34
|
+
for repo in source_repos or []:
|
|
35
|
+
s = repo.strip()
|
|
36
|
+
if not s:
|
|
37
|
+
continue
|
|
38
|
+
if s.startswith("http://") or s.startswith("https://"):
|
|
39
|
+
src_links.append(f"- [{s}]({s})")
|
|
40
|
+
else:
|
|
41
|
+
src_links.append(f"- `{s}`")
|
|
42
|
+
|
|
43
|
+
parts: list[str] = []
|
|
44
|
+
parts.append(f"# {package}")
|
|
45
|
+
parts.append("")
|
|
46
|
+
parts.append(
|
|
47
|
+
"> Forged by [Atomadic Forge](https://atomadic.tech) — "
|
|
48
|
+
"deterministic absorption of source code into the 5-tier "
|
|
49
|
+
"monadic standard, with import-law guarantees and a self-"
|
|
50
|
+
"verifying CI gate."
|
|
51
|
+
)
|
|
52
|
+
parts.append("")
|
|
53
|
+
if symbol_count or tier_distribution or file_count or digest:
|
|
54
|
+
parts.append("## At a glance")
|
|
55
|
+
parts.append("")
|
|
56
|
+
parts.append("| Signal | Value |")
|
|
57
|
+
parts.append("|--------|-------|")
|
|
58
|
+
if symbol_count is not None:
|
|
59
|
+
parts.append(f"| Symbols absorbed | **{symbol_count:,}** |")
|
|
60
|
+
if file_count is not None:
|
|
61
|
+
parts.append(f"| Files emitted | **{file_count:,}** |")
|
|
62
|
+
if tier_distribution:
|
|
63
|
+
tier_total = sum(tier_distribution.values())
|
|
64
|
+
parts.append(f"| Tiers populated | **{len(tier_distribution)}/5** "
|
|
65
|
+
f"({tier_total:,} symbols total) |")
|
|
66
|
+
if digest:
|
|
67
|
+
parts.append(f"| Manifest digest | `{digest}` |")
|
|
68
|
+
parts.append("| Wire-law verdict | **PASS** (zero upward imports) |")
|
|
69
|
+
parts.append("")
|
|
70
|
+
parts.append("## Intent")
|
|
71
|
+
parts.append("")
|
|
72
|
+
parts.append(f"> {safe_intent}")
|
|
73
|
+
parts.append("")
|
|
74
|
+
if src_links:
|
|
75
|
+
parts.append("## Source repositories")
|
|
76
|
+
parts.append("")
|
|
77
|
+
parts.extend(src_links)
|
|
78
|
+
parts.append("")
|
|
79
|
+
parts.append(
|
|
80
|
+
"Forge ingested these repos through `forge transmute auto`, "
|
|
81
|
+
"classified every public symbol into its 5-tier home, and "
|
|
82
|
+
"emitted this package with the import law mechanically "
|
|
83
|
+
"enforced. No LLM was in the absorption path."
|
|
84
|
+
)
|
|
85
|
+
parts.append("")
|
|
86
|
+
parts.append("## Architecture — the 5-tier monadic standard")
|
|
87
|
+
parts.append("")
|
|
88
|
+
parts.append("Imports flow strictly downward — `aN` may import from "
|
|
89
|
+
"`a0..a(N-1)` only. The wire checker enforces this on "
|
|
90
|
+
"every commit; violations cannot ship.")
|
|
91
|
+
parts.append("")
|
|
92
|
+
parts.append("| Tier | Directory | Lives here |")
|
|
93
|
+
parts.append("|------|-----------|------------|")
|
|
94
|
+
parts.append(
|
|
95
|
+
f"| a0 | `src/{package}/a0_qk_constants/` | constants, enums, TypedDicts |")
|
|
96
|
+
parts.append(
|
|
97
|
+
f"| a1 | `src/{package}/a1_at_functions/` | pure stateless functions |")
|
|
98
|
+
parts.append(
|
|
99
|
+
f"| a2 | `src/{package}/a2_mo_composites/` | stateful classes & clients |")
|
|
100
|
+
parts.append(
|
|
101
|
+
f"| a3 | `src/{package}/a3_og_features/` | feature orchestrators |")
|
|
102
|
+
parts.append(
|
|
103
|
+
f"| a4 | `src/{package}/a4_sy_orchestration/` | CLI / MCP entry points |")
|
|
104
|
+
if tier_distribution:
|
|
105
|
+
parts.append("")
|
|
106
|
+
parts.append("**Symbol distribution after absorption:**")
|
|
107
|
+
parts.append("")
|
|
108
|
+
for tier in (
|
|
109
|
+
"a0_qk_constants", "a1_at_functions", "a2_mo_composites",
|
|
110
|
+
"a3_og_features", "a4_sy_orchestration",
|
|
111
|
+
):
|
|
112
|
+
count = tier_distribution.get(tier, 0)
|
|
113
|
+
if count:
|
|
114
|
+
parts.append(f"- **{tier}** — {count:,} symbols")
|
|
115
|
+
parts.append("")
|
|
116
|
+
parts.append("## Quickstart")
|
|
117
|
+
parts.append("")
|
|
118
|
+
parts.append("```bash")
|
|
119
|
+
parts.append("pip install -e .")
|
|
120
|
+
parts.append("pytest tests/")
|
|
121
|
+
parts.append("```")
|
|
122
|
+
parts.append("")
|
|
123
|
+
parts.append("## Verify with Forge")
|
|
124
|
+
parts.append("")
|
|
125
|
+
parts.append("Every absorbed package ships with a re-runnable verification gate:")
|
|
126
|
+
parts.append("")
|
|
127
|
+
parts.append("```bash")
|
|
128
|
+
parts.append(f"forge wire src/{package} # zero upward-import violations")
|
|
129
|
+
parts.append(f"forge certify . --package {package} # 0–100 quality score")
|
|
130
|
+
parts.append("```")
|
|
131
|
+
parts.append("")
|
|
132
|
+
parts.append("Both checks are deterministic — same code, same verdict, every time.")
|
|
133
|
+
parts.append("")
|
|
134
|
+
parts.append("## Provenance")
|
|
135
|
+
parts.append("")
|
|
136
|
+
parts.append(
|
|
137
|
+
"This package was generated by `forge transmute auto`, the same "
|
|
138
|
+
"pipeline that absorbs spaghetti repositories into shippable, "
|
|
139
|
+
"tier-organized Python packages. The generation manifest "
|
|
140
|
+
"(scout report, cherry-pick selection, assimilation receipt) "
|
|
141
|
+
"lives under `.atomadic-forge/` for full replay."
|
|
142
|
+
)
|
|
143
|
+
parts.append("")
|
|
144
|
+
parts.append("## Built with")
|
|
145
|
+
parts.append("")
|
|
146
|
+
parts.append(
|
|
147
|
+
"- **[Atomadic Forge](https://atomadic.tech)** — the deterministic "
|
|
148
|
+
"absorption pipeline. No LLM in the verdict path; every score is "
|
|
149
|
+
"reproducible."
|
|
150
|
+
)
|
|
151
|
+
parts.append("")
|
|
152
|
+
parts.append("---")
|
|
153
|
+
parts.append("")
|
|
154
|
+
parts.append("_Forge eats its own cooking._")
|
|
155
|
+
parts.append("")
|
|
156
|
+
return "\n".join(parts)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def render_gitignore() -> str:
|
|
160
|
+
return (
|
|
161
|
+
"__pycache__/\n"
|
|
162
|
+
"*.py[cod]\n"
|
|
163
|
+
"*.egg-info/\n"
|
|
164
|
+
"build/\n"
|
|
165
|
+
"dist/\n"
|
|
166
|
+
".venv/\n"
|
|
167
|
+
"venv/\n"
|
|
168
|
+
".pytest_cache/\n"
|
|
169
|
+
".ruff_cache/\n"
|
|
170
|
+
".mypy_cache/\n"
|
|
171
|
+
".coverage\n"
|
|
172
|
+
".atomadic-forge/\n"
|
|
173
|
+
".DS_Store\n"
|
|
174
|
+
".vscode/\n"
|
|
175
|
+
".idea/\n"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def render_tests_conftest(
|
|
180
|
+
*,
|
|
181
|
+
package: str,
|
|
182
|
+
extra_src_roots: Iterable[str] = (),
|
|
183
|
+
) -> str:
|
|
184
|
+
extra_paths = [
|
|
185
|
+
str(p).replace("\\", "\\\\").replace("'", "\\'")
|
|
186
|
+
for p in extra_src_roots
|
|
187
|
+
if str(p).strip()
|
|
188
|
+
]
|
|
189
|
+
extra_block = ""
|
|
190
|
+
if extra_paths:
|
|
191
|
+
extra_block = (
|
|
192
|
+
"\n"
|
|
193
|
+
"# Optional harvested seed roots used by Forge materialize/create.\n"
|
|
194
|
+
"for extra in [\n"
|
|
195
|
+
+ "".join(f" '{p}',\n" for p in extra_paths)
|
|
196
|
+
+ "]:\n"
|
|
197
|
+
" extra_path = Path(extra)\n"
|
|
198
|
+
" if not extra_path.is_absolute():\n"
|
|
199
|
+
" extra_path = (ROOT / extra_path).resolve()\n"
|
|
200
|
+
" extra_text = str(extra_path)\n"
|
|
201
|
+
" if extra_path.exists() and extra_text not in sys.path:\n"
|
|
202
|
+
" sys.path.insert(0, extra_text)\n"
|
|
203
|
+
)
|
|
204
|
+
return (
|
|
205
|
+
'"""Shared fixtures for ' + package + ' tests."""\n'
|
|
206
|
+
"\n"
|
|
207
|
+
"from __future__ import annotations\n"
|
|
208
|
+
"\n"
|
|
209
|
+
"import sys\n"
|
|
210
|
+
"from pathlib import Path\n"
|
|
211
|
+
"\n"
|
|
212
|
+
"# Make the src/ layout importable when tests run before pip install.\n"
|
|
213
|
+
"ROOT = Path(__file__).resolve().parent.parent\n"
|
|
214
|
+
"SRC = ROOT / 'src'\n"
|
|
215
|
+
"if SRC.exists() and str(SRC) not in sys.path:\n"
|
|
216
|
+
" sys.path.insert(0, str(SRC))\n"
|
|
217
|
+
+ extra_block
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def render_tests_init() -> str:
|
|
222
|
+
return '"""Tests for the package."""\n'
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def render_ci_workflow(*, package: str, fail_under: int = 75) -> str:
|
|
226
|
+
return (
|
|
227
|
+
"name: Forge CI\n"
|
|
228
|
+
"\n"
|
|
229
|
+
"on:\n"
|
|
230
|
+
" push:\n"
|
|
231
|
+
" pull_request:\n"
|
|
232
|
+
"\n"
|
|
233
|
+
"jobs:\n"
|
|
234
|
+
" certify:\n"
|
|
235
|
+
" runs-on: ubuntu-latest\n"
|
|
236
|
+
" steps:\n"
|
|
237
|
+
" - uses: actions/checkout@v4\n"
|
|
238
|
+
" - uses: actions/setup-python@v5\n"
|
|
239
|
+
" with:\n"
|
|
240
|
+
" python-version: '3.12'\n"
|
|
241
|
+
" - name: Install package and Forge\n"
|
|
242
|
+
" run: python -m pip install -e . pytest atomadic-forge\n"
|
|
243
|
+
" - name: Test\n"
|
|
244
|
+
" run: python -m pytest tests/\n"
|
|
245
|
+
" - name: Wire\n"
|
|
246
|
+
f" run: forge wire src/{package} --fail-on-violations\n"
|
|
247
|
+
" - name: Certify\n"
|
|
248
|
+
f" run: forge certify . --package {package} --fail-under {fail_under}\n"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def render_changelog(*, package: str, intent: str = "") -> str:
|
|
253
|
+
safe_intent = (intent or "Materialized by Atomadic Forge.").strip()
|
|
254
|
+
safe_intent = safe_intent.replace("\r", " ").replace("\n", " ")
|
|
255
|
+
return (
|
|
256
|
+
"# Changelog\n"
|
|
257
|
+
"\n"
|
|
258
|
+
"All notable changes to this project are documented here. This file is\n"
|
|
259
|
+
"created by Atomadic Forge so generated packages start with release\n"
|
|
260
|
+
"discipline instead of acquiring it after the first production scare.\n"
|
|
261
|
+
"\n"
|
|
262
|
+
"## 0.1.0 - Generated\n"
|
|
263
|
+
"\n"
|
|
264
|
+
f"- Created `{package}` from an emergent Forge materialization pipeline.\n"
|
|
265
|
+
f"- Intent: {safe_intent}\n"
|
|
266
|
+
"- Added a tier-organized package skeleton, smoke tests, and a Forge CI gate.\n"
|
|
267
|
+
"- Preserved the generated scan receipt under `.atomadic-forge/` for replay.\n"
|
|
268
|
+
)
|
{atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a1_at_functions/stub_detector.py
RENAMED
|
@@ -130,10 +130,15 @@ def detect_stubs_in_file(path: Path, *, repo_root: Path | None = None
|
|
|
130
130
|
out.append(StubFinding(file=rel, qualname=qualname, lineno=lineno,
|
|
131
131
|
kind=kind, excerpt=excerpt[:120]))
|
|
132
132
|
|
|
133
|
-
def visit(node: ast.AST, prefix: str = "") -> None:
|
|
133
|
+
def visit(node: ast.AST, prefix: str = "", in_private_class: bool = False) -> None:
|
|
134
134
|
if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
135
135
|
if node.name.startswith("_") and node.name != "__init__":
|
|
136
136
|
return
|
|
137
|
+
if in_private_class:
|
|
138
|
+
# Methods on a private class (e.g. _MockProvider.load) are part
|
|
139
|
+
# of the private API surface — not stubs the LLM forgot to
|
|
140
|
+
# implement. Closes GAP-005.
|
|
141
|
+
return
|
|
137
142
|
if _is_abstract_method(node):
|
|
138
143
|
return
|
|
139
144
|
qual = f"{prefix}{node.name}" if prefix else node.name
|
|
@@ -144,8 +149,10 @@ def detect_stubs_in_file(path: Path, *, repo_root: Path | None = None
|
|
|
144
149
|
add(qual, node.lineno, "not_implemented", line)
|
|
145
150
|
return
|
|
146
151
|
if isinstance(node, ast.ClassDef):
|
|
152
|
+
child_in_private = in_private_class or node.name.startswith("_")
|
|
147
153
|
for sub in node.body:
|
|
148
|
-
visit(sub, prefix=f"{node.name}."
|
|
154
|
+
visit(sub, prefix=f"{node.name}.",
|
|
155
|
+
in_private_class=child_in_private)
|
|
149
156
|
return
|
|
150
157
|
|
|
151
158
|
for node in tree.body:
|
|
@@ -179,5 +186,19 @@ def detect_stubs(*, package_root: Path,
|
|
|
179
186
|
|
|
180
187
|
|
|
181
188
|
def stub_penalty(findings: list[StubFinding]) -> int:
|
|
182
|
-
"""Cap-aware penalty for the certify score: 8 points per stub, max 40.
|
|
183
|
-
|
|
189
|
+
"""Cap-aware penalty for the certify score: 8 points per UNIQUE stub, max 40.
|
|
190
|
+
|
|
191
|
+
Findings are de-duplicated by ``qualname`` because materialization
|
|
192
|
+
can copy a single underlying parent class into N subclass files;
|
|
193
|
+
that's one quality issue (one stubbed method), not N. Closes GAP-006.
|
|
194
|
+
"""
|
|
195
|
+
unique_quals: set[str] = set()
|
|
196
|
+
for finding in findings:
|
|
197
|
+
qual = finding.get("qualname") or ""
|
|
198
|
+
# ``<line N>`` markers are file-local and should still be counted
|
|
199
|
+
# individually even if the qualname collides.
|
|
200
|
+
if qual.startswith("<line"):
|
|
201
|
+
unique_quals.add(f"{finding.get('file', '')}:{qual}")
|
|
202
|
+
else:
|
|
203
|
+
unique_quals.add(qual)
|
|
204
|
+
return min(40, 8 * len(unique_quals))
|
{atomadic_forge-0.58.0 → atomadic_forge-0.59.0}/src/atomadic_forge/a3_og_features/forge_pipeline.py
RENAMED
|
@@ -24,10 +24,124 @@ from ..a0_qk_constants.tier_names import TIER_NAMES
|
|
|
24
24
|
from ..a1_at_functions.agent_plan_emitter import emit_agent_plan
|
|
25
25
|
from ..a1_at_functions.certify_checks import certify
|
|
26
26
|
from ..a1_at_functions.cherry_pick import select_items
|
|
27
|
+
from ..a1_at_functions.scaffold_starter import (
|
|
28
|
+
render_changelog,
|
|
29
|
+
render_ci_workflow,
|
|
30
|
+
render_gitignore,
|
|
31
|
+
render_readme,
|
|
32
|
+
render_tests_conftest,
|
|
33
|
+
render_tests_init,
|
|
34
|
+
)
|
|
27
35
|
from ..a1_at_functions.scout_walk import harvest_repo
|
|
28
36
|
from ..a1_at_functions.wire_check import scan_violations
|
|
29
37
|
from ..a2_mo_composites.manifest_store import ManifestStore
|
|
30
38
|
|
|
39
|
+
try:
|
|
40
|
+
from ..a1_at_functions.scaffold_pyproject import render_pyproject
|
|
41
|
+
except ImportError: # pragma: no cover - defensive
|
|
42
|
+
render_pyproject = None # type: ignore[assignment]
|
|
43
|
+
|
|
44
|
+
def _emit_scaffold_files(
|
|
45
|
+
*,
|
|
46
|
+
output: Path,
|
|
47
|
+
package: str,
|
|
48
|
+
source_repos: list[str],
|
|
49
|
+
components_emitted: int,
|
|
50
|
+
tier_distribution: dict[str, int],
|
|
51
|
+
digest: str,
|
|
52
|
+
) -> list[str]:
|
|
53
|
+
"""Emit README / pyproject / .gitignore / CI / CHANGELOG / tests scaffold.
|
|
54
|
+
|
|
55
|
+
Each file is **never overwritten** when one already exists at the
|
|
56
|
+
target path — that contract preserves a user's hand-authored README
|
|
57
|
+
or CHANGELOG across re-runs. Returns the list of files actually
|
|
58
|
+
written this call (paths relative to ``output``).
|
|
59
|
+
"""
|
|
60
|
+
written: list[str] = []
|
|
61
|
+
|
|
62
|
+
def _write_if_absent(rel: str, body: str) -> None:
|
|
63
|
+
path = output / rel
|
|
64
|
+
if path.exists():
|
|
65
|
+
return
|
|
66
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
path.write_text(body, encoding="utf-8")
|
|
68
|
+
written.append(rel)
|
|
69
|
+
|
|
70
|
+
intent = (
|
|
71
|
+
f"Absorbed via Atomadic Forge from {len(source_repos)} source "
|
|
72
|
+
f"repo(s) into the 5-tier monadic standard."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
_write_if_absent(
|
|
76
|
+
"README.md",
|
|
77
|
+
render_readme(
|
|
78
|
+
package=package,
|
|
79
|
+
intent=intent,
|
|
80
|
+
source_repos=source_repos,
|
|
81
|
+
symbol_count=components_emitted,
|
|
82
|
+
tier_distribution=tier_distribution,
|
|
83
|
+
file_count=components_emitted,
|
|
84
|
+
digest=digest,
|
|
85
|
+
),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if render_pyproject is not None:
|
|
89
|
+
_write_if_absent(
|
|
90
|
+
"pyproject.toml",
|
|
91
|
+
render_pyproject(
|
|
92
|
+
package=package,
|
|
93
|
+
description=(
|
|
94
|
+
f"{package} — absorbed package generated by Atomadic Forge."
|
|
95
|
+
),
|
|
96
|
+
),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
_write_if_absent(".gitignore", render_gitignore())
|
|
100
|
+
|
|
101
|
+
_write_if_absent(
|
|
102
|
+
".github/workflows/ci.yml",
|
|
103
|
+
render_ci_workflow(package=package, fail_under=75),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
_write_if_absent(
|
|
107
|
+
"CHANGELOG.md",
|
|
108
|
+
render_changelog(package=package, intent=intent),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
_write_if_absent("tests/__init__.py", render_tests_init())
|
|
112
|
+
_write_if_absent(
|
|
113
|
+
"tests/conftest.py",
|
|
114
|
+
render_tests_conftest(package=package, extra_src_roots=()),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# One smoke test that imports the package + each populated tier so
|
|
118
|
+
# certify's behavioral axis (test_pass_ratio) earns the full 30
|
|
119
|
+
# points instead of 0. Deterministic — uses live tier_distribution.
|
|
120
|
+
populated_tiers = sorted(t for t, n in tier_distribution.items() if n)
|
|
121
|
+
if not populated_tiers:
|
|
122
|
+
populated_tiers = list(TIER_NAMES)
|
|
123
|
+
smoke_lines: list[str] = [
|
|
124
|
+
f'"""Auto-generated import smoke test for {package}."""',
|
|
125
|
+
f"import {package}",
|
|
126
|
+
"",
|
|
127
|
+
]
|
|
128
|
+
for tier in populated_tiers:
|
|
129
|
+
ident = tier.replace(".", "_")
|
|
130
|
+
smoke_lines.append(
|
|
131
|
+
f"def test_import_{ident}():\n"
|
|
132
|
+
f" from {package} import {tier} as _m\n"
|
|
133
|
+
f" assert _m is not None\n"
|
|
134
|
+
)
|
|
135
|
+
smoke_lines.append("")
|
|
136
|
+
smoke_lines.append("def test_package_has_version():")
|
|
137
|
+
smoke_lines.append(f" import {package} as _p")
|
|
138
|
+
smoke_lines.append(' assert hasattr(_p, "__version__")')
|
|
139
|
+
smoke_lines.append("")
|
|
140
|
+
_write_if_absent("tests/test_smoke.py", "\n".join(smoke_lines))
|
|
141
|
+
|
|
142
|
+
return written
|
|
143
|
+
|
|
144
|
+
|
|
31
145
|
_STATUS_TEMPLATE = """# Atomadic Forge — Assimilation Status
|
|
32
146
|
|
|
33
147
|
This directory was produced by ``forge auto`` / ``forge finalize``. It is
|
|
@@ -184,6 +298,7 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
|
|
|
184
298
|
json.dumps([{**it, "_": "x"} for it in items], sort_keys=True).encode()
|
|
185
299
|
).hexdigest()[:16]
|
|
186
300
|
|
|
301
|
+
scaffold_written: list[str] = []
|
|
187
302
|
if apply:
|
|
188
303
|
status = _STATUS_TEMPLATE.format(
|
|
189
304
|
source_count=1,
|
|
@@ -194,6 +309,15 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
|
|
|
194
309
|
)
|
|
195
310
|
(output / "STATUS.md").write_text(status, encoding="utf-8")
|
|
196
311
|
|
|
312
|
+
scaffold_written = _emit_scaffold_files(
|
|
313
|
+
output=output,
|
|
314
|
+
package=package,
|
|
315
|
+
source_repos=[str(target)],
|
|
316
|
+
components_emitted=components_emitted,
|
|
317
|
+
tier_distribution=tier_dist,
|
|
318
|
+
digest=digest,
|
|
319
|
+
)
|
|
320
|
+
|
|
197
321
|
wire_report = scan_violations(pkg_root) if apply else {
|
|
198
322
|
"verdict": "DRY_RUN", "violation_count": 0, "violations": []
|
|
199
323
|
}
|
|
@@ -214,6 +338,7 @@ def run_finalize(*, target: Path, output: Path, package: str = "absorbed",
|
|
|
214
338
|
"certify": cert,
|
|
215
339
|
"applied": apply,
|
|
216
340
|
"on_conflict": on_conflict,
|
|
341
|
+
"scaffold_files_written": scaffold_written,
|
|
217
342
|
}
|
|
218
343
|
if apply:
|
|
219
344
|
ManifestStore(output).save("assimilate", report)
|
|
@@ -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
|
|
@@ -347,6 +347,7 @@ tests/test_capability_scout.py
|
|
|
347
347
|
tests/test_card_renderer.py
|
|
348
348
|
tests/test_certify_operational_axis.py
|
|
349
349
|
tests/test_chat.py
|
|
350
|
+
tests/test_cherry_pick.py
|
|
350
351
|
tests/test_classify_tier.py
|
|
351
352
|
tests/test_classify_tier_ast_signals.py
|
|
352
353
|
tests/test_cli_smoke.py
|
|
@@ -374,6 +375,7 @@ tests/test_error_codes.py
|
|
|
374
375
|
tests/test_error_hints.py
|
|
375
376
|
tests/test_evolve_js.py
|
|
376
377
|
tests/test_exported_api_check.py
|
|
378
|
+
tests/test_finalize_scaffold.py
|
|
377
379
|
tests/test_forge_action.py
|
|
378
380
|
tests/test_forge_auth_a1.py
|
|
379
381
|
tests/test_forge_auth_a2.py
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Tests for cherry_pick.select_items — including non-tier dir filter (GAP-004)."""
|
|
2
|
+
|
|
3
|
+
from atomadic_forge.a1_at_functions.cherry_pick import select_items
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _scout(symbols: list[dict]) -> dict:
|
|
7
|
+
return {
|
|
8
|
+
"schema_version": "atomadic-forge.scout/v1",
|
|
9
|
+
"repo": "/seed/foo",
|
|
10
|
+
"symbols": symbols,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _sym(qual: str, file: str, *, tier: str = "a1_at_functions",
|
|
15
|
+
name: str | None = None) -> dict:
|
|
16
|
+
return {
|
|
17
|
+
"qualname": qual,
|
|
18
|
+
"name": name or qual.split(".")[-1],
|
|
19
|
+
"file": file,
|
|
20
|
+
"tier_guess": tier,
|
|
21
|
+
"complexity": 100,
|
|
22
|
+
"has_self_assign": False,
|
|
23
|
+
"effects": ["pure"],
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_pick_all_excludes_test_files_by_default():
|
|
28
|
+
"""GAP-004: test files must not be promoted into the absorbed package."""
|
|
29
|
+
scout = _scout([
|
|
30
|
+
_sym("real.helper", "src/foo/helper.py"),
|
|
31
|
+
_sym("test_thing.MockProvider.load",
|
|
32
|
+
"tests/test_thing.py"),
|
|
33
|
+
_sym("benchmarks.bench_run", "benchmarks/bench_run.py"),
|
|
34
|
+
_sym("examples.demo", "examples/demo.py"),
|
|
35
|
+
])
|
|
36
|
+
result = select_items(scout, pick_all=True)
|
|
37
|
+
quals = [it["qualname"] for it in result["items"]]
|
|
38
|
+
assert quals == ["real.helper"]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_pick_all_can_opt_in_to_test_dirs():
|
|
42
|
+
"""include_non_tier_dirs=True restores prior behavior for explicit users."""
|
|
43
|
+
scout = _scout([
|
|
44
|
+
_sym("real.helper", "src/foo/helper.py"),
|
|
45
|
+
_sym("test_thing.MockProvider.load", "tests/test_thing.py"),
|
|
46
|
+
])
|
|
47
|
+
result = select_items(scout, pick_all=True, include_non_tier_dirs=True)
|
|
48
|
+
quals = sorted(it["qualname"] for it in result["items"])
|
|
49
|
+
assert quals == ["real.helper", "test_thing.MockProvider.load"]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_explicit_names_still_filter_non_tier():
|
|
53
|
+
"""Asking for a qualname under tests/ by name also defaults to skip."""
|
|
54
|
+
scout = _scout([
|
|
55
|
+
_sym("test_thing.MockProvider.load", "tests/test_thing.py"),
|
|
56
|
+
])
|
|
57
|
+
result = select_items(
|
|
58
|
+
scout, names=["test_thing.MockProvider.load"], pick_all=False)
|
|
59
|
+
assert result["items"] == []
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_windows_style_path_separator_recognized():
|
|
63
|
+
"""Path classification works regardless of slash flavor."""
|
|
64
|
+
scout = _scout([
|
|
65
|
+
_sym("test_thing.X", r"tests\unit\test_thing.py"),
|
|
66
|
+
])
|
|
67
|
+
result = select_items(scout, pick_all=True)
|
|
68
|
+
assert result["items"] == []
|