asecli 0.7.0__tar.gz → 0.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. {asecli-0.7.0 → asecli-0.8.1}/.github/workflows/ci.yml +12 -1
  2. asecli-0.8.1/.github/workflows/cross-cli.yml +123 -0
  3. {asecli-0.7.0 → asecli-0.8.1}/.github/workflows/publish.yml +14 -3
  4. {asecli-0.7.0 → asecli-0.8.1}/PKG-INFO +36 -12
  5. {asecli-0.7.0 → asecli-0.8.1}/README.md +35 -11
  6. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/change-register.md +1 -0
  7. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/timeline.md +5 -0
  8. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/traceability.csv +2 -1
  9. {asecli-0.7.0 → asecli-0.8.1}/docs/01-architecture/module-map.md +6 -3
  10. {asecli-0.7.0 → asecli-0.8.1}/docs/01-architecture/technical-route.md +10 -0
  11. {asecli-0.7.0 → asecli-0.8.1}/docs/03-quality/regression-catalog.md +1 -0
  12. {asecli-0.7.0 → asecli-0.8.1}/docs/04-delivery/project-plan-task-charter.md +3 -1
  13. {asecli-0.7.0 → asecli-0.8.1}/pyproject.toml +4 -2
  14. {asecli-0.7.0 → asecli-0.8.1}/scripts/install.ps1 +1 -1
  15. {asecli-0.7.0 → asecli-0.8.1}/scripts/install.sh +1 -1
  16. {asecli-0.7.0 → asecli-0.8.1}/skills/asecli/SKILL.md +12 -2
  17. asecli-0.8.1/skills/asecli/references/conversion-publication-receipt.v1.schema.json +27 -0
  18. asecli-0.8.1/skills/asecli/references/conversion-workflow.md +147 -0
  19. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/__init__.py +1 -1
  20. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/__init__.py +8 -1
  21. asecli-0.8.1/src/asecli/bridge/_editor_spec_io.py +47 -0
  22. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/contract.py +2 -0
  23. asecli-0.8.1/src/asecli/cli/contract_command.py +33 -0
  24. asecli-0.8.1/src/asecli/cli/conversion_output.py +184 -0
  25. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/create_command.py +5 -5
  26. asecli-0.8.1/src/asecli/cli/export_sg_command.py +202 -0
  27. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/main.py +9 -5
  28. asecli-0.8.1/src/asecli/cli/migrate_package_command.py +115 -0
  29. asecli-0.8.1/src/asecli/contracts/editor-graph-spec.v3.schema.json +263 -0
  30. asecli-0.8.1/src/asecli/contracts/sgcli.native.v3.schema.json +1614 -0
  31. asecli-0.8.1/src/asecli/contracts.py +46 -0
  32. asecli-0.8.1/src/asecli/export_sg.py +12 -0
  33. asecli-0.8.1/src/asecli/schema_validation.py +220 -0
  34. asecli-0.8.1/src/asecli/sg_export/__init__.py +15 -0
  35. asecli-0.8.1/src/asecli/sg_export/alpha_modulate.py +113 -0
  36. asecli-0.8.1/src/asecli/sg_export/binding.py +218 -0
  37. asecli-0.8.1/src/asecli/sg_export/conversion_report.py +219 -0
  38. asecli-0.8.1/src/asecli/sg_export/custom_expression.py +95 -0
  39. asecli-0.8.1/src/asecli/sg_export/decoder.py +250 -0
  40. asecli-0.8.1/src/asecli/sg_export/evidence.py +63 -0
  41. asecli-0.8.1/src/asecli/sg_export/model.py +127 -0
  42. asecli-0.8.1/src/asecli/sg_export/nodes.py +219 -0
  43. asecli-0.8.1/src/asecli/sg_export/pass_blend.py +200 -0
  44. asecli-0.8.1/src/asecli/sg_export/reconciliation.py +120 -0
  45. asecli-0.8.1/src/asecli/sg_export/report_semantics.py +57 -0
  46. asecli-0.8.1/src/asecli/sg_export/sources.py +218 -0
  47. asecli-0.8.1/src/asecli/sg_export/surface_matching.py +165 -0
  48. asecli-0.8.1/src/asecli/sg_export/surface_semantics.py +228 -0
  49. {asecli-0.7.0 → asecli-0.8.1}/tests/test_build_reproducibility.py +8 -1
  50. {asecli-0.7.0 → asecli-0.8.1}/tests/test_cli_contract.py +2 -1
  51. asecli-0.8.1/tests/test_contract_schema.py +155 -0
  52. asecli-0.8.1/tests/test_conversion_report_semantics.py +73 -0
  53. asecli-0.8.1/tests/test_cross_cli_workflow.py +38 -0
  54. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_create_cli.py +4 -2
  55. asecli-0.8.1/tests/test_export_sg.py +381 -0
  56. {asecli-0.7.0 → asecli-0.8.1}/tests/test_governance.py +1 -1
  57. {asecli-0.7.0 → asecli-0.8.1}/tests/test_install_scripts.py +2 -2
  58. asecli-0.8.1/tests/test_migrate_package.py +53 -0
  59. asecli-0.8.1/tests/test_pass_blend.py +69 -0
  60. asecli-0.8.1/tests/test_sg_export_sources.py +56 -0
  61. {asecli-0.7.0 → asecli-0.8.1}/tests/test_skill_install.py +1 -0
  62. asecli-0.8.1/tests/test_smoke.py +4 -0
  63. asecli-0.8.1/tests/test_surface_semantics.py +331 -0
  64. asecli-0.8.1/tests/test_surface_semantics_integration.py +45 -0
  65. asecli-0.8.1/uv.lock +513 -0
  66. asecli-0.7.0/skills/asecli/references/conversion-workflow.md +0 -41
  67. asecli-0.7.0/src/asecli/bridge/_editor_spec_io.py +0 -26
  68. asecli-0.7.0/tests/test_smoke.py +0 -4
  69. asecli-0.7.0/uv.lock +0 -204
  70. {asecli-0.7.0 → asecli-0.8.1}/.gitignore +0 -0
  71. {asecli-0.7.0 → asecli-0.8.1}/.project-architect.json +0 -0
  72. {asecli-0.7.0 → asecli-0.8.1}/AGENTS.md +0 -0
  73. {asecli-0.7.0 → asecli-0.8.1}/LICENSE +0 -0
  74. {asecli-0.7.0 → asecli-0.8.1}/SECURITY.md +0 -0
  75. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/audit-supplement.json +0 -0
  76. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/delivery-protocol.md +0 -0
  77. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/project-charter.md +0 -0
  78. {asecli-0.7.0 → asecli-0.8.1}/docs/00-governance/supply-chain-policy.md +0 -0
  79. {asecli-0.7.0 → asecli-0.8.1}/docs/01-architecture/assumption-experiments.md +0 -0
  80. {asecli-0.7.0 → asecli-0.8.1}/docs/01-architecture/project-architecture-and-requirements.md +0 -0
  81. {asecli-0.7.0 → asecli-0.8.1}/docs/03-quality/bug-register.md +0 -0
  82. {asecli-0.7.0 → asecli-0.8.1}/docs/03-quality/test-strategy.md +0 -0
  83. {asecli-0.7.0 → asecli-0.8.1}/docs/04-delivery/roadmap.md +0 -0
  84. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-014104-audit-report.md +0 -0
  85. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-014104-optimization-plan.md +0 -0
  86. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-145343-audit-report.md +0 -0
  87. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-145343-optimization-plan.md +0 -0
  88. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-193521-audit-report.md +0 -0
  89. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-193521-optimization-plan.md +0 -0
  90. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-203438-audit-report.md +0 -0
  91. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-01-203438-optimization-plan.md +0 -0
  92. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-02-121155-audit-report.md +0 -0
  93. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-02-121155-optimization-plan.md +0 -0
  94. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-02-175509-audit-report.md +0 -0
  95. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-02-175509-optimization-plan.md +0 -0
  96. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-04-122304-audit-report.md +0 -0
  97. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-04-122304-optimization-plan.md +0 -0
  98. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-142617-audit-report.md +0 -0
  99. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-142617-optimization-plan.md +0 -0
  100. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-160945-audit-report.md +0 -0
  101. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-160945-optimization-plan.md +0 -0
  102. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-213523-audit-report.md +0 -0
  103. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-05-213523-optimization-plan.md +0 -0
  104. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-10-193631-audit-report.md +0 -0
  105. {asecli-0.7.0 → asecli-0.8.1}/docs/adversarial-audits/2026-09-10-193631-optimization-plan.md +0 -0
  106. {asecli-0.7.0 → asecli-0.8.1}/docs/first-principles/2026-08-31-231401-optimization-plan.md +0 -0
  107. {asecli-0.7.0 → asecli-0.8.1}/docs/first-principles/2026-09-01-190656-optimization-plan.md +0 -0
  108. {asecli-0.7.0 → asecli-0.8.1}/docs/proposals/2026-09-07-shadergraph-to-ase-requirements.md +0 -0
  109. {asecli-0.7.0 → asecli-0.8.1}/skills/asecli/references/layout-standard.md +0 -0
  110. {asecli-0.7.0 → asecli-0.8.1}/skills/asecli/references/master-output-settings-standard.md +0 -0
  111. {asecli-0.7.0 → asecli-0.8.1}/skills/asecli/references/material-property-standard.md +0 -0
  112. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_editor_port_contract.py +0 -0
  113. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_editor_primitives.py +0 -0
  114. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_editor_spec_grammar.py +0 -0
  115. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_editor_spec_validation.py +0 -0
  116. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_gui_handoff_store.py +0 -0
  117. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_gui_project.py +0 -0
  118. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_gui_resource_store.py +0 -0
  119. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/_gui_resource_upgrade.py +0 -0
  120. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/editor_create.py +0 -0
  121. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/editor_spec.py +0 -0
  122. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/graph_geometry.py +0 -0
  123. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/graph_geometry_parser.py +0 -0
  124. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/graph_inspect.py +0 -0
  125. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_handoff.py +0 -0
  126. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_presentation.py +0 -0
  127. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_provider_detection.py +0 -0
  128. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_runtime_probe.py +0 -0
  129. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_support.py +0 -0
  130. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/gui_support_resource.py +0 -0
  131. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/mcp_client.py +0 -0
  132. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/recompile.py +0 -0
  133. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/render_settings.py +0 -0
  134. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resource_text.py +0 -0
  135. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.authoring.part00.cs.txt +0 -0
  136. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.authoring.part01.cs.txt +0 -0
  137. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.authoring.store.cs.txt +0 -0
  138. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.condition.cs.txt +0 -0
  139. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.hydration.cs.txt +0 -0
  140. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.part00.cs.txt +0 -0
  141. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.part01.cs.txt +0 -0
  142. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.reconciliation.cs.txt +0 -0
  143. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/asecli_material_gui.transaction.cs.txt +0 -0
  144. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/editor_create.part00.cs.txt +0 -0
  145. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/editor_create.part01.cs.txt +0 -0
  146. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/editor_create.part02.cs.txt +0 -0
  147. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/editor_create.part03.cs.txt +0 -0
  148. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/editor_create.part04.cs.txt +0 -0
  149. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/resources/wire_route.transaction.cs.txt +0 -0
  150. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/bridge/wire_route.py +0 -0
  151. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/checks/__init__.py +0 -0
  152. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/checks/checksum.py +0 -0
  153. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/checks/local_vars.py +0 -0
  154. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/checks/usage.py +0 -0
  155. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/checks/validate.py +0 -0
  156. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/__init__.py +0 -0
  157. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/commands.py +0 -0
  158. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/commentary_command.py +0 -0
  159. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/custom_gui_command.py +0 -0
  160. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/graph_review_command.py +0 -0
  161. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/gui_provider.py +0 -0
  162. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/gui_support_command.py +0 -0
  163. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/io.py +0 -0
  164. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/layout_command.py +0 -0
  165. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/recompile_metadata.py +0 -0
  166. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/skill_command.py +0 -0
  167. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/cli/usage_command.py +0 -0
  168. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/__init__.py +0 -0
  169. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/comment_bounds.py +0 -0
  170. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/comment_layout.py +0 -0
  171. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/comment_metrics.py +0 -0
  172. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/comment_purpose.py +0 -0
  173. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/commentary.py +0 -0
  174. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/compiled_metadata.py +0 -0
  175. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/compiled_properties.py +0 -0
  176. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/custom_gui.py +0 -0
  177. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/custom_gui_versions.py +0 -0
  178. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/fishbone_placement.py +0 -0
  179. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/fishbone_topology.py +0 -0
  180. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/graph_ops.py +0 -0
  181. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/graph_review.py +0 -0
  182. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/island_layout.py +0 -0
  183. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/layout.py +0 -0
  184. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/layout_audit.py +0 -0
  185. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/layout_audit_geometry.py +0 -0
  186. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/layout_audit_repeated.py +0 -0
  187. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/layout_graph.py +0 -0
  188. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/local_vars.py +0 -0
  189. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/material_gui_condition.py +0 -0
  190. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/material_gui_protocol.py +0 -0
  191. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/material_gui_spec.py +0 -0
  192. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/meticulous_layout.py +0 -0
  193. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/model.py +0 -0
  194. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/property_presentation.py +0 -0
  195. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/reuse_plan.py +0 -0
  196. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/wire_geometry.py +0 -0
  197. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/core/wire_router.py +0 -0
  198. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/schema/__init__.py +0 -0
  199. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/schema/data/observed.json +0 -0
  200. {asecli-0.7.0 → asecli-0.8.1}/src/asecli/schema/data/schemas.json +0 -0
  201. {asecli-0.7.0 → asecli-0.8.1}/tests/TEST.md +0 -0
  202. {asecli-0.7.0 → asecli-0.8.1}/tests/__init__.py +0 -0
  203. {asecli-0.7.0 → asecli-0.8.1}/tests/conftest.py +0 -0
  204. {asecli-0.7.0 → asecli-0.8.1}/tests/editor_create_v3_fixture.py +0 -0
  205. {asecli-0.7.0 → asecli-0.8.1}/tests/fixtures/HLIT.shader +0 -0
  206. {asecli-0.7.0 → asecli-0.8.1}/tests/fixtures/asecli_material_gui_v0_2_0.cs.txt +0 -0
  207. {asecli-0.7.0 → asecli-0.8.1}/tests/fixtures/step-antialiasing.function.txt +0 -0
  208. {asecli-0.7.0 → asecli-0.8.1}/tests/test_adversarial_hardening.py +0 -0
  209. {asecli-0.7.0 → asecli-0.8.1}/tests/test_audit_fixes.py +0 -0
  210. {asecli-0.7.0 → asecli-0.8.1}/tests/test_bridge_contract.py +0 -0
  211. {asecli-0.7.0 → asecli-0.8.1}/tests/test_bridge_recompile.py +0 -0
  212. {asecli-0.7.0 → asecli-0.8.1}/tests/test_commentary.py +0 -0
  213. {asecli-0.7.0 → asecli-0.8.1}/tests/test_core_contract.py +0 -0
  214. {asecli-0.7.0 → asecli-0.8.1}/tests/test_create.py +0 -0
  215. {asecli-0.7.0 → asecli-0.8.1}/tests/test_create_constant_presentation.py +0 -0
  216. {asecli-0.7.0 → asecli-0.8.1}/tests/test_custom_gui.py +0 -0
  217. {asecli-0.7.0 → asecli-0.8.1}/tests/test_custom_gui_cli.py +0 -0
  218. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_create_bridge.py +0 -0
  219. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_create_e2e.py +0 -0
  220. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_create_spec.py +0 -0
  221. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_create_spec_v3.py +0 -0
  222. {asecli-0.7.0 → asecli-0.8.1}/tests/test_editor_render_settings.py +0 -0
  223. {asecli-0.7.0 → asecli-0.8.1}/tests/test_graph_review.py +0 -0
  224. {asecli-0.7.0 → asecli-0.8.1}/tests/test_graph_safety.py +0 -0
  225. {asecli-0.7.0 → asecli-0.8.1}/tests/test_gui_handoff.py +0 -0
  226. {asecli-0.7.0 → asecli-0.8.1}/tests/test_gui_native_extension.py +0 -0
  227. {asecli-0.7.0 → asecli-0.8.1}/tests/test_gui_support.py +0 -0
  228. {asecli-0.7.0 → asecli-0.8.1}/tests/test_gui_support_cli_contract.py +0 -0
  229. {asecli-0.7.0 → asecli-0.8.1}/tests/test_gui_upgrade.py +0 -0
  230. {asecli-0.7.0 → asecli-0.8.1}/tests/test_island_layout.py +0 -0
  231. {asecli-0.7.0 → asecli-0.8.1}/tests/test_layout.py +0 -0
  232. {asecli-0.7.0 → asecli-0.8.1}/tests/test_layout_governance.py +0 -0
  233. {asecli-0.7.0 → asecli-0.8.1}/tests/test_layout_local_var_policy.py +0 -0
  234. {asecli-0.7.0 → asecli-0.8.1}/tests/test_material_gui_e2e.py +0 -0
  235. {asecli-0.7.0 → asecli-0.8.1}/tests/test_mcp_security.py +0 -0
  236. {asecli-0.7.0 → asecli-0.8.1}/tests/test_mutate.py +0 -0
  237. {asecli-0.7.0 → asecli-0.8.1}/tests/test_perf.py +0 -0
  238. {asecli-0.7.0 → asecli-0.8.1}/tests/test_property_presentation.py +0 -0
  239. {asecli-0.7.0 → asecli-0.8.1}/tests/test_roundtrip.py +0 -0
  240. {asecli-0.7.0 → asecli-0.8.1}/tests/test_schema_add.py +0 -0
  241. {asecli-0.7.0 → asecli-0.8.1}/tests/test_schema_samples.py +0 -0
  242. {asecli-0.7.0 → asecli-0.8.1}/tests/test_supply_chain.py +0 -0
  243. {asecli-0.7.0 → asecli-0.8.1}/tests/test_usage_audit.py +0 -0
  244. {asecli-0.7.0 → asecli-0.8.1}/tests/test_wire_route_bridge.py +0 -0
  245. {asecli-0.7.0 → asecli-0.8.1}/tools/build_schema.py +0 -0
  246. {asecli-0.7.0 → asecli-0.8.1}/tools/check_ci_governance.py +0 -0
  247. {asecli-0.7.0 → asecli-0.8.1}/tools/check_document_governance.py +0 -0
  248. {asecli-0.7.0 → asecli-0.8.1}/tools/check_packed_executor_loc.py +0 -0
  249. {asecli-0.7.0 → asecli-0.8.1}/tools/check_regression_catalog.py +0 -0
  250. {asecli-0.7.0 → asecli-0.8.1}/tools/check_release_candidate.py +0 -0
  251. {asecli-0.7.0 → asecli-0.8.1}/tools/compare_build_artifacts.py +0 -0
  252. {asecli-0.7.0 → asecli-0.8.1}/tools/generate_sbom.py +0 -0
  253. {asecli-0.7.0 → asecli-0.8.1}/tools/supply_chain_check.py +0 -0
