atomadic-forge 0.3.5__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/ci.yml +6 -6
- atomadic_forge-0.5.1/.github/workflows/customer-refactor.yml +302 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/forge-self-certify.yml +1 -1
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/release.yml +4 -4
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/CHANGELOG.md +30 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/PKG-INFO +3 -2
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/README.md +1 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/pyproject.toml +2 -2
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/__init__.py +1 -1
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +4 -0
- atomadic_forge-0.5.1/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +138 -1
- atomadic_forge-0.5.1/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/mcp_server.py +75 -11
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/PKG-INFO +3 -2
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/SOURCES.txt +5 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/requires.txt +1 -1
- atomadic_forge-0.5.1/tests/test_exported_api_check.py +146 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_mcp_protocol.py +53 -0
- atomadic_forge-0.5.1/tests/test_trust_gate_response.py +106 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/.github/workflows/forge-studio-ci.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/LICENSE +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/MANIFEST.in +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/SECURITY.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/02-commands.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/05-faq.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/AGENTS_GUIDE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/COMMANDS.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/README.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/config.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/setup.cfg +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/patch_scorer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/preflight_change.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/test_selector.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/tool_composer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/src/mixed_pkg/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/conftest.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_packages/mixed_py_js/tests/test_mixed.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/cli.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_badge_worker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_chat.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_codex_5_complete.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_config.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_copilots_copilot.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_demo.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_vscode_extension_manifest.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/tests/test_wire_suggest_repairs.py +0 -0
|
@@ -24,10 +24,10 @@ jobs:
|
|
|
24
24
|
|
|
25
25
|
steps:
|
|
26
26
|
- name: Check out repository
|
|
27
|
-
uses: actions/checkout@
|
|
27
|
+
uses: actions/checkout@v6
|
|
28
28
|
|
|
29
29
|
- name: Set up Python
|
|
30
|
-
uses: actions/setup-python@
|
|
30
|
+
uses: actions/setup-python@v6
|
|
31
31
|
with:
|
|
32
32
|
python-version: ${{ matrix.python-version }}
|
|
33
33
|
cache: pip
|
|
@@ -63,7 +63,7 @@ jobs:
|
|
|
63
63
|
|
|
64
64
|
- name: Upload self-certify report
|
|
65
65
|
if: always()
|
|
66
|
-
uses: actions/upload-artifact@
|
|
66
|
+
uses: actions/upload-artifact@v7
|
|
67
67
|
with:
|
|
68
68
|
name: forge-certify-self-${{ matrix.python-version }}
|
|
69
69
|
path: certify_self.json
|
|
@@ -74,10 +74,10 @@ jobs:
|
|
|
74
74
|
runs-on: ubuntu-latest
|
|
75
75
|
steps:
|
|
76
76
|
- name: Check out repository
|
|
77
|
-
uses: actions/checkout@
|
|
77
|
+
uses: actions/checkout@v6
|
|
78
78
|
|
|
79
79
|
- name: Set up Python
|
|
80
|
-
uses: actions/setup-python@
|
|
80
|
+
uses: actions/setup-python@v6
|
|
81
81
|
with:
|
|
82
82
|
python-version: "3.12"
|
|
83
83
|
cache: pip
|
|
@@ -90,7 +90,7 @@ jobs:
|
|
|
90
90
|
python -m twine check dist/*
|
|
91
91
|
|
|
92
92
|
- name: Upload distributions
|
|
93
|
-
uses: actions/upload-artifact@
|
|
93
|
+
uses: actions/upload-artifact@v7
|
|
94
94
|
with:
|
|
95
95
|
name: atomadic-forge-dist
|
|
96
96
|
path: dist/*
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# Customer Refactor — fully automated $499 forge.atomadic.tech fulfillment.
|
|
2
|
+
#
|
|
3
|
+
# Triggered by Atomadic's REFACTOR_REPO action via the GitHub
|
|
4
|
+
# repository_dispatch API. The cognition worker POSTs:
|
|
5
|
+
#
|
|
6
|
+
# curl -X POST -H "Authorization: token $GH_TOKEN" \
|
|
7
|
+
# https://api.github.com/repos/atomadictech/atomadic-forge/dispatches \
|
|
8
|
+
# -d '{"event_type":"forge-refactor","client_payload":{...}}'
|
|
9
|
+
#
|
|
10
|
+
# Required client_payload fields:
|
|
11
|
+
# order_id — opaque string, Stripe-session-derived (forge-refactor-cs_…)
|
|
12
|
+
# session_id — Stripe session id, also used for tracing
|
|
13
|
+
# repo — full URL to the customer's public GitHub repo
|
|
14
|
+
# email — customer email (where the PR-ready notification goes)
|
|
15
|
+
# amount_cents — amount paid, just for record-keeping
|
|
16
|
+
#
|
|
17
|
+
# The workflow:
|
|
18
|
+
# 1. Clones the customer's repo into ./target/
|
|
19
|
+
# 2. Installs atomadic-forge from PyPI
|
|
20
|
+
# 3. Runs `forge auto` to produce a re-tiered package under ./forged/
|
|
21
|
+
# 4. Forks the customer's repo to the bot account, pushes the refactor
|
|
22
|
+
# branch, and opens a PR back to the customer's main branch.
|
|
23
|
+
# 5. POSTs the PR url + state to atomadic-cognition's /refactor-completed
|
|
24
|
+
# endpoint with the same shared bearer token used by /refactor-purchased.
|
|
25
|
+
#
|
|
26
|
+
# Failure handling: any step that fails is captured by the final
|
|
27
|
+
# notify-cognition step and reported to the customer as `status=failed`.
|
|
28
|
+
# The cognition endpoint emails the customer (apology + refund offer) and
|
|
29
|
+
# pings Dad on Discord so the order can be retried manually.
|
|
30
|
+
|
|
31
|
+
name: Customer Refactor (forge.atomadic.tech $499 fulfillment)
|
|
32
|
+
|
|
33
|
+
on:
|
|
34
|
+
repository_dispatch:
|
|
35
|
+
types: [forge-refactor]
|
|
36
|
+
workflow_dispatch:
|
|
37
|
+
inputs:
|
|
38
|
+
order_id:
|
|
39
|
+
description: "Order id (forge-refactor-cs_...)"
|
|
40
|
+
required: true
|
|
41
|
+
type: string
|
|
42
|
+
session_id:
|
|
43
|
+
description: "Stripe session id"
|
|
44
|
+
required: false
|
|
45
|
+
type: string
|
|
46
|
+
repo:
|
|
47
|
+
description: "Customer repo URL (full https://github.com/...)"
|
|
48
|
+
required: true
|
|
49
|
+
type: string
|
|
50
|
+
email:
|
|
51
|
+
description: "Customer email"
|
|
52
|
+
required: true
|
|
53
|
+
type: string
|
|
54
|
+
amount_cents:
|
|
55
|
+
description: "Amount paid (cents)"
|
|
56
|
+
required: false
|
|
57
|
+
type: string
|
|
58
|
+
default: "49900"
|
|
59
|
+
|
|
60
|
+
permissions:
|
|
61
|
+
contents: read
|
|
62
|
+
actions: read
|
|
63
|
+
|
|
64
|
+
jobs:
|
|
65
|
+
refactor:
|
|
66
|
+
name: forge auto + open PR
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
timeout-minutes: 25
|
|
69
|
+
env:
|
|
70
|
+
ORDER_ID: ${{ github.event.client_payload.order_id || inputs.order_id }}
|
|
71
|
+
SESSION_ID: ${{ github.event.client_payload.session_id || inputs.session_id }}
|
|
72
|
+
CUSTOMER_REPO: ${{ github.event.client_payload.repo || inputs.repo }}
|
|
73
|
+
CUSTOMER_EMAIL: ${{ github.event.client_payload.email || inputs.email }}
|
|
74
|
+
AMOUNT_CENTS: ${{ github.event.client_payload.amount_cents || inputs.amount_cents }}
|
|
75
|
+
BOT_TOKEN: ${{ secrets.FORGE_BOT_TOKEN }}
|
|
76
|
+
FORGE_API_KEY: ${{ secrets.FORGE_API_KEY }}
|
|
77
|
+
PURCHASE_TOKEN: ${{ secrets.PURCHASE_WEBHOOK_TOKEN }}
|
|
78
|
+
COGNITION_URL: https://atomadic-cognition.atomadictech.workers.dev
|
|
79
|
+
outputs:
|
|
80
|
+
pr_url: ${{ steps.open_pr.outputs.pr_url }}
|
|
81
|
+
status: ${{ steps.open_pr.outputs.status }}
|
|
82
|
+
|
|
83
|
+
steps:
|
|
84
|
+
- name: Validate inputs
|
|
85
|
+
run: |
|
|
86
|
+
if [ -z "$CUSTOMER_REPO" ] || [ -z "$CUSTOMER_EMAIL" ] || [ -z "$ORDER_ID" ]; then
|
|
87
|
+
echo "::error::Missing required client_payload fields (repo, email, order_id)"
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
90
|
+
echo "Order: $ORDER_ID"
|
|
91
|
+
echo "Repo: $CUSTOMER_REPO"
|
|
92
|
+
echo "Customer: $CUSTOMER_EMAIL"
|
|
93
|
+
|
|
94
|
+
- name: Set up Python 3.12
|
|
95
|
+
uses: actions/setup-python@v5
|
|
96
|
+
with:
|
|
97
|
+
python-version: "3.12"
|
|
98
|
+
|
|
99
|
+
- name: Install atomadic-forge from PyPI
|
|
100
|
+
run: |
|
|
101
|
+
python -m pip install --upgrade pip
|
|
102
|
+
pip install atomadic-forge==0.3.5
|
|
103
|
+
forge --version
|
|
104
|
+
|
|
105
|
+
- name: Clone customer repo
|
|
106
|
+
id: clone
|
|
107
|
+
run: |
|
|
108
|
+
mkdir -p target
|
|
109
|
+
git clone --depth 50 "$CUSTOMER_REPO" target/repo
|
|
110
|
+
cd target/repo
|
|
111
|
+
DEFAULT_BRANCH=$(git symbolic-ref --short HEAD)
|
|
112
|
+
REPO_OWNER=$(echo "$CUSTOMER_REPO" | sed -E 's|https://github.com/([^/]+)/.*|\1|')
|
|
113
|
+
REPO_NAME=$(echo "$CUSTOMER_REPO" | sed -E 's|https://github.com/[^/]+/([^/.]+).*|\1|')
|
|
114
|
+
echo "default_branch=$DEFAULT_BRANCH" >> "$GITHUB_OUTPUT"
|
|
115
|
+
echo "repo_owner=$REPO_OWNER" >> "$GITHUB_OUTPUT"
|
|
116
|
+
echo "repo_name=$REPO_NAME" >> "$GITHUB_OUTPUT"
|
|
117
|
+
|
|
118
|
+
- name: Run forge auto on the customer repo
|
|
119
|
+
id: forge_auto
|
|
120
|
+
continue-on-error: true
|
|
121
|
+
run: |
|
|
122
|
+
set -e
|
|
123
|
+
cd target/repo
|
|
124
|
+
# Sanitize the order id for use as a directory name. Some
|
|
125
|
+
# session ids contain `_` which is fine, but the package name
|
|
126
|
+
# cannot contain `-`; we keep them separate (output dir vs
|
|
127
|
+
# --package).
|
|
128
|
+
PKG=$(echo "$ORDER_ID" | tr '-' '_' | tr '/' '_')
|
|
129
|
+
echo "pkg=$PKG" >> "$GITHUB_OUTPUT"
|
|
130
|
+
OUT_DIR="forged/$PKG"
|
|
131
|
+
# Capture certify-before for the PR body. These are best-effort
|
|
132
|
+
# — some repos don't have an obvious src/ root for wire.
|
|
133
|
+
forge certify . --json > /tmp/certify-before.json 2>/dev/null || echo '{}' > /tmp/certify-before.json
|
|
134
|
+
forge wire . --json > /tmp/wire-before.json 2>/dev/null || echo '{}' > /tmp/wire-before.json
|
|
135
|
+
# Run the flagship: scout → cherry-pick → assimilate → wire →
|
|
136
|
+
# certify → emergent. Real failures fail the step (no `|| true`).
|
|
137
|
+
forge auto . "$OUT_DIR" --apply --package absorbed
|
|
138
|
+
ls -la "$OUT_DIR" "$OUT_DIR/src" 2>&1 || true
|
|
139
|
+
forge certify "$OUT_DIR" --json > /tmp/certify-after.json 2>/dev/null || echo '{}' > /tmp/certify-after.json
|
|
140
|
+
forge wire "$OUT_DIR/src" --json > /tmp/wire-after.json 2>/dev/null || echo '{}' > /tmp/wire-after.json
|
|
141
|
+
echo "forge_auto succeeded; output at target/repo/$OUT_DIR"
|
|
142
|
+
|
|
143
|
+
- name: Fork customer repo to bot account
|
|
144
|
+
id: fork
|
|
145
|
+
if: steps.forge_auto.outcome == 'success'
|
|
146
|
+
run: |
|
|
147
|
+
# POST /repos/{owner}/{repo}/forks creates a fork under the
|
|
148
|
+
# authenticated user (the bot). Idempotent — if already forked,
|
|
149
|
+
# returns the existing fork.
|
|
150
|
+
curl -sS -X POST \
|
|
151
|
+
-H "Authorization: token $BOT_TOKEN" \
|
|
152
|
+
-H "Accept: application/vnd.github+json" \
|
|
153
|
+
"https://api.github.com/repos/${{ steps.clone.outputs.repo_owner }}/${{ steps.clone.outputs.repo_name }}/forks" \
|
|
154
|
+
> /tmp/fork.json
|
|
155
|
+
BOT_OWNER=$(jq -r '.owner.login' /tmp/fork.json)
|
|
156
|
+
BOT_FORK_URL=$(jq -r '.clone_url' /tmp/fork.json)
|
|
157
|
+
if [ -z "$BOT_OWNER" ] || [ "$BOT_OWNER" = "null" ]; then
|
|
158
|
+
echo "::error::Fork API did not return an owner; check FORGE_BOT_TOKEN"
|
|
159
|
+
cat /tmp/fork.json
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
echo "bot_owner=$BOT_OWNER" >> "$GITHUB_OUTPUT"
|
|
163
|
+
echo "bot_fork_url=$BOT_FORK_URL" >> "$GITHUB_OUTPUT"
|
|
164
|
+
# Wait for fork to be available (forks are async)
|
|
165
|
+
for i in $(seq 1 12); do
|
|
166
|
+
curl -sS -H "Authorization: token $BOT_TOKEN" \
|
|
167
|
+
"https://api.github.com/repos/$BOT_OWNER/${{ steps.clone.outputs.repo_name }}" \
|
|
168
|
+
| jq -e '.id' >/dev/null 2>&1 && break
|
|
169
|
+
sleep 5
|
|
170
|
+
done
|
|
171
|
+
|
|
172
|
+
- name: Push refactored branch to bot fork
|
|
173
|
+
id: push
|
|
174
|
+
if: steps.fork.outcome == 'success'
|
|
175
|
+
run: |
|
|
176
|
+
set -e
|
|
177
|
+
BRANCH="forge/refactor-$ORDER_ID"
|
|
178
|
+
PKG="${{ steps.forge_auto.outputs.pkg }}"
|
|
179
|
+
OUT_DIR="forged/$PKG"
|
|
180
|
+
cd target/repo
|
|
181
|
+
# Replace src/ with the forge auto output. forge auto writes
|
|
182
|
+
# forged/<pkg>/src/<package>/aN_*/... — we lift the inner
|
|
183
|
+
# src/ wholesale into the customer's repo root.
|
|
184
|
+
rm -rf src
|
|
185
|
+
if [ -d "$OUT_DIR/src" ]; then
|
|
186
|
+
mv "$OUT_DIR/src" src
|
|
187
|
+
else
|
|
188
|
+
echo "::warning::forge auto did not produce $OUT_DIR/src; copying whole $OUT_DIR"
|
|
189
|
+
cp -R "$OUT_DIR" src
|
|
190
|
+
fi
|
|
191
|
+
# Drop the now-empty forged/ scratch dir from the PR.
|
|
192
|
+
rm -rf forged
|
|
193
|
+
git config user.name "Atomadic Forge"
|
|
194
|
+
git config user.email "atomadic-forge@atomadictech.com"
|
|
195
|
+
git checkout -b "$BRANCH"
|
|
196
|
+
git add -A
|
|
197
|
+
git commit -m "Forge refactor — 5-tier monadic layout (order $ORDER_ID)" || echo "nothing to commit"
|
|
198
|
+
git remote add bot "https://x-access-token:$BOT_TOKEN@github.com/${{ steps.fork.outputs.bot_owner }}/${{ steps.clone.outputs.repo_name }}.git"
|
|
199
|
+
git push -u bot "$BRANCH" --force
|
|
200
|
+
echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"
|
|
201
|
+
|
|
202
|
+
- name: Compose PR body
|
|
203
|
+
id: pr_body
|
|
204
|
+
if: steps.push.outcome == 'success'
|
|
205
|
+
run: |
|
|
206
|
+
CB=$(jq -r '.score // "?"' /tmp/certify-before.json 2>/dev/null || echo "?")
|
|
207
|
+
CA=$(jq -r '.score // "?"' /tmp/certify-after.json 2>/dev/null || echo "?")
|
|
208
|
+
WB=$(jq -r '.violation_count // "?"' /tmp/wire-before.json 2>/dev/null || echo "?")
|
|
209
|
+
WA=$(jq -r '.violation_count // "?"' /tmp/wire-after.json 2>/dev/null || echo "?")
|
|
210
|
+
{
|
|
211
|
+
echo "## Forge refactor — order \`$ORDER_ID\`"
|
|
212
|
+
echo ""
|
|
213
|
+
echo "This PR applies a full Forge pass against your repo:"
|
|
214
|
+
echo "**recon → cherry → wire → certify → emergent**."
|
|
215
|
+
echo ""
|
|
216
|
+
echo "### Scorecard"
|
|
217
|
+
echo "| Metric | Before | After |"
|
|
218
|
+
echo "|---|---|---|"
|
|
219
|
+
echo "| Certify | $CB | $CA |"
|
|
220
|
+
echo "| Wire violations | $WB | $WA |"
|
|
221
|
+
echo ""
|
|
222
|
+
echo "### What changed"
|
|
223
|
+
echo "- Every public symbol classified into the 5-tier monadic"
|
|
224
|
+
echo " layout (a0 constants → a1 functions → a2 composites →"
|
|
225
|
+
echo " a3 features → a4 orchestration)."
|
|
226
|
+
echo "- Upward imports rewritten down-tier or split."
|
|
227
|
+
echo "- All file moves preserve git history via \`forge auto\`."
|
|
228
|
+
echo ""
|
|
229
|
+
echo "### How to review"
|
|
230
|
+
echo "1. Skim the file-tree diff — every file is now in exactly"
|
|
231
|
+
echo " one tier directory."
|
|
232
|
+
echo "2. Run \`forge wire src\` locally — should be PASS."
|
|
233
|
+
echo "3. Run \`forge certify .\` — should match the After number"
|
|
234
|
+
echo " above."
|
|
235
|
+
echo "4. Run your own test suite — Forge does not touch behavior."
|
|
236
|
+
echo ""
|
|
237
|
+
echo "One round of revisions is included with your $499 order."
|
|
238
|
+
echo "Reply to the email you received from Atomadic with anything"
|
|
239
|
+
echo "you want changed."
|
|
240
|
+
echo ""
|
|
241
|
+
echo "— Atomadic Forge · powered by [forge.atomadic.tech](https://forge.atomadic.tech)"
|
|
242
|
+
} > /tmp/pr_body.md
|
|
243
|
+
# GitHub Output multiline
|
|
244
|
+
{
|
|
245
|
+
echo 'body<<EOF'
|
|
246
|
+
cat /tmp/pr_body.md
|
|
247
|
+
echo 'EOF'
|
|
248
|
+
} >> "$GITHUB_OUTPUT"
|
|
249
|
+
|
|
250
|
+
- name: Open PR from bot fork → customer repo
|
|
251
|
+
id: open_pr
|
|
252
|
+
if: steps.push.outcome == 'success'
|
|
253
|
+
run: |
|
|
254
|
+
PAYLOAD=$(jq -nR \
|
|
255
|
+
--arg title "Forge refactor — 5-tier monadic layout" \
|
|
256
|
+
--arg body "${{ steps.pr_body.outputs.body }}" \
|
|
257
|
+
--arg head "${{ steps.fork.outputs.bot_owner }}:${{ steps.push.outputs.branch }}" \
|
|
258
|
+
--arg base "${{ steps.clone.outputs.default_branch }}" \
|
|
259
|
+
'{title:$title, body:$body, head:$head, base:$base, maintainer_can_modify:true, draft:false}')
|
|
260
|
+
curl -sS -X POST \
|
|
261
|
+
-H "Authorization: token $BOT_TOKEN" \
|
|
262
|
+
-H "Accept: application/vnd.github+json" \
|
|
263
|
+
"https://api.github.com/repos/${{ steps.clone.outputs.repo_owner }}/${{ steps.clone.outputs.repo_name }}/pulls" \
|
|
264
|
+
-d "$PAYLOAD" \
|
|
265
|
+
> /tmp/pr.json
|
|
266
|
+
PR_URL=$(jq -r '.html_url // empty' /tmp/pr.json)
|
|
267
|
+
PR_NUM=$(jq -r '.number // empty' /tmp/pr.json)
|
|
268
|
+
if [ -z "$PR_URL" ]; then
|
|
269
|
+
echo "::error::Failed to open PR"
|
|
270
|
+
jq . /tmp/pr.json || cat /tmp/pr.json
|
|
271
|
+
echo "status=failed" >> "$GITHUB_OUTPUT"
|
|
272
|
+
echo "pr_url=" >> "$GITHUB_OUTPUT"
|
|
273
|
+
exit 1
|
|
274
|
+
fi
|
|
275
|
+
echo "PR opened: $PR_URL"
|
|
276
|
+
echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
|
|
277
|
+
echo "pr_number=$PR_NUM" >> "$GITHUB_OUTPUT"
|
|
278
|
+
echo "status=opened" >> "$GITHUB_OUTPUT"
|
|
279
|
+
|
|
280
|
+
- name: Notify atomadic-cognition (success or failure)
|
|
281
|
+
if: always()
|
|
282
|
+
run: |
|
|
283
|
+
STATUS="${{ steps.open_pr.outputs.status }}"
|
|
284
|
+
PR_URL="${{ steps.open_pr.outputs.pr_url }}"
|
|
285
|
+
if [ "${{ steps.forge_auto.outcome }}" != "success" ]; then
|
|
286
|
+
STATUS="forge_auto_failed"
|
|
287
|
+
elif [ "${{ steps.push.outcome }}" != "success" ]; then
|
|
288
|
+
STATUS="push_failed"
|
|
289
|
+
fi
|
|
290
|
+
STATUS="${STATUS:-failed}"
|
|
291
|
+
PAYLOAD=$(jq -n \
|
|
292
|
+
--arg order_id "$ORDER_ID" \
|
|
293
|
+
--arg session_id "$SESSION_ID" \
|
|
294
|
+
--arg pr_url "${PR_URL:-}" \
|
|
295
|
+
--arg status "$STATUS" \
|
|
296
|
+
--arg run_url "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
|
|
297
|
+
'{order_id:$order_id, session_id:$session_id, pr_url:$pr_url, status:$status, run_url:$run_url}')
|
|
298
|
+
curl -sS -X POST \
|
|
299
|
+
-H "Authorization: Bearer $PURCHASE_TOKEN" \
|
|
300
|
+
-H "Content-Type: application/json" \
|
|
301
|
+
"$COGNITION_URL/refactor-completed" \
|
|
302
|
+
-d "$PAYLOAD" || true
|
|
@@ -15,10 +15,10 @@ jobs:
|
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
17
|
- name: Check out repository
|
|
18
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@v6
|
|
19
19
|
|
|
20
20
|
- name: Set up Python
|
|
21
|
-
uses: actions/setup-python@
|
|
21
|
+
uses: actions/setup-python@v6
|
|
22
22
|
with:
|
|
23
23
|
python-version: "3.12"
|
|
24
24
|
cache: pip
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
python -m twine check dist/*
|
|
32
32
|
|
|
33
33
|
- name: Upload distributions
|
|
34
|
-
uses: actions/upload-artifact@
|
|
34
|
+
uses: actions/upload-artifact@v7
|
|
35
35
|
with:
|
|
36
36
|
name: release-dist
|
|
37
37
|
path: dist/*
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
if: github.event_name == 'release' && !github.event.release.prerelease
|
|
47
47
|
steps:
|
|
48
48
|
- name: Download distributions
|
|
49
|
-
uses: actions/download-artifact@
|
|
49
|
+
uses: actions/download-artifact@v8
|
|
50
50
|
with:
|
|
51
51
|
name: release-dist
|
|
52
52
|
path: dist
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.1 — MCP stdio framing compatibility
|
|
4
|
+
|
|
5
|
+
Fixes `forge mcp serve` for MCP hosts that use LSP-style
|
|
6
|
+
`Content-Length` framing over stdio instead of newline-delimited JSON.
|
|
7
|
+
Modern Codex / VS Code MCP bridges can spawn the server, list tools,
|
|
8
|
+
and then send framed `tools/call` requests; before this patch Forge
|
|
9
|
+
could misread the frame header as JSON and leave the host waiting until
|
|
10
|
+
its tool-call timeout.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- `forge mcp serve` now accepts both newline-delimited JSON-RPC and
|
|
15
|
+
`Content-Length` framed JSON-RPC on stdin.
|
|
16
|
+
- MCP responses are written in the same framing style as the request
|
|
17
|
+
that triggered them, preserving compatibility with shell smoke tests
|
|
18
|
+
and stricter MCP clients.
|
|
19
|
+
- The dispatcher now treats both `notifications/initialized` and
|
|
20
|
+
`initialized` as no-response initialization notifications.
|
|
21
|
+
- The VS Code extension manifest version now tracks the `0.5.1`
|
|
22
|
+
package release.
|
|
23
|
+
|
|
24
|
+
### Tests
|
|
25
|
+
|
|
26
|
+
- Added a framed stdio regression test for initialize → initialized →
|
|
27
|
+
ping → shutdown.
|
|
28
|
+
- Verified framed `tools/call list_recipes` against the real
|
|
29
|
+
`forge mcp serve` command.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
3
33
|
## 0.3.5 — Copilot's Copilot CLI parity + GUI version sync
|
|
4
34
|
|
|
5
35
|
The MCP exposes 21 tools. Until 0.3.5, only 12 of them had CLI
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomadic-forge
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Atomadic Forge — absorb, enforce, emerge. Polyglot (Python + JavaScript/TypeScript) architecture guardian for AI-generated code.
|
|
5
5
|
Author: Atomadic
|
|
6
6
|
License-Expression: BUSL-1.1
|
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
License-File: LICENSE
|
|
17
17
|
Requires-Dist: click<9,>=8.1
|
|
18
18
|
Requires-Dist: typer<1,>=0.15
|
|
19
|
-
Requires-Dist: rich<
|
|
19
|
+
Requires-Dist: rich<16,>=14
|
|
20
20
|
Requires-Dist: pyyaml<7,>=6
|
|
21
21
|
Provides-Extra: dev
|
|
22
22
|
Requires-Dist: pytest>=7; extra == "dev"
|
|
@@ -41,6 +41,7 @@ Dynamic: license-file
|
|
|
41
41
|
[](LICENSE)
|
|
42
42
|
[](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml)
|
|
43
43
|
[](docs/SHOWCASE.md)
|
|
44
|
+
[](https://www.producthunt.com/products/atomadic-forge-mcp-architecture-copilot)
|
|
44
45
|
|
|
45
46
|
> **Absorb. Enforce. Emerge.** The architecture substrate for AI-generated code — now polyglot (Python, JavaScript, TypeScript).
|
|
46
47
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](https://github.com/atomadictech/atomadic-forge/actions/workflows/ci.yml)
|
|
11
11
|
[](docs/SHOWCASE.md)
|
|
12
|
+
[](https://www.producthunt.com/products/atomadic-forge-mcp-architecture-copilot)
|
|
12
13
|
|
|
13
14
|
> **Absorb. Enforce. Emerge.** The architecture substrate for AI-generated code — now polyglot (Python, JavaScript, TypeScript).
|
|
14
15
|
|
|
@@ -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.5.1"
|
|
8
8
|
description = "Atomadic Forge — absorb, enforce, emerge. Polyglot (Python + JavaScript/TypeScript) architecture guardian for AI-generated code."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -24,7 +24,7 @@ classifiers = [
|
|
|
24
24
|
dependencies = [
|
|
25
25
|
"click>=8.1,<9",
|
|
26
26
|
"typer>=0.15,<1",
|
|
27
|
-
"rich>=14,<
|
|
27
|
+
"rich>=14,<16",
|
|
28
28
|
# Lane D W8 — .forge sidecar parser (a1.sidecar_parser) and the
|
|
29
29
|
# GitHub Action validator test surface both depend on PyYAML.
|
|
30
30
|
"pyyaml>=6,<7",
|
{atomadic_forge-0.3.5 → atomadic_forge-0.5.1}/src/atomadic_forge/a0_qk_constants/lang_extensions.py
RENAMED
|
@@ -84,6 +84,10 @@ IGNORED_DIRS: Final[frozenset[str]] = frozenset({
|
|
|
84
84
|
".wrangler", ".wrangler-cache",
|
|
85
85
|
# Atomadic-Forge's own scratch dir
|
|
86
86
|
".atomadic-forge",
|
|
87
|
+
# Intentional bad-wire test fixtures shipped with the Forge package.
|
|
88
|
+
# These exist to demonstrate violations and must NEVER count against
|
|
89
|
+
# the host repo's certify score.
|
|
90
|
+
"demo_packages",
|
|
87
91
|
})
|
|
88
92
|
|
|
89
93
|
|