atomadic-forge 0.3.5__tar.gz → 0.5.2__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.2}/.github/workflows/ci.yml +6 -6
- atomadic_forge-0.5.2/.github/workflows/customer-refactor.yml +302 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/forge-self-certify.yml +1 -1
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/release.yml +4 -4
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/CHANGELOG.md +74 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/PKG-INFO +13 -5
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/README.md +11 -3
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/05-faq.md +8 -4
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/AGENTS_GUIDE.md +25 -13
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/COMMANDS.md +44 -16
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/pyproject.toml +2 -2
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/__init__.py +1 -1
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/lang_extensions.py +4 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_context_pack.py +3 -30
- atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/exported_api_check.py +188 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/mcp_protocol.py +166 -2
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/patch_scorer.py +14 -9
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/preflight_change.py +20 -6
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/test_selector.py +30 -5
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/tool_composer.py +8 -3
- atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/trust_gate_response.py +221 -0
- atomadic_forge-0.5.2/src/atomadic_forge/a1_at_functions/validation_commands.py +183 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/mcp_server.py +75 -11
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/cli.py +73 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/PKG-INFO +13 -5
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/SOURCES.txt +6 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/requires.txt +1 -1
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_codex_5_complete.py +37 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_copilots_copilot.py +40 -0
- atomadic_forge-0.5.2/tests/test_exported_api_check.py +146 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_mcp_protocol.py +70 -0
- atomadic_forge-0.5.2/tests/test_trust_gate_response.py +106 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/actions/forge-action/README.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/actions/forge-action/action.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/dependabot.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/pull_request_template.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/.github/workflows/forge-studio-ci.yml +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/ARCHITECTURE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/CONTRIBUTING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/LICENSE +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/MANIFEST.in +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/SECURITY.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/assets/Atomadic-Forge-01.png +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/01-getting-started.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/02-commands.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/03-tutorial.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/04-llm-loops.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/AIR_GAPPED.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/CI_CD.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/CODEX_WALKTHROUGH.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/FIRST_10_MINUTES.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/FORMALIZATION.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/LANDSCAPE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/MARKET_POSITIONING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/MULTI_REPO.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/README.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RECEIPT.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RELEASE_CHECKLIST.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/RELEASE_MESSAGING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/ROADMAP.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/SHOWCASE.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/SIDECAR.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/STUDIO.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/WHY_NOW.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/INDEX.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/chat.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/commandsmith.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/config.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/demo.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/emergent-then-synergy.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/evolve-then-iterate.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/evolve.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/feature-then-emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/iterate.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/synergy-then-emergent.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/commands/synergy.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/CMMC_AI_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/CS-1.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/EU_AI_ACT_ANNEX_IV.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/FDA_PCCP_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/compliance/SR_11-7_MAPPING.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/01-quickstart.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/02-your-first-package.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/03-the-five-tier-law.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/04-plug-in-llms.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/05-multi-repo-absorb.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/docs/tutorials/06-javascript-quickstart.md +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/setup.cfg +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/__main__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/agent_plan_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/auth_constants.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/commandsmith_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/config_defaults.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/emergent_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/error_codes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/forge_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/gen_language.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/policy_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/receipt_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/roi_constants.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/semantic_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/sidecar_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/synergy_types.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a0_qk_constants/tier_names.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_memory.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_plan_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/agent_summary.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/body_extractor.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/card_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/certify_checks.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/chat_context.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/cherry_pick.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/classify_tier.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/commandsmith_discover.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/commandsmith_render.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/compiler_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/compliance_checker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/config_io.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/cs1_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/doc_synthesizer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_compose.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_rank.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_signature_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/emergent_synthesize.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/enforce_planner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/error_hints.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/evolution_log.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/forge_auth.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/forge_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/generation_quality.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/import_repair.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/import_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/js_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lineage_chain.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lineage_reader.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/llm_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/local_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/lsp_protocol.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/manifest_diff.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/plan_adapter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/policy_loader.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/progress_reporter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/provider_detect.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/provider_resolver.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/receipt_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/recipes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/repo_explainer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/roi_calculator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/rollback_planner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sbom_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_js.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_pyproject.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scaffold_starter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/scout_walk.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sidecar_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/sidecar_validator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/stub_detector.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_detect.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_render.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/synergy_surface_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/test_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/tier_init_rebuild.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/transcript_log.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a1_at_functions/wire_check.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/forge_auth_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/lineage_chain_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/manifest_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/plan_store.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a2_mo_composites/receipt_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/commandsmith_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/atomadic_forge/a3_og_features/demo_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/emergent_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/emergent_pipeline_integration.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_enforce.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_loop.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_pipeline.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/forge_plan_apply.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/lsp_server.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/setup_wizard.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a3_og_features/synergy_feature.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/copilots_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/login_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/a4_sy_orchestration/whoami_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/__init__.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/_registry.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/audit.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/chat.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/commandsmith.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/config_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/demo.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/emergent_then_synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/evolve_then_iterate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/feature_then_emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/iterate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge/commands/synergy_then_emergent.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/dependency_links.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/entry_points.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/src/atomadic_forge.egg-info/top_level.txt +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_aaaa_nexus_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_agent_plan.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_agent_summary.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_audit_verb.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_badge_worker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_body_extractor_repairs.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_card_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_certify_operational_axis.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_chat.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_classify_tier.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_cli_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_codex_6_enforce_polyglot.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_commandsmith.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_compiler_feedback.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_compliance_checker.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_config.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_cs1_renderer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_demo.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_emergent_compose.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_emergent_signature_extract.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_error_codes.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_error_hints.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_evolve_js.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_action.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_auth_a1.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_auth_a2.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_forge_enforce.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_generation_quality.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_ignore_and_docs.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_import_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_iterate_evolve.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_certify.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_parser.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_recon.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_js_wire.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_lineage_chain.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_local_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_lsp_protocol.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_manifest_diff.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_ollama_client.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_pipeline.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_plan_apply.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_pre_audit_smoke.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_precommit_hooks.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_progress_reporter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_schema.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_receipt_signer.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_roi_calculator.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sbom_emitter.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_scaffold.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sidecar.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_sidecar_validate.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_stagnation.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_stub_detector.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_synergy.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_test_runner.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_tier_init_rebuild.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_vscode_extension_manifest.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_whoami_cmd.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/tests/test_wire_certify.py +0 -0
- {atomadic_forge-0.3.5 → atomadic_forge-0.5.2}/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,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.2 - Agent ergonomics and language-aware guidance
|
|
4
|
+
|
|
5
|
+
Implements the first round of quality-of-life improvements from the
|
|
6
|
+
Forge agent review. This release makes Forge friendlier when an agent
|
|
7
|
+
uses it on JavaScript repos, documentation/research patches, or live
|
|
8
|
+
MCP connections.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `forge mcp doctor` smoke-tests MCP stdio with framed `initialize`,
|
|
13
|
+
`tools/list`, and `shutdown` requests. It reports version, project
|
|
14
|
+
root, tool count, framed-stdio status, server exit code, and a
|
|
15
|
+
recovery hint.
|
|
16
|
+
- `tools/list` entries now include a `cli_command` fallback so agents
|
|
17
|
+
can switch from MCP to shell without guessing command names.
|
|
18
|
+
- Shared validation heuristics now detect `package.json` scripts,
|
|
19
|
+
JS/TS tests, tier roots, and release-gate commands.
|
|
20
|
+
|
|
21
|
+
### Improved
|
|
22
|
+
|
|
23
|
+
- `context-pack` prefers `npm run verify` / `npm test` for JavaScript
|
|
24
|
+
projects and derives `forge wire` gates from real tier roots.
|
|
25
|
+
- `preflight` recognizes non-code artifacts such as `docs/`,
|
|
26
|
+
`research/`, `.github/`, and `cognition/guides/` as valid project
|
|
27
|
+
memory instead of misplaced source.
|
|
28
|
+
- `select-tests` discovers JS/TS test files and avoids mirror pytest
|
|
29
|
+
requirements for documentation-only changes.
|
|
30
|
+
- `score-patch` no longer treats docs/research-only diffs as code
|
|
31
|
+
changes without tests, and emits language-aware validation commands
|
|
32
|
+
when a project root is provided.
|
|
33
|
+
- `compose-tools verify_patch` now maps to
|
|
34
|
+
`score_patch -> select_tests -> wire -> certify`.
|
|
35
|
+
- Hidden worktrees, experiment directories, build output, and
|
|
36
|
+
`node_modules` are skipped when deriving release-gate wire roots.
|
|
37
|
+
|
|
38
|
+
### Tests
|
|
39
|
+
|
|
40
|
+
- Added regression tests for JavaScript validation selection,
|
|
41
|
+
non-code artifact preflight, docs-only patch scoring, exact
|
|
42
|
+
`verify_patch` recipe matching, MCP CLI fallback metadata, and
|
|
43
|
+
`forge mcp doctor`.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 0.5.1 — MCP stdio framing compatibility
|
|
48
|
+
|
|
49
|
+
Fixes `forge mcp serve` for MCP hosts that use LSP-style
|
|
50
|
+
`Content-Length` framing over stdio instead of newline-delimited JSON.
|
|
51
|
+
Modern Codex / VS Code MCP bridges can spawn the server, list tools,
|
|
52
|
+
and then send framed `tools/call` requests; before this patch Forge
|
|
53
|
+
could misread the frame header as JSON and leave the host waiting until
|
|
54
|
+
its tool-call timeout.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- `forge mcp serve` now accepts both newline-delimited JSON-RPC and
|
|
59
|
+
`Content-Length` framed JSON-RPC on stdin.
|
|
60
|
+
- MCP responses are written in the same framing style as the request
|
|
61
|
+
that triggered them, preserving compatibility with shell smoke tests
|
|
62
|
+
and stricter MCP clients.
|
|
63
|
+
- The dispatcher now treats both `notifications/initialized` and
|
|
64
|
+
`initialized` as no-response initialization notifications.
|
|
65
|
+
- The VS Code extension manifest version now tracks the `0.5.1`
|
|
66
|
+
package release.
|
|
67
|
+
|
|
68
|
+
### Tests
|
|
69
|
+
|
|
70
|
+
- Added a framed stdio regression test for initialize → initialized →
|
|
71
|
+
ping → shutdown.
|
|
72
|
+
- Verified framed `tools/call list_recipes` against the real
|
|
73
|
+
`forge mcp serve` command.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
3
77
|
## 0.3.5 — Copilot's Copilot CLI parity + GUI version sync
|
|
4
78
|
|
|
5
79
|
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.2
|
|
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
|
|
|
@@ -215,14 +216,21 @@ Forge ships a **Model Context Protocol server** — add it to Cursor, Claude Cod
|
|
|
215
216
|
}
|
|
216
217
|
```
|
|
217
218
|
|
|
218
|
-
**
|
|
219
|
+
**23 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe` · `trust_gate_response` · `exported_api_check`
|
|
219
220
|
|
|
220
221
|
**5 resources:** Receipt schema · formalization docs · lineage chain · blocker summary · verdicts
|
|
221
222
|
|
|
222
223
|
```bash
|
|
223
224
|
forge mcp serve --help # full tool + resource listing with examples
|
|
225
|
+
forge mcp doctor --project . --json
|
|
224
226
|
```
|
|
225
227
|
|
|
228
|
+
As of `0.5.2`, `tools/list` includes a `cli_command` fallback for
|
|
229
|
+
each MCP tool. `context-pack`, `preflight`, `select-tests`, and
|
|
230
|
+
`score-patch` also use language-aware validation commands so
|
|
231
|
+
JavaScript projects get `npm run verify` / `npm test` guidance and
|
|
232
|
+
documentation/research paths are treated as non-code project memory.
|
|
233
|
+
|
|
226
234
|
### Subscription required for `forge mcp serve`
|
|
227
235
|
|
|
228
236
|
Every `tools/call` against the MCP server is gated behind a paid Forge
|
|
@@ -369,7 +377,7 @@ Forge waits before returning a clear provider error.
|
|
|
369
377
|
|
|
370
378
|
| Command | Purpose |
|
|
371
379
|
|---------|---------|
|
|
372
|
-
| `forge mcp serve` | Stdio JSON-RPC MCP server —
|
|
380
|
+
| `forge mcp serve` | Stdio JSON-RPC MCP server — 23 tools for Cursor / Claude Code / Aider / Devin. |
|
|
373
381
|
| `forge plan / plan-list / plan-show / plan-step / plan-apply` | Agent plan persistence and step-by-step apply. |
|
|
374
382
|
| `forge iterate` | LLM loop: intent → code → absorb → wire → score → iterate. Single shot. |
|
|
375
383
|
| `forge evolve` | Recursive improvement: N rounds, catalog grows each round. |
|
|
@@ -491,7 +499,7 @@ forge commandsmith smoke # Smoke-test all 36+ registered verbs
|
|
|
491
499
|
- ✓ **100/100 certify** — forge scores itself on every CI run
|
|
492
500
|
- ✓ **0 wire violations** — forge passes its own import-law scan
|
|
493
501
|
- ✓ **On PyPI** — `pip install atomadic-forge`
|
|
494
|
-
- ✓ **MCP server** —
|
|
502
|
+
- ✓ **MCP server** — 23 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
|
|
495
503
|
- ✓ **Desktop GUI** — Forge Studio (Tauri 2 + React)
|
|
496
504
|
- ✓ **Ed25519 signing** — `forge certify --local-sign`
|
|
497
505
|
- ✓ **CycloneDX SBOM** — `forge sbom`
|
|
@@ -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
|
|
|
@@ -183,14 +184,21 @@ Forge ships a **Model Context Protocol server** — add it to Cursor, Claude Cod
|
|
|
183
184
|
}
|
|
184
185
|
```
|
|
185
186
|
|
|
186
|
-
**
|
|
187
|
+
**23 tools exposed:** `recon` · `wire` · `certify` · `enforce` · `audit_list` · `auto_plan` · `auto_step` · `auto_apply` · `context_pack` · `preflight_change` · `score_patch` · `select_tests` · `rollback_plan` · `explain_repo` · `adapt_plan` · `compose_tools` · `load_policy` · `why_did_this_change` · `what_failed_last_time` · `list_recipes` · `get_recipe` · `trust_gate_response` · `exported_api_check`
|
|
187
188
|
|
|
188
189
|
**5 resources:** Receipt schema · formalization docs · lineage chain · blocker summary · verdicts
|
|
189
190
|
|
|
190
191
|
```bash
|
|
191
192
|
forge mcp serve --help # full tool + resource listing with examples
|
|
193
|
+
forge mcp doctor --project . --json
|
|
192
194
|
```
|
|
193
195
|
|
|
196
|
+
As of `0.5.2`, `tools/list` includes a `cli_command` fallback for
|
|
197
|
+
each MCP tool. `context-pack`, `preflight`, `select-tests`, and
|
|
198
|
+
`score-patch` also use language-aware validation commands so
|
|
199
|
+
JavaScript projects get `npm run verify` / `npm test` guidance and
|
|
200
|
+
documentation/research paths are treated as non-code project memory.
|
|
201
|
+
|
|
194
202
|
### Subscription required for `forge mcp serve`
|
|
195
203
|
|
|
196
204
|
Every `tools/call` against the MCP server is gated behind a paid Forge
|
|
@@ -337,7 +345,7 @@ Forge waits before returning a clear provider error.
|
|
|
337
345
|
|
|
338
346
|
| Command | Purpose |
|
|
339
347
|
|---------|---------|
|
|
340
|
-
| `forge mcp serve` | Stdio JSON-RPC MCP server —
|
|
348
|
+
| `forge mcp serve` | Stdio JSON-RPC MCP server — 23 tools for Cursor / Claude Code / Aider / Devin. |
|
|
341
349
|
| `forge plan / plan-list / plan-show / plan-step / plan-apply` | Agent plan persistence and step-by-step apply. |
|
|
342
350
|
| `forge iterate` | LLM loop: intent → code → absorb → wire → score → iterate. Single shot. |
|
|
343
351
|
| `forge evolve` | Recursive improvement: N rounds, catalog grows each round. |
|
|
@@ -459,7 +467,7 @@ forge commandsmith smoke # Smoke-test all 36+ registered verbs
|
|
|
459
467
|
- ✓ **100/100 certify** — forge scores itself on every CI run
|
|
460
468
|
- ✓ **0 wire violations** — forge passes its own import-law scan
|
|
461
469
|
- ✓ **On PyPI** — `pip install atomadic-forge`
|
|
462
|
-
- ✓ **MCP server** —
|
|
470
|
+
- ✓ **MCP server** — 23 tools, 5 resources; works with Cursor, Claude Code, Aider, Devin
|
|
463
471
|
- ✓ **Desktop GUI** — Forge Studio (Tauri 2 + React)
|
|
464
472
|
- ✓ **Ed25519 signing** — `forge certify --local-sign`
|
|
465
473
|
- ✓ **CycloneDX SBOM** — `forge sbom`
|
|
@@ -429,27 +429,31 @@ config:
|
|
|
429
429
|
}
|
|
430
430
|
```
|
|
431
431
|
|
|
432
|
-
Once registered, the agent gets **
|
|
433
|
-
full Codex-1..5 surface
|
|
432
|
+
Once registered, the agent gets **23 tools** + **5 resources** (the
|
|
433
|
+
full Codex-1..5 surface plus response/API trust gates). The 23 tools group into
|
|
434
434
|
*inventory* (`recon` / `wire` / `certify` / `enforce` / `audit_list` /
|
|
435
435
|
`agent_summary`), *action loop* (`auto_plan` / `auto_step` /
|
|
436
436
|
`auto_apply`), and *Copilot's Copilot* (`context_pack` /
|
|
437
437
|
`preflight_change` / `score_patch` / `select_tests` / `rollback_plan` /
|
|
438
438
|
`explain_repo` / `adapt_plan` / `compose_tools` / `load_policy` /
|
|
439
439
|
`why_did_this_change` / `what_failed_last_time` / `list_recipes` /
|
|
440
|
-
`get_recipe`). See the full **[Agents Guide](AGENTS_GUIDE.md)** for
|
|
440
|
+
`get_recipe` / `trust_gate_response` / `exported_api_check`). See the full **[Agents Guide](AGENTS_GUIDE.md)** for
|
|
441
441
|
integration patterns, the agent-friendly `agent_summary` /
|
|
442
442
|
`context_pack` tools, the Forge Receipt schema agents should
|
|
443
443
|
consume, F-code routing for mechanical fixes, the proposal-engine
|
|
444
444
|
flow, and best practices.
|
|
445
445
|
|
|
446
|
+
For MCP troubleshooting, run `forge mcp doctor --project . --json`.
|
|
447
|
+
As of `0.5.2`, `tools/list` also includes a `cli_command` fallback for
|
|
448
|
+
each MCP tool, and validation hints are language-aware.
|
|
449
|
+
|
|
446
450
|
### What's the difference between AGENTS.md and the Agents Guide?
|
|
447
451
|
|
|
448
452
|
- **`AGENTS.md`** at the repo root is for agents *building* Forge —
|
|
449
453
|
the dev contract: tier discipline, F-code namespace, schema
|
|
450
454
|
versioning, branch hygiene, the verification lane.
|
|
451
455
|
- **`docs/AGENTS_GUIDE.md`** is for agents *using* Forge — Cursor /
|
|
452
|
-
Claude Code / Aider / etc. integrating via MCP, calling the
|
|
456
|
+
Claude Code / Aider / etc. integrating via MCP, calling the 23
|
|
453
457
|
tools, consuming Receipts, running `preflight_change` /
|
|
454
458
|
`score_patch` guardrails, applying mechanical fixes via `enforce`.
|
|
455
459
|
|