@@ -90,6 +90,17 @@ jobs:
90
90
  test -f "$test_project/Assets/Editor/ASECLI/ASECLIMaterialGUI.cs"
91
91
  - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 (Node 24)
92
92
  with:
93
- name: asecli-${{ env.ASECLI_VERSION }}-python-${{ runner.arch }}
93
+ name: asecli-candidate-${{ github.sha }}
94
94
  path: dist/
95
95
  if-no-files-found: error
96
+
97
+ cross-cli:
98
+ needs: package
99
+ uses: ./.github/workflows/cross-cli.yml
100
+ with:
101
+ sgcli_ref: ${{ vars.SGCLI_CANDIDATE_SHA }}
102
+ asecli_artifact_name: asecli-candidate-${{ github.sha }}
103
+ secrets:
104
+ sgcli_read_ssh_key: ${{ secrets.SGCLI_READ_SSH_KEY }}
105
+ permissions:
106
+ contents: read
@@ -0,0 +1,123 @@
1
+ name: Cross CLI Contract Gate
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ sgcli_ref:
7
+ description: Exact trusted SGCLI commit
8
+ required: false
9
+ default: ""
10
+ type: string
11
+ asecli_artifact_name:
12
+ description: Build-once ASECLI candidate artifact from the caller
13
+ required: false
14
+ default: ""
15
+ type: string
16
+ secrets:
17
+ sgcli_read_ssh_key:
18
+ description: Read-only deploy key for the private SGCLI repository
19
+ required: false
20
+ workflow_dispatch:
21
+ inputs:
22
+ sgcli_ref:
23
+ description: Exact trusted SGCLI commit
24
+ required: true
25
+ type: string
26
+ asecli_artifact_name:
27
+ description: Existing ASECLI candidate artifact in this run; blank builds for diagnostics
28
+ required: false
29
+ default: ""
30
+ type: string
31
+
32
+ permissions:
33
+ contents: read
34
+
35
+ jobs:
36
+ public-contract:
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
40
+ with:
41
+ persist-credentials: false
42
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
43
+ with:
44
+ version: "0.11.14"
45
+ python-version: "3.12"
46
+ - run: uv sync --frozen --python 3.12
47
+ - name: Validate public/fork-safe consumer contracts
48
+ run: uv run --frozen python -m pytest -q tests/test_contract_schema.py
49
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
50
+ if: ${{ inputs.asecli_artifact_name != '' }}
51
+ with:
52
+ name: ${{ inputs.asecli_artifact_name }}
53
+ path: ${{ runner.temp }}/asecli-candidate
54
+ - name: Smoke test the build-once candidate wheel
55
+ if: ${{ inputs.asecli_artifact_name != '' }}
56
+ run: |
57
+ uv venv "$RUNNER_TEMP/asecli-public-smoke" --python 3.12
58
+ uv pip install --python "$RUNNER_TEMP/asecli-public-smoke/bin/python" "$RUNNER_TEMP"/asecli-candidate/*.whl
59
+ "$RUNNER_TEMP/asecli-public-smoke/bin/asecli" contract editor-graph --version 3
60
+ - name: Record candidate gate boundary
61
+ if: ${{ github.event_name == 'pull_request' }}
62
+ run: >-
63
+ echo 'Private SGCLI candidate checkout is intentionally not available to pull requests;
64
+ the private SGCLI repository owns the full two-candidate WaveNoise gate.'
65
+
66
+ two-wheel-direct-json:
67
+ if: ${{ github.event_name != 'pull_request' }}
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - name: Validate trusted cross-repository inputs
71
+ env:
72
+ SGCLI_REF: ${{ inputs.sgcli_ref }}
73
+ SGCLI_READ_SSH_KEY: ${{ secrets.sgcli_read_ssh_key }}
74
+ run: |
75
+ test -n "$SGCLI_REF" || { echo "CROSS_REPO_REF_MISSING: configure SGCLI_CANDIDATE_SHA"; exit 2; }
76
+ [[ "$SGCLI_REF" =~ ^[0-9a-fA-F]{40}$ ]] || { echo "CROSS_REPO_REF_INVALID: SGCLI_CANDIDATE_SHA must be an exact 40-character commit SHA"; exit 2; }
77
+ test -n "$SGCLI_READ_SSH_KEY" || { echo "CROSS_REPO_AUTH_MISSING: configure read-only SGCLI_READ_SSH_KEY deploy key"; exit 2; }
78
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
79
+ with:
80
+ path: ASECLI
81
+ persist-credentials: false
82
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
83
+ with:
84
+ repository: seeseeczl/SGCLI
85
+ ref: ${{ inputs.sgcli_ref }}
86
+ ssh-key: ${{ secrets.sgcli_read_ssh_key }}
87
+ path: SGCLI
88
+ persist-credentials: false
89
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
90
+ with:
91
+ version: "0.11.14"
92
+ python-version: "3.12"
93
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
94
+ if: ${{ inputs.asecli_artifact_name != '' }}
95
+ with:
96
+ name: ${{ inputs.asecli_artifact_name }}
97
+ path: ${{ runner.temp }}/asecli-candidate
98
+ - name: Build ASECLI candidate for manual dispatch
99
+ if: ${{ inputs.asecli_artifact_name == '' }}
100
+ run: (cd ASECLI && uv build --wheel --out-dir "$RUNNER_TEMP/asecli-candidate")
101
+ - name: Build exact SGCLI candidate
102
+ run: (cd SGCLI && uv build --wheel --out-dir "$RUNNER_TEMP/sgcli-wheel")
103
+ - name: Run no-transform two-wheel WaveNoise matrix
104
+ run: >-
105
+ python SGCLI/scripts/check_cross_cli_contracts.py
106
+ --sgcli-root SGCLI
107
+ --asecli-root ASECLI
108
+ --sgcli-wheel "$RUNNER_TEMP"/sgcli-wheel/*.whl
109
+ --asecli-wheel "$RUNNER_TEMP"/asecli-candidate/*.whl
110
+ --output "$RUNNER_TEMP/cross-cli-artifacts/manifest.json"
111
+ --artifact-dir "$RUNNER_TEMP/cross-cli-artifacts"
112
+ --sgcli-ref "${{ inputs.sgcli_ref }}"
113
+ --asecli-ref "${{ github.sha }}"
114
+ --workflow-revision "${{ github.workflow_ref }}@${{ github.sha }}"
115
+ - name: Verify downloaded-artifact shape and hashes
116
+ run: >-
117
+ python SGCLI/scripts/verify_cross_cli_artifacts.py
118
+ "$RUNNER_TEMP/cross-cli-artifacts/manifest.json"
119
+ - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
120
+ with:
121
+ name: cross-cli-contracts-${{ github.sha }}
122
+ path: ${{ runner.temp }}/cross-cli-artifacts/
123
+ if-no-files-found: error
@@ -85,12 +85,23 @@ jobs:
85
85
  test -f "$test_project/Assets/Editor/ASECLI/ASECLIMaterialGUI.cs"
86
86
  - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 (Node 24)
87
87
  with:
88
- name: dist-${{ github.sha }}
88
+ name: asecli-candidate-${{ github.sha }}
89
89
  path: dist/
90
90
  if-no-files-found: error
91
91
 
92
- publish:
92
+ cross-cli:
93
93
  needs: package
94
+ uses: ./.github/workflows/cross-cli.yml
95
+ with:
96
+ sgcli_ref: ${{ vars.SGCLI_CANDIDATE_SHA }}
97
+ asecli_artifact_name: asecli-candidate-${{ github.sha }}
98
+ secrets:
99
+ sgcli_read_ssh_key: ${{ secrets.SGCLI_READ_SSH_KEY }}
100
+ permissions:
101
+ contents: read
102
+
103
+ publish:
104
+ needs: [package, cross-cli]
94
105
  if: ${{ vars.ASECLI_PYPI_ENABLED == 'true' }}
95
106
  runs-on: ubuntu-latest
96
107
  environment:
@@ -105,7 +116,7 @@ jobs:
105
116
  enable-cache: false
106
117
  - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 (Node 24)
107
118
  with:
108
- name: dist-${{ github.sha }}
119
+ name: asecli-candidate-${{ github.sha }}
109
120
  path: dist/
110
121
  - run: cd dist && shasum -a 256 -c SHA256SUMS
111
122
  - run: uv publish dist/*.whl dist/*.tar.gz
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: asecli
3
- Version: 0.7.0
3
+ Version: 0.8.1
4
4
  Summary: Agent-native CLI for reading, modifying, validating and compiling Amplify Shader Editor assets
5
5
  Project-URL: Homepage, https://github.com/seeseeczl/ASECLI
6
6
  Project-URL: Repository, https://github.com/seeseeczl/ASECLI
@@ -28,9 +28,9 @@ Description-Content-Type: text/markdown
28
28
 
29
29
  AseCLI 是面向 AI Agent 的本地 CLI:离线读取、编辑和校验 ASE 节点图;通过运行中的 Unity/团结引擎与 MCP,让真实 ASE 创建节点、提供精排几何并重新生成 HLSL。Skill 提供跨 Agent 的操作规则,CLI 提供可验证的执行结果。
30
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)
31
+ 当前正式版:**[0.8.1](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1)** · [PyPI](https://pypi.org/project/asecli/0.8.1/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
32
32
 
33
- ASECLI 接收 `EditorGraphSpec`,不直接承担任意 Shader Graph 的转换。SGCLI 导出的源图 JSON、转换后的创建规格和已经整理的 `.shader` 是不同资产;创建成功不代表转换效果等价。
33
+ ASECLI 接收 SGCLI 生成的裸 `EditorGraphSpec v3`,并可把受支持的 ASE Shader 直接导出为 SGCLI 的裸 `sgcli.native.v3`。两个方向都只有“生产者 spec 原文件→消费者 `--spec`”;独立 report 与发布 receipt 都不进入创建输入,创建成功也不代表转换效果等价。
34
34
 
35
35
  ```
36
36
  你:提需求("给这个 shader 加个可调描边")
@@ -47,6 +47,7 @@ Agent:设计节点图 → asecli 写文件 → 校验 → 触发编译 → 你
47
47
  | 转换后核对 | `graph-review` 保守比较计算基线,按输出端口生成 Local Var 复用计划 | 只读计划不需要;不会自动创建 Register/Get |
48
48
  | 材质 Inspector | 原生 MZGUI 优先;缺失时才注入 ASECLI ShaderGUI fallback。两者兼容 `FoldoutMzgui`、`TooltipMzgui`、`HelpBoxMzgui` 和条件置灰 `EnableIfMzgui`;默认只生成 Tooltip,HelpBox 由用户按需添加 | 写元数据否;安装、重编译和最终 Inspector 验收需要 |
49
49
  | Shader 创建 | 从已满足属性呈现契约的编译壳克隆;或由严格 `EditorGraphSpec v2/v3` 让 ASE 自己创建节点、连线、保存和重载核对 | Editor 后端需要 |
50
+ | ASE→SG 导出 | `export-sg` 直接生成裸 `sgcli.native.v3` 和同方向独立报告;名称槽位由 SGCLI 消费端解析 | 导出本身不需要;实际 SG 创建需要 |
50
51
  | 编译桥接 | 通过 MCP for Unity 请求 ASE 重新生成 HLSL,并验证工具结果/保存语义 | 是 |
51
52
  | Agent 集成 | 全部子命令单行 JSON 输出;稳定错误码与退出码,适合 Agent 子进程编排 | 否 |
52
53
  | 工程交付 | 双 Python CI、锁文件、回归目录、可复现 wheel/sdist、SBOM、供应链与许可证检查 | 否 |
@@ -131,7 +132,7 @@ curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/insta
131
132
  uv tool uninstall asecli
132
133
  ```
133
134
 
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
+ 当前正式版本为 `0.8.1`(透明 Multiply 的 matcher-v4 语义修复与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.1/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
135
136
 
136
137
  已知限制:真实 MCP 下,属性+纹理 v2 和 Reciprocal 降级 v2 的 create、manifest、validate、独立 recompile 已通过;SGCLI SphereMask v3 spec 在重载时仍可能返回 `node missing after reload: Radius` 并回滚。本次不承诺该 recipe 端到端可用,也不改变 SGCLI v2 默认值契约。
137
138
 
@@ -161,7 +162,7 @@ asecli --help
161
162
 
162
163
  ```bash
163
164
  shasum -a 256 -c SHA256SUMS
164
- uv tool install /path/to/asecli-0.7.0-py3-none-any.whl
165
+ uv tool install /path/to/asecli-0.8.1-py3-none-any.whl
165
166
  asecli --help
166
167
  ```
167
168
 
@@ -186,7 +187,9 @@ asecli graph-audit Assets/Example.shader
186
187
  前提:SGCLI 已生成合法的 EditorGraphSpec;目标工程已打开,MCP 地址与当前实例一致。下面的目标必须尚不存在。
187
188
 
188
189
  ```bash
189
- asecli create Assets/ConvertedNew.shader --backend editor --spec graph.json \
190
+ sgcli convert Assets/Source.shadergraph --out-dir ./out
191
+ asecli create Assets/ConvertedNew.shader \
192
+ --spec ./out/Source.sgcli-to-asecli.spec.json \
190
193
  --mcp-url http://127.0.0.1:9080/mcp
191
194
  asecli validate Assets/ConvertedNew.shader
192
195
  asecli recompile Assets/ConvertedNew.shader --mcp-url http://127.0.0.1:9080/mcp
@@ -194,6 +197,24 @@ asecli recompile Assets/ConvertedNew.shader --mcp-url http://127.0.0.1:9080/mcp
194
197
 
195
198
  核对创建结果的节点、端口、连接及属性 manifest。`staging_reloaded=true` 只表示暂存图重载成功;目标图仍需独立 `recompile`。超时后先检查目标与同目录 `ASECLI-Temp-*`,禁止盲目重试。
196
199
 
200
+ ### 将 ASE Shader 直接导出给 SGCLI
201
+
202
+ ```bash
203
+ asecli export-sg Assets/ConvertedNew.shader --out-dir ./out
204
+ sgcli sg create Assets/ConvertedNew.shadergraph \
205
+ --spec ./out/ConvertedNew.asecli-to-sgcli.spec.json
206
+ ```
207
+
208
+ `export-sg` 自动从源 Shader 向上识别 Unity/Tuanjie 工程;跨工程资源解析时显式传 `--target-project`。它强制生成 `<stem>.asecli-to-sgcli.spec.json`、`.report.json` 与 `.receipt.json`,同名即失败;receipt 只证明 spec/report 两份文件的提交状态与 SHA,不是中间交接包。命令不调用 SGCLI,也不生成 ASE 自有中间 JSON。未知节点、Master/Pass、外部属性或纹理 Importer 语义时只写规范报告,不写半成品 spec。反方向 `.asecli-to-sgcli.spec.json` 不能交给 ASECLI `create --spec`。
209
+
210
+ ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.3` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.1` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
211
+
212
+ 可用 `asecli contract editor-graph --version 3 --spec FILE` 在不连接 Editor 时执行权威 Schema/loader 并返回原文件 SHA。报告分开记录来源快照、发布前复核、生产者 Schema 与真实消费者读取状态。旧 `{graph,report}` wrapper 只允许按已登记形状显式迁移,且内层必须已经是 `sgcli.native.v3`;无版本 discriminator 的旧输入只报告 `legacy_format`,不得伪称已识别版本化 Schema:
213
+
214
+ ```bash
215
+ asecli migrate-package Old-graph-for-sgcli.json --out-dir ./out --extract-sg-spec
216
+ ```
217
+
197
218
  ### 整理转换后的复杂图
198
219
 
199
220
  先将当前已确认正确的 Shader 另存为**唯一基线备份**;相邻 `.bak` 会被后续写入更新,不能充当整个任务的永久基线。
@@ -247,6 +268,9 @@ asecli recompile Assets/Example.shader
247
268
  | `validate <file>` | 检查悬空连线、重复 ID、输入多来源、Local Var 一致性和 CHKSM。 | 只读;有 error 时返回退出码 2。 |
248
269
  | `graph-review <file> [--baseline FILE] [--reuse-policy consumer-groups\\|fanout]` | 保守核对计算基线并列出复用计划。 | 只读;基线不一致返回 `SEMANTIC_MISMATCH` / 2,不自动创建 Local Var。 |
249
270
  | `graph-audit <file>` | 从 Master 反向分析未参与输出的节点,区分 `unused_candidates` 与外部消费者。 | 只读;Property 的源码/HLSL/GUI 引用不会被误报为可删。 |
271
+ | `export-sg <file> --out-dir DIR [--target-project PROJECT]` | 直接输出裸 `sgcli.native.v3`、独立转换报告和发布回执。 | spec 是唯一交接输入;receipt 只证明 spec/report 提交状态;不调用 SGCLI;同名失败;转换失败只写 report。 |
272
+ | `contract editor-graph --version 3 [--spec FILE]` | 输出 wheel 内权威 EditorGraphSpec v3 JSON Schema;可离线校验并回执输入 SHA。 | 只读;loader 仍执行端口、中文属性和模板等更强语义校验。 |
273
+ | `migrate-package <file> --out-dir DIR --extract-sg-spec` | 显式提取登记的旧 `{graph,report}` wrapper。 | 只接受内层 `sgcli.native.v3`;未知/v2 wrapper 只留失败报告,不进入正常消费者。 |
250
274
  | `set-field <file> --node N --field I --value V [--write]` | 修改一个已知节点的绝对序列化字段。 | 默认预演;`--write` 后写入。不要用它猜写 Master 或未知版本尾部。 |
251
275
  | `add-node <file> --type T [--id N] [--pos X,Y] [--write]` | 按 schema 创建可写节点与默认参数。 | 默认预演;未知、opaque 或版本不兼容节点会拒绝。`--line` 是复用真实序列化行的专家入口;若新行含 schema 占位符的 32 位 hex 标识,会返回 `warnings` 提示在 Unity 中核对唯一性。 |
252
276
  | `connect <file> --from A:P --to B:P [--write]` | 将来源节点输出端接到目标节点输入端。 | 默认预演;`--from` 是数据源,`--to` 是消费者。 |
@@ -259,7 +283,7 @@ asecli recompile Assets/Example.shader
259
283
  | `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
284
  | `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
285
  | `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 与属性精度、默认值和范围。 |
286
+ | `create <out> --spec graph.json` | 用白名单 `EditorGraphSpec v2/v3` 让 ASE 自身创建、保存和重载目标图。 | 提供 `--spec` 时默认选择 Editor 后端并立即请求写入;每个 Property 必填中文 `inspector_name` 和中文 `tooltip`,可选 `help` 写用户 HelpBox。v3 另支持版本化 primitive/recipe 与属性精度、默认值和范围。 |
263
287
  | `recompile <file> [--mcp-url URL] [--allow-remote-mcp]` | 调用运行中 ASE 重新生成 HLSL/保存,报告 `changed`;并自动快照→恢复材质 GUI 元数据、重算 CHKSM、强制 `AssetDatabase.ImportAsset` 二次导入。 | **立即触发 Editor 操作**;默认仅允许 loopback MCP。返回 `changed`,元数据被恢复时另返回 `metadata_restored` 与 `asset_import`。 |
264
288
 
265
289
  ### 详细操作入口
@@ -274,7 +298,7 @@ asecli recompile Assets/Example.shader
274
298
 
275
299
  ### Editor API 创建
276
300
 
277
- 默认 `create` 仍是原有纯文本后端。`--backend editor --spec graph.json` 明确使用 Editor;`--backend auto` 在提供 `--spec` 时选择 Editor,否则选择文本后端。Editor 目标必须位于 Unity/Tuanjie 工程的 `Assets/` 下且尚不存在,不允许 `--force`。
301
+ `create` 默认自动路由:提供 `--spec` 时选择 Editor;没有 `--spec` 时走原有纯文本后端。仍可用 `--backend editor|text|auto` 显式指定。Editor 目标必须位于 Unity/Tuanjie 工程的 `Assets/` 下且尚不存在,不允许 `--force`。
278
302
 
279
303
  最小 Caster-like 规格:
280
304
 
@@ -316,12 +340,12 @@ asecli recompile Assets/Example.shader
316
340
  除显式 `--help` 保留人类可读文本外,stdout 恒为单行严格 JSON,agent 可直接解析。`--version` 也返回 JSON:
317
341
 
318
342
  ```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"}}
343
+ {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":true,"data":{"node_count":7}}
344
+ {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
345
+ {"contract_version":1,"cli_version":"0.8.1","command":"version","ok":true,"data":{"version":"0.8.1"}}
322
346
  ```
323
347
 
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`。
348
+ 常见错误码:`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`、`SG_EXPORT_BLOCKED`、`EXTERNAL_REFERENCE`、`SKILL_INSTALL_CONFLICT`、`SKILL_INSTALL_ERROR`、`WRITE_CONFLICT`、`WRITE_PARTIAL`、`UNSAFE_PATH`、`WRITE_ERROR`、`BRIDGE_ERROR`、`INTERNAL`。
325
349
  退出码:`0` 成功 · `2` 用法/校验/解析错误 · `3` 桥接错误
326
350
 
327
351
  ## 安全与验收边界
@@ -4,9 +4,9 @@
4
4
 
5
5
  AseCLI 是面向 AI Agent 的本地 CLI:离线读取、编辑和校验 ASE 节点图;通过运行中的 Unity/团结引擎与 MCP,让真实 ASE 创建节点、提供精排几何并重新生成 HLSL。Skill 提供跨 Agent 的操作规则,CLI 提供可验证的执行结果。
6
6
 
7
- 当前正式版:**[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)
7
+ 当前正式版:**[0.8.1](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1)** · [PyPI](https://pypi.org/project/asecli/0.8.1/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
8
8
 
9
- ASECLI 接收 `EditorGraphSpec`,不直接承担任意 Shader Graph 的转换。SGCLI 导出的源图 JSON、转换后的创建规格和已经整理的 `.shader` 是不同资产;创建成功不代表转换效果等价。
9
+ ASECLI 接收 SGCLI 生成的裸 `EditorGraphSpec v3`,并可把受支持的 ASE Shader 直接导出为 SGCLI 的裸 `sgcli.native.v3`。两个方向都只有“生产者 spec 原文件→消费者 `--spec`”;独立 report 与发布 receipt 都不进入创建输入,创建成功也不代表转换效果等价。
10
10
 
11
11
  ```
12
12
  你:提需求("给这个 shader 加个可调描边")
@@ -23,6 +23,7 @@ Agent:设计节点图 → asecli 写文件 → 校验 → 触发编译 → 你
23
23
  | 转换后核对 | `graph-review` 保守比较计算基线,按输出端口生成 Local Var 复用计划 | 只读计划不需要;不会自动创建 Register/Get |
24
24
  | 材质 Inspector | 原生 MZGUI 优先;缺失时才注入 ASECLI ShaderGUI fallback。两者兼容 `FoldoutMzgui`、`TooltipMzgui`、`HelpBoxMzgui` 和条件置灰 `EnableIfMzgui`;默认只生成 Tooltip,HelpBox 由用户按需添加 | 写元数据否;安装、重编译和最终 Inspector 验收需要 |
25
25
  | Shader 创建 | 从已满足属性呈现契约的编译壳克隆;或由严格 `EditorGraphSpec v2/v3` 让 ASE 自己创建节点、连线、保存和重载核对 | Editor 后端需要 |
26
+ | ASE→SG 导出 | `export-sg` 直接生成裸 `sgcli.native.v3` 和同方向独立报告;名称槽位由 SGCLI 消费端解析 | 导出本身不需要;实际 SG 创建需要 |
26
27
  | 编译桥接 | 通过 MCP for Unity 请求 ASE 重新生成 HLSL,并验证工具结果/保存语义 | 是 |
27
28
  | Agent 集成 | 全部子命令单行 JSON 输出;稳定错误码与退出码,适合 Agent 子进程编排 | 否 |
28
29
  | 工程交付 | 双 Python CI、锁文件、回归目录、可复现 wheel/sdist、SBOM、供应链与许可证检查 | 否 |
@@ -107,7 +108,7 @@ curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/insta
107
108
  uv tool uninstall asecli
108
109
  ```
109
110
 
110
- 当前正式版本为 `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` 保留为回滚点。
111
+ 当前正式版本为 `0.8.1`(透明 Multiply 的 matcher-v4 语义修复与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.1/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
111
112
 
112
113
  已知限制:真实 MCP 下,属性+纹理 v2 和 Reciprocal 降级 v2 的 create、manifest、validate、独立 recompile 已通过;SGCLI SphereMask v3 spec 在重载时仍可能返回 `node missing after reload: Radius` 并回滚。本次不承诺该 recipe 端到端可用,也不改变 SGCLI v2 默认值契约。
113
114
 
@@ -137,7 +138,7 @@ asecli --help
137
138
 
138
139
  ```bash
139
140
  shasum -a 256 -c SHA256SUMS
140
- uv tool install /path/to/asecli-0.7.0-py3-none-any.whl
141
+ uv tool install /path/to/asecli-0.8.1-py3-none-any.whl
141
142
  asecli --help
142
143
  ```
143
144
 
@@ -162,7 +163,9 @@ asecli graph-audit Assets/Example.shader
162
163
  前提:SGCLI 已生成合法的 EditorGraphSpec;目标工程已打开,MCP 地址与当前实例一致。下面的目标必须尚不存在。
163
164
 
164
165
  ```bash
165
- asecli create Assets/ConvertedNew.shader --backend editor --spec graph.json \
166
+ sgcli convert Assets/Source.shadergraph --out-dir ./out
167
+ asecli create Assets/ConvertedNew.shader \
168
+ --spec ./out/Source.sgcli-to-asecli.spec.json \
166
169
  --mcp-url http://127.0.0.1:9080/mcp
167
170
  asecli validate Assets/ConvertedNew.shader
168
171
  asecli recompile Assets/ConvertedNew.shader --mcp-url http://127.0.0.1:9080/mcp
@@ -170,6 +173,24 @@ asecli recompile Assets/ConvertedNew.shader --mcp-url http://127.0.0.1:9080/mcp
170
173
 
171
174
  核对创建结果的节点、端口、连接及属性 manifest。`staging_reloaded=true` 只表示暂存图重载成功;目标图仍需独立 `recompile`。超时后先检查目标与同目录 `ASECLI-Temp-*`,禁止盲目重试。
172
175
 
176
+ ### 将 ASE Shader 直接导出给 SGCLI
177
+
178
+ ```bash
179
+ asecli export-sg Assets/ConvertedNew.shader --out-dir ./out
180
+ sgcli sg create Assets/ConvertedNew.shadergraph \
181
+ --spec ./out/ConvertedNew.asecli-to-sgcli.spec.json
182
+ ```
183
+
184
+ `export-sg` 自动从源 Shader 向上识别 Unity/Tuanjie 工程;跨工程资源解析时显式传 `--target-project`。它强制生成 `<stem>.asecli-to-sgcli.spec.json`、`.report.json` 与 `.receipt.json`,同名即失败;receipt 只证明 spec/report 两份文件的提交状态与 SHA,不是中间交接包。命令不调用 SGCLI,也不生成 ASE 自有中间 JSON。未知节点、Master/Pass、外部属性或纹理 Importer 语义时只写规范报告,不写半成品 spec。反方向 `.asecli-to-sgcli.spec.json` 不能交给 ASECLI `create --spec`。
185
+
186
+ ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.3` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.1` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
187
+
188
+ 可用 `asecli contract editor-graph --version 3 --spec FILE` 在不连接 Editor 时执行权威 Schema/loader 并返回原文件 SHA。报告分开记录来源快照、发布前复核、生产者 Schema 与真实消费者读取状态。旧 `{graph,report}` wrapper 只允许按已登记形状显式迁移,且内层必须已经是 `sgcli.native.v3`;无版本 discriminator 的旧输入只报告 `legacy_format`,不得伪称已识别版本化 Schema:
189
+
190
+ ```bash
191
+ asecli migrate-package Old-graph-for-sgcli.json --out-dir ./out --extract-sg-spec
192
+ ```
193
+
173
194
  ### 整理转换后的复杂图
174
195
 
175
196
  先将当前已确认正确的 Shader 另存为**唯一基线备份**;相邻 `.bak` 会被后续写入更新,不能充当整个任务的永久基线。
@@ -223,6 +244,9 @@ asecli recompile Assets/Example.shader
223
244
  | `validate <file>` | 检查悬空连线、重复 ID、输入多来源、Local Var 一致性和 CHKSM。 | 只读;有 error 时返回退出码 2。 |
224
245
  | `graph-review <file> [--baseline FILE] [--reuse-policy consumer-groups\\|fanout]` | 保守核对计算基线并列出复用计划。 | 只读;基线不一致返回 `SEMANTIC_MISMATCH` / 2,不自动创建 Local Var。 |
225
246
  | `graph-audit <file>` | 从 Master 反向分析未参与输出的节点,区分 `unused_candidates` 与外部消费者。 | 只读;Property 的源码/HLSL/GUI 引用不会被误报为可删。 |
247
+ | `export-sg <file> --out-dir DIR [--target-project PROJECT]` | 直接输出裸 `sgcli.native.v3`、独立转换报告和发布回执。 | spec 是唯一交接输入;receipt 只证明 spec/report 提交状态;不调用 SGCLI;同名失败;转换失败只写 report。 |
248
+ | `contract editor-graph --version 3 [--spec FILE]` | 输出 wheel 内权威 EditorGraphSpec v3 JSON Schema;可离线校验并回执输入 SHA。 | 只读;loader 仍执行端口、中文属性和模板等更强语义校验。 |
249
+ | `migrate-package <file> --out-dir DIR --extract-sg-spec` | 显式提取登记的旧 `{graph,report}` wrapper。 | 只接受内层 `sgcli.native.v3`;未知/v2 wrapper 只留失败报告,不进入正常消费者。 |
226
250
  | `set-field <file> --node N --field I --value V [--write]` | 修改一个已知节点的绝对序列化字段。 | 默认预演;`--write` 后写入。不要用它猜写 Master 或未知版本尾部。 |
227
251
  | `add-node <file> --type T [--id N] [--pos X,Y] [--write]` | 按 schema 创建可写节点与默认参数。 | 默认预演;未知、opaque 或版本不兼容节点会拒绝。`--line` 是复用真实序列化行的专家入口;若新行含 schema 占位符的 32 位 hex 标识,会返回 `warnings` 提示在 Unity 中核对唯一性。 |
228
252
  | `connect <file> --from A:P --to B:P [--write]` | 将来源节点输出端接到目标节点输入端。 | 默认预演;`--from` 是数据源,`--to` 是消费者。 |
@@ -235,7 +259,7 @@ asecli recompile Assets/Example.shader
235
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 工程。 |
236
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。 |
237
261
  | `create <out> --from TEMPLATE [--name NAME] [--graph-from DONOR]` | 复制一个已编译模板壳;可替换图或同步 Shader 名与 CHKSM。 | **立即创建/覆盖目标**;模板和 donor 组合后的文件必须已满足属性呈现契约,否则写前拒绝。 |
238
- | `create <out> --backend editor --spec graph.json` | 用白名单 `EditorGraphSpec v2/v3` 让 ASE 自身创建、保存和重载目标图。 | **立即请求 Editor 写入**;每个 Property 必填中文 `inspector_name` 和中文 `tooltip`,可选 `help` 写用户 HelpBox。v3 另支持版本化 primitive/recipe 与属性精度、默认值和范围。 |
262
+ | `create <out> --spec graph.json` | 用白名单 `EditorGraphSpec v2/v3` 让 ASE 自身创建、保存和重载目标图。 | 提供 `--spec` 时默认选择 Editor 后端并立即请求写入;每个 Property 必填中文 `inspector_name` 和中文 `tooltip`,可选 `help` 写用户 HelpBox。v3 另支持版本化 primitive/recipe 与属性精度、默认值和范围。 |
239
263
  | `recompile <file> [--mcp-url URL] [--allow-remote-mcp]` | 调用运行中 ASE 重新生成 HLSL/保存,报告 `changed`;并自动快照→恢复材质 GUI 元数据、重算 CHKSM、强制 `AssetDatabase.ImportAsset` 二次导入。 | **立即触发 Editor 操作**;默认仅允许 loopback MCP。返回 `changed`,元数据被恢复时另返回 `metadata_restored` 与 `asset_import`。 |
240
264
 
241
265
  ### 详细操作入口
@@ -250,7 +274,7 @@ asecli recompile Assets/Example.shader
250
274
 
251
275
  ### Editor API 创建
252
276
 
253
- 默认 `create` 仍是原有纯文本后端。`--backend editor --spec graph.json` 明确使用 Editor;`--backend auto` 在提供 `--spec` 时选择 Editor,否则选择文本后端。Editor 目标必须位于 Unity/Tuanjie 工程的 `Assets/` 下且尚不存在,不允许 `--force`。
277
+ `create` 默认自动路由:提供 `--spec` 时选择 Editor;没有 `--spec` 时走原有纯文本后端。仍可用 `--backend editor|text|auto` 显式指定。Editor 目标必须位于 Unity/Tuanjie 工程的 `Assets/` 下且尚不存在,不允许 `--force`。
254
278
 
255
279
  最小 Caster-like 规格:
256
280
 
@@ -292,12 +316,12 @@ asecli recompile Assets/Example.shader
292
316
  除显式 `--help` 保留人类可读文本外,stdout 恒为单行严格 JSON,agent 可直接解析。`--version` 也返回 JSON:
293
317
 
294
318
  ```json
295
- {"contract_version":1,"cli_version":"0.7.0","command":"parse","ok":true,"data":{"node_count":7}}
296
- {"contract_version":1,"cli_version":"0.7.0","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
297
- {"contract_version":1,"cli_version":"0.7.0","command":"version","ok":true,"data":{"version":"0.7.0"}}
319
+ {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":true,"data":{"node_count":7}}
320
+ {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
321
+ {"contract_version":1,"cli_version":"0.8.1","command":"version","ok":true,"data":{"version":"0.8.1"}}
298
322
  ```
299
323
 
300
- 常见错误码:`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`。
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`、`SG_EXPORT_BLOCKED`、`EXTERNAL_REFERENCE`、`SKILL_INSTALL_CONFLICT`、`SKILL_INSTALL_ERROR`、`WRITE_CONFLICT`、`WRITE_PARTIAL`、`UNSAFE_PATH`、`WRITE_ERROR`、`BRIDGE_ERROR`、`INTERNAL`。
301
325
  退出码:`0` 成功 · `2` 用法/校验/解析错误 · `3` 桥接错误
302
326
 
303
327
  ## 安全与验收边界
@@ -43,5 +43,6 @@ evidence: [docs/05-audits/2026-09-01-122217-optimization-tasks.md]
43
43
  | CR-0027 | 将随 wheel 分发的 ASECLI Skill 从 Codex 默认安装扩展为主流 Agent Skills 通用安装 | MOD-CLI MOD-SKILL | 新增 `--agent`、`--scope`、`--project-root`;开放 `.agents/skills` 覆盖 Codex/Cursor/Gemini CLI/GitHub Copilot,Claude Code 使用 `.claude/skills`;无参数与 `--skill-root` 保持兼容;`all` 先检查所有内容冲突 | REG-0058 | 禁用新路由参数即可退回 CR-0015 的 Codex 默认目录;不删除或覆盖已安装 Skill | 定向 46 passed、Skill validator、Project Architect strict 与隔离 wheel 安装通过;BUG-0023 已修复固定片段编译与 SHA 回归;全量 358 passed/3 skipped;发布追溯 REL-0013 |
44
44
  | CR-0028 | 补齐 SG JSON 创建后的 ASE 图整理工作流:端口级复用计划、折叠接口计算基线、刚性计算岛排布与分层验收 | MOD-CORE MOD-LAYOUT MOD-CLI MOD-SKILL | 只读 graph-review;fanout 必须显式选择,默认消费组规则不变;island-columns 默认 1;不重建现有 Shader,不修改 SGCLI,不猜动态节点字段 | REG-0060 REG-0061 | 不用新增参数即保留原布局;回退本任务文件增量,不覆盖并行创建器改动;不发布 | 自动验证中;Local Var 自动 Editor 创建未实现,画布/GUI/渲染验收待具体目标,不以只读计划冒充写入 |
45
45
  | CR-0029 | 强化 CLI JSON 输出契约:原子 ASCII-safe 写出、拒绝非有限数、统一契约/命令/版本字段与错误码注册表 | MOD-CORE MOD-LAYOUT MOD-BRIDGE MOD-CLI MOD-SKILL | 除显式 `--help` 外 stdout 恒为一个严格 JSON;`--version` 改为 JSON;新增顶层字段为加性;损坏几何失败关闭 | REG-0062 | 回滚到 `v0.6.4`;不改 Shader 计算、Editor 交易或用户资产 | 对抗审计 5 项 finding 均关闭;定向 76 passed,全量 388 passed/3 skipped,wheel/ASCII/中文错误路径 smoke 通过;发布见 REL-0015 |
46
+ | CR-0030 | 两 CLI 取消外部中间包:ASECLI 直接输出 SGCLI 原生裸 `sgcli.native.v3`,并以方向化 spec/report 文件名与 SGCLI 的 EditorGraphSpec 输出对称 | MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL | 新增 `export-sg`、`contract`;`create --spec` 拒绝 wrapper/report/反方向后缀;旧历史 JSON 不进入正式流程;候选 wheel Schema/篡改负例、发布 receipt 与跨仓 required workflow 失败关闭;不调用或依赖 SGCLI 运行时 | REG-0063 | 禁用新入口或回滚 wheel;不得恢复消费者隐式解包/正式 translator,不批量改名历史文件 | `v0.8.0@58ccf10` 已发布:publish run 34592028675、GitHub/PyPI 同源资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 全部复核通过;全量 `428 passed, 3 skipped`(Python 3.10 同结果)。最终 wheel Editor/画布/渲染仍开放,不声明视觉等价 |
46
47
 
47
48
  授权来源:用户于 2026-09-01 明确要求“执行优化任务,全部完成”,并于同日批准吸收 ASE Editor API 方案后要求“执行”;随后明确要求先推送并执行对抗性审计优化计划。2026-09-02 用户要求推送并进一步明确“以正式的 CLI 形式发布”,据此创建私有正式 GitHub Release `v0.1.0`;同日进一步明确说明条样式一致性必须成为 CLI 的规范能力,据此登记 CR-0011/BUG-0015,并明确所有通过 CLI 构建的 ASE 文件都必须使用中文属性显示名、自动变量名与默认值 Tooltip 和中文使用说明,据此登记 CR-0012。同日用户要求执行 `2026-09-02-211218` 优化计划,据此登记 CR-0013;随后书面授权打 tag 并发布 `v0.2.0`。2026-09-03 用户要求执行最新优化任务书并把剩余门槛全部完成,据此登记 CR-0014 并授权完成必要提交、直接推送与远程 CI 验证;随后明确要求“推送并发布”,据此授权创建私有正式版本 `v0.3.0`。2026-09-04 用户要求将 ASE 精排与 Inspector 编排规范作为可安装 Skill 并授权发布 `v0.3.1`。2026-09-05 用户要求执行 MZGUI 对接与效率优化,随后分别授权私有版本 `v0.4.0`、`v0.4.1` 和审计补丁 `v0.4.2`。2026-09-06 用户明确 Tooltip 必填、HelpBox 可选、条件置灰并授权 `v0.5.0`;随后要求脑图式 DAG 精排并授权 `v0.6.0`;又将 Local Var 门槛改为两个及以上不同消费组,据此登记 CR-0020;最后以多组人工示范明确递归局部鱼骨、Comment 保留和显式 WireNode 路由并要求执行,据此登记 CR-0021。2026-09-07 用户明确授权提交、推送、私有 Release `v0.6.1` 和本机安装。同日进一步明确要求开源该项目并提供同事安装命令,据此登记 CR-0022:采用 MIT 许可证并将 GitHub 仓库转为 public。随后要求做成最终、最常见的安装形态,据此登记 CR-0023:发布 PyPI 项目 `asecli`,用户命令为 `uv tool install asecli`;仍未授权 CLI Hub。2026-09-08 用户进一步明确要求推送、发布新版本并安装本机,据此授权 `v0.6.2` 的 main 推送、tag、GitHub Release、PyPI Trusted Publishing 与本机正式产物安装;CLI Hub 仍不在授权范围。首次 PyPI OIDC 因没有对应账号和 Trusted Publisher 失败后,用户说明没有 PyPI 账号并明确要求继续 GitHub Release 发布,据此以 CR-0025 将 PyPI 延后并完成 GitHub-only 交付。随后用户取得 PyPI 账号并明确要求继续配置,据此登记 CR-0026,启用精确匹配的 Pending Publisher 并通过 run 34192454152 attempt 3 完成首次 PyPI 发布。同日用户要求将现有 Skill 改为主流 Agent 通用,据此登记 CR-0027;本次不包含推送、tag 或发布。2026-09-10 用户要求对 JSON 输出能力执行对抗审计与优化,随后明确要求推送、发布并安装本机,据此登记 CR-0029 并授权 `v0.7.0` GitHub Release、PyPI Trusted Publishing 与本机 CLI/Skill 安装;CLI Hub 仍不在范围。
@@ -92,3 +92,8 @@
92
92
  | 2026-09-08 | v0.6.4 发布及全局安装完成 | long 授权;verified → released;tag d4a5a46、publish run 34224245874 与主线 run 34224240036 成功;双 Python 各 371 passed/3 skipped,双渠道资产一致;本机 CLI 0.6.4、全局 .agents/.claude/.codex Skill 内容一致且幂等,旧 Codex Skill 已可恢复备份;并行创建器改动未纳入 | REL-0014 CR-0028 TASK-0061 TASK-0062 TASK-0063 REG-0060 REG-0061 |
93
93
  | 2026-09-10 | CLI JSON 契约对抗审计与整改 | 5 项 finding 全部关闭;新增原子 ASCII-safe writer、非有限数双门禁、contract/CLI version/command 顶层字段、version JSON、22 错误码注册表与 17 子命令动态契约覆盖;未触及 Shader 计算或 Editor 资产 | CR-0029 TASK-0064 REG-0062 AA-OPT-001 AA-OPT-002 AA-OPT-003 AA-OPT-004 AA-OPT-005 |
94
94
  | 2026-09-10 | v0.7.0 发布候选 | 用户明确要求推送后发布并安装本机;因 `--version` 的机器协议变化按 pre-1.0 语义版本升级为 0.7.0,保留 v0.6.4 回滚点,远程 CI/OIDC、双渠道回读与本机 CLI/Skill 安装按 REL-0015 执行 | REL-0015 CR-0029 TASK-0064 REG-0062 |
95
+ | 2026-09-10 | v0.7.0 双渠道发布与本机安装完成 | tag `v0.7.0` 解引用为 `029fea4`;run 34475832000 的双 Python verify、package 与 PyPI OIDC publish 全成功;GitHub Release 为 Latest,五项资产与 PyPI wheel/sdist 摘要一致;本机 CLI、官方索引 uvx 及三处全局 Skill 均通过,旧 Skill 已完整备份 | REL-0015 CR-0029 TASK-0064 REG-0062 |
96
+ | 2026-09-11 | 双向裸规格直连第二轮对抗整改 | CR-0030 / ADR-0022 / TASK-0065 / REG-0063:完成 AA-OPT-201~207,补齐 Draft parity、候选 wheel 契约可信根、篡改负例、required workflow、语义矩阵、离线 artifact、发布 receipt 与迁移 provenance。全量 `419 passed, 3 skipped`;最终 wheel `2e38ef11...` 可复现,真实双向 WaveNoise producer/consumer SHA 一致。用户级 ASECLI Skill 因不同内容按规则拒绝覆盖;最终 wheel Editor/画布/render 仍开放。未提交、未推送、未发布。 | CR-0030 ADR-0022 TASK-0065 REG-0063 AA-OPT-201 AA-OPT-202 AA-OPT-203 AA-OPT-204 AA-OPT-205 AA-OPT-206 AA-OPT-207 |
97
+ | 2026-09-11 | 双向裸规格直连第三轮对抗整改 | 执行 AA-OPT-301~308:public PR 不读取 private SGCLI;可信链要求只读 token 和精确 40 位 SHA;package wheel 原样交给 cross-CLI/publish;WaveNoise 双向语义 fixture、receipt 绑定、fixture-set 完整性、Draft 数值等价与 clean provenance 通过。全量及 Python 3.10 均 `428 passed, 3 skipped`;本地 clean release-mode 双 wheel matrix/verifier 通过。AA-OPT-309 的远端 ruleset/required checks、最终 wheel Editor/画布/render 仍开放。未提交、未推送、未发布。 | CR-0030 TASK-0065 REG-0063 AA-OPT-301 AA-OPT-302 AA-OPT-303 AA-OPT-304 AA-OPT-305 AA-OPT-306 AA-OPT-307 AA-OPT-308 AA-OPT-309 |
98
+ | 2026-09-11 | v0.8.0 双渠道发布与本机安装完成 | tag `v0.8.0` 解引用到 `58ccf10`;[publish run 34592028675](https://github.com/seeseeczl/ASECLI/actions/runs/34592028675) 的双 Python、package、public contract、Deploy Key cross-CLI 和 PyPI OIDC 全绿。GitHub Release 五项资产与 PyPI wheel/sdist 摘要一致且未 yanked;本机 CLI 为 0.8.0,`.agents`/`.claude` Skill 与 wheel 一致,旧三处 Skill 已备份。WaveNoise 双向生产/消费 SHA 一致;最终 wheel 的 Editor/画布/render 保持未验证披露。 | REL-0016 CR-0030 TASK-0065 REG-0063 |
99
+ | 2026-09-14 | v0.8.1 发布候选 | matcher-v4 识别并折叠原生 `Lerp(white,color,alpha)`,保留 Wave Noise 不可表示 Alpha Blend 的失败关闭;SGCLI 普通 authoring 与转换认证分离。发布前全量 `461 passed, 3 skipped`,CI governance、供应链与 diff 通过;远端 publish/PyPI、正式资产回读和本机安装待执行,Editor/画布/render 保持开放披露。 | REL-0017 CR-0030 TASK-0066 REG-0063 |
@@ -61,4 +61,5 @@ CR-0026,变更,已发布,ADR-0019,MOD-CLI,TASK-0058,REG-0021 REG-0052 REG-0057,2
61
61
  CR-0027,变更,已发布,ADR-0021,MOD-CLI MOD-SKILL,TASK-0059 TASK-0060,REG-0058,2026-09-08 v0.6.3@a758d0f;run 34205409407;双 Python 358 passed/3 skipped;双渠道摘要与安装回滚通过,REL-0013,long,主流 Agent Skill;旧安装兼容
62
62
  BUG-0023,缺陷,已修复,ADR-0020,MOD-BRIDGE,TASK-0060,REG-0059,2026-09-08 两类真实 v2 CLI create/manifest/validate/recompile 通过;358 passed/3 skipped,REL-0013,long,方法体兼容 KeyValuePair;SphereMask Radius 重载仍为已知限制
63
63
  CR-0028,变更,已发布(视觉与自动LocalVar仍待验),ADR-0021,MOD-CORE MOD-LAYOUT MOD-CLI MOD-SKILL,TASK-0061 TASK-0062 TASK-0063,REG-0060 REG-0061,端口级基线与复用计划及岛内刚性多列布局;未自动创建LocalVar;未做实机验收,REL-0014,long,保留并行创建器改动;不修改SGCLI
64
- CR-0029,变更,已验证,ADR-0001 ADR-0009,MOD-CORE MOD-LAYOUT MOD-BRIDGE MOD-CLI MOD-SKILL,TASK-0064,REG-0062,2026-09-10 对抗审计 5 项关闭;76 passed;全量 388 passed/3 skipped;wheel 与 ASCII/中文路径 smoke 通过,REL-0015,long,严格原子 JSON;非有限数拒绝;version JSON;22 错误码;17 子命令动态覆盖
64
+ CR-0029,变更,已发布,ADR-0001 ADR-0009,MOD-CORE MOD-LAYOUT MOD-BRIDGE MOD-CLI MOD-SKILL,TASK-0064,REG-0062,2026-09-10 v0.7.0@029fea4;run 34475832000 全成功;GitHub/PyPI 摘要一致;本机 CLI/Skill 安装幂等,REL-0015,long,严格原子 JSON;非有限数拒绝;version JSON;22 错误码;17 子命令动态覆盖
65
+ CR-0030,变更,已发布(视觉门禁开放),ADR-0022,MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL,TASK-0065,REG-0063,2026-09-11 v0.8.0 publish run 34592028675 全绿;GitHub/PyPI 资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 通过,REL-0016,long,消费者原生裸规格与方向命名;最终 wheel Editor/画布/渲染仍开放
@@ -5,13 +5,15 @@
5
5
  | MOD-CORE | src/asecli/core | FR-0001 FR-0002 FR-0005 CR-0002 CR-0005 CR-0028 CR-0029 BUG-0002 BUG-0007 BUG-0009 | 行式模型、图块替换、最小差异写回 | `AseFile.from_path`;`parse_graph_text`;`parse_node_line`;`replace_graph` | 仅标准库;禁止依赖 schema/bridge/cli |
6
6
  | MOD-SCHEMA | src/asecli/schema | FR-0002 CR-0002 BUG-0001 | 节点 schema、版本兼容与 mutation allowlist | `schema_for`;`schema_version`;`is_version_compatible` | 允许依赖 MOD-CORE 类型;禁止依赖 bridge/cli |
7
7
  | MOD-CHECK | src/asecli/checks | FR-0003 CR-0002 CR-0003 BUG-0003 BUG-0006 | 图结构校验与 CHKSM 重算 | `validate_file`;`verify_checksum`;`fix_checksum` | 允许依赖 MOD-CORE;禁止依赖 bridge/cli |
8
- | MOD-BRIDGE | src/asecli/bridge | FR-0004 FR-0008 FR-0009 FR-0011 CR-0001 CR-0004 CR-0008 CR-0009 CR-0010 CR-0011 CR-0012 CR-0013 CR-0014 CR-0016 CR-0017 CR-0018 CR-0019 CR-0021 CR-0024 CR-0029 BUG-0005 BUG-0012 BUG-0013 BUG-0016 BUG-0021 BUG-0023 | MCP 客户端、loopback 信任边界、tool result/envelope、重编译、受控 Editor 图创建、WireNode 路由事务、确定性资源拼装与 GUI 支持升级 | `recompile_via_mcp`;`create_shader_via_mcp`;`apply_wire_routes_via_mcp`;`inspect_gui_support`;`install_gui_support`;`McpClient` | 仅标准库;禁止依赖 cli;远程需显式授权 |
9
- | MOD-CLI | src/asecli/cli | FR-0003 FR-0005 FR-0006 FR-0007 FR-0009 FR-0010 FR-0011 CR-0002 CR-0003 CR-0004 CR-0005 CR-0006 CR-0008 CR-0009 CR-0010 CR-0011 CR-0012 CR-0013 CR-0015 CR-0016 CR-0017 CR-0018 CR-0019 CR-0021 CR-0022 CR-0023 CR-0024 CR-0025 CR-0026 CR-0027 CR-0028 CR-0029 BUG-0004 BUG-0006 BUG-0008 BUG-0009 BUG-0010 BUG-0013 BUG-0017 BUG-0018 | 17 个命令、单行严格 JSON、原子 ASCII-safe 写出、写入/信任组合根、create 后端路由、属性呈现门禁、跨主流 Agent 的受控 Skill 安装与版本化可校验 CI 打包 | `asecli <command>`;`asecli install-skill` | 允许依赖 core/schema/check/bridge;只能使用公开 API |
10
- | MOD-SKILL | skills/asecli | FR-0006 FR-0008 FR-0009 FR-0010 FR-0011 CR-0007 CR-0008 CR-0010 CR-0013 CR-0015 CR-0016 CR-0018 CR-0019 CR-0020 CR-0021 CR-0027 CR-0028 CR-0029 | 通用 Agent Skill:ASE 格式说明、递归鱼骨精排、Inspector 分组/命名/说明规范、图/GUI/Comment/Local Var/编译操作手册、错误处理与跨 Agent 执行边界;随 wheel 打包并由 CLI 安装 | `SKILL.md`;`references/layout-standard.md`;`references/material-property-standard.md`(文档资产) | 无代码依赖;只要求 shell 与单行 JSON,不依赖某家 Agent 专属 API |
8
+ | MOD-BRIDGE | src/asecli/bridge | FR-0004 FR-0008 FR-0009 FR-0011 CR-0001 CR-0004 CR-0008 CR-0009 CR-0010 CR-0011 CR-0012 CR-0013 CR-0014 CR-0016 CR-0017 CR-0018 CR-0019 CR-0021 CR-0024 CR-0029 CR-0030 BUG-0005 BUG-0012 BUG-0013 BUG-0016 BUG-0021 BUG-0023 | MCP 客户端、loopback 信任边界、tool result/envelope、重编译、受控 Editor 图创建、EditorGraphSpec 权威 Schema、WireNode 路由事务、确定性资源拼装与 GUI 支持升级 | `recompile_via_mcp`;`create_shader_via_mcp`;`editor_graph_schema`;`apply_wire_routes_via_mcp`;`inspect_gui_support`;`install_gui_support`;`McpClient` | 仅标准库;禁止依赖 cli;远程需显式授权 |
9
+ | MOD-CLI | src/asecli/cli | FR-0003 FR-0005 FR-0006 FR-0007 FR-0009 FR-0010 FR-0011 CR-0002 CR-0003 CR-0004 CR-0005 CR-0006 CR-0008 CR-0009 CR-0010 CR-0011 CR-0012 CR-0013 CR-0015 CR-0016 CR-0017 CR-0018 CR-0019 CR-0021 CR-0022 CR-0023 CR-0024 CR-0025 CR-0026 CR-0027 CR-0028 CR-0029 CR-0030 BUG-0004 BUG-0006 BUG-0008 BUG-0009 BUG-0010 BUG-0013 BUG-0017 BUG-0018 | 20 个命令、单行严格 JSON、原子 ASCII-safe 写出、写入/信任组合根、create 后端路由、双向 contract/export/migration 入口、属性呈现门禁、跨主流 Agent 的受控 Skill 安装与版本化可校验 CI 打包 | `asecli <command>`;`asecli export-sg`;`asecli contract`;`asecli migrate-package`;`asecli install-skill` | 允许依赖 core/schema/check/bridge/export;只能使用公开 API |
10
+ | MOD-SKILL | skills/asecli | FR-0006 FR-0008 FR-0009 FR-0010 FR-0011 CR-0007 CR-0008 CR-0010 CR-0013 CR-0015 CR-0016 CR-0018 CR-0019 CR-0020 CR-0021 CR-0027 CR-0028 CR-0029 CR-0030 | 通用 Agent Skill:ASE 格式说明、递归鱼骨精排、Inspector 分组/命名/说明规范、图/GUI/Comment/Local Var/编译操作手册、错误处理与跨 Agent 执行边界;随 wheel 打包并由 CLI 安装 | `SKILL.md`;`references/layout-standard.md`;`references/material-property-standard.md`(文档资产) | 无代码依赖;只要求 shell 与单行 JSON,不依赖某家 Agent 专属 API |
11
11
  | MOD-LAYOUT | src/asecli/core/layout.py; meticulous_layout.py; layout_audit.py; comment_layout.py; wire_geometry.py; wire_router.py | FR-0008 FR-0010 CR-0019 CR-0020 CR-0021 CR-0028 CR-0029 | 兼容分层布局;基于真实端口和直属来源局部输出线的递归鱼骨、Local Var 跨组审计、Comment 保留/收框/作用标题、显式 WireNode 路由计划 | `layout_positions`;`meticulous_layout_positions`;`audit_meticulous_layout`;`plan_wire_routes` | 允许依赖 core 模型;禁止依赖 schema/bridge/cli |
12
12
  | MOD-CUSTOM-GUI | src/asecli/core/custom_gui.py; custom_gui_versions.py; material_gui_spec.py; material_gui_condition.py; property_presentation.py | FR-0009 FR-0010 CR-0009 CR-0010 CR-0012 CR-0016 CR-0018 BUG-0011 | 真实版本能力矩阵;主 Master/ShaderLab CustomEditor 同步;PropertyNode MZGUI 元数据尾部、中文显示名、UTF-16 文案、旧标记兼容、条件置灰、批量治理与 `asecli.property-presentation.v2` 检查 | `inspect_custom_gui`;`resolve_property_node`;`apply_material_gui_spec`;`require_property_presentation` | 仅依赖 MOD-CORE model;禁止依赖 schema/check/bridge/cli |
13
13
  | MOD-GUI-SUPPORT | src/asecli/bridge/gui_support.py; gui_provider_detection.py; `_gui_project.py`; `_gui_resource_store.py`; `_gui_resource_upgrade.py`; gui_presentation.py; bridge/resources/asecli_material_gui*.cs.txt | FR-0009 CR-0009 CR-0010 CR-0011 CR-0014 CR-0016 CR-0018 BUG-0014 BUG-0015 BUG-0019 BUG-0020 BUG-0022 | 原生 MZGUI 优先选择;fallback 安全安装/已知哈希升级;以同一个 `MZGUI.MZGUI` 公共入口渲染 Inspector;ASE Editor 可视化编辑三类标准属性;打开图时恢复元数据;未知版本能力失败关闭 | `inspect_gui_support`;`install_gui_support`;`MZGUI.MZGUI`;`ASECLIGUIAttributesWindow` | Python 仅标准库;C# 仅 UnityEditor/UnityEngine,通过字符串反射适配 ASE,禁止源码补丁和编译期 ASE 引用 |
14
14
  | MOD-COMMENTARY | src/asecli/core/commentary.py | FR-0010 | CommentaryNode 可变长序列化、成员树检查与自动包围框 | `inspect_comment_groups`;`create_comment_group` | 仅依赖 MOD-CORE model/graph_ops;禁止依赖 schema/check/bridge/cli |
15
+ | MOD-SG-EXPORT | src/asecli/export_sg.py; src/asecli/sg_export | CR-0030 | 从 ASE 图与生成 ShaderLab 建立源 manifest,映射属性、节点、连接、Register/Get、Comment、资源和 Target,输出裸 `sgcli.native.v3` 与独立转换报告 | `export_sg`;`build_native_spec`;`build_conversion_report` | 允许依赖 MOD-CORE 与公开 contracts;禁止调用 SGCLI、依赖 SGCLI Python 包或输出 source-native wrapper |
16
+ | MOD-CONTRACT | src/asecli/contracts.py; src/asecli/contracts | CR-0030 | 随 wheel 发布 EditorGraphSpec v3 权威 Schema,并固定 SGCLI native v3 消费快照版本/SHA | `editor_graph_schema`;`native_v3_snapshot` | 仅静态 package resource;不得放宽运行时 loader 或建立跨仓运行时依赖 |
15
17
 
16
18
  ## 依赖规则
17
19
 
@@ -28,3 +30,4 @@
28
30
  11. `layout`/`comment-group` 的 JSON 只证明结构结果,固定返回独立的 `structural_validation` 与 `visual_validation`;真实画布签收必须引用版本化截图/人工证据,当前基线为 REG-0041。
29
31
  12. MaterialGUI 的长中文标签在窄宽度下自动换行,字段独占下一行;技术 Tooltip 默认值使用最多六位小数的 invariant 格式。REG-0042 是主题、宽度、缩放和交互状态回归基线。
30
32
  13. `asecli install-skill` 只安装随 wheel 打包的 `asecli` Skill。无参数保持原 Codex 用户目录;显式路由支持开放 `.agents` 以及 Codex、Claude Code、Cursor、Gemini CLI、GitHub Copilot 的用户级/项目级目录。`all` 只写 `.agents` 与 `.claude` 两个非重复根并在写入前检查全部内容冲突;同内容幂等,不同内容失败关闭,不覆盖用户自定义 Skill。wheel 必须包含 Skill 与所有引用规范。
33
+ 14. 双向转换的外部交接只允许消费者原生裸规格:ASECLI 只消费 `EditorGraphSpec v3`,只生产 `sgcli.native.v3`;spec/report 分文件,方向后缀固定,同名不覆盖。内部 manifest/IR 不得成为用户必须传递的第三份图 JSON。
@@ -192,3 +192,13 @@
192
192
  - 决策:新增 `--agent agents|codex|claude|cursor|gemini|copilot|all`、`--scope user|project` 和 `--project-root`。`.agents/skills` 是 Codex、Cursor、Gemini CLI 与 GitHub Copilot 共同识别的开放目录;Claude Code 另用 `.claude/skills`。因此 `all` 只安装这两个根,避免向每个兼容别名重复复制同名 Skill。单一 Agent 仍可选择其原生目录。
193
193
  - 兼容与安全:无参数继续解析 `$CODEX_HOME/skills` 或 `~/.codex/skills`,`--skill-root` 保持显式覆盖。所有目标沿用完整树 digest、幂等、符号链接保护与不同内容拒绝覆盖;`all` 在创建任一目标前预检全部已有 Skill 内容冲突。
194
194
  - 边界:Skill 只约定 shell 与单行 JSON,不假设 Agent 专属工具、权限或消息格式。Editor、目标工程和视觉验收能力仍由实际运行环境决定;本 CR 不发布版本、不修改 Shader、不启动 Editor。
195
+
196
+ ### ADR-0022 双 CLI 使用消费者原生裸规格直连
197
+
198
+ - 状态:已实现,视觉验收未关闭(2026-09-11,CR-0030)
199
+ - 背景:历史 ASE→SG 需要 ASE 自有语义 JSON 和一次性翻译脚本,SG→ASE 又曾使用 `graph + report` wrapper;两者都让用户交接文件不能直接成为对方 CLI 的正式输入。
200
+ - 决策:ASECLI 的 `export-sg` 直接生成裸 `sgcli.native.v3`,文件名为 `<stem>.asecli-to-sgcli.spec.json`;独立报告为同 stem 的 `.report.json`。反向由 SGCLI 直接生成裸 `EditorGraphSpec v3`,ASECLI `create --spec` 原样读取。两个 CLI 不互调,不发布 source-native 中间协议。
201
+ - 契约所有权:ASECLI 随 wheel 发布并导出 EditorGraphSpec v3 Schema;SGCLI 随 wheel 发布 native v3 Schema。生产者快照固定消费者版本与 Schema SHA;消费者严格拒绝 wrapper、未知字段、已知反方向后缀和 report 文件。
202
+ - 写入语义:输出目录由生产者强制生成规范名称;同名失败;转换失败可以写规范 report,但不得写不完整 spec。Schema 版本仅存在于内容。
203
+ - 证据边界:producer/consumer 文件 SHA 完全一致只证明无变换交接。Editor 创建、保存重载、编译、正常缩放画布和同条件渲染仍分别验收;未运行渲染时 `visual_equivalent=false`。
204
+ - 回滚:可禁用 `export-sg` 新入口或恢复旧发布版本,但不得让 `create --spec` 接受 wrapper,也不得把一次性 translator 恢复为正式主链。
@@ -64,3 +64,4 @@
64
64
  | REG-0060 | CR-0028 | conversion-baseline:来源输出分量、目标端口、Register/Get 等价折叠、错误引用/环/重复输入失败关闭、常量变化拒绝、显式 fanout 与默认消费组策略、既有 Register 幂等复用 | `uv run --frozen pytest tests/test_graph_review.py tests/test_layout_local_var_policy.py` | 定向 94 passed;自动环节已验证;真实历史 Wave Noise 文件只读识别 12 个候选;不声明源 SG 默认值或画面等价 |
65
65
  | REG-0061 | CR-0028 | island-packing:保持岛内鱼骨相对位置、逻辑依赖顺序、主输出锚定、二次幂等、非法几何与列数失败关闭、保留默认布局契约 | `uv run --frozen pytest tests/test_island_layout.py tests/test_layout_governance.py tests/test_layout.py tests/test_cli_contract.py` | 定向 94 passed;自动环节已验证;本次未写 Unity 工程,实机画布待验 |
66
66
  | REG-0062 | CR-0029 AA-DATA-001 AA-DATA-002 AA-CONTRACT-001 AA-CONTRACT-002 AA-TEST-001 | cli-json-contract-v1:先序列化后原子 ASCII-safe 写出;拒绝 NaN/Infinity 与非有限几何;顶层契约/版本/命令字段;version JSON/help 唯一文本例外;22 错误码与 17 子命令动态对账 | `uv run --frozen pytest tests/test_cli_contract.py tests/test_bridge_contract.py tests/test_commentary.py tests/test_smoke.py tests/test_install_scripts.py` + 全量 pytest + 隔离 wheel console-script smoke | 定向 76 passed;全量 388 passed/3 skipped;ASCII stdout+中文错误路径、wheel 安装、lock/CI/供应链/文档治理/diff 通过;Editor/Windows 未本地运行,Windows 交由发布 CI 验证 |
67
+ | REG-0063 | CR-0030 ADR-0022 AUD-FLOW-001 AUD-CONTRACT-002 AUD-CONTRACT-003 AA-CONTRACT-201 AA-CI-202 AA-REL-203 AA-TEST-204 AA-EVIDENCE-205 AA-DATA-206 AA-MIGRATE-207 AA-CI-301 AA-CI-302 AA-TEST-303 AA-EVIDENCE-304 AA-REL-305 AA-EVIDENCE-306 AA-CONTRACT-307 AA-PROV-308 AA-GOV-309 | direct-cross-cli-json-v3:`export-sg` 规范命名与失败仅报告;裸 native v3 顶层;反方向/report/wrapper/未知字段拒绝;Draft 2020-12 数值 parity;三态 receipt 交叉绑定;build-once 候选 wheel;固定 WaveNoise 双向语义 fixture;fixture-set 完整性;clean provenance;生产者输出与消费者输入 SHA-256 完全一致 | `uv run --frozen pytest tests/test_export_sg.py tests/test_contract_schema.py tests/test_editor_create_cli.py tests/test_cli_contract.py tests/test_build_reproducibility.py tests/test_cross_cli_workflow.py` + SGCLI `tests/test_cross_cli_semantics.py`、双 wheel 黑盒 matrix/verifier + bridge 3 分层 E2E | 第三轮全量 `428 passed, 3 skipped`,Python 3.10 同结果;临时干净快照 release-mode matrix 两仓 `dirty=false`、WaveNoise configured、离线 verifier 通过。远端 required checks/ruleset、最终 wheel Editor/画布/render 未关闭,不得声明发布或视觉等价。 |
@@ -104,7 +104,9 @@ kickoff_completion: complete
104
104
  | TASK-0061 | CR-0028 | 核对转换图计算基线及端口级复用计划 | 用户缺口补齐授权 | graph_review.py/reuse_plan.py/core 公共导出/layout_audit.py 与相关测试 | SGCLI、生成 HLSL、猜写 Local Var | long/2026-09-08 | REG-0060;错误端口和常量变化必须失败,默认策略保持 | 折叠丢分量或误吞默认值即停止 | 定向 94 passed;自动环节已验证;只读,不宣称自动创建接口 | 自动验证完成,实机待验 |
105
105
  | TASK-0062 | CR-0028 | 独立计算岛刚性多列摆放 | TASK-0061;已有鱼骨与真实几何契约 | island_layout.py/meticulous_layout.py 与测试 | 拆改岛内连接、自动 WireNode 路由、虚构几何 | long/2026-09-08 | REG-0061;相对位置、依赖与二次幂等 | 几何缺失/布局硬失败时零写入 | 定向 94 passed;自动环节已验证;实机待验 | 自动验证完成,实机待验 |
106
106
  | TASK-0063 | CR-0028 | 将转换后交付流程接入 CLI 与 Skill | TASK-0061 TASK-0062;用户完整过程 | graph_review_command.py/main.py/layout_command.py;Skill/README/治理 | 发布、覆盖用户 Skill、改并行创建器、生产 Shader | long/2026-09-08 | REG-0060 REG-0061;CLI JSON/只读/失败码、Skill validator | 计划冒充创建或结构冒充视觉时停止 | 定向 94 passed;自动环节已验证;未接入自动 Local Var Editor 创建 | 自动验证完成,实机待验 |
107
- | TASK-0064 | CR-0029 | 关闭 JSON 输出对抗审计并发布安装 `v0.7.0` | AA-OPT-001~005;用户推送、发布、安装授权 | contract/main;Commentary/layout/Editor 几何;README/Skill;版本与 REL-0015 | CLI Hub;修改用户 Shader;覆盖未知 Skill;绕过发布门禁 | long/2026-09-10 | REG-0062;双 Python、完整治理、可复现构建、远程 publish/OIDC、双渠道摘要、本机 CLI/Skill | CI、OIDC、摘要、安装或 Skill 冲突任一失败即停止,保留 `v0.6.4` | 本地 76 passed;全量 388 passed/3 skipped;远程与安装证据回写 REL-0015 | 本地候选已验证 |
107
+ | TASK-0064 | CR-0029 | 关闭 JSON 输出对抗审计并发布安装 `v0.7.0` | AA-OPT-001~005;用户推送、发布、安装授权 | contract/main;Commentary/layout/Editor 几何;README/Skill;版本与 REL-0015 | CLI Hub;修改用户 Shader;覆盖未知 Skill;绕过发布门禁 | long/2026-09-10 | REG-0062;双 Python、完整治理、可复现构建、远程 publish/OIDC、双渠道摘要、本机 CLI/Skill | CI、OIDC、摘要、安装或 Skill 冲突任一失败即停止,保留 `v0.6.4` | v0.7.0@029fea4;run 34475832000 全成功;GitHub/PyPI 摘要一致;本机 CLI/Skill 安装与幂等通过 | 已发布 |
108
+ | TASK-0065 | CR-0030 ADR-0022 AA-OPT-201~207 AA-OPT-301~309 REL-0016 | 实现 ASECLI→native v3 与 SGCLI→EditorGraphSpec v3 的双向裸规格原文件直连并发布 0.8.0 | 用户确认的合并优化计划、三轮对抗审计与推送发布安装授权 | `export_sg.py`、`sg_export/**`、`contracts/**`、`schema_validation.py`、`conversion_output.py`、CLI/create、README/Skill、测试、治理和 cross-CLI workflows | 调用 SGCLI;恢复 source-native/wrapper 主链;修改生产 Shader;覆盖用户 dirty Skill;绕过失败门禁 | long/2026-09-11 | REG-0063;Draft parity;候选 wheel Schema/篡改负例;固定 WaveNoise 语义;artifact 完整性与 clean provenance;双 Python全量;远端 publish/OIDC;双渠道回读;本机 CLI/Skill;Editor/画布/渲染分层 | 未知 ASE/Target/资源/端口、部分 spec、同名覆盖、Schema 漂移、脏候选、远端门禁或资产冲突即停止 | `v0.8.0@58ccf10` 已发布;run 34592028675、GitHub/PyPI 资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 全部复核通过;最终 Editor/画布/渲染开放披露 | 已发布(REL-0016,视觉开放) |
109
+ | TASK-0066 | CR-0030 ADR-0022 AA-OPT-201 AA-OPT-202 REL-0017 | 发布并安装 matcher-v4 与 ASE→SG 转换认证补丁 v0.8.1 | 用户要求两个 CLI 分别推送、发布并安装本机 | `sg_export/**`、report、版本、README、回归与发布证据 | 修改生产 Shader;绕过不可表示 Alpha Blend;恢复 wrapper;覆盖未知 Skill | long/2026-09-14 | REG-0063;两仓全量、治理、供应链、Tag publish、GitHub/PyPI 摘要、本机 CLI/Skill;Editor/视觉分层 | 任一自动/远端/摘要/安装门禁失败即停止并保留 v0.8.0 | 本地候选 `461 passed, 3 skipped`,远端与安装待执行 | verified |
108
110
 
109
111
  ## 验证、风险与回滚
110
112
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "asecli"
3
- version = "0.7.0"
3
+ version = "0.8.1"
4
4
  description = "Agent-native CLI for reading, modifying, validating and compiling Amplify Shader Editor assets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -27,7 +27,7 @@ Issues = "https://github.com/seeseeczl/ASECLI/issues"
27
27
  Changelog = "https://github.com/seeseeczl/ASECLI/releases"
28
28
 
29
29
  [dependency-groups]
30
- dev = ["hatchling==1.32.0", "pytest>=8.0"]
30
+ dev = ["hatchling==1.32.0", "jsonschema>=4.23,<5", "pytest>=8.0"]
31
31
 
32
32
  [project.scripts]
33
33
  asecli = "asecli.cli.main:app"
@@ -45,6 +45,8 @@ packages = ["src/asecli"]
45
45
  # wheel-based CLI install.
46
46
  [tool.hatch.build.targets.wheel.force-include]
47
47
  "skills/asecli" = "asecli/skills/asecli"
48
+ "src/asecli/contracts/editor-graph-spec.v3.schema.json" = "asecli/contracts/editor-graph-spec.v3.schema.json"
49
+ "src/asecli/contracts/sgcli.native.v3.schema.json" = "asecli/contracts/sgcli.native.v3.schema.json"
48
50
 
49
51
  [tool.hatch.build.targets.sdist]
50
52
  # Release/audit records contain artifact evidence and are kept outside the