asecli 0.6.4__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- asecli-0.7.0/PKG-INFO +422 -0
- asecli-0.7.0/README.md +398 -0
- {asecli-0.6.4 → asecli-0.7.0}/SECURITY.md +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/audit-supplement.json +14 -2
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/change-register.md +2 -1
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/timeline.md +3 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/traceability.csv +2 -1
- {asecli-0.6.4 → asecli-0.7.0}/docs/01-architecture/module-map.md +5 -5
- {asecli-0.6.4 → asecli-0.7.0}/docs/01-architecture/project-architecture-and-requirements.md +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/docs/03-quality/regression-catalog.md +1 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/03-quality/test-strategy.md +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/docs/04-delivery/project-plan-task-charter.md +2 -1
- asecli-0.7.0/docs/adversarial-audits/2026-09-04-122304-audit-report.md +89 -0
- asecli-0.7.0/docs/adversarial-audits/2026-09-04-122304-optimization-plan.md +46 -0
- asecli-0.7.0/docs/adversarial-audits/2026-09-10-193631-audit-report.md +98 -0
- asecli-0.7.0/docs/adversarial-audits/2026-09-10-193631-optimization-plan.md +52 -0
- asecli-0.7.0/docs/proposals/2026-09-07-shadergraph-to-ase-requirements.md +222 -0
- {asecli-0.6.4 → asecli-0.7.0}/pyproject.toml +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/scripts/install.ps1 +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/scripts/install.sh +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/skills/asecli/SKILL.md +13 -5
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/__init__.py +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/__init__.py +2 -1
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_editor_port_contract.py +2 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_editor_spec_grammar.py +6 -5
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_editor_spec_validation.py +21 -7
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/editor_create.py +43 -7
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/editor_spec.py +18 -21
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/graph_geometry_parser.py +8 -1
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/graph_inspect.py +3 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/recompile.py +23 -0
- asecli-0.7.0/src/asecli/bridge/render_settings.py +26 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/editor_create.part00.cs.txt +29 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/editor_create.part01.cs.txt +1 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/editor_create.part02.cs.txt +31 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/editor_create.part03.cs.txt +11 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/editor_create.part04.cs.txt +1 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/commands.py +5 -1
- asecli-0.7.0/src/asecli/cli/contract.py +117 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/create_command.py +1 -1
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/layout_command.py +3 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/main.py +34 -30
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/commentary.py +8 -3
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/layout.py +5 -1
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/layout_graph.py +5 -1
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_bridge_contract.py +65 -0
- asecli-0.7.0/tests/test_cli_contract.py +235 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_commentary.py +26 -0
- asecli-0.7.0/tests/test_create_constant_presentation.py +19 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_custom_gui.py +9 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_editor_create_bridge.py +1 -1
- asecli-0.7.0/tests/test_editor_render_settings.py +124 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_install_scripts.py +2 -2
- asecli-0.7.0/tests/test_smoke.py +4 -0
- {asecli-0.6.4 → asecli-0.7.0}/uv.lock +1 -1
- asecli-0.6.4/PKG-INFO +0 -637
- asecli-0.6.4/README.md +0 -613
- asecli-0.6.4/tests/test_cli_contract.py +0 -138
- asecli-0.6.4/tests/test_smoke.py +0 -4
- {asecli-0.6.4 → asecli-0.7.0}/.github/workflows/ci.yml +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/.github/workflows/publish.yml +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/.gitignore +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/.project-architect.json +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/AGENTS.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/LICENSE +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/delivery-protocol.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/project-charter.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/00-governance/supply-chain-policy.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/01-architecture/assumption-experiments.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/01-architecture/technical-route.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/03-quality/bug-register.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/04-delivery/roadmap.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-014104-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-014104-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-145343-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-145343-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-193521-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-193521-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-203438-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-01-203438-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-02-121155-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-02-121155-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-02-175509-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-02-175509-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-142617-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-142617-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-160945-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-160945-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-213523-audit-report.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/adversarial-audits/2026-09-05-213523-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/first-principles/2026-08-31-231401-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/docs/first-principles/2026-09-01-190656-optimization-plan.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/skills/asecli/references/conversion-workflow.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/skills/asecli/references/layout-standard.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/skills/asecli/references/master-output-settings-standard.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/skills/asecli/references/material-property-standard.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_editor_primitives.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_editor_spec_io.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_gui_handoff_store.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_gui_project.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_gui_resource_store.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/_gui_resource_upgrade.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/graph_geometry.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_handoff.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_presentation.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_provider_detection.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_runtime_probe.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_support.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/gui_support_resource.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/mcp_client.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resource_text.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.authoring.part00.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.authoring.part01.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.authoring.store.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.condition.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.hydration.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.part00.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.part01.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.reconciliation.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/asecli_material_gui.transaction.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/resources/wire_route.transaction.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/bridge/wire_route.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/checks/__init__.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/checks/checksum.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/checks/local_vars.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/checks/usage.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/checks/validate.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/__init__.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/commentary_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/custom_gui_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/graph_review_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/gui_provider.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/gui_support_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/io.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/recompile_metadata.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/skill_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/cli/usage_command.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/__init__.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/comment_bounds.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/comment_layout.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/comment_metrics.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/comment_purpose.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/compiled_metadata.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/compiled_properties.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/custom_gui.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/custom_gui_versions.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/fishbone_placement.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/fishbone_topology.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/graph_ops.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/graph_review.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/island_layout.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/layout_audit.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/layout_audit_geometry.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/layout_audit_repeated.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/local_vars.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/material_gui_condition.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/material_gui_protocol.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/material_gui_spec.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/meticulous_layout.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/model.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/property_presentation.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/reuse_plan.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/wire_geometry.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/core/wire_router.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/schema/__init__.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/schema/data/observed.json +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/src/asecli/schema/data/schemas.json +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/TEST.md +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/__init__.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/conftest.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/editor_create_v3_fixture.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/fixtures/HLIT.shader +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/fixtures/asecli_material_gui_v0_2_0.cs.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/fixtures/step-antialiasing.function.txt +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_adversarial_hardening.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_audit_fixes.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_bridge_recompile.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_build_reproducibility.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_core_contract.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_create.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_custom_gui_cli.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_editor_create_cli.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_editor_create_e2e.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_editor_create_spec.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_editor_create_spec_v3.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_governance.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_graph_review.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_graph_safety.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_gui_handoff.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_gui_native_extension.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_gui_support.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_gui_support_cli_contract.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_gui_upgrade.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_island_layout.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_layout.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_layout_governance.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_layout_local_var_policy.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_material_gui_e2e.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_mcp_security.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_mutate.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_perf.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_property_presentation.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_roundtrip.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_schema_add.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_schema_samples.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_skill_install.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_supply_chain.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_usage_audit.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tests/test_wire_route_bridge.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/build_schema.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/check_ci_governance.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/check_document_governance.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/check_packed_executor_loc.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/check_regression_catalog.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/check_release_candidate.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/compare_build_artifacts.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/generate_sbom.py +0 -0
- {asecli-0.6.4 → asecli-0.7.0}/tools/supply_chain_check.py +0 -0
asecli-0.7.0/PKG-INFO
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: asecli
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: Agent-native CLI for reading, modifying, validating and compiling Amplify Shader Editor assets
|
|
5
|
+
Project-URL: Homepage, https://github.com/seeseeczl/ASECLI
|
|
6
|
+
Project-URL: Repository, https://github.com/seeseeczl/ASECLI
|
|
7
|
+
Project-URL: Issues, https://github.com/seeseeczl/ASECLI/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/seeseeczl/ASECLI/releases
|
|
9
|
+
Author: AseCLI contributors
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: amplify-shader-editor,ase,cli,shader,unity
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# AseCLI
|
|
26
|
+
|
|
27
|
+
**让 AI Agent 创建、修改、校验、整理与编译 Amplify Shader Editor(ASE)文件。**
|
|
28
|
+
|
|
29
|
+
AseCLI 是面向 AI Agent 的本地 CLI:离线读取、编辑和校验 ASE 节点图;通过运行中的 Unity/团结引擎与 MCP,让真实 ASE 创建节点、提供精排几何并重新生成 HLSL。Skill 提供跨 Agent 的操作规则,CLI 提供可验证的执行结果。
|
|
30
|
+
|
|
31
|
+
当前正式版:**[0.7.0](https://github.com/seeseeczl/ASECLI/releases/tag/v0.7.0)** · [PyPI](https://pypi.org/project/asecli/0.7.0/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
|
|
32
|
+
|
|
33
|
+
ASECLI 接收 `EditorGraphSpec`,不直接承担任意 Shader Graph 的转换。SGCLI 导出的源图 JSON、转换后的创建规格和已经整理的 `.shader` 是不同资产;创建成功不代表转换效果等价。
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
你:提需求("给这个 shader 加个可调描边")
|
|
37
|
+
Agent:设计节点图 → asecli 写文件 → 校验 → 触发编译 → 你验收效果
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 能力总览
|
|
41
|
+
|
|
42
|
+
| 领域 | 能力清单 | 是否需要运行中的 Unity/Tuanjie |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| 图读取与安全检查 | 解析节点/连线、结构校验、CHKSM 校验与修复、无效节点审计 | 否 |
|
|
45
|
+
| 图编辑 | 设置已知字段、schema 驱动或原始行加节点、连线/断线、受保护删节点、最小差异写回 | 否 |
|
|
46
|
+
| 图整理 | 离线初排、真实几何递归鱼骨、独立计算岛摆放(默认单列,可选多列)、原生 Comment 与边界检查 | 精排、真实边界检查需要 |
|
|
47
|
+
| 转换后核对 | `graph-review` 保守比较计算基线,按输出端口生成 Local Var 复用计划 | 只读计划不需要;不会自动创建 Register/Get |
|
|
48
|
+
| 材质 Inspector | 原生 MZGUI 优先;缺失时才注入 ASECLI ShaderGUI fallback。两者兼容 `FoldoutMzgui`、`TooltipMzgui`、`HelpBoxMzgui` 和条件置灰 `EnableIfMzgui`;默认只生成 Tooltip,HelpBox 由用户按需添加 | 写元数据否;安装、重编译和最终 Inspector 验收需要 |
|
|
49
|
+
| Shader 创建 | 从已满足属性呈现契约的编译壳克隆;或由严格 `EditorGraphSpec v2/v3` 让 ASE 自己创建节点、连线、保存和重载核对 | Editor 后端需要 |
|
|
50
|
+
| 编译桥接 | 通过 MCP for Unity 请求 ASE 重新生成 HLSL,并验证工具结果/保存语义 | 是 |
|
|
51
|
+
| Agent 集成 | 全部子命令单行 JSON 输出;稳定错误码与退出码,适合 Agent 子进程编排 | 否 |
|
|
52
|
+
| 工程交付 | 双 Python CI、锁文件、回归目录、可复现 wheel/sdist、SBOM、供应链与许可证检查 | 否 |
|
|
53
|
+
|
|
54
|
+
核心实现特性:
|
|
55
|
+
|
|
56
|
+
- **纯文本读写引擎**:真实样本逐字节 roundtrip 一致;普通布局保留计算连接,精排还可联动 Comment,显式路由需另外授权与核对。
|
|
57
|
+
- **节点 schema 库**:299 种节点类型的参数结构来自 ASE 运行时序列化提取;未知或版本不兼容的结构拒绝猜写。
|
|
58
|
+
- **安全写入**:写前比对 SHA-256 快照、加独占锁、拒绝符号链接和陈旧快照;既有文件写入前生成相邻 `.bak` 备份。
|
|
59
|
+
- **受控 Editor 创建**:固定 C# 执行器 + 白名单 JSON 规格,拒绝任意 C#、任意反射字段和不支持版本的降级写入。
|
|
60
|
+
- **属性呈现契约**:所有由 `create` 生成的 ASE Shader 必须满足 `asecli.property-presentation.v2`;公开属性使用中文显示名和中文 Tooltip,GUI 自动追加英文变量名与 Shader 默认值。HelpBox 是用户可选内容,不参与合规门禁。
|
|
61
|
+
- **证据分层**:文本/自动化通过不等于真实 Editor、目标 Inspector 或最终渲染画面通过;README 会明确标注这些边界。
|
|
62
|
+
|
|
63
|
+
## 环境要求
|
|
64
|
+
|
|
65
|
+
- 离线:查看、已知结构编辑、校验、计算基线比较和 `legacy` 初排,不需要 Unity。
|
|
66
|
+
- Editor:创建、编译、`meticulous` 精排及真实 Comment 边界检查,需要目标工程已打开且 MCP 会话已启动。Editor 创建当前以 ASE `1.9.6.2` 为支持边界。
|
|
67
|
+
- 安装脚本会自动安装 [uv](https://docs.astral.sh/uv/) 和 Python >= 3.10,不必预先配置
|
|
68
|
+
|
|
69
|
+
## 安装与运行
|
|
70
|
+
|
|
71
|
+
推荐通过 PyPI 安装 CLI 与 Agent Skill:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
uv tool install asecli
|
|
75
|
+
asecli install-skill --agent all
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`--agent all` 使用最少的非重复目录覆盖当前主流 Agent:
|
|
79
|
+
|
|
80
|
+
- `~/.agents/skills/asecli`:Codex、Cursor、Gemini CLI、GitHub Copilot。
|
|
81
|
+
- `~/.claude/skills/asecli`:Claude Code。
|
|
82
|
+
|
|
83
|
+
Skill 使用通用 `SKILL.md`、相对引用和 CLI 子进程,不依赖某一家 Agent 的专属工具 API。需要把 Skill 随仓库共享时,使用:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
asecli install-skill --agent all --scope project --project-root /path/to/project
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
项目级安装会写入 `<project>/.agents/skills/asecli` 与 `<project>/.claude/skills/asecli`。也可只安装一个原生目标:
|
|
90
|
+
|
|
91
|
+
| `--agent` | 用户级目录 | 项目级目录 |
|
|
92
|
+
| --- | --- | --- |
|
|
93
|
+
| `agents` | `~/.agents/skills` | `.agents/skills` |
|
|
94
|
+
| `codex` | `~/.agents/skills` | `.agents/skills` |
|
|
95
|
+
| `claude` | `~/.claude/skills` | `.claude/skills` |
|
|
96
|
+
| `cursor` | `~/.cursor/skills` | `.cursor/skills` |
|
|
97
|
+
| `gemini` | `~/.gemini/skills` | `.gemini/skills` |
|
|
98
|
+
| `copilot` | `~/.copilot/skills` | `.github/skills` |
|
|
99
|
+
|
|
100
|
+
不带新参数的 `asecli install-skill` 继续安装到原有 Codex 用户目录,保证旧脚本兼容;`--skill-root DIR` 仍可精确指定任意 Skill 根目录。所有目标都保持同内容幂等、不同内容拒绝覆盖;`--agent all` 会先检查全部目标,发现内容冲突时不会先写入其他目录。
|
|
101
|
+
|
|
102
|
+
目录矩阵依据各产品当前公开文档:[Codex](https://developers.openai.com/codex/skills)、[Claude Code](https://docs.anthropic.com/en/docs/claude-code/skills)、[Cursor](https://cursor.com/docs/context/skills)、[Gemini CLI](https://geminicli.com/docs/cli/skills/) 与 [GitHub Copilot](https://docs.github.com/en/copilot/concepts/agents/about-agent-skills)。
|
|
103
|
+
|
|
104
|
+
也可使用 GitHub Release 一键脚本同时安装 uv、CLI 与 Agent Skill。macOS / Linux:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/install.sh | sh
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Windows PowerShell 一条命令:
|
|
111
|
+
|
|
112
|
+
```powershell
|
|
113
|
+
irm https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/install.ps1 | iex
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
脚本会安装 uv、当前 GitHub Release 的 `asecli`,以及该版本支持的 Agent Skill。支持 `--agent` 的版本会采用上面的主流 Agent 通用安装;旧 Release 仍回退到原有 Codex 目录。同内容幂等,已有不同内容时跳过覆盖。
|
|
117
|
+
|
|
118
|
+
升级与卸载:
|
|
119
|
+
|
|
120
|
+
CLI 升级不会覆盖独立安装的 Skill;再次安装若提示内容冲突,先将旧 Skill 移到发现目录之外备份,再安装新版,保留自己的定制。卸载 CLI 不会自动删除这些 Skill。
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# PyPI 安装的升级
|
|
124
|
+
uv tool upgrade asecli
|
|
125
|
+
asecli install-skill --agent all
|
|
126
|
+
|
|
127
|
+
# GitHub Release 一键安装的升级
|
|
128
|
+
curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/install.sh | sh
|
|
129
|
+
|
|
130
|
+
# 卸载
|
|
131
|
+
uv tool uninstall asecli
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
当前正式版本为 `0.7.0`(严格、原子、可版本化的 CLI JSON 输出契约),可从 [PyPI](https://pypi.org/project/asecli/0.7.0/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.7.0) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.6.4` 保留为回滚点。
|
|
135
|
+
|
|
136
|
+
已知限制:真实 MCP 下,属性+纹理 v2 和 Reciprocal 降级 v2 的 create、manifest、validate、独立 recompile 已通过;SGCLI SphereMask v3 spec 在重载时仍可能返回 `node missing after reload: Radius` 并回滚。本次不承诺该 recipe 端到端可用,也不改变 SGCLI v2 默认值契约。
|
|
137
|
+
|
|
138
|
+
### 源码开发运行
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
git clone https://github.com/seeseeczl/ASECLI.git
|
|
142
|
+
cd ASECLI
|
|
143
|
+
uv sync --frozen
|
|
144
|
+
uv run --frozen asecli --help
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
后续所有示例中的 `asecli` 都可替换为 `uv run --frozen asecli`,无需向全局环境安装任何内容。
|
|
148
|
+
|
|
149
|
+
### 从源码安装为本机命令
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
git clone https://github.com/seeseeczl/ASECLI.git
|
|
153
|
+
cd ASECLI
|
|
154
|
+
uv tool install .
|
|
155
|
+
asecli --help
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 安装受控的本地 wheel
|
|
159
|
+
|
|
160
|
+
适用于管理员通过其他受控渠道交付 wheel 的情况。只安装同时提供 `SHA256SUMS` 且校验通过的文件:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
shasum -a 256 -c SHA256SUMS
|
|
164
|
+
uv tool install /path/to/asecli-0.7.0-py3-none-any.whl
|
|
165
|
+
asecli --help
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
升级源码副本时使用 `git pull --ff-only` 后重新执行 `uv sync --frozen`。若 lock 检查失败,不要跳过冻结安装;先解决 `uv.lock` 与项目声明的不一致。
|
|
169
|
+
|
|
170
|
+
## 快速上手
|
|
171
|
+
|
|
172
|
+
### 先只读检查现有 Shader
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
asecli parse Assets/Example.shader
|
|
176
|
+
asecli validate Assets/Example.shader
|
|
177
|
+
asecli graph-audit Assets/Example.shader
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
修改已知节点前先预演,确认节点 ID、端口与字段含义,再加 `--write`。不要直接复制其他图的节点 ID 或序列化字段下标。
|
|
181
|
+
|
|
182
|
+
多数修改命令默认预演;`create` 会立即创建资产,`recompile` 会立即请求 Editor 写回,`install-skill` 会写入安装目录。它们不是 dry-run。
|
|
183
|
+
|
|
184
|
+
### 从 SG 转换规格创建 ASE 图
|
|
185
|
+
|
|
186
|
+
前提:SGCLI 已生成合法的 EditorGraphSpec;目标工程已打开,MCP 地址与当前实例一致。下面的目标必须尚不存在。
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
asecli create Assets/ConvertedNew.shader --backend editor --spec graph.json \
|
|
190
|
+
--mcp-url http://127.0.0.1:9080/mcp
|
|
191
|
+
asecli validate Assets/ConvertedNew.shader
|
|
192
|
+
asecli recompile Assets/ConvertedNew.shader --mcp-url http://127.0.0.1:9080/mcp
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
核对创建结果的节点、端口、连接及属性 manifest。`staging_reloaded=true` 只表示暂存图重载成功;目标图仍需独立 `recompile`。超时后先检查目标与同目录 `ASECLI-Temp-*`,禁止盲目重试。
|
|
196
|
+
|
|
197
|
+
### 整理转换后的复杂图
|
|
198
|
+
|
|
199
|
+
先将当前已确认正确的 Shader 另存为**唯一基线备份**;相邻 `.bak` 会被后续写入更新,不能充当整个任务的永久基线。
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# 只读:锁定计算连接、常量与属性,分析复用
|
|
203
|
+
asecli graph-review Assets/ConvertedNew.shader
|
|
204
|
+
|
|
205
|
+
# 需要运行中 Editor:读取真实尺寸,预演鱼骨及三列计算岛
|
|
206
|
+
asecli layout Assets/ConvertedNew.shader --mode meticulous --island-columns 3 --audit \
|
|
207
|
+
--mcp-url http://127.0.0.1:9080/mcp
|
|
208
|
+
|
|
209
|
+
# 审计无硬失败后,以同样参数写入
|
|
210
|
+
asecli layout Assets/ConvertedNew.shader --mode meticulous --island-columns 3 --write \
|
|
211
|
+
--mcp-url http://127.0.0.1:9080/mcp
|
|
212
|
+
|
|
213
|
+
asecli graph-review Assets/ConvertedNew.shader --baseline /path/to/unique-baseline.shader
|
|
214
|
+
asecli validate Assets/ConvertedNew.shader
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
- `graph-review` 比较折叠 Register/Get/WireNode 后的计算连接及非布局节点字段;它是保守对照,不是完整语义等价证明。
|
|
218
|
+
- 默认复用按不同消费组判断;仅在用户指定“同一输出使用两次就注册”时用 `--reuse-policy fanout`。计划按来源节点和输出端口计数,**不会自动创建 Register/Get**。
|
|
219
|
+
- 计算岛整体摆放保留岛内关系;不把所有模块机械塞进全局深度列。默认不新增 WireNode,`--route-wires` 需要单独明确授权。
|
|
220
|
+
- 稳定布局后再添加 Comment、整理属性 GUI。不得从旧 JSON 重建已整理的 Shader,也不能仅回写坐标而遗漏新增节点和连线。
|
|
221
|
+
- SG 与 ASE 还需对照未连输入默认值、向量宽度、子图绑定及生成 HLSL;未知默认值不能补零。最后分别验收结构、Editor、画布/GUI、同条件效果。
|
|
222
|
+
|
|
223
|
+
完整流程见 [转换后图交付流程](skills/asecli/references/conversion-workflow.md)。新增计算岛流程的正常缩放画布、GUI 交互与效果对比仍需目标环境验收,不以自动测试代替。
|
|
224
|
+
|
|
225
|
+
### 整理材质面板
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
asecli gui-support /path/to/UnityProject
|
|
229
|
+
asecli custom-gui Assets/Example.shader --editor MZGUI.MZGUI --property _PaintColor \
|
|
230
|
+
--group "固有色" --tooltip "控制车身基础漆面颜色;Alpha 当前不参与透明度计算。" --write
|
|
231
|
+
asecli custom-gui Assets/Example.shader --spec material-gui.json
|
|
232
|
+
# 确认预演后再写入
|
|
233
|
+
asecli custom-gui Assets/Example.shader --spec material-gui.json --write
|
|
234
|
+
asecli validate Assets/Example.shader
|
|
235
|
+
asecli recompile Assets/Example.shader
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
采用 `gui-support` 返回的 `recommended_editor` 作为 `--editor`;已有原生 MZGUI 时不注入第二套 GUI。批量规格保留英文变量名、类型、默认值、范围和 HDR,只按实际用途设置中文显示名、分组和 Tooltip。规格示例与交互验收见 [Skill](skills/asecli/SKILL.md) 和 [属性规范](skills/asecli/references/material-property-standard.md)。
|
|
239
|
+
|
|
240
|
+
## 完整命令目录
|
|
241
|
+
|
|
242
|
+
所有命令都可用 `asecli <command> --help` 查看参数。下表列出公开子命令及其实际副作用。
|
|
243
|
+
|
|
244
|
+
| 命令 | 做什么 | 写入/运行边界 |
|
|
245
|
+
| --- | --- | --- |
|
|
246
|
+
| `parse <file>` | 输出 ASE 图版本、节点数、连线数及节点摘要。 | 只读。 |
|
|
247
|
+
| `validate <file>` | 检查悬空连线、重复 ID、输入多来源、Local Var 一致性和 CHKSM。 | 只读;有 error 时返回退出码 2。 |
|
|
248
|
+
| `graph-review <file> [--baseline FILE] [--reuse-policy consumer-groups\\|fanout]` | 保守核对计算基线并列出复用计划。 | 只读;基线不一致返回 `SEMANTIC_MISMATCH` / 2,不自动创建 Local Var。 |
|
|
249
|
+
| `graph-audit <file>` | 从 Master 反向分析未参与输出的节点,区分 `unused_candidates` 与外部消费者。 | 只读;Property 的源码/HLSL/GUI 引用不会被误报为可删。 |
|
|
250
|
+
| `set-field <file> --node N --field I --value V [--write]` | 修改一个已知节点的绝对序列化字段。 | 默认预演;`--write` 后写入。不要用它猜写 Master 或未知版本尾部。 |
|
|
251
|
+
| `add-node <file> --type T [--id N] [--pos X,Y] [--write]` | 按 schema 创建可写节点与默认参数。 | 默认预演;未知、opaque 或版本不兼容节点会拒绝。`--line` 是复用真实序列化行的专家入口;若新行含 schema 占位符的 32 位 hex 标识,会返回 `warnings` 提示在 Unity 中核对唯一性。 |
|
|
252
|
+
| `connect <file> --from A:P --to B:P [--write]` | 将来源节点输出端接到目标节点输入端。 | 默认预演;`--from` 是数据源,`--to` 是消费者。 |
|
|
253
|
+
| `disconnect <file> --from A:P --to B:P [--write]` | 删除一条精确连线。 | 默认预演;找不到该连线会失败。 |
|
|
254
|
+
| `remove-node <file> --node N [--force-external] [--write]` | 删除节点及附属连线。 | 默认预演;外部源码仍引用的 Property 默认拒删。`--force-external` 只用于已迁移消费者的明确操作。 |
|
|
255
|
+
| `fix-checksum <file> [--write]` | 重算 `//CHKSM`,并报告旧值、实际值和是否已有效。 | 默认预演;`--write` 后写入并备份原文件。 |
|
|
256
|
+
| `layout <file> [--mode legacy\|meticulous] [--island-columns N] [--route-wires] [--gap-x X --gap-y Y] [--audit] [--unity-instance NAME] [--write]` | `legacy` 保留原分层布局;`meticulous` 以 Output 为根递归展开上游子树,按输入端口顺序居中分布,并联动收紧 Comment。 | 默认 `legacy` 且只预演。`meticulous` 单次连接 Editor 获取真实节点、标题栏和端口几何;硬门禁失败或几何缺失时不写盘。`--island-columns`(1-8,默认单列)多列摆放计算岛;`--route-wires` 移动/新增 WireNode 需单独授权;`--gap-x/--gap-y` 仅 `legacy`;多实例用 `--unity-instance` 选 `Name@hash`。 |
|
|
257
|
+
| `gui-support <project> [--runtime-probe] [--handoff-native] [--write]` | 优先检测并选用原生 MZGUI;原生环境只安装 authoring/条件置灰扩展,缺失时安装 fallback;原生后来加入时可恢复交接。 | 不创建第二个原生 provider;V2 枚举全部 provider;handoff 默认预演,只处理已知哈希并保留 authoring-only bridge,复验失败可恢复。 |
|
|
258
|
+
| `custom-gui <file> [--node N \| --property P] … [--write]` | 查询/同步 CustomEditor;设置或清除 Foldout、Tooltip、用户 HelpBox 和由另一数值属性控制的置灰条件。 | 条件写为 `EnableIfMzgui(source,operator,value)`;不满足时只禁用控件,不清空材质值。`--clear-enabled-if` 可清除。expert 参数 `--add-attribute`/`--remove-attribute` 直接增删 MZGUI 兼容元数据。 |
|
|
259
|
+
| `install-skill [--agent A] [--scope user\|project] [--project-root DIR] [--skill-root DIR]` | 将 wheel 内置的通用 ASECLI Agent Skill 安装到开放 `.agents` 目录或 Codex、Claude Code、Cursor、Gemini CLI、GitHub Copilot 原生目录。 | 无参数保持旧 Codex 目录;省略 `--agent` 但给 `--scope`/`--project-root` 时默认 `agents`;`all` 以两个非重复目标覆盖五类 Agent;相同内容幂等,任一冲突先整体拒绝,不修改 Shader、材质或 Unity/Tuanjie 工程。 |
|
|
260
|
+
| `comment-group <file> [--nodes IDS --title T] [--note NOTE --padding P --id N] … [--write]` | 查询、创建、嵌套 ASE 原生 Comment 框;可检查成员越框或重叠。 | 创建默认用离线尺寸估算。`--editor-bounds`、`--check-bounds`、`--fit` 需连接 Editor;`--note` 写 Comment 头小字(默认 "Comment"),`--padding` 默认 50,`--id` 指定 Comment 节点 ID。 |
|
|
261
|
+
| `create <out> --from TEMPLATE [--name NAME] [--graph-from DONOR]` | 复制一个已编译模板壳;可替换图或同步 Shader 名与 CHKSM。 | **立即创建/覆盖目标**;模板和 donor 组合后的文件必须已满足属性呈现契约,否则写前拒绝。 |
|
|
262
|
+
| `create <out> --backend editor --spec graph.json` | 用白名单 `EditorGraphSpec v2/v3` 让 ASE 自身创建、保存和重载目标图。 | **立即请求 Editor 写入**;每个 Property 必填中文 `inspector_name` 和中文 `tooltip`,可选 `help` 写用户 HelpBox。v3 另支持版本化 primitive/recipe 与属性精度、默认值和范围。 |
|
|
263
|
+
| `recompile <file> [--mcp-url URL] [--allow-remote-mcp]` | 调用运行中 ASE 重新生成 HLSL/保存,报告 `changed`;并自动快照→恢复材质 GUI 元数据、重算 CHKSM、强制 `AssetDatabase.ImportAsset` 二次导入。 | **立即触发 Editor 操作**;默认仅允许 loopback MCP。返回 `changed`,元数据被恢复时另返回 `metadata_restored` 与 `asset_import`。 |
|
|
264
|
+
|
|
265
|
+
### 详细操作入口
|
|
266
|
+
|
|
267
|
+
| 任务 | 参考 |
|
|
268
|
+
| --- | --- |
|
|
269
|
+
| 已知结构编辑、批量 GUI、Comment、错误处理 | [Agent 操作手册](skills/asecli/SKILL.md) |
|
|
270
|
+
| SG 转换后的基线、复用、计算岛与分层验收 | [转换后图交付流程](skills/asecli/references/conversion-workflow.md) |
|
|
271
|
+
| 真实几何鱼骨、端口对齐、框与连线边界 | [布局规范](skills/asecli/references/layout-standard.md) |
|
|
272
|
+
| 中文显示名、Foldout、Tooltip、默认值与保留接口 | [材质属性规范](skills/asecli/references/material-property-standard.md) |
|
|
273
|
+
| Master/Pass、平台兼容性与功能开关 | [Master/Output 规范](skills/asecli/references/master-output-settings-standard.md) |
|
|
274
|
+
|
|
275
|
+
### Editor API 创建
|
|
276
|
+
|
|
277
|
+
默认 `create` 仍是原有纯文本后端。`--backend editor --spec graph.json` 明确使用 Editor;`--backend auto` 在提供 `--spec` 时选择 Editor,否则选择文本后端。Editor 目标必须位于 Unity/Tuanjie 工程的 `Assets/` 下且尚不存在,不允许 `--force`。
|
|
278
|
+
|
|
279
|
+
最小 Caster-like 规格:
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"version": 2,
|
|
284
|
+
"template": {
|
|
285
|
+
"guid": "2992e84f91cbeb14eab234972e07ea9d",
|
|
286
|
+
"shader_name": "Vehicle/LocalShadow/Caster"
|
|
287
|
+
},
|
|
288
|
+
"nodes": [
|
|
289
|
+
{
|
|
290
|
+
"alias": "mask",
|
|
291
|
+
"kind": "sampler",
|
|
292
|
+
"position": [-520, 20],
|
|
293
|
+
"property_name": "_CasterMask",
|
|
294
|
+
"inspector_name": "投射遮罩",
|
|
295
|
+
"tooltip": "控制投射遮罩贴图;白色区域显示阴影,黑色区域不显示。",
|
|
296
|
+
"parameter_type": "Property"
|
|
297
|
+
}
|
|
298
|
+
],
|
|
299
|
+
"connections": [
|
|
300
|
+
{"from": {"node": "mask", "port": 1}, "to": {"node": "master", "port": 2}}
|
|
301
|
+
]
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
- CLI 创建接受 `EditorGraphSpec v2/v3`。每个 Property/Sampler 必须提供含中文的 `inspector_name` 和 `tooltip`;用户可另加可选 `help` 生成 HelpBox。v3 必填 `primitives_version: 1`,增加受控 `primitive`、可原生展开或降级为单节点 Custom Expression 的 `recipe`,并为已支持节点增加 `precision/default/min/max`。未知版本、primitive 或字段在 MCP 前失败关闭;v1 仅保留底层桥接兼容。
|
|
306
|
+
- v3 的 primitive 闭包绑定 ASE `1.9.6.2`;recipe 只按声明顺序引用输入或此前 primitive,禁止前向引用/循环。原生闭包不完整时才使用规格内已校验的逐节点 HLSL fallback,不会把整张图收成单一黑盒。
|
|
307
|
+
- 首期绑定 ASE `1.9.6.2`;Master 端口契约只开放已实测的 URP Unlit 模板 GUID。未知版本、模板 Master 端口、节点、字段、端口或类型在写入前失败。
|
|
308
|
+
- 规格只传 JSON 数据。执行的 C# 来自包内固定资源;Custom Expression 的 HLSL 是可编辑节点内容,但任意 C#、任意反射字段和危险运行时标记不会透传。
|
|
309
|
+
- 保存成功必须同时满足 Save、暂存重载、模板 GUID/Shader 名、节点/属性/动态端口/连接 manifest、移动提交和目标 Shader 身份一致;Editor 事务失败会回滚明确的目标/暂存资产并恢复原 ASE 窗口状态。为避免 MCP 插件重连吞掉成功回执,同一次创建调用不再重复加载目标图。成功 JSON 中 `reloaded` 与 `staging_reloaded` 表示暂存图已 LoadFromDisk;`target_graph_reloaded` 恒为 `false`。CLI 属性收尾后必须使用独立 `recompile` 完成目标图重载复验。若提交后 Python 后验解析失败,CLI 为避免竞态误删会保留目标和 `.meta`,并返回 `transaction_nonce`、Shader/meta SHA-256 供人工核对。
|
|
310
|
+
- MCP 3.4.7 默认按源码模式拦截 `AssetDatabase.DeleteAsset`。CLI 仅对包内固定、参数已校验且暂存名带随机 nonce 的事务执行器设置该次 `safety_checks=false`;不会把用户 C# 透传到这一入口。
|
|
311
|
+
- MCP 客户端超时代表完成状态未知,不等同于 Editor 已停止或已回滚。初始化握手共用 20 秒总预算,真实 `tools/call` 保留 120 秒执行预算;超时 JSON 会给出 `phase`、`elapsed_ms`、`budget_ms` 并返回 `BRIDGE_ERROR`/3。重试前先检查目标文件及同目录 `ASECLI-Temp-*`,避免把迟到成功误判为失败。
|
|
312
|
+
- 隔离团结 E2E 已证明 Caster-like/Receiver-like 图可创建、保存、关闭并由新进程重载;这不证明目标工程的运行时矩阵注入、材质绑定或最终渲染画面正确。
|
|
313
|
+
|
|
314
|
+
## JSON 契约
|
|
315
|
+
|
|
316
|
+
除显式 `--help` 保留人类可读文本外,stdout 恒为单行严格 JSON,agent 可直接解析。`--version` 也返回 JSON:
|
|
317
|
+
|
|
318
|
+
```json
|
|
319
|
+
{"contract_version":1,"cli_version":"0.7.0","command":"parse","ok":true,"data":{"node_count":7}}
|
|
320
|
+
{"contract_version":1,"cli_version":"0.7.0","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
|
|
321
|
+
{"contract_version":1,"cli_version":"0.7.0","command":"version","ok":true,"data":{"version":"0.7.0"}}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
常见错误码:`PARSE_ERROR`、`NOT_FOUND`、`USAGE_ERROR`、`SCHEMA_UNAVAILABLE`、`SCHEMA_VERSION_MISMATCH`、`VALIDATION_ERROR`、`PROPERTY_PRESENTATION_ERROR`、`LAYOUT_ERROR`、`CHECKSUM_FORMAT_ERROR`、`GUI_SUPPORT_ERROR`、`CUSTOM_GUI_ERROR`、`COMMENT_GROUP_ERROR`、`GRAPH_REVIEW_ERROR`、`SEMANTIC_MISMATCH`、`EXTERNAL_REFERENCE`、`SKILL_INSTALL_CONFLICT`、`SKILL_INSTALL_ERROR`、`WRITE_CONFLICT`、`UNSAFE_PATH`、`WRITE_ERROR`、`BRIDGE_ERROR`、`INTERNAL`。
|
|
325
|
+
退出码:`0` 成功 · `2` 用法/校验/解析错误 · `3` 桥接错误
|
|
326
|
+
|
|
327
|
+
## 安全与验收边界
|
|
328
|
+
|
|
329
|
+
- 写入前检查基线,出现 `WRITE_CONFLICT` 先重新读取并比较,不覆盖其他 Agent 或 Editor 的改动。备份、锁与路径检查不能代替语义验收。
|
|
330
|
+
- 未知动态节点、Master 或版本字段不得猜写;使用已支持的语义命令或真实 ASE Editor API,不手工拼 Shader/HLSL 冒充 Editor 创建。
|
|
331
|
+
- `graph-audit` 分析输出可达性;`graph-review` 分析计算基线与复用。未连 Property 可能被 GUI/HLSL 或项目源码消费,审计候选不是删除许可。
|
|
332
|
+
- 属性 GUI 优先复用原生 MZGUI;未知或多个 provider 时停止。团结 `2022.3.61t9` 有既有验证,其他 Editor/API fallback 不自动视为已实测支持。
|
|
333
|
+
- 编译通过、属性相同、计算连接一致,都不能独立证明 SG 转换等价。正常缩放画布、Foldout 点击、Tooltip 悬停和同条件渲染对照要分别报告。
|
|
334
|
+
|
|
335
|
+
## 编译桥接前提
|
|
336
|
+
|
|
337
|
+
1. Tuanjie/Unity 编辑器已打开目标工程
|
|
338
|
+
2. MCP for Unity 会话已启动(编辑器内 Start Session,默认 `http://127.0.0.1:8080/mcp`)
|
|
339
|
+
3. MCP 不能被其他会话独占(`recompile` 报 `BRIDGE_ERROR` 时先检查占用)
|
|
340
|
+
4. `recompile` 成功时 `data.changed=true` 表示 HLSL 已重新生成;`changed=false` 表示文件本已最新。Editor 创建成功会返回 `template_guid`、`shader_name` 和 Save/Load manifest
|
|
341
|
+
|
|
342
|
+
安全边界:默认只允许 `127.0.0.1`、`localhost`、`::1`;远程 MCP 必须显式加 `--allow-remote-mcp`。实例 token 只能通过当前进程环境变量 `ASECLI_MCP_INSTANCE_TOKEN` 提供,禁止写入命令参数、脚本或日志。客户端拒绝 URL 凭证、query、fragment 和 HTTP 重定向,避免 token 被转发。`recompile` 会调用 MCP 的 `execute_code`,因此只能连接你明确信任的编辑器会话。
|
|
343
|
+
|
|
344
|
+
## 开发测试
|
|
345
|
+
|
|
346
|
+
以下为开发入口,不是每次文档修改的必跑清单。Editor 创建 E2E 只允许带有 `.asecli-e2e-isolated` 标记的隔离工程;不得给生产工程补标记绕过保护。无实机环境时的 skip 不代表通过。
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
uv lock --check
|
|
350
|
+
uv run --frozen pytest -q # 全量(桥接测试无环境时自动跳过)
|
|
351
|
+
ASECLI_TEST_SHADER=Assets/xxx.shader uv run --frozen pytest -m bridge # 桥接端到端
|
|
352
|
+
ASECLI_EDITOR_CREATE_PROJECT=/path/to/isolated-project \
|
|
353
|
+
ASECLI_TUANJIE_PATH=/path/to/Tuanjie \
|
|
354
|
+
uv run --frozen pytest -q -m bridge tests/test_editor_create_e2e.py # 真实 Editor 创建/新进程重载
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## 开发、质量与交付治理
|
|
358
|
+
|
|
359
|
+
本项目的治理不是额外的项目管理流程,而是让 CLI 行为、文档、回归与交付证据保持可追溯的最小约束。详细来源分别是 [项目章程](docs/00-governance/project-charter.md)、[交付协议](docs/00-governance/delivery-protocol.md)、[回归目录](docs/03-quality/regression-catalog.md)、[供应链策略](docs/00-governance/supply-chain-policy.md) 和 [追溯表](docs/00-governance/traceability.csv)。
|
|
360
|
+
|
|
361
|
+
### 按改动范围验证
|
|
362
|
+
|
|
363
|
+
以 [AGENTS.md](AGENTS.md) 为当前执行规则,不为小修改重复启动完整发布流程。
|
|
364
|
+
|
|
365
|
+
| 变更 | 最小验证 |
|
|
366
|
+
| --- | --- |
|
|
367
|
+
| 文档、注释、不改变行为的配置 | 相关 diff、格式和直接引用;不启动 Editor、不跑全量测试、不构建发布包 |
|
|
368
|
+
| 局部 Python 行为 | 直接相关测试与必要 CLI smoke;跨核心模块或公共契约时再追加全量 |
|
|
369
|
+
| Editor API、真实几何、Inspector 或渲染 | 自动检查通过后,复用一个 Editor 会话集中验证相关实机项 |
|
|
370
|
+
| 用户明确要求推送或发布 | 完整治理、可复现构建、远端 CI、资产校验与回滚检查 |
|
|
371
|
+
|
|
372
|
+
有任务卡时回填实际证据;纯 README 校正不补造 FR、CR 或发布记录。未运行、跳过与失败分别说明。
|
|
373
|
+
|
|
374
|
+
### CI、构建与发布门禁
|
|
375
|
+
|
|
376
|
+
`.github/workflows/ci.yml` 在 push 到 `main`、PR 和手动触发时执行:
|
|
377
|
+
|
|
378
|
+
1. Python 3.10 与 3.12:`uv lock --check`、冻结同步、全量 pytest、治理检查、回归目录收集检查。
|
|
379
|
+
2. Python 3.12 package:在 checkout 外双次构建 wheel/sdist,逐项比较可复现性。
|
|
380
|
+
3. 产物:生成 `SHA256SUMS`、SPDX 2.3 SBOM、供应链检查结果;从生成 wheel 建立隔离虚拟环境并执行 `asecli parse` 冒烟验证。
|
|
381
|
+
|
|
382
|
+
CI 通过只证明远端自动门禁通过。进入“已交付”还需要真实的 push run 链接、可下载 artifact 与 hash 核对、以及需要时的回滚观察。普通 push 不会发版。PyPI Trusted Publisher 与 GitHub `pypi` environment 已激活,tag workflow 从同一份已校验 artifact 上传;GitHub 一键安装脚本继续使用最新 Release。CLI Hub 仍不自动提交。
|
|
383
|
+
|
|
384
|
+
### 供应链、许可证与密钥
|
|
385
|
+
|
|
386
|
+
- 当前许可证为 MIT;源码公开,正式安装入口为 PyPI `uv tool install asecli`,GitHub Release 一键脚本保留为安装 CLI 与 Skill 的完整入口。CLI Hub 不是当前分发入口,后续启用需要新的明确授权。
|
|
387
|
+
- 当前生产运行时依赖为 0;新增运行时依赖、改许可证或改分发方式均是单独 CR,必须完成许可证与漏洞评估。
|
|
388
|
+
- `uv.lock` 固定开发依赖的来源、版本和 SHA-256;CI 中所有 GitHub Actions 必须固定为 40 位 commit SHA。
|
|
389
|
+
- `tools/supply_chain_check.py` 会检查 lock、Action pin、常见高置信密钥模式与许可证;`tools/generate_sbom.py` 生成 artifact 清单。离线检查不等同于真实漏洞数据库或 Dependabot 状态。
|
|
390
|
+
- MCP 实例 token 只能由 `ASECLI_MCP_INSTANCE_TOKEN` 环境变量提供,严禁放进 argv、仓库、文档示例、日志、截图或 artifact;远端 MCP 必须显式 `--allow-remote-mcp`。
|
|
391
|
+
|
|
392
|
+
### 证据边界
|
|
393
|
+
|
|
394
|
+
| 证据 | 可以证明 | 不能替代 |
|
|
395
|
+
| --- | --- | --- |
|
|
396
|
+
| `pytest` / mock | 文本解析、写入不变量、CLI JSON、MCP 响应处理和安全契约。 | 真实 Editor API、材质 Inspector 交互、目标平台或渲染画面。 |
|
|
397
|
+
| 隔离 Unity/Tuanjie bridge | 特定编辑器版本、MCP 会话与隔离资产上的编译/创建链路。 | 用户目标工程的材质绑定、平台编译和最终效果。 |
|
|
398
|
+
| 本地双构建/安装 | 可重复构建流程与包内容。 | 远端 CI、Release 上传或下载 artifact 完整性。 |
|
|
399
|
+
| GitHub Actions 运行记录 | 该 commit 的远端 CI 结果与 artifact 生成。 | 真实 GUI 视觉、目标 DCC/平台运行时验收。 |
|
|
400
|
+
|
|
401
|
+
报告时必须把已运行、未运行和受环境限制跳过的门禁分别说明;不要把“可静态验证”写成“最终用户画面已验收”。
|
|
402
|
+
|
|
403
|
+
## 架构与文档
|
|
404
|
+
|
|
405
|
+
- 需求基线:[`docs/01-architecture/project-architecture-and-requirements.md`](docs/01-architecture/project-architecture-and-requirements.md)
|
|
406
|
+
- 技术决策:[`docs/01-architecture/technical-route.md`](docs/01-architecture/technical-route.md)
|
|
407
|
+
- 模块边界:[`docs/01-architecture/module-map.md`](docs/01-architecture/module-map.md)
|
|
408
|
+
- 第一性原理计划书:[`docs/first-principles/2026-08-31-231401-optimization-plan.md`](docs/first-principles/2026-08-31-231401-optimization-plan.md)
|
|
409
|
+
- 实验记录:[`docs/01-architecture/assumption-experiments.md`](docs/01-architecture/assumption-experiments.md)
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
src/asecli/
|
|
413
|
+
├── core/ 解析器/序列化器/图模型/布局引擎
|
|
414
|
+
├── schema/ 节点 schema 库(data/schemas.json)与 Master 观测样本(data/observed.json)
|
|
415
|
+
├── checks/ 结构校验与 checksum
|
|
416
|
+
├── bridge/ MCP for Unity 客户端、重编译触发与材质 GUI 支持安装器
|
|
417
|
+
└── cli/ 命令入口与 JSON 契约
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## License
|
|
421
|
+
|
|
422
|
+
MIT License,见 [`LICENSE`](LICENSE)。
|