create-yss-spec 3.0.0 → 3.0.1

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 (1508) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/cli.js +0 -1
  4. package/template/.agents/skills/.strategic-design-skills-manifest.json +35 -0
  5. package/template/.agents/skills/.yss-skills-manifest.json +0 -2
  6. package/template/.agents/skills/code-review/SKILL.md +1 -1
  7. package/template/.agents/skills/code-review/references/yss-review-standards.md +1 -1
  8. package/template/.agents/skills/lombok/SKILL.md +1 -1
  9. package/template/.agents/skills/mapstruct/SKILL.md +1 -1
  10. package/template/.agents/skills/prototype-review/SKILL.md +7 -6
  11. package/template/.agents/skills/yss-antd-design/SKILL.md +8 -7
  12. package/template/.agents/skills/yss-antd-design/references/evidence.md +11 -6
  13. package/template/.agents/skills/yss-api-integration/SKILL.md +2 -2
  14. package/template/.agents/skills/yss-application/SKILL.md +2 -2
  15. package/template/.agents/skills/yss-audit-log/SKILL.md +2 -2
  16. package/template/.agents/skills/yss-audit-log/references/source-index.md +1 -1
  17. package/template/.agents/skills/yss-cache/SKILL.md +2 -2
  18. package/template/.agents/skills/yss-cache/references/source-index.md +1 -1
  19. package/template/.agents/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  20. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  21. package/template/.agents/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  22. package/template/.agents/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  23. package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  24. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  25. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  26. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  27. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  28. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  29. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  30. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  31. package/template/.agents/skills/yss-design-system/SKILL.md +6 -6
  32. package/template/.agents/skills/yss-distributed-id/SKILL.md +2 -2
  33. package/template/.agents/skills/yss-distributed-id/references/source-index.md +1 -1
  34. package/template/.agents/skills/yss-domain/SKILL.md +1 -1
  35. package/template/.agents/skills/yss-dto/SKILL.md +2 -2
  36. package/template/.agents/skills/yss-dto/references/source-index.md +1 -1
  37. package/template/.agents/skills/yss-excel-mvc/SKILL.md +2 -2
  38. package/template/.agents/skills/yss-excel-mvc/references/source-index.md +1 -1
  39. package/template/.agents/skills/yss-exception/SKILL.md +1 -1
  40. package/template/.agents/skills/yss-exception/references/source-index.md +1 -1
  41. package/template/.agents/skills/{yss-router → yss-implementation-contract-compiler}/SKILL.md +22 -18
  42. package/template/.agents/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  43. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  44. package/template/{.codex/skills/yss-router/references/router-contract.yaml → .agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml} +59 -94
  45. package/template/{.codex/skills/yss-router → .agents/skills/yss-implementation-contract-compiler}/references/slice-implementation-contract.md +20 -8
  46. package/template/.agents/skills/{yss-router → yss-implementation-contract-compiler}/references/yss-skill-execution-result.md +5 -3
  47. package/template/.agents/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  48. package/template/.agents/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  49. package/template/.agents/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  50. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  51. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  52. package/template/.agents/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  53. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  54. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  55. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  56. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  57. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  58. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  59. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  60. package/template/.agents/skills/yss-mybatis/SKILL.md +2 -2
  61. package/template/.agents/skills/yss-mybatis/references/source-index.md +1 -1
  62. package/template/.agents/skills/yss-page-module-development/SKILL.md +1 -1
  63. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +6 -6
  64. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  65. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  66. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  67. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
  68. package/template/.agents/skills/yss-prototype-stage/SKILL.md +34 -24
  69. package/template/.agents/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  70. package/template/.agents/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  71. package/template/.agents/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  72. package/template/.agents/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  73. package/template/.agents/skills/yss-repository/SKILL.md +2 -2
  74. package/template/.agents/skills/yss-resilience4j/SKILL.md +1 -1
  75. package/template/.agents/skills/yss-resilience4j/references/source-index.md +1 -1
  76. package/template/.agents/skills/yss-security-algorithm/SKILL.md +1 -1
  77. package/template/.agents/skills/yss-security-algorithm/references/source-index.md +1 -1
  78. package/template/.agents/skills/{yss-source-index → yss-skill-source-index-refresh}/SKILL.md +4 -4
  79. package/template/.agents/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  80. package/template/{.claude/skills/yss-source-index → .agents/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.mjs +1 -1
  81. package/template/.agents/skills/yss-ui/SKILL.md +2 -1
  82. package/template/.agents/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  83. package/template/.agents/skills/yss-up-springboot3/SKILL.md +1 -1
  84. package/template/.agents/skills/yss-userinfo/SKILL.md +1 -1
  85. package/template/.agents/skills/yss-userinfo/references/source-index.md +1 -1
  86. package/template/.agents/skills/yss-validation/SKILL.md +1 -1
  87. package/template/.agents/skills/yss-validation/references/source-index.md +1 -1
  88. package/template/.agents/skills/yss-web-controller/SKILL.md +2 -2
  89. package/template/.claude/skills/code-review/SKILL.md +1 -1
  90. package/template/.claude/skills/code-review/references/yss-review-standards.md +1 -1
  91. package/template/.claude/skills/lombok/SKILL.md +1 -1
  92. package/template/.claude/skills/mapstruct/SKILL.md +1 -1
  93. package/template/.claude/skills/prototype-review/SKILL.md +7 -6
  94. package/template/.claude/skills/yss-antd-design/SKILL.md +8 -7
  95. package/template/.claude/skills/yss-antd-design/references/evidence.md +11 -6
  96. package/template/.claude/skills/yss-api-integration/SKILL.md +2 -2
  97. package/template/.claude/skills/yss-application/SKILL.md +2 -2
  98. package/template/.claude/skills/yss-audit-log/SKILL.md +2 -2
  99. package/template/.claude/skills/yss-audit-log/references/source-index.md +1 -1
  100. package/template/.claude/skills/yss-cache/SKILL.md +2 -2
  101. package/template/.claude/skills/yss-cache/references/source-index.md +1 -1
  102. package/template/.claude/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  103. package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  104. package/template/.claude/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  105. package/template/.claude/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  106. package/template/.claude/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  107. package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  108. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  109. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  110. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  111. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  112. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  113. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  114. package/template/.claude/skills/yss-design-system/SKILL.md +6 -6
  115. package/template/.claude/skills/yss-distributed-id/SKILL.md +2 -2
  116. package/template/.claude/skills/yss-distributed-id/references/source-index.md +1 -1
  117. package/template/.claude/skills/yss-domain/SKILL.md +1 -1
  118. package/template/.claude/skills/yss-dto/SKILL.md +2 -2
  119. package/template/.claude/skills/yss-dto/references/source-index.md +1 -1
  120. package/template/.claude/skills/yss-excel-mvc/SKILL.md +2 -2
  121. package/template/.claude/skills/yss-excel-mvc/references/source-index.md +1 -1
  122. package/template/.claude/skills/yss-exception/SKILL.md +1 -1
  123. package/template/.claude/skills/yss-exception/references/source-index.md +1 -1
  124. package/template/{.codex/skills/yss-router → .claude/skills/yss-implementation-contract-compiler}/SKILL.md +22 -18
  125. package/template/.claude/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  126. package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  127. package/template/.claude/skills/{yss-router/references/router-contract.yaml → yss-implementation-contract-compiler/references/compiler-contract.yaml} +59 -94
  128. package/template/{.agents/skills/yss-router → .claude/skills/yss-implementation-contract-compiler}/references/slice-implementation-contract.md +20 -8
  129. package/template/{.codex/skills/yss-router → .claude/skills/yss-implementation-contract-compiler}/references/yss-skill-execution-result.md +5 -3
  130. package/template/.claude/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  131. package/template/.claude/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  132. package/template/.claude/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  133. package/template/.claude/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  134. package/template/.claude/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  135. package/template/.claude/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  136. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  137. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  138. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  139. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  140. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  141. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  142. package/template/.claude/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  143. package/template/.claude/skills/yss-mybatis/SKILL.md +2 -2
  144. package/template/.claude/skills/yss-mybatis/references/source-index.md +1 -1
  145. package/template/.claude/skills/yss-page-module-development/SKILL.md +1 -1
  146. package/template/.claude/skills/yss-product-lifecycle/SKILL.md +6 -6
  147. package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  148. package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  149. package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  150. package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +1 -1
  151. package/template/.claude/skills/yss-prototype-stage/SKILL.md +34 -24
  152. package/template/.claude/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  153. package/template/.claude/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  154. package/template/.claude/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  155. package/template/.claude/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  156. package/template/.claude/skills/yss-repository/SKILL.md +2 -2
  157. package/template/.claude/skills/yss-resilience4j/SKILL.md +1 -1
  158. package/template/.claude/skills/yss-resilience4j/references/source-index.md +1 -1
  159. package/template/.claude/skills/yss-security-algorithm/SKILL.md +1 -1
  160. package/template/.claude/skills/yss-security-algorithm/references/source-index.md +1 -1
  161. package/template/.claude/skills/{yss-source-index → yss-skill-source-index-refresh}/SKILL.md +4 -4
  162. package/template/.claude/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  163. package/template/{.codex/skills/yss-source-index → .claude/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.mjs +1 -1
  164. package/template/.claude/skills/yss-ui/SKILL.md +2 -1
  165. package/template/.claude/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  166. package/template/.claude/skills/yss-up-springboot3/SKILL.md +1 -1
  167. package/template/.claude/skills/yss-userinfo/SKILL.md +1 -1
  168. package/template/.claude/skills/yss-userinfo/references/source-index.md +1 -1
  169. package/template/.claude/skills/yss-validation/SKILL.md +1 -1
  170. package/template/.claude/skills/yss-validation/references/source-index.md +1 -1
  171. package/template/.claude/skills/yss-web-controller/SKILL.md +2 -2
  172. package/template/.codex/skills/code-review/SKILL.md +1 -1
  173. package/template/.codex/skills/code-review/references/yss-review-standards.md +1 -1
  174. package/template/.codex/skills/lombok/SKILL.md +1 -1
  175. package/template/.codex/skills/mapstruct/SKILL.md +1 -1
  176. package/template/.codex/skills/prototype-review/SKILL.md +7 -6
  177. package/template/.codex/skills/yss-antd-design/SKILL.md +8 -7
  178. package/template/.codex/skills/yss-antd-design/references/evidence.md +11 -6
  179. package/template/.codex/skills/yss-api-integration/SKILL.md +2 -2
  180. package/template/.codex/skills/yss-application/SKILL.md +2 -2
  181. package/template/.codex/skills/yss-audit-log/SKILL.md +2 -2
  182. package/template/.codex/skills/yss-audit-log/references/source-index.md +1 -1
  183. package/template/.codex/skills/yss-cache/SKILL.md +2 -2
  184. package/template/.codex/skills/yss-cache/references/source-index.md +1 -1
  185. package/template/.codex/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  186. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  187. package/template/.codex/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  188. package/template/.codex/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  189. package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  190. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  191. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  192. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  193. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  194. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  195. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  196. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  197. package/template/.codex/skills/yss-design-system/SKILL.md +6 -6
  198. package/template/.codex/skills/yss-distributed-id/SKILL.md +2 -2
  199. package/template/.codex/skills/yss-distributed-id/references/source-index.md +1 -1
  200. package/template/.codex/skills/yss-domain/SKILL.md +1 -1
  201. package/template/.codex/skills/yss-dto/SKILL.md +2 -2
  202. package/template/.codex/skills/yss-dto/references/source-index.md +1 -1
  203. package/template/.codex/skills/yss-excel-mvc/SKILL.md +2 -2
  204. package/template/.codex/skills/yss-excel-mvc/references/source-index.md +1 -1
  205. package/template/.codex/skills/yss-exception/SKILL.md +1 -1
  206. package/template/.codex/skills/yss-exception/references/source-index.md +1 -1
  207. package/template/{.cursor/skills/yss-router → .codex/skills/yss-implementation-contract-compiler}/SKILL.md +22 -18
  208. package/template/.codex/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  209. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  210. package/template/{.cursor/skills/yss-router/references/router-contract.yaml → .codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml} +59 -94
  211. package/template/{.cursor/skills/yss-router → .codex/skills/yss-implementation-contract-compiler}/references/slice-implementation-contract.md +20 -8
  212. package/template/{.claude/skills/yss-router → .codex/skills/yss-implementation-contract-compiler}/references/yss-skill-execution-result.md +5 -3
  213. package/template/.codex/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  214. package/template/.codex/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  215. package/template/.codex/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  216. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  217. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  218. package/template/.codex/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  219. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  220. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  221. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  222. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  223. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  224. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  225. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  226. package/template/.codex/skills/yss-mybatis/SKILL.md +2 -2
  227. package/template/.codex/skills/yss-mybatis/references/source-index.md +1 -1
  228. package/template/.codex/skills/yss-page-module-development/SKILL.md +1 -1
  229. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +6 -6
  230. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  231. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  232. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  233. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
  234. package/template/.codex/skills/yss-prototype-stage/SKILL.md +34 -24
  235. package/template/.codex/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  236. package/template/.codex/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  237. package/template/.codex/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  238. package/template/.codex/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  239. package/template/.codex/skills/yss-repository/SKILL.md +2 -2
  240. package/template/.codex/skills/yss-resilience4j/SKILL.md +1 -1
  241. package/template/.codex/skills/yss-resilience4j/references/source-index.md +1 -1
  242. package/template/.codex/skills/yss-security-algorithm/SKILL.md +1 -1
  243. package/template/.codex/skills/yss-security-algorithm/references/source-index.md +1 -1
  244. package/template/.codex/skills/{yss-source-index → yss-skill-source-index-refresh}/SKILL.md +4 -4
  245. package/template/.codex/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  246. package/template/{.agents/skills/yss-source-index → .codex/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.mjs +1 -1
  247. package/template/.codex/skills/yss-ui/SKILL.md +2 -1
  248. package/template/.codex/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  249. package/template/.codex/skills/yss-up-springboot3/SKILL.md +1 -1
  250. package/template/.codex/skills/yss-userinfo/SKILL.md +1 -1
  251. package/template/.codex/skills/yss-userinfo/references/source-index.md +1 -1
  252. package/template/.codex/skills/yss-validation/SKILL.md +1 -1
  253. package/template/.codex/skills/yss-validation/references/source-index.md +1 -1
  254. package/template/.codex/skills/yss-web-controller/SKILL.md +2 -2
  255. package/template/.cursor/skills/code-review/SKILL.md +1 -1
  256. package/template/.cursor/skills/code-review/references/yss-review-standards.md +1 -1
  257. package/template/.cursor/skills/lombok/SKILL.md +1 -1
  258. package/template/.cursor/skills/mapstruct/SKILL.md +1 -1
  259. package/template/.cursor/skills/prototype-review/SKILL.md +7 -6
  260. package/template/.cursor/skills/yss-antd-design/SKILL.md +8 -7
  261. package/template/.cursor/skills/yss-antd-design/references/evidence.md +11 -6
  262. package/template/.cursor/skills/yss-api-integration/SKILL.md +2 -2
  263. package/template/.cursor/skills/yss-application/SKILL.md +2 -2
  264. package/template/.cursor/skills/yss-audit-log/SKILL.md +2 -2
  265. package/template/.cursor/skills/yss-audit-log/references/source-index.md +1 -1
  266. package/template/.cursor/skills/yss-cache/SKILL.md +2 -2
  267. package/template/.cursor/skills/yss-cache/references/source-index.md +1 -1
  268. package/template/.cursor/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  269. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  270. package/template/.cursor/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  271. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  272. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  273. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  274. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  275. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  276. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  277. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  278. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  279. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  280. package/template/.cursor/skills/yss-design-system/SKILL.md +6 -6
  281. package/template/.cursor/skills/yss-distributed-id/SKILL.md +2 -2
  282. package/template/.cursor/skills/yss-distributed-id/references/source-index.md +1 -1
  283. package/template/.cursor/skills/yss-domain/SKILL.md +1 -1
  284. package/template/.cursor/skills/yss-dto/SKILL.md +2 -2
  285. package/template/.cursor/skills/yss-dto/references/source-index.md +1 -1
  286. package/template/.cursor/skills/yss-excel-mvc/SKILL.md +2 -2
  287. package/template/.cursor/skills/yss-excel-mvc/references/source-index.md +1 -1
  288. package/template/.cursor/skills/yss-exception/SKILL.md +1 -1
  289. package/template/.cursor/skills/yss-exception/references/source-index.md +1 -1
  290. package/template/{.claude/skills/yss-router → .cursor/skills/yss-implementation-contract-compiler}/SKILL.md +22 -18
  291. package/template/.cursor/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  292. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  293. package/template/{.agents/skills/yss-router/references/router-contract.yaml → .cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml} +59 -94
  294. package/template/{.claude/skills/yss-router → .cursor/skills/yss-implementation-contract-compiler}/references/slice-implementation-contract.md +20 -8
  295. package/template/.cursor/skills/{yss-router → yss-implementation-contract-compiler}/references/yss-skill-execution-result.md +5 -3
  296. package/template/.cursor/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  297. package/template/.cursor/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  298. package/template/.cursor/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  299. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  300. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  301. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  302. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  303. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  304. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  305. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  306. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  307. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  308. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  309. package/template/.cursor/skills/yss-mybatis/SKILL.md +2 -2
  310. package/template/.cursor/skills/yss-mybatis/references/source-index.md +1 -1
  311. package/template/.cursor/skills/yss-page-module-development/SKILL.md +1 -1
  312. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +6 -6
  313. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  314. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  315. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  316. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
  317. package/template/.cursor/skills/yss-prototype-stage/SKILL.md +34 -24
  318. package/template/.cursor/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  319. package/template/.cursor/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  320. package/template/.cursor/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  321. package/template/.cursor/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  322. package/template/.cursor/skills/yss-repository/SKILL.md +2 -2
  323. package/template/.cursor/skills/yss-resilience4j/SKILL.md +1 -1
  324. package/template/.cursor/skills/yss-resilience4j/references/source-index.md +1 -1
  325. package/template/.cursor/skills/yss-security-algorithm/SKILL.md +1 -1
  326. package/template/.cursor/skills/yss-security-algorithm/references/source-index.md +1 -1
  327. package/template/.cursor/skills/{yss-source-index → yss-skill-source-index-refresh}/SKILL.md +4 -4
  328. package/template/.cursor/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  329. package/template/.cursor/skills/{yss-source-index → yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.mjs +1 -1
  330. package/template/.cursor/skills/yss-ui/SKILL.md +2 -1
  331. package/template/.cursor/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  332. package/template/.cursor/skills/yss-up-springboot3/SKILL.md +1 -1
  333. package/template/.cursor/skills/yss-userinfo/SKILL.md +1 -1
  334. package/template/.cursor/skills/yss-userinfo/references/source-index.md +1 -1
  335. package/template/.cursor/skills/yss-validation/SKILL.md +1 -1
  336. package/template/.cursor/skills/yss-validation/references/source-index.md +1 -1
  337. package/template/.cursor/skills/yss-web-controller/SKILL.md +2 -2
  338. package/template/.pi/skills/code-review/SKILL.md +1 -1
  339. package/template/.pi/skills/code-review/references/yss-review-standards.md +1 -1
  340. package/template/.pi/skills/lombok/SKILL.md +1 -1
  341. package/template/.pi/skills/mapstruct/SKILL.md +1 -1
  342. package/template/.pi/skills/prototype-review/SKILL.md +7 -6
  343. package/template/.pi/skills/yss-antd-design/SKILL.md +8 -7
  344. package/template/.pi/skills/yss-antd-design/references/evidence.md +11 -6
  345. package/template/.pi/skills/yss-api-integration/SKILL.md +2 -2
  346. package/template/.pi/skills/yss-application/SKILL.md +2 -2
  347. package/template/.pi/skills/yss-audit-log/SKILL.md +2 -2
  348. package/template/.pi/skills/yss-audit-log/references/source-index.md +1 -1
  349. package/template/.pi/skills/yss-cache/SKILL.md +2 -2
  350. package/template/.pi/skills/yss-cache/references/source-index.md +1 -1
  351. package/template/.pi/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  352. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  353. package/template/.pi/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  354. package/template/.pi/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  355. package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  356. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  357. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  358. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  359. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  360. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  361. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  362. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  363. package/template/.pi/skills/yss-design-system/SKILL.md +6 -6
  364. package/template/.pi/skills/yss-distributed-id/SKILL.md +2 -2
  365. package/template/.pi/skills/yss-distributed-id/references/source-index.md +1 -1
  366. package/template/.pi/skills/yss-domain/SKILL.md +1 -1
  367. package/template/.pi/skills/yss-dto/SKILL.md +2 -2
  368. package/template/.pi/skills/yss-dto/references/source-index.md +1 -1
  369. package/template/.pi/skills/yss-excel-mvc/SKILL.md +2 -2
  370. package/template/.pi/skills/yss-excel-mvc/references/source-index.md +1 -1
  371. package/template/.pi/skills/yss-exception/SKILL.md +1 -1
  372. package/template/.pi/skills/yss-exception/references/source-index.md +1 -1
  373. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +55 -0
  374. package/template/.pi/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  375. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  376. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +314 -0
  377. package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +197 -0
  378. package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +69 -0
  379. package/template/.pi/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  380. package/template/.pi/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  381. package/template/.pi/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  382. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  383. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  384. package/template/.pi/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  385. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  386. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  387. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  388. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  389. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  390. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  391. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  392. package/template/.pi/skills/yss-mybatis/SKILL.md +2 -2
  393. package/template/.pi/skills/yss-mybatis/references/source-index.md +1 -1
  394. package/template/.pi/skills/yss-page-module-development/SKILL.md +1 -1
  395. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +6 -6
  396. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  397. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  398. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  399. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
  400. package/template/.pi/skills/yss-prototype-stage/SKILL.md +34 -24
  401. package/template/.pi/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  402. package/template/.pi/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  403. package/template/.pi/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  404. package/template/.pi/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  405. package/template/.pi/skills/yss-repository/SKILL.md +2 -2
  406. package/template/.pi/skills/yss-resilience4j/SKILL.md +1 -1
  407. package/template/.pi/skills/yss-resilience4j/references/source-index.md +1 -1
  408. package/template/.pi/skills/yss-security-algorithm/SKILL.md +1 -1
  409. package/template/.pi/skills/yss-security-algorithm/references/source-index.md +1 -1
  410. package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +63 -0
  411. package/template/.pi/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  412. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +24 -0
  413. package/template/.pi/skills/yss-ui/SKILL.md +2 -1
  414. package/template/.pi/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  415. package/template/.pi/skills/yss-up-springboot3/SKILL.md +1 -1
  416. package/template/.pi/skills/yss-userinfo/SKILL.md +1 -1
  417. package/template/.pi/skills/yss-userinfo/references/source-index.md +1 -1
  418. package/template/.pi/skills/yss-validation/SKILL.md +1 -1
  419. package/template/.pi/skills/yss-validation/references/source-index.md +1 -1
  420. package/template/.pi/skills/yss-web-controller/SKILL.md +2 -2
  421. package/template/.qoder/skills/code-review/SKILL.md +1 -1
  422. package/template/.qoder/skills/code-review/references/yss-review-standards.md +1 -1
  423. package/template/.qoder/skills/lombok/SKILL.md +1 -1
  424. package/template/.qoder/skills/mapstruct/SKILL.md +1 -1
  425. package/template/.qoder/skills/prototype-review/SKILL.md +7 -6
  426. package/template/.qoder/skills/yss-antd-design/SKILL.md +8 -7
  427. package/template/.qoder/skills/yss-antd-design/references/evidence.md +11 -6
  428. package/template/.qoder/skills/yss-api-integration/SKILL.md +2 -2
  429. package/template/.qoder/skills/yss-application/SKILL.md +2 -2
  430. package/template/.qoder/skills/yss-audit-log/SKILL.md +2 -2
  431. package/template/.qoder/skills/yss-audit-log/references/source-index.md +1 -1
  432. package/template/.qoder/skills/yss-cache/SKILL.md +2 -2
  433. package/template/.qoder/skills/yss-cache/references/source-index.md +1 -1
  434. package/template/.qoder/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  435. package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  436. package/template/.qoder/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  437. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  438. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  439. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  440. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  441. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  442. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  443. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  444. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  445. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  446. package/template/.qoder/skills/yss-design-system/SKILL.md +6 -6
  447. package/template/.qoder/skills/yss-distributed-id/SKILL.md +2 -2
  448. package/template/.qoder/skills/yss-distributed-id/references/source-index.md +1 -1
  449. package/template/.qoder/skills/yss-domain/SKILL.md +1 -1
  450. package/template/.qoder/skills/yss-dto/SKILL.md +2 -2
  451. package/template/.qoder/skills/yss-dto/references/source-index.md +1 -1
  452. package/template/.qoder/skills/yss-excel-mvc/SKILL.md +2 -2
  453. package/template/.qoder/skills/yss-excel-mvc/references/source-index.md +1 -1
  454. package/template/.qoder/skills/yss-exception/SKILL.md +1 -1
  455. package/template/.qoder/skills/yss-exception/references/source-index.md +1 -1
  456. package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +55 -0
  457. package/template/.qoder/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  458. package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  459. package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +314 -0
  460. package/template/.qoder/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +197 -0
  461. package/template/.qoder/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +69 -0
  462. package/template/.qoder/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  463. package/template/.qoder/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  464. package/template/.qoder/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  465. package/template/.qoder/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  466. package/template/.qoder/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  467. package/template/.qoder/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  468. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  469. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  470. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  471. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  472. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  473. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  474. package/template/.qoder/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  475. package/template/.qoder/skills/yss-mybatis/SKILL.md +2 -2
  476. package/template/.qoder/skills/yss-mybatis/references/source-index.md +1 -1
  477. package/template/.qoder/skills/yss-page-module-development/SKILL.md +1 -1
  478. package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +6 -6
  479. package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  480. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  481. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  482. package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +1 -1
  483. package/template/.qoder/skills/yss-prototype-stage/SKILL.md +34 -24
  484. package/template/.qoder/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  485. package/template/.qoder/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  486. package/template/.qoder/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  487. package/template/.qoder/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  488. package/template/.qoder/skills/yss-repository/SKILL.md +2 -2
  489. package/template/.qoder/skills/yss-resilience4j/SKILL.md +1 -1
  490. package/template/.qoder/skills/yss-resilience4j/references/source-index.md +1 -1
  491. package/template/.qoder/skills/yss-security-algorithm/SKILL.md +1 -1
  492. package/template/.qoder/skills/yss-security-algorithm/references/source-index.md +1 -1
  493. package/template/.qoder/skills/yss-skill-source-index-refresh/SKILL.md +63 -0
  494. package/template/.qoder/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  495. package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +24 -0
  496. package/template/.qoder/skills/yss-ui/SKILL.md +2 -1
  497. package/template/.qoder/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  498. package/template/.qoder/skills/yss-up-springboot3/SKILL.md +1 -1
  499. package/template/.qoder/skills/yss-userinfo/SKILL.md +1 -1
  500. package/template/.qoder/skills/yss-userinfo/references/source-index.md +1 -1
  501. package/template/.qoder/skills/yss-validation/SKILL.md +1 -1
  502. package/template/.qoder/skills/yss-validation/references/source-index.md +1 -1
  503. package/template/.qoder/skills/yss-web-controller/SKILL.md +2 -2
  504. package/template/.trae/skills/code-review/SKILL.md +1 -1
  505. package/template/.trae/skills/code-review/references/yss-review-standards.md +1 -1
  506. package/template/.trae/skills/lombok/SKILL.md +1 -1
  507. package/template/.trae/skills/mapstruct/SKILL.md +1 -1
  508. package/template/.trae/skills/prototype-review/SKILL.md +7 -6
  509. package/template/.trae/skills/yss-antd-design/SKILL.md +8 -7
  510. package/template/.trae/skills/yss-antd-design/references/evidence.md +11 -6
  511. package/template/.trae/skills/yss-api-integration/SKILL.md +2 -2
  512. package/template/.trae/skills/yss-application/SKILL.md +2 -2
  513. package/template/.trae/skills/yss-audit-log/SKILL.md +2 -2
  514. package/template/.trae/skills/yss-audit-log/references/source-index.md +1 -1
  515. package/template/.trae/skills/yss-cache/SKILL.md +2 -2
  516. package/template/.trae/skills/yss-cache/references/source-index.md +1 -1
  517. package/template/.trae/skills/yss-cache/scripts/check-skill-freshness.sh +1 -1
  518. package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +6 -6
  519. package/template/.trae/skills/yss-ddd-scaffold-generator/agents/openai.yaml +1 -1
  520. package/template/.trae/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +1 -1
  521. package/template/.trae/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +3 -3
  522. package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  523. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +3 -3
  524. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +3 -3
  525. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +8 -8
  526. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +1 -1
  527. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  528. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +8 -8
  529. package/template/.trae/skills/yss-design-system/SKILL.md +6 -6
  530. package/template/.trae/skills/yss-distributed-id/SKILL.md +2 -2
  531. package/template/.trae/skills/yss-distributed-id/references/source-index.md +1 -1
  532. package/template/.trae/skills/yss-domain/SKILL.md +1 -1
  533. package/template/.trae/skills/yss-dto/SKILL.md +2 -2
  534. package/template/.trae/skills/yss-dto/references/source-index.md +1 -1
  535. package/template/.trae/skills/yss-excel-mvc/SKILL.md +2 -2
  536. package/template/.trae/skills/yss-excel-mvc/references/source-index.md +1 -1
  537. package/template/.trae/skills/yss-exception/SKILL.md +1 -1
  538. package/template/.trae/skills/yss-exception/references/source-index.md +1 -1
  539. package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +55 -0
  540. package/template/.trae/skills/yss-implementation-contract-compiler/agents/openai.yaml +4 -0
  541. package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +134 -0
  542. package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +314 -0
  543. package/template/.trae/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +197 -0
  544. package/template/.trae/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +69 -0
  545. package/template/.trae/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +89 -0
  546. package/template/.trae/skills/yss-mvc-scaffold-generator/SKILL.md +87 -0
  547. package/template/.trae/skills/yss-mvc-scaffold-generator/agents/openai.yaml +4 -0
  548. package/template/.trae/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +50 -0
  549. package/template/.trae/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +42 -0
  550. package/template/.trae/skills/yss-mvc-scaffold-generator/references/architecture.md +28 -0
  551. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +136 -0
  552. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +337 -0
  553. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +66 -0
  554. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +115 -0
  555. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +90 -0
  556. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +54 -0
  557. package/template/.trae/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +103 -0
  558. package/template/.trae/skills/yss-mybatis/SKILL.md +2 -2
  559. package/template/.trae/skills/yss-mybatis/references/source-index.md +1 -1
  560. package/template/.trae/skills/yss-page-module-development/SKILL.md +1 -1
  561. package/template/.trae/skills/yss-product-lifecycle/SKILL.md +6 -6
  562. package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  563. package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +25 -17
  564. package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +5 -5
  565. package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +1 -1
  566. package/template/.trae/skills/yss-prototype-stage/SKILL.md +34 -24
  567. package/template/.trae/skills/yss-prototype-stage/references/product-design-adapter.md +43 -38
  568. package/template/.trae/skills/yss-prototype-stage/references/prototype-profile-routing.md +67 -0
  569. package/template/.trae/skills/yss-prototype-stage/scripts/prototype-contract.mjs +192 -103
  570. package/template/.trae/skills/yss-prototype-stage/tests/run-scenarios.mjs +87 -134
  571. package/template/.trae/skills/yss-repository/SKILL.md +2 -2
  572. package/template/.trae/skills/yss-resilience4j/SKILL.md +1 -1
  573. package/template/.trae/skills/yss-resilience4j/references/source-index.md +1 -1
  574. package/template/.trae/skills/yss-security-algorithm/SKILL.md +1 -1
  575. package/template/.trae/skills/yss-security-algorithm/references/source-index.md +1 -1
  576. package/template/.trae/skills/yss-skill-source-index-refresh/SKILL.md +63 -0
  577. package/template/.trae/skills/yss-skill-source-index-refresh/agents/openai.yaml +4 -0
  578. package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +24 -0
  579. package/template/.trae/skills/yss-ui/SKILL.md +2 -1
  580. package/template/.trae/skills/yss-ui/assets/docs/guide/llms.md +0 -61
  581. package/template/.trae/skills/yss-up-springboot3/SKILL.md +1 -1
  582. package/template/.trae/skills/yss-userinfo/SKILL.md +1 -1
  583. package/template/.trae/skills/yss-userinfo/references/source-index.md +1 -1
  584. package/template/.trae/skills/yss-validation/SKILL.md +1 -1
  585. package/template/.trae/skills/yss-validation/references/source-index.md +1 -1
  586. package/template/.trae/skills/yss-web-controller/SKILL.md +2 -2
  587. package/template/AGENTS.md +11 -11
  588. package/template/CONTEXT.md +8 -7
  589. package/template/README.md +0 -1
  590. package/template/docs/agents/digital-human-roles.md +3 -3
  591. package/template/docs/agents/digital-human-roles.yaml +3 -3
  592. package/template/docs/agents/skill-migrations.md +18 -5
  593. package/template/docs/agents/skills-maintenance.md +3 -3
  594. package/template/docs/agents/strategic-design-skills-integration.md +41 -0
  595. package/template/docs/agents/yss-skill-registry.yaml +134 -28
  596. package/template/docs/api/templates/openapi-draft-review-checklist.md +3 -3
  597. package/template/docs/architecture/templates/engineering-baseline-review-template.md +3 -3
  598. package/template/docs/design/README.md +7 -7
  599. package/template/docs/design/design.md +25 -17
  600. package/template/docs/design/templates/interaction-spec-template.md +4 -4
  601. package/template/docs/design/templates/prototype-confirmation-template.md +13 -15
  602. package/template/docs/design/templates/prototype-evidence-template.yaml +99 -75
  603. package/template/docs/design/templates/prototype-review-checklist.md +5 -4
  604. package/template/docs/design/templates/state-matrix-template.md +11 -0
  605. package/template/docs/discovery/reports/agent-governance-options.md +8 -8
  606. package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -1
  607. package/template/docs/process/implementation-repo-integration.md +1 -1
  608. package/template/docs/process/lifecycle-artifact-map.md +4 -2
  609. package/template/docs/process/lifecycle-registry-baseline.json +4 -1
  610. package/template/docs/process/lifecycle-registry.yaml +15 -9
  611. package/template/docs/process/template-engineering-overview.md +2 -2
  612. package/template/docs/process/template-verification-profiles.yaml +27 -6
  613. package/template/docs/templates/build-architecture-checklist-template.md +6 -6
  614. package/template/docs/templates/implementation-routing-template.md +8 -8
  615. package/template/docs/templates/requirement-freeze-template.md +2 -2
  616. package/template/docs/templates/review-report-template.md +4 -4
  617. package/template/docs/templates/spec-template.md +1 -1
  618. package/template/docs/templates/vertical-slice-ticket-template.md +4 -4
  619. package/template/docs/user-guide/yss-ui-mcp.md +0 -2
  620. package/template/docs/user-guide//346/210/230/346/234/257/350/256/276/350/256/241/345/255/220/351/241/271/347/233/256/347/224/250/346/210/267/346/211/213/345/206/214.md +2 -2
  621. package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +4 -4
  622. package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214/347/264/242/345/274/225.md +4 -4
  623. package/template/scripts/audit-yss-backend-skills +56 -0
  624. package/template/scripts/generate-yss-skill-boundaries +67 -0
  625. package/template/scripts/lib/export-skills.mjs +4 -4
  626. package/template/scripts/lib/implementation-contract-compiler.mjs +194 -0
  627. package/template/scripts/lib/scenario-checks.mjs +9 -6
  628. package/template/scripts/lib/skill-governance.mjs +27 -5
  629. package/template/scripts/lib/skill-registry.mjs +107 -63
  630. package/template/scripts/lib/skill-supply-chain.mjs +45 -5
  631. package/template/scripts/verify-repository-scope-scenarios +2 -2
  632. package/template/scripts/verify-retired-skill-ids +37 -0
  633. package/template/scripts/verify-scaffold-generator-scenarios +18 -18
  634. package/template/scripts/verify-template-verification-scenarios +4 -1
  635. package/template/scripts/verify-yss-implementation-contract-compiler-scenarios +14 -0
  636. package/template/skills-lock.json +87 -157
  637. package/template/yss-public-skills.json +4 -4
  638. package/template.manifest.json +0 -3
  639. package/template.snapshot.json +5 -5
  640. package/template/.agents/skills/yss-router/agents/openai.yaml +0 -4
  641. package/template/.agents/skills/yss-router/references/boundaries.md +0 -50
  642. package/template/.agents/skills/yss-source-index/agents/openai.yaml +0 -4
  643. package/template/.claude/skills/yss-router/agents/openai.yaml +0 -4
  644. package/template/.claude/skills/yss-router/references/boundaries.md +0 -50
  645. package/template/.claude/skills/yss-source-index/agents/openai.yaml +0 -4
  646. package/template/.codex/skills/yss-router/agents/openai.yaml +0 -4
  647. package/template/.codex/skills/yss-router/references/boundaries.md +0 -50
  648. package/template/.codex/skills/yss-source-index/agents/openai.yaml +0 -4
  649. package/template/.cursor/skills/yss-router/agents/openai.yaml +0 -4
  650. package/template/.cursor/skills/yss-router/references/boundaries.md +0 -50
  651. package/template/.cursor/skills/yss-source-index/agents/openai.yaml +0 -4
  652. package/template/.gemini/settings.json +0 -8
  653. package/template/.hermes/skills/alibaba-java-code-style/SKILL.md +0 -51
  654. package/template/.hermes/skills/alibaba-java-code-style/agents/openai.yaml +0 -4
  655. package/template/.hermes/skills/alibaba-java-code-style/references/database-engineering-design.md +0 -147
  656. package/template/.hermes/skills/alibaba-java-code-style/references/java-programming.md +0 -178
  657. package/template/.hermes/skills/alibaba-java-code-style/references/reliability-test-security.md +0 -89
  658. package/template/.hermes/skills/archify/LICENSE +0 -22
  659. package/template/.hermes/skills/archify/SKILL.md +0 -156
  660. package/template/.hermes/skills/archify/assets/template.html +0 -14787
  661. package/template/.hermes/skills/archify/bin/archify.mjs +0 -1990
  662. package/template/.hermes/skills/archify/bin/open-artifact.mjs +0 -86
  663. package/template/.hermes/skills/archify/bin/preview.mjs +0 -648
  664. package/template/.hermes/skills/archify/bin/visual-check.mjs +0 -829
  665. package/template/.hermes/skills/archify/brand-marks/README.md +0 -31
  666. package/template/.hermes/skills/archify/brand-marks/catalog.json +0 -131
  667. package/template/.hermes/skills/archify/delta/architecture-delta.mjs +0 -1214
  668. package/template/.hermes/skills/archify/examples/agent-run.lifecycle.json +0 -71
  669. package/template/.hermes/skills/archify/examples/agent-tool-call.workflow.json +0 -94
  670. package/template/.hermes/skills/archify/examples/async-job-roundtrip.sequence.json +0 -61
  671. package/template/.hermes/skills/archify/examples/brand-aware-delivery.architecture.json +0 -47
  672. package/template/.hermes/skills/archify/examples/cache-miss-request.sequence.json +0 -81
  673. package/template/.hermes/skills/archify/examples/checkout-platform.base.architecture.json +0 -31
  674. package/template/.hermes/skills/archify/examples/checkout-platform.head.architecture.json +0 -31
  675. package/template/.hermes/skills/archify/examples/dataflow-product-analytics.html +0 -14898
  676. package/template/.hermes/skills/archify/examples/deployment-release.lifecycle.json +0 -49
  677. package/template/.hermes/skills/archify/examples/event-stream.dataflow.json +0 -57
  678. package/template/.hermes/skills/archify/examples/incident-response.workflow.json +0 -64
  679. package/template/.hermes/skills/archify/examples/lifecycle-agent-run.html +0 -14847
  680. package/template/.hermes/skills/archify/examples/product-analytics.dataflow.json +0 -76
  681. package/template/.hermes/skills/archify/examples/production-deployment.architecture.json +0 -71
  682. package/template/.hermes/skills/archify/examples/release-delivery.workflow.json +0 -62
  683. package/template/.hermes/skills/archify/examples/sequence-cache-miss-request.html +0 -14913
  684. package/template/.hermes/skills/archify/examples/web-app-rendered.html +0 -14862
  685. package/template/.hermes/skills/archify/examples/web-app.architecture.json +0 -46
  686. package/template/.hermes/skills/archify/examples/workflow-agent-tool-call-rendered.html +0 -14904
  687. package/template/.hermes/skills/archify/migrations/workflow-v2.mjs +0 -279
  688. package/template/.hermes/skills/archify/package-lock.json +0 -149
  689. package/template/.hermes/skills/archify/package.json +0 -37
  690. package/template/.hermes/skills/archify/recipes/scenarios.mjs +0 -391
  691. package/template/.hermes/skills/archify/references/authoring-contract.md +0 -191
  692. package/template/.hermes/skills/archify/references/brand-marks.md +0 -65
  693. package/template/.hermes/skills/archify/references/delivery-contract.md +0 -112
  694. package/template/.hermes/skills/archify/references/viewer-runtime.md +0 -45
  695. package/template/.hermes/skills/archify/renderers/architecture/grid.mjs +0 -62
  696. package/template/.hermes/skills/archify/renderers/architecture/render-architecture.mjs +0 -1078
  697. package/template/.hermes/skills/archify/renderers/dataflow/README.md +0 -104
  698. package/template/.hermes/skills/archify/renderers/dataflow/render-dataflow.mjs +0 -483
  699. package/template/.hermes/skills/archify/renderers/lifecycle/README.md +0 -115
  700. package/template/.hermes/skills/archify/renderers/lifecycle/render-lifecycle.mjs +0 -561
  701. package/template/.hermes/skills/archify/renderers/sequence/README.md +0 -114
  702. package/template/.hermes/skills/archify/renderers/sequence/render-sequence.mjs +0 -453
  703. package/template/.hermes/skills/archify/renderers/shared/brand-marks.mjs +0 -563
  704. package/template/.hermes/skills/archify/renderers/shared/cli.mjs +0 -218
  705. package/template/.hermes/skills/archify/renderers/shared/desktop-readability.mjs +0 -26
  706. package/template/.hermes/skills/archify/renderers/shared/diagnostics.mjs +0 -127
  707. package/template/.hermes/skills/archify/renderers/shared/engineering-profiles.mjs +0 -157
  708. package/template/.hermes/skills/archify/renderers/shared/generated-brand-marks.mjs +0 -2003
  709. package/template/.hermes/skills/archify/renderers/shared/generated-validators.mjs +0 -13
  710. package/template/.hermes/skills/archify/renderers/shared/geometry.mjs +0 -1423
  711. package/template/.hermes/skills/archify/renderers/shared/i18n.mjs +0 -594
  712. package/template/.hermes/skills/archify/renderers/shared/layout-report.mjs +0 -40
  713. package/template/.hermes/skills/archify/renderers/shared/legend.mjs +0 -217
  714. package/template/.hermes/skills/archify/renderers/shared/output-path.mjs +0 -321
  715. package/template/.hermes/skills/archify/renderers/shared/repository-evidence.mjs +0 -235
  716. package/template/.hermes/skills/archify/renderers/shared/text-fit.mjs +0 -49
  717. package/template/.hermes/skills/archify/renderers/shared/utils.mjs +0 -232
  718. package/template/.hermes/skills/archify/renderers/shared/validator.mjs +0 -86
  719. package/template/.hermes/skills/archify/renderers/workflow/README.md +0 -223
  720. package/template/.hermes/skills/archify/renderers/workflow/render-workflow.mjs +0 -35
  721. package/template/.hermes/skills/archify/renderers/workflow/workflow-compiler.mjs +0 -4400
  722. package/template/.hermes/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +0 -144
  723. package/template/.hermes/skills/archify/schemas/README.md +0 -211
  724. package/template/.hermes/skills/archify/schemas/architecture.schema.json +0 -176
  725. package/template/.hermes/skills/archify/schemas/common.schema.json +0 -115
  726. package/template/.hermes/skills/archify/schemas/dataflow.schema.json +0 -243
  727. package/template/.hermes/skills/archify/schemas/lifecycle.schema.json +0 -266
  728. package/template/.hermes/skills/archify/schemas/sequence.schema.json +0 -223
  729. package/template/.hermes/skills/archify/schemas/workflow.schema.json +0 -428
  730. package/template/.hermes/skills/archify/scripts/check-render-output.mjs +0 -835
  731. package/template/.hermes/skills/archify/scripts/check-update.mjs +0 -1667
  732. package/template/.hermes/skills/archify/scripts/generate-brand-marks.mjs +0 -141
  733. package/template/.hermes/skills/archify/scripts/generate-validators.mjs +0 -66
  734. package/template/.hermes/skills/archify/scripts/render-examples.mjs +0 -26
  735. package/template/.hermes/skills/archify/scripts/update-contract.mjs +0 -182
  736. package/template/.hermes/skills/archify/scripts/yss-safe-deliver.mjs +0 -214
  737. package/template/.hermes/skills/archify/skill-release.json +0 -10
  738. package/template/.hermes/skills/archify/test/adaptive-reader-layout.test.mjs +0 -86
  739. package/template/.hermes/skills/archify/test/animation.test.mjs +0 -179
  740. package/template/.hermes/skills/archify/test/architecture-delta.test.mjs +0 -518
  741. package/template/.hermes/skills/archify/test/authored-reachability.test.mjs +0 -95
  742. package/template/.hermes/skills/archify/test/authoring-safety-contract.test.mjs +0 -54
  743. package/template/.hermes/skills/archify/test/automatic-port-spread.test.mjs +0 -376
  744. package/template/.hermes/skills/archify/test/base-input-compatibility.test.mjs +0 -42
  745. package/template/.hermes/skills/archify/test/brand-marks.test.mjs +0 -654
  746. package/template/.hermes/skills/archify/test/chapter-delta-preview.test.mjs +0 -157
  747. package/template/.hermes/skills/archify/test/chapter-handoff.test.mjs +0 -97
  748. package/template/.hermes/skills/archify/test/chapter-rail.test.mjs +0 -86
  749. package/template/.hermes/skills/archify/test/checkout-line-endings.test.mjs +0 -72
  750. package/template/.hermes/skills/archify/test/clean-skill-staging.test.mjs +0 -244
  751. package/template/.hermes/skills/archify/test/cli.test.mjs +0 -809
  752. package/template/.hermes/skills/archify/test/community-proof-intake.test.mjs +0 -104
  753. package/template/.hermes/skills/archify/test/cursor-onboarding.test.mjs +0 -74
  754. package/template/.hermes/skills/archify/test/degraded.test.mjs +0 -161
  755. package/template/.hermes/skills/archify/test/delivery-contract.test.mjs +0 -52
  756. package/template/.hermes/skills/archify/test/desktop-reader-browser.test.mjs +0 -58
  757. package/template/.hermes/skills/archify/test/diagram-guide.test.mjs +0 -92
  758. package/template/.hermes/skills/archify/test/engineering-profile.test.mjs +0 -209
  759. package/template/.hermes/skills/archify/test/finder.test.mjs +0 -104
  760. package/template/.hermes/skills/archify/test/fixtures/automatic-routing-node-border-clearance.workflow.json +0 -40
  761. package/template/.hermes/skills/archify/test/fixtures/fail-migration-cleanup.mjs +0 -17
  762. package/template/.hermes/skills/archify/test/fixtures/issue-126/custom-widths.workflow.json +0 -18
  763. package/template/.hermes/skills/archify/test/fixtures/issue-126/explicit-route.workflow.json +0 -28
  764. package/template/.hermes/skills/archify/test/fixtures/issue-126/explicit-viewbox.workflow.json +0 -19
  765. package/template/.hermes/skills/archify/test/fixtures/issue-126/labels.workflow.json +0 -18
  766. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/agent-run.lifecycle.json +0 -64
  767. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/agent-tool-call.workflow.json +0 -88
  768. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/cache-miss-request.sequence.json +0 -75
  769. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/event-stream.dataflow.json +0 -57
  770. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/product-analytics.dataflow.json +0 -70
  771. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/production-deployment.architecture.json +0 -71
  772. package/template/.hermes/skills/archify/test/fixtures/v1-baseline/web-app.architecture.json +0 -41
  773. package/template/.hermes/skills/archify/test/fixtures/v1-workflow-700x400.workflow.json +0 -22
  774. package/template/.hermes/skills/archify/test/fixtures/v1-workflow-explicit-coordinates.workflow.json +0 -47
  775. package/template/.hermes/skills/archify/test/gallery.test.mjs +0 -130
  776. package/template/.hermes/skills/archify/test/generate-validators.test.mjs +0 -59
  777. package/template/.hermes/skills/archify/test/generated-artifact-xml.test.mjs +0 -88
  778. package/template/.hermes/skills/archify/test/geometry.test.mjs +0 -739
  779. package/template/.hermes/skills/archify/test/golden.mjs +0 -207
  780. package/template/.hermes/skills/archify/test/grid.test.mjs +0 -47
  781. package/template/.hermes/skills/archify/test/guide-page.test.mjs +0 -59
  782. package/template/.hermes/skills/archify/test/guide.test.mjs +0 -81
  783. package/template/.hermes/skills/archify/test/guided-views.test.mjs +0 -144
  784. package/template/.hermes/skills/archify/test/helpers/xml.mjs +0 -37
  785. package/template/.hermes/skills/archify/test/i18n.test.mjs +0 -422
  786. package/template/.hermes/skills/archify/test/intent-trace.test.mjs +0 -111
  787. package/template/.hermes/skills/archify/test/landing.test.mjs +0 -97
  788. package/template/.hermes/skills/archify/test/layout-rules.test.mjs +0 -1449
  789. package/template/.hermes/skills/archify/test/legend-contract.test.mjs +0 -404
  790. package/template/.hermes/skills/archify/test/motion-governor.test.mjs +0 -111
  791. package/template/.hermes/skills/archify/test/open-artifact.test.mjs +0 -118
  792. package/template/.hermes/skills/archify/test/ordinary-model-floor.test.mjs +0 -1024
  793. package/template/.hermes/skills/archify/test/output-path.test.mjs +0 -587
  794. package/template/.hermes/skills/archify/test/presentation.test.mjs +0 -71
  795. package/template/.hermes/skills/archify/test/preset-tryon.test.mjs +0 -113
  796. package/template/.hermes/skills/archify/test/preview-contract.test.mjs +0 -40
  797. package/template/.hermes/skills/archify/test/preview.test.mjs +0 -499
  798. package/template/.hermes/skills/archify/test/proof-aperture.test.mjs +0 -78
  799. package/template/.hermes/skills/archify/test/reach-share-card.test.mjs +0 -149
  800. package/template/.hermes/skills/archify/test/readme-showcase.test.mjs +0 -318
  801. package/template/.hermes/skills/archify/test/real-repository-proof.test.mjs +0 -209
  802. package/template/.hermes/skills/archify/test/relationship-direct-explorer.test.mjs +0 -115
  803. package/template/.hermes/skills/archify/test/relationship-lens.test.mjs +0 -128
  804. package/template/.hermes/skills/archify/test/relationship-permalink.test.mjs +0 -130
  805. package/template/.hermes/skills/archify/test/relationship-pulse.test.mjs +0 -122
  806. package/template/.hermes/skills/archify/test/release-identity.test.mjs +0 -504
  807. package/template/.hermes/skills/archify/test/release-package-gates.test.mjs +0 -508
  808. package/template/.hermes/skills/archify/test/render-output-checks.test.mjs +0 -435
  809. package/template/.hermes/skills/archify/test/repair-receipt.test.mjs +0 -181
  810. package/template/.hermes/skills/archify/test/repository-evidence.test.mjs +0 -217
  811. package/template/.hermes/skills/archify/test/repository-language-metadata.test.mjs +0 -52
  812. package/template/.hermes/skills/archify/test/route-journey.test.mjs +0 -123
  813. package/template/.hermes/skills/archify/test/route-probe.test.mjs +0 -114
  814. package/template/.hermes/skills/archify/test/route-share-card.test.mjs +0 -163
  815. package/template/.hermes/skills/archify/test/semantic-camera.test.mjs +0 -88
  816. package/template/.hermes/skills/archify/test/semantic-flow.test.mjs +0 -90
  817. package/template/.hermes/skills/archify/test/semantic-legend-gateway.test.mjs +0 -156
  818. package/template/.hermes/skills/archify/test/semantic-lens.test.mjs +0 -103
  819. package/template/.hermes/skills/archify/test/semantic-passport.test.mjs +0 -99
  820. package/template/.hermes/skills/archify/test/semantic-radar.test.mjs +0 -575
  821. package/template/.hermes/skills/archify/test/semantic-zoom.test.mjs +0 -86
  822. package/template/.hermes/skills/archify/test/sequence-column-fit.test.mjs +0 -137
  823. package/template/.hermes/skills/archify/test/settled-flow.test.mjs +0 -97
  824. package/template/.hermes/skills/archify/test/share-card-export.test.mjs +0 -132
  825. package/template/.hermes/skills/archify/test/site-language-continuity.test.mjs +0 -562
  826. package/template/.hermes/skills/archify/test/site-language-integration.mjs +0 -9
  827. package/template/.hermes/skills/archify/test/skill-metadata.test.mjs +0 -84
  828. package/template/.hermes/skills/archify/test/stable-update-manifest.test.mjs +0 -167
  829. package/template/.hermes/skills/archify/test/start-page.test.mjs +0 -312
  830. package/template/.hermes/skills/archify/test/story-beat-navigator.test.mjs +0 -103
  831. package/template/.hermes/skills/archify/test/story-carrier.test.mjs +0 -90
  832. package/template/.hermes/skills/archify/test/story-director-strip.test.mjs +0 -91
  833. package/template/.hermes/skills/archify/test/story-follow-camera.test.mjs +0 -103
  834. package/template/.hermes/skills/archify/test/story-horizon.test.mjs +0 -89
  835. package/template/.hermes/skills/archify/test/story-moment-link.test.mjs +0 -93
  836. package/template/.hermes/skills/archify/test/story-shelf.test.mjs +0 -84
  837. package/template/.hermes/skills/archify/test/story-trail.test.mjs +0 -81
  838. package/template/.hermes/skills/archify/test/toolbar-polish.test.mjs +0 -57
  839. package/template/.hermes/skills/archify/test/update-contract.test.mjs +0 -133
  840. package/template/.hermes/skills/archify/test/update-notifier.test.mjs +0 -3317
  841. package/template/.hermes/skills/archify/test/v1-compatibility.test.mjs +0 -329
  842. package/template/.hermes/skills/archify/test/vertical-edge.test.mjs +0 -68
  843. package/template/.hermes/skills/archify/test/viewer-chrome-layout.test.mjs +0 -872
  844. package/template/.hermes/skills/archify/test/visual-check.test.mjs +0 -400
  845. package/template/.hermes/skills/archify/test/webm-artifact.smoke.mjs +0 -1840
  846. package/template/.hermes/skills/archify/test/workflow-compiler-hard-contract.test.mjs +0 -2135
  847. package/template/.hermes/skills/archify/test/workflow-compiler.test.mjs +0 -1163
  848. package/template/.hermes/skills/archify/test/workflow-migration.test.mjs +0 -620
  849. package/template/.hermes/skills/archify/test/workflow-semantic-contract.test.mjs +0 -131
  850. package/template/.hermes/skills/archify/test/yss-safe-deliver.test.mjs +0 -153
  851. package/template/.hermes/skills/ask-matt/PHASE-BOUNDARIES.md +0 -55
  852. package/template/.hermes/skills/ask-matt/SKILL.md +0 -95
  853. package/template/.hermes/skills/ask-matt/agents/openai.yaml +0 -5
  854. package/template/.hermes/skills/code-review/SKILL.md +0 -122
  855. package/template/.hermes/skills/code-review/agents/openai.yaml +0 -3
  856. package/template/.hermes/skills/code-review/references/yss-review-standards.md +0 -54
  857. package/template/.hermes/skills/codebase-design/DEEPENING.md +0 -37
  858. package/template/.hermes/skills/codebase-design/DESIGN-IT-TWICE.md +0 -44
  859. package/template/.hermes/skills/codebase-design/SKILL.md +0 -118
  860. package/template/.hermes/skills/codebase-design/agents/openai.yaml +0 -3
  861. package/template/.hermes/skills/competitive-intelligence/SKILL.md +0 -94
  862. package/template/.hermes/skills/component-selection-imports/SKILL.md +0 -64
  863. package/template/.hermes/skills/cross-repo-implementation-routing/SKILL.md +0 -51
  864. package/template/.hermes/skills/diagnosing-bugs/SKILL.md +0 -138
  865. package/template/.hermes/skills/diagnosing-bugs/agents/openai.yaml +0 -3
  866. package/template/.hermes/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +0 -44
  867. package/template/.hermes/skills/dispatching-parallel-agents/SKILL.md +0 -185
  868. package/template/.hermes/skills/domain-modeling/ADR-FORMAT.md +0 -47
  869. package/template/.hermes/skills/domain-modeling/CONTEXT-FORMAT.md +0 -60
  870. package/template/.hermes/skills/domain-modeling/SKILL.md +0 -74
  871. package/template/.hermes/skills/domain-modeling/agents/openai.yaml +0 -3
  872. package/template/.hermes/skills/file-export-download/SKILL.md +0 -160
  873. package/template/.hermes/skills/file-export-download/agents/openai.yaml +0 -4
  874. package/template/.hermes/skills/formily-foundation/SKILL.md +0 -176
  875. package/template/.hermes/skills/formily-foundation/references/examples.md +0 -486
  876. package/template/.hermes/skills/formily-linkage-effects/SKILL.md +0 -167
  877. package/template/.hermes/skills/formily-mode-slot-detail/SKILL.md +0 -137
  878. package/template/.hermes/skills/formily-step-flow/SKILL.md +0 -194
  879. package/template/.hermes/skills/frontend-commit/SKILL.md +0 -118
  880. package/template/.hermes/skills/frontend-commit/agents/openai.yaml +0 -7
  881. package/template/.hermes/skills/frontend-commit/references/scope-and-examples.md +0 -111
  882. package/template/.hermes/skills/grill-me/SKILL.md +0 -7
  883. package/template/.hermes/skills/grill-me/agents/openai.yaml +0 -5
  884. package/template/.hermes/skills/grill-with-docs/SKILL.md +0 -19
  885. package/template/.hermes/skills/grill-with-docs/agents/openai.yaml +0 -5
  886. package/template/.hermes/skills/grilling/SKILL.md +0 -28
  887. package/template/.hermes/skills/grilling/agents/openai.yaml +0 -3
  888. package/template/.hermes/skills/handoff/SKILL.md +0 -16
  889. package/template/.hermes/skills/handoff/agents/openai.yaml +0 -5
  890. package/template/.hermes/skills/implement/SKILL.md +0 -15
  891. package/template/.hermes/skills/implement/agents/openai.yaml +0 -5
  892. package/template/.hermes/skills/implementation-repo-onboarding/SKILL.md +0 -50
  893. package/template/.hermes/skills/improve-codebase-architecture/HTML-REPORT.md +0 -123
  894. package/template/.hermes/skills/improve-codebase-architecture/SKILL.md +0 -71
  895. package/template/.hermes/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  896. package/template/.hermes/skills/java-backend-commit/SKILL.md +0 -121
  897. package/template/.hermes/skills/java-backend-commit/agents/openai.yaml +0 -7
  898. package/template/.hermes/skills/java-backend-commit/references/scope-and-examples.md +0 -118
  899. package/template/.hermes/skills/llm-wiki/SKILL.md +0 -60
  900. package/template/.hermes/skills/llm-wiki/assets/CLAUDE.md.template +0 -26
  901. package/template/.hermes/skills/llm-wiki/assets/fixtures/broken-wiki/wiki/CLAUDE.md +0 -3
  902. package/template/.hermes/skills/llm-wiki/assets/fixtures/broken-wiki/wiki/index.md +0 -5
  903. package/template/.hermes/skills/llm-wiki/assets/fixtures/broken-wiki/wiki/log.md +0 -1
  904. package/template/.hermes/skills/llm-wiki/assets/fixtures/broken-wiki/wiki//345/255/230/345/234/250/347/232/204/351/241/265.md +0 -7
  905. package/template/.hermes/skills/llm-wiki/references/compile.md +0 -126
  906. package/template/.hermes/skills/llm-wiki/references/discover.md +0 -42
  907. package/template/.hermes/skills/llm-wiki/references/ingest.md +0 -36
  908. package/template/.hermes/skills/llm-wiki/references/lint.md +0 -54
  909. package/template/.hermes/skills/llm-wiki/references/query.md +0 -21
  910. package/template/.hermes/skills/llm-wiki/references/schema.md +0 -45
  911. package/template/.hermes/skills/llm-wiki/references/writing.md +0 -35
  912. package/template/.hermes/skills/llm-wiki/scripts/advise.mjs +0 -196
  913. package/template/.hermes/skills/llm-wiki/scripts/advise.test.mjs +0 -91
  914. package/template/.hermes/skills/llm-wiki/scripts/extract.mjs +0 -55
  915. package/template/.hermes/skills/llm-wiki/scripts/extract.test.mjs +0 -34
  916. package/template/.hermes/skills/llm-wiki/scripts/inventory.mjs +0 -174
  917. package/template/.hermes/skills/llm-wiki/scripts/inventory.test.mjs +0 -98
  918. package/template/.hermes/skills/llm-wiki/scripts/lint-wikilinks.mjs +0 -177
  919. package/template/.hermes/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +0 -212
  920. package/template/.hermes/skills/lombok/SKILL.md +0 -351
  921. package/template/.hermes/skills/loop-me/SKILL.md +0 -32
  922. package/template/.hermes/skills/loop-me/agents/openai.yaml +0 -5
  923. package/template/.hermes/skills/maintaining-skills/SKILL.md +0 -27
  924. package/template/.hermes/skills/mapstruct/SKILL.md +0 -334
  925. package/template/.hermes/skills/migrate-to-shoehorn/SKILL.md +0 -118
  926. package/template/.hermes/skills/migrate-to-shoehorn/agents/openai.yaml +0 -3
  927. package/template/.hermes/skills/page-form-module/SKILL.md +0 -168
  928. package/template/.hermes/skills/page-list-module/SKILL.md +0 -137
  929. package/template/.hermes/skills/page-skeleton/SKILL.md +0 -76
  930. package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +0 -34
  931. package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +0 -75
  932. package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/index.vue +0 -107
  933. package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +0 -256
  934. package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/style.less +0 -30
  935. package/template/.hermes/skills/page-skeleton/examples/StandardListPage/constant.ts +0 -28
  936. package/template/.hermes/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +0 -58
  937. package/template/.hermes/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +0 -65
  938. package/template/.hermes/skills/page-skeleton/examples/StandardListPage/index.vue +0 -91
  939. package/template/.hermes/skills/page-skeleton/examples/StandardListPage/style.less +0 -49
  940. package/template/.hermes/skills/prototype/LOGIC.md +0 -67
  941. package/template/.hermes/skills/prototype/SKILL.md +0 -26
  942. package/template/.hermes/skills/prototype/UI.md +0 -112
  943. package/template/.hermes/skills/prototype/agents/openai.yaml +0 -3
  944. package/template/.hermes/skills/prototype-page-acceptance/SKILL.md +0 -62
  945. package/template/.hermes/skills/prototype-review/SKILL.md +0 -74
  946. package/template/.hermes/skills/prototype-review/agents/openai.yaml +0 -4
  947. package/template/.hermes/skills/resolving-merge-conflicts/SKILL.md +0 -14
  948. package/template/.hermes/skills/resolving-merge-conflicts/agents/openai.yaml +0 -3
  949. package/template/.hermes/skills/scaffold-exercises/SKILL.md +0 -106
  950. package/template/.hermes/skills/scaffold-exercises/agents/openai.yaml +0 -3
  951. package/template/.hermes/skills/setup-matt-pocock-skills/SKILL.md +0 -125
  952. package/template/.hermes/skills/setup-matt-pocock-skills/agents/openai.yaml +0 -5
  953. package/template/.hermes/skills/setup-matt-pocock-skills/domain.md +0 -51
  954. package/template/.hermes/skills/setup-matt-pocock-skills/issue-tracker-github.md +0 -45
  955. package/template/.hermes/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +0 -46
  956. package/template/.hermes/skills/setup-matt-pocock-skills/issue-tracker-local.md +0 -66
  957. package/template/.hermes/skills/setup-matt-pocock-skills/triage-labels.md +0 -15
  958. package/template/.hermes/skills/setup-pre-commit/SKILL.md +0 -91
  959. package/template/.hermes/skills/setup-pre-commit/agents/openai.yaml +0 -3
  960. package/template/.hermes/skills/setup-ts-deep-modules/SKILL.md +0 -102
  961. package/template/.hermes/skills/setup-ts-deep-modules/agents/openai.yaml +0 -5
  962. package/template/.hermes/skills/setup-ts-deep-modules/dependency-cruiser.config.cjs +0 -95
  963. package/template/.hermes/skills/tdd/SKILL.md +0 -38
  964. package/template/.hermes/skills/tdd/agents/openai.yaml +0 -3
  965. package/template/.hermes/skills/tdd/mocking.md +0 -59
  966. package/template/.hermes/skills/tdd/tests.md +0 -77
  967. package/template/.hermes/skills/teach/GLOSSARY-FORMAT.md +0 -35
  968. package/template/.hermes/skills/teach/LEARNING-RECORD-FORMAT.md +0 -46
  969. package/template/.hermes/skills/teach/MISSION-FORMAT.md +0 -31
  970. package/template/.hermes/skills/teach/RESOURCES-FORMAT.md +0 -32
  971. package/template/.hermes/skills/teach/SKILL.md +0 -140
  972. package/template/.hermes/skills/teach/agents/openai.yaml +0 -5
  973. package/template/.hermes/skills/theme-token-usage/SKILL.md +0 -123
  974. package/template/.hermes/skills/theme-token-usage/agents/openai.yaml +0 -4
  975. package/template/.hermes/skills/to-questionnaire/SKILL.md +0 -53
  976. package/template/.hermes/skills/to-questionnaire/agents/openai.yaml +0 -5
  977. package/template/.hermes/skills/to-spec/SKILL.md +0 -75
  978. package/template/.hermes/skills/to-spec/agents/openai.yaml +0 -5
  979. package/template/.hermes/skills/to-tickets/SKILL.md +0 -105
  980. package/template/.hermes/skills/to-tickets/agents/openai.yaml +0 -5
  981. package/template/.hermes/skills/triage/AGENT-BRIEF.md +0 -207
  982. package/template/.hermes/skills/triage/OUT-OF-SCOPE.md +0 -105
  983. package/template/.hermes/skills/triage/SKILL.md +0 -112
  984. package/template/.hermes/skills/triage/agents/openai.yaml +0 -5
  985. package/template/.hermes/skills/using-git-worktrees/SKILL.md +0 -202
  986. package/template/.hermes/skills/vue3-best-practices/SKILL.md +0 -68
  987. package/template/.hermes/skills/wait-what/SKILL.md +0 -7
  988. package/template/.hermes/skills/wait-what/agents/openai.yaml +0 -5
  989. package/template/.hermes/skills/wayfinder/SKILL.md +0 -128
  990. package/template/.hermes/skills/wayfinder/agents/openai.yaml +0 -5
  991. package/template/.hermes/skills/writing-beats/SKILL.md +0 -67
  992. package/template/.hermes/skills/writing-beats/agents/openai.yaml +0 -5
  993. package/template/.hermes/skills/writing-for-agents/SKILL-MECHANICS.md +0 -22
  994. package/template/.hermes/skills/writing-for-agents/SKILL.md +0 -81
  995. package/template/.hermes/skills/writing-for-agents/agents/openai.yaml +0 -3
  996. package/template/.hermes/skills/writing-fragments/SKILL.md +0 -79
  997. package/template/.hermes/skills/writing-fragments/agents/openai.yaml +0 -5
  998. package/template/.hermes/skills/writing-shape/SKILL.md +0 -79
  999. package/template/.hermes/skills/writing-shape/agents/openai.yaml +0 -5
  1000. package/template/.hermes/skills/yedit-table-usage/SKILL.md +0 -227
  1001. package/template/.hermes/skills/yss-antd-design/SKILL.md +0 -34
  1002. package/template/.hermes/skills/yss-antd-design/references/boundaries.md +0 -30
  1003. package/template/.hermes/skills/yss-antd-design/references/cli-matrix.md +0 -38
  1004. package/template/.hermes/skills/yss-antd-design/references/evidence.md +0 -30
  1005. package/template/.hermes/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  1006. package/template/.hermes/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  1007. package/template/.hermes/skills/yss-api-integration/SKILL.md +0 -185
  1008. package/template/.hermes/skills/yss-api-integration/agents/openai.yaml +0 -5
  1009. package/template/.hermes/skills/yss-application/SKILL.md +0 -54
  1010. package/template/.hermes/skills/yss-application/agents/openai.yaml +0 -5
  1011. package/template/.hermes/skills/yss-application/references/application-layer-guide.md +0 -87
  1012. package/template/.hermes/skills/yss-audit-log/SKILL.md +0 -67
  1013. package/template/.hermes/skills/yss-audit-log/agents/openai.yaml +0 -5
  1014. package/template/.hermes/skills/yss-audit-log/assets/AuditLogAspect.java +0 -262
  1015. package/template/.hermes/skills/yss-audit-log/assets/YssAuditLogPrintSubscriberImpl.java +0 -37
  1016. package/template/.hermes/skills/yss-audit-log/assets/YssAuditLogSysManagerSubscriberImpl.java +0 -18
  1017. package/template/.hermes/skills/yss-audit-log/assets/YssAuditPublishService.java +0 -69
  1018. package/template/.hermes/skills/yss-audit-log/references/README.md +0 -69
  1019. package/template/.hermes/skills/yss-audit-log/references/source-index.md +0 -43
  1020. package/template/.hermes/skills/yss-cache/SKILL.md +0 -44
  1021. package/template/.hermes/skills/yss-cache/agents/openai.yaml +0 -5
  1022. package/template/.hermes/skills/yss-cache/references/annotations.md +0 -39
  1023. package/template/.hermes/skills/yss-cache/references/architecture.md +0 -25
  1024. package/template/.hermes/skills/yss-cache/references/configuration.md +0 -34
  1025. package/template/.hermes/skills/yss-cache/references/redis-fallback.md +0 -23
  1026. package/template/.hermes/skills/yss-cache/references/redis-topology.md +0 -62
  1027. package/template/.hermes/skills/yss-cache/references/serialization.md +0 -17
  1028. package/template/.hermes/skills/yss-cache/references/source-index.md +0 -67
  1029. package/template/.hermes/skills/yss-cache/references/troubleshooting.md +0 -33
  1030. package/template/.hermes/skills/yss-cache/references/verification.md +0 -34
  1031. package/template/.hermes/skills/yss-cache/scripts/check-skill-freshness.sh +0 -84
  1032. package/template/.hermes/skills/yss-cache/scripts/inspect-cache-usage.sh +0 -96
  1033. package/template/.hermes/skills/yss-cache/scripts/verify-cache-component.sh +0 -101
  1034. package/template/.hermes/skills/yss-components/SKILL.md +0 -386
  1035. package/template/.hermes/skills/yss-components/agents/openai.yaml +0 -5
  1036. package/template/.hermes/skills/yss-components/references/frontend-docs.md +0 -9
  1037. package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +0 -121
  1038. package/template/.hermes/skills/yss-ddd-scaffold-generator/agents/openai.yaml +0 -5
  1039. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +0 -8
  1040. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +0 -36
  1041. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/logback-spring.xml.template +0 -15
  1042. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +0 -36
  1043. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +0 -15
  1044. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +0 -19
  1045. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +0 -52
  1046. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -70
  1047. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +0 -22
  1048. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +0 -54
  1049. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +0 -155
  1050. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +0 -58
  1051. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/jvm.config +0 -1
  1052. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +0 -2
  1053. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +0 -41
  1054. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/MavenWrapperDownloader.java +0 -117
  1055. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.jar +0 -0
  1056. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +0 -20
  1057. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/mvnw +0 -316
  1058. package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/mvnw.cmd +0 -188
  1059. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +0 -116
  1060. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +0 -125
  1061. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  1062. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  1063. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  1064. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  1065. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  1066. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  1067. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  1068. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  1069. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +0 -58
  1070. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +0 -5
  1071. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  1072. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  1073. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +0 -225
  1074. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +0 -164
  1075. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +0 -126
  1076. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +0 -363
  1077. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +0 -172
  1078. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +0 -112
  1079. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +0 -401
  1080. package/template/.hermes/skills/yss-design-system/SKILL.md +0 -105
  1081. package/template/.hermes/skills/yss-design-system/agents/openai.yaml +0 -5
  1082. package/template/.hermes/skills/yss-design-system/references/design-qa-theme.md +0 -64
  1083. package/template/.hermes/skills/yss-design-system/references/design-system.md +0 -245
  1084. package/template/.hermes/skills/yss-design-system/scripts/validate-frontmatter.mjs +0 -36
  1085. package/template/.hermes/skills/yss-design-system/scripts/validate-frontmatter.test.mjs +0 -12
  1086. package/template/.hermes/skills/yss-distributed-id/SKILL.md +0 -69
  1087. package/template/.hermes/skills/yss-distributed-id/agents/openai.yaml +0 -5
  1088. package/template/.hermes/skills/yss-distributed-id/assets/AutoIdInterceptor.java +0 -246
  1089. package/template/.hermes/skills/yss-distributed-id/assets/EnableDistributedId.java +0 -25
  1090. package/template/.hermes/skills/yss-distributed-id/assets/LeafConf.java +0 -36
  1091. package/template/.hermes/skills/yss-distributed-id/references/README.md +0 -51
  1092. package/template/.hermes/skills/yss-distributed-id/references/source-index.md +0 -86
  1093. package/template/.hermes/skills/yss-domain/SKILL.md +0 -70
  1094. package/template/.hermes/skills/yss-domain/agents/openai.yaml +0 -5
  1095. package/template/.hermes/skills/yss-domain/references/domain-layer-guide.md +0 -101
  1096. package/template/.hermes/skills/yss-dto/SKILL.md +0 -92
  1097. package/template/.hermes/skills/yss-dto/agents/openai.yaml +0 -5
  1098. package/template/.hermes/skills/yss-dto/assets/CommandDTO.java +0 -8
  1099. package/template/.hermes/skills/yss-dto/assets/PageQuery.java +0 -133
  1100. package/template/.hermes/skills/yss-dto/assets/QueryDTO.java +0 -6
  1101. package/template/.hermes/skills/yss-dto/assets/Result.java +0 -105
  1102. package/template/.hermes/skills/yss-dto/references/README.md +0 -67
  1103. package/template/.hermes/skills/yss-dto/references/openapi-wire-profile.yaml +0 -187
  1104. package/template/.hermes/skills/yss-dto/references/source-index.md +0 -55
  1105. package/template/.hermes/skills/yss-excel-mvc/SKILL.md +0 -66
  1106. package/template/.hermes/skills/yss-excel-mvc/agents/openai.yaml +0 -5
  1107. package/template/.hermes/skills/yss-excel-mvc/assets/ExcelDynamicData.java +0 -66
  1108. package/template/.hermes/skills/yss-excel-mvc/assets/RequestExcel.java +0 -33
  1109. package/template/.hermes/skills/yss-excel-mvc/assets/RequestFastExcelArgumentResolver.java +0 -272
  1110. package/template/.hermes/skills/yss-excel-mvc/assets/ResponseExcel.java +0 -46
  1111. package/template/.hermes/skills/yss-excel-mvc/assets/ResponseFastExcelReturnValueHandler.java +0 -154
  1112. package/template/.hermes/skills/yss-excel-mvc/references/README.md +0 -5
  1113. package/template/.hermes/skills/yss-excel-mvc/references/source-index.md +0 -74
  1114. package/template/.hermes/skills/yss-exception/SKILL.md +0 -57
  1115. package/template/.hermes/skills/yss-exception/agents/openai.yaml +0 -4
  1116. package/template/.hermes/skills/yss-exception/references/source-index.md +0 -35
  1117. package/template/.hermes/skills/yss-formily/SKILL.md +0 -272
  1118. package/template/.hermes/skills/yss-formily-schema-generator/SKILL.md +0 -189
  1119. package/template/.hermes/skills/yss-formily-schema-generator/agents/openai.yaml +0 -5
  1120. package/template/.hermes/skills/yss-formily-schema-generator/assets/java-sdk/ExampleUsage.java +0 -111
  1121. package/template/.hermes/skills/yss-formily-schema-generator/assets/java-sdk/YssFormilyDsl.java +0 -1219
  1122. package/template/.hermes/skills/yss-formily-schema-generator/references/workflow.md +0 -240
  1123. package/template/.hermes/skills/yss-frontend-scaffold-generator/SKILL.md +0 -76
  1124. package/template/.hermes/skills/yss-hook/SKILL.md +0 -200
  1125. package/template/.hermes/skills/yss-hook/agents/openai.yaml +0 -5
  1126. package/template/.hermes/skills/yss-hook/references/frontend-docs.md +0 -10
  1127. package/template/.hermes/skills/yss-microapp-commit/SKILL.md +0 -201
  1128. package/template/.hermes/skills/yss-microapp-commit/agents/openai.yaml +0 -5
  1129. package/template/.hermes/skills/yss-microapp-commit/references/scope-mapping.md +0 -204
  1130. package/template/.hermes/skills/yss-mybatis/SKILL.md +0 -77
  1131. package/template/.hermes/skills/yss-mybatis/agents/openai.yaml +0 -5
  1132. package/template/.hermes/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  1133. package/template/.hermes/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  1134. package/template/.hermes/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  1135. package/template/.hermes/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  1136. package/template/.hermes/skills/yss-mybatis/references/README.md +0 -57
  1137. package/template/.hermes/skills/yss-mybatis/references/source-index.md +0 -93
  1138. package/template/.hermes/skills/yss-openapi-draft-review/SKILL.md +0 -82
  1139. package/template/.hermes/skills/yss-openapi-governance/SKILL.md +0 -130
  1140. package/template/.hermes/skills/yss-openapi-governance/agents/openai.yaml +0 -4
  1141. package/template/.hermes/skills/yss-page-module-development/SKILL.md +0 -165
  1142. package/template/.hermes/skills/yss-page-module-development/agents/openai.yaml +0 -5
  1143. package/template/.hermes/skills/yss-page-module-development/examples/AdvancedFormPage/constant.ts +0 -32
  1144. package/template/.hermes/skills/yss-page-module-development/examples/AdvancedFormPage/hooks/useRuleConfig.ts +0 -158
  1145. package/template/.hermes/skills/yss-page-module-development/examples/AdvancedFormPage/index.vue +0 -188
  1146. package/template/.hermes/skills/yss-page-module-development/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +0 -256
  1147. package/template/.hermes/skills/yss-page-module-development/examples/AdvancedFormPage/style.less +0 -76
  1148. package/template/.hermes/skills/yss-page-module-development/examples/StandardListPage/constant.ts +0 -128
  1149. package/template/.hermes/skills/yss-page-module-development/examples/StandardListPage/hooks/useQualityRuleList.ts +0 -144
  1150. package/template/.hermes/skills/yss-page-module-development/examples/StandardListPage/hooks/useRuleActions.ts +0 -141
  1151. package/template/.hermes/skills/yss-page-module-development/examples/StandardListPage/index.vue +0 -175
  1152. package/template/.hermes/skills/yss-page-module-development/examples/StandardListPage/style.less +0 -83
  1153. package/template/.hermes/skills/yss-page-module-development/references/component-map.md +0 -34
  1154. package/template/.hermes/skills/yss-page-module-development/references/frontend-docs.md +0 -11
  1155. package/template/.hermes/skills/yss-page-module-development/references/hooks-map.md +0 -11
  1156. package/template/.hermes/skills/yss-page-module-development/references/utils-map.md +0 -14
  1157. package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +0 -52
  1158. package/template/.hermes/skills/yss-product-lifecycle/agents/openai.yaml +0 -4
  1159. package/template/.hermes/skills/yss-product-lifecycle/references/artifact-dependencies.md +0 -36
  1160. package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +0 -122
  1161. package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +0 -865
  1162. package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +0 -116
  1163. package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +0 -112
  1164. package/template/.hermes/skills/yss-prototype-stage/SKILL.md +0 -47
  1165. package/template/.hermes/skills/yss-prototype-stage/references/product-design-adapter.md +0 -54
  1166. package/template/.hermes/skills/yss-prototype-stage/scripts/prototype-contract.mjs +0 -207
  1167. package/template/.hermes/skills/yss-prototype-stage/tests/run-scenarios.mjs +0 -154
  1168. package/template/.hermes/skills/yss-repository/SKILL.md +0 -80
  1169. package/template/.hermes/skills/yss-repository/agents/openai.yaml +0 -5
  1170. package/template/.hermes/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  1171. package/template/.hermes/skills/yss-research/SKILL.md +0 -73
  1172. package/template/.hermes/skills/yss-research/agents/openai.yaml +0 -3
  1173. package/template/.hermes/skills/yss-research/assets/evidence-template.yaml +0 -68
  1174. package/template/.hermes/skills/yss-research/assets/research-brief-template.md +0 -36
  1175. package/template/.hermes/skills/yss-research/references/evidence-contract.md +0 -42
  1176. package/template/.hermes/skills/yss-research/scripts/validate-research-package.mjs +0 -128
  1177. package/template/.hermes/skills/yss-research/tests/run-scenarios.mjs +0 -81
  1178. package/template/.hermes/skills/yss-resilience4j/SKILL.md +0 -46
  1179. package/template/.hermes/skills/yss-resilience4j/agents/openai.yaml +0 -4
  1180. package/template/.hermes/skills/yss-resilience4j/references/source-index.md +0 -33
  1181. package/template/.hermes/skills/yss-router/SKILL.md +0 -51
  1182. package/template/.hermes/skills/yss-router/agents/openai.yaml +0 -4
  1183. package/template/.hermes/skills/yss-router/references/boundaries.md +0 -50
  1184. package/template/.hermes/skills/yss-router/references/router-contract.yaml +0 -349
  1185. package/template/.hermes/skills/yss-router/references/slice-implementation-contract.md +0 -185
  1186. package/template/.hermes/skills/yss-router/references/yss-skill-execution-result.md +0 -67
  1187. package/template/.hermes/skills/yss-security-algorithm/SKILL.md +0 -52
  1188. package/template/.hermes/skills/yss-security-algorithm/agents/openai.yaml +0 -4
  1189. package/template/.hermes/skills/yss-security-algorithm/references/source-index.md +0 -35
  1190. package/template/.hermes/skills/yss-source-index/SKILL.md +0 -63
  1191. package/template/.hermes/skills/yss-source-index/agents/openai.yaml +0 -4
  1192. package/template/.hermes/skills/yss-source-index/scripts/refresh-yss-skill-index.mjs +0 -24
  1193. package/template/.hermes/skills/yss-stage-decision/SKILL.md +0 -51
  1194. package/template/.hermes/skills/yss-stage-decision/references/domain-strategy-contract.md +0 -26
  1195. package/template/.hermes/skills/yss-stage-decision/references/domain-strategy.schema.json +0 -128
  1196. package/template/.hermes/skills/yss-stage-decision/references/stage-decision-package-contract.md +0 -19
  1197. package/template/.hermes/skills/yss-stage-decision/references/stage-decision-package.schema.json +0 -86
  1198. package/template/.hermes/skills/yss-stage-decision/references/validation-rules.md +0 -18
  1199. package/template/.hermes/skills/yss-stage-decision/scripts/validate-domain-strategy.mjs +0 -169
  1200. package/template/.hermes/skills/yss-stage-decision/scripts/validate-stage-decision-package.mjs +0 -100
  1201. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/domain-strategy-approval.yaml +0 -15
  1202. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/invalid-direction.yaml +0 -58
  1203. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/invalid-stage-decision-blocker.yaml +0 -44
  1204. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/stage-decision-approval.yaml +0 -15
  1205. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/valid-stage-decision-package.yaml +0 -49
  1206. package/template/.hermes/skills/yss-stage-decision/tests/fixtures/valid-supplier-domain.yaml +0 -108
  1207. package/template/.hermes/skills/yss-stage-decision/tests/run-scenarios.mjs +0 -68
  1208. package/template/.hermes/skills/yss-tactical-design/SKILL.md +0 -35
  1209. package/template/.hermes/skills/yss-tactical-design/agents/openai.yaml +0 -4
  1210. package/template/.hermes/skills/yss-tactical-design/references/output-template.md +0 -28
  1211. package/template/.hermes/skills/yss-tactical-design/references/tactical-design-contract.md +0 -41
  1212. package/template/.hermes/skills/yss-tactical-design/references/tactical-design.schema.json +0 -31
  1213. package/template/.hermes/skills/yss-tactical-design/references/validation-rules.md +0 -13
  1214. package/template/.hermes/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +0 -213
  1215. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/invalid-api-leaks-aggregate.yaml +0 -21
  1216. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/invalid-missing-consistency-policy.yaml +0 -21
  1217. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/invalid-missing-invariant.yaml +0 -21
  1218. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/invalid-stale-upstream-ref.yaml +0 -21
  1219. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/invalid-strategic-as-tactical.yaml +0 -21
  1220. package/template/.hermes/skills/yss-tactical-design/tests/fixtures/valid-tactical-design.yaml +0 -80
  1221. package/template/.hermes/skills/yss-tactical-design/tests/run-scenarios.mjs +0 -47
  1222. package/template/.hermes/skills/yss-ui/SKILL.md +0 -170
  1223. package/template/.hermes/skills/yss-ui/agents/openai.yaml +0 -5
  1224. package/template/.hermes/skills/yss-ui/assets/demos/button/auth-basic.vue +0 -24
  1225. package/template/.hermes/skills/yss-ui/assets/demos/button/auth-dropdown.vue +0 -29
  1226. package/template/.hermes/skills/yss-ui/assets/demos/button/permission.vue +0 -10
  1227. package/template/.hermes/skills/yss-ui/assets/demos/button/size.vue +0 -12
  1228. package/template/.hermes/skills/yss-ui/assets/demos/button/states.vue +0 -12
  1229. package/template/.hermes/skills/yss-ui/assets/demos/card/basic/index.vue +0 -54
  1230. package/template/.hermes/skills/yss-ui/assets/demos/card/basic/style.less +0 -41
  1231. package/template/.hermes/skills/yss-ui/assets/demos/card/cover/index.vue +0 -25
  1232. package/template/.hermes/skills/yss-ui/assets/demos/card/flexible-layout/index.vue +0 -122
  1233. package/template/.hermes/skills/yss-ui/assets/demos/card/flexible-layout/style.less +0 -191
  1234. package/template/.hermes/skills/yss-ui/assets/demos/card/header-extra/index.vue +0 -260
  1235. package/template/.hermes/skills/yss-ui/assets/demos/card/header-extra/style.less +0 -124
  1236. package/template/.hermes/skills/yss-ui/assets/demos/card/layout-metrics/constants.ts +0 -61
  1237. package/template/.hermes/skills/yss-ui/assets/demos/card/layout-metrics/index.vue +0 -72
  1238. package/template/.hermes/skills/yss-ui/assets/demos/card/layout-metrics/metrics-cards.vue +0 -70
  1239. package/template/.hermes/skills/yss-ui/assets/demos/card/layout-metrics/style.less +0 -232
  1240. package/template/.hermes/skills/yss-ui/assets/demos/card/loading/index.vue +0 -19
  1241. package/template/.hermes/skills/yss-ui/assets/demos/card/meta/index.vue +0 -19
  1242. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/basic/constants.ts +0 -44
  1243. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/basic/hooks/useConditionBasic.ts +0 -18
  1244. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/basic/index.vue +0 -100
  1245. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/linked/constants.ts +0 -51
  1246. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/linked/hooks/useConditionLinked.ts +0 -29
  1247. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/linked/index.vue +0 -23
  1248. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/nesting-between/constants.ts +0 -35
  1249. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/nesting-between/hooks/useConditionNesting.ts +0 -25
  1250. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/nesting-between/index.vue +0 -24
  1251. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/remote/constants.ts +0 -7
  1252. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/remote/hooks/useConditionRemote.ts +0 -75
  1253. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/remote/index.vue +0 -23
  1254. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation/constants.ts +0 -42
  1255. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation/hooks/useConditionBasic.ts +0 -22
  1256. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation/index.vue +0 -138
  1257. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation-custom/constants.ts +0 -42
  1258. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation-custom/hooks/useConditionBasic.ts +0 -22
  1259. package/template/.hermes/skills/yss-ui/assets/demos/condition-builder/validation-custom/index.vue +0 -134
  1260. package/template/.hermes/skills/yss-ui/assets/demos/cron/basic/index.vue +0 -54
  1261. package/template/.hermes/skills/yss-ui/assets/demos/cron/select/index.vue +0 -145
  1262. package/template/.hermes/skills/yss-ui/assets/demos/echarts/basic.vue +0 -30
  1263. package/template/.hermes/skills/yss-ui/assets/demos/echarts/calendar-heatmap.vue +0 -49
  1264. package/template/.hermes/skills/yss-ui/assets/demos/echarts/candlestick.vue +0 -30
  1265. package/template/.hermes/skills/yss-ui/assets/demos/echarts/dark.vue +0 -40
  1266. package/template/.hermes/skills/yss-ui/assets/demos/echarts/expose-methods.vue +0 -97
  1267. package/template/.hermes/skills/yss-ui/assets/demos/echarts/funnel.vue +0 -42
  1268. package/template/.hermes/skills/yss-ui/assets/demos/echarts/gauge.vue +0 -25
  1269. package/template/.hermes/skills/yss-ui/assets/demos/echarts/line.vue +0 -24
  1270. package/template/.hermes/skills/yss-ui/assets/demos/echarts/mix.vue +0 -33
  1271. package/template/.hermes/skills/yss-ui/assets/demos/echarts/pie.vue +0 -34
  1272. package/template/.hermes/skills/yss-ui/assets/demos/echarts/radar.vue +0 -38
  1273. package/template/.hermes/skills/yss-ui/assets/demos/echarts/ring-segment.vue +0 -77
  1274. package/template/.hermes/skills/yss-ui/assets/demos/echarts/scatter.vue +0 -23
  1275. package/template/.hermes/skills/yss-ui/assets/demos/echarts/stacked-area.vue +0 -55
  1276. package/template/.hermes/skills/yss-ui/assets/demos/echarts/stacked-bar.vue +0 -52
  1277. package/template/.hermes/skills/yss-ui/assets/demos/echarts/treemap.vue +0 -30
  1278. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/all-types/hooks/useAllTypes.ts +0 -259
  1279. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/all-types/index.vue +0 -33
  1280. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/async-remote/hooks/useAsyncRemote.ts +0 -201
  1281. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/async-remote/index.vue +0 -45
  1282. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/basic/index.vue +0 -104
  1283. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/big-data/index.vue +0 -82
  1284. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/custom-rule/index.vue +0 -114
  1285. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/direct-editable/index.vue +0 -94
  1286. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/drag/index.vue +0 -125
  1287. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/filter/index.vue +0 -107
  1288. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/linkage/index.vue +0 -181
  1289. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/pagination-action/index.vue +0 -131
  1290. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/required/index.vue +0 -95
  1291. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/row-edit/index.vue +0 -220
  1292. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/row-options/index.vue +0 -165
  1293. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/slot-linkage/index.vue +0 -184
  1294. package/template/.hermes/skills/yss-ui/assets/demos/edit-table/submit-view/index.vue +0 -107
  1295. package/template/.hermes/skills/yss-ui/assets/demos/file-import/basic.vue +0 -54
  1296. package/template/.hermes/skills/yss-ui/assets/demos/file-import/formily.vue +0 -42
  1297. package/template/.hermes/skills/yss-ui/assets/demos/file-import/multiple.vue +0 -33
  1298. package/template/.hermes/skills/yss-ui/assets/demos/file-import/result-slot.vue +0 -30
  1299. package/template/.hermes/skills/yss-ui/assets/demos/formily/actions.vue +0 -61
  1300. package/template/.hermes/skills/yss-ui/assets/demos/formily/align.vue +0 -56
  1301. package/template/.hermes/skills/yss-ui/assets/demos/formily/async-validate.vue +0 -69
  1302. package/template/.hermes/skills/yss-ui/assets/demos/formily/basic.vue +0 -317
  1303. package/template/.hermes/skills/yss-ui/assets/demos/formily/collapse.vue +0 -104
  1304. package/template/.hermes/skills/yss-ui/assets/demos/formily/custom-component.vue +0 -75
  1305. package/template/.hermes/skills/yss-ui/assets/demos/formily/disabled.vue +0 -71
  1306. package/template/.hermes/skills/yss-ui/assets/demos/formily/dynamic-array.vue +0 -74
  1307. package/template/.hermes/skills/yss-ui/assets/demos/formily/dynamic.vue +0 -59
  1308. package/template/.hermes/skills/yss-ui/assets/demos/formily/effects.vue +0 -117
  1309. package/template/.hermes/skills/yss-ui/assets/demos/formily/events-inline.vue +0 -82
  1310. package/template/.hermes/skills/yss-ui/assets/demos/formily/events-scope.vue +0 -101
  1311. package/template/.hermes/skills/yss-ui/assets/demos/formily/grid.vue +0 -71
  1312. package/template/.hermes/skills/yss-ui/assets/demos/formily/group.vue +0 -102
  1313. package/template/.hermes/skills/yss-ui/assets/demos/formily/helper-slot.vue +0 -50
  1314. package/template/.hermes/skills/yss-ui/assets/demos/formily/label-tip.vue +0 -42
  1315. package/template/.hermes/skills/yss-ui/assets/demos/formily/linkage-multi.vue +0 -127
  1316. package/template/.hermes/skills/yss-ui/assets/demos/formily/linkage.vue +0 -78
  1317. package/template/.hermes/skills/yss-ui/assets/demos/formily/modes.vue +0 -72
  1318. package/template/.hermes/skills/yss-ui/assets/demos/formily/remote-enum.vue +0 -88
  1319. package/template/.hermes/skills/yss-ui/assets/demos/formily/slot.vue +0 -54
  1320. package/template/.hermes/skills/yss-ui/assets/demos/formily/steps.vue +0 -135
  1321. package/template/.hermes/skills/yss-ui/assets/demos/formily/submit-failed.vue +0 -72
  1322. package/template/.hermes/skills/yss-ui/assets/demos/monaco/basic.vue +0 -40
  1323. package/template/.hermes/skills/yss-ui/assets/demos/monaco/diff-basic.vue +0 -143
  1324. package/template/.hermes/skills/yss-ui/assets/demos/monaco/fullscreen.vue +0 -84
  1325. package/template/.hermes/skills/yss-ui/assets/demos/monaco/history-log-viewer.vue +0 -586
  1326. package/template/.hermes/skills/yss-ui/assets/demos/monaco/log-viewer.vue +0 -260
  1327. package/template/.hermes/skills/yss-ui/assets/demos/monaco/mock/mockLogApi.ts +0 -199
  1328. package/template/.hermes/skills/yss-ui/assets/demos/monaco/monaco.vue +0 -66
  1329. package/template/.hermes/skills/yss-ui/assets/demos/monaco/readonly.vue +0 -20
  1330. package/template/.hermes/skills/yss-ui/assets/demos/monaco/resizable.vue +0 -22
  1331. package/template/.hermes/skills/yss-ui/assets/demos/monaco/sql-schema.vue +0 -20
  1332. package/template/.hermes/skills/yss-ui/assets/demos/monaco/switch-lang-theme.vue +0 -48
  1333. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table/constant.ts +0 -18
  1334. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table/index.vue +0 -60
  1335. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table/style.less +0 -39
  1336. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table-layout/hooks/useTreeTable.ts +0 -158
  1337. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table-layout/index.vue +0 -88
  1338. package/template/.hermes/skills/yss-ui/assets/demos/split-pane/tree-table-layout/style.less +0 -73
  1339. package/template/.hermes/skills/yss-ui/assets/demos/table/action/index.vue +0 -83
  1340. package/template/.hermes/skills/yss-ui/assets/demos/table/action/style.less +0 -3
  1341. package/template/.hermes/skills/yss-ui/assets/demos/table/action-auth/index.vue +0 -41
  1342. package/template/.hermes/skills/yss-ui/assets/demos/table/action-slot/index.vue +0 -62
  1343. package/template/.hermes/skills/yss-ui/assets/demos/table/action-slot/style.less +0 -36
  1344. package/template/.hermes/skills/yss-ui/assets/demos/table/basic/hooks/useBasicTable.ts +0 -205
  1345. package/template/.hermes/skills/yss-ui/assets/demos/table/basic/index.vue +0 -89
  1346. package/template/.hermes/skills/yss-ui/assets/demos/table/basic/style.less +0 -28
  1347. package/template/.hermes/skills/yss-ui/assets/demos/table/column-custom-search/hooks/useColumnCustomSearch.ts +0 -236
  1348. package/template/.hermes/skills/yss-ui/assets/demos/table/column-custom-search/index.vue +0 -141
  1349. package/template/.hermes/skills/yss-ui/assets/demos/table/column-custom-search/style.less +0 -48
  1350. package/template/.hermes/skills/yss-ui/assets/demos/table/drag/index.vue +0 -42
  1351. package/template/.hermes/skills/yss-ui/assets/demos/table/expand/action-expand.vue +0 -142
  1352. package/template/.hermes/skills/yss-ui/assets/demos/table/expand/index.vue +0 -35
  1353. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-async/index.vue +0 -93
  1354. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-auto/index.vue +0 -99
  1355. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-custom/index.vue +0 -72
  1356. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-local/index.vue +0 -112
  1357. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-mixed/index.vue +0 -142
  1358. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-remote/constant.ts +0 -129
  1359. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-remote/hooks/useTableData.ts +0 -186
  1360. package/template/.hermes/skills/yss-ui/assets/demos/table/filter-remote/index.vue +0 -73
  1361. package/template/.hermes/skills/yss-ui/assets/demos/table/group-header/index.vue +0 -86
  1362. package/template/.hermes/skills/yss-ui/assets/demos/table/group-header/style.less +0 -3
  1363. package/template/.hermes/skills/yss-ui/assets/demos/table/header-height/index.vue +0 -29
  1364. package/template/.hermes/skills/yss-ui/assets/demos/table/header-height/style.less +0 -9
  1365. package/template/.hermes/skills/yss-ui/assets/demos/table/merge-cells/hooks/useMergeCells.ts +0 -183
  1366. package/template/.hermes/skills/yss-ui/assets/demos/table/merge-cells/index.vue +0 -17
  1367. package/template/.hermes/skills/yss-ui/assets/demos/table/merge-cells/style.less +0 -3
  1368. package/template/.hermes/skills/yss-ui/assets/demos/table/pagination-remote/hooks/usePaginationRemote.ts +0 -106
  1369. package/template/.hermes/skills/yss-ui/assets/demos/table/pagination-remote/index.vue +0 -24
  1370. package/template/.hermes/skills/yss-ui/assets/demos/table/renderers/index.vue +0 -64
  1371. package/template/.hermes/skills/yss-ui/assets/demos/table/selection-checkbox/index.vue +0 -88
  1372. package/template/.hermes/skills/yss-ui/assets/demos/table/selection-checkbox/style.less +0 -9
  1373. package/template/.hermes/skills/yss-ui/assets/demos/table/selection-radio/index.vue +0 -57
  1374. package/template/.hermes/skills/yss-ui/assets/demos/table/selection-radio/style.less +0 -9
  1375. package/template/.hermes/skills/yss-ui/assets/demos/table/transform/index.vue +0 -32
  1376. package/template/.hermes/skills/yss-ui/assets/demos/tree/basic-left/index.vue +0 -124
  1377. package/template/.hermes/skills/yss-ui/assets/demos/tree/datasource-group/index.vue +0 -31
  1378. package/template/.hermes/skills/yss-ui/assets/demos/tree/multi-checkable/index.vue +0 -86
  1379. package/template/.hermes/skills/yss-ui/assets/demos/tree/multiple-select/index.vue +0 -76
  1380. package/template/.hermes/skills/yss-ui/assets/demos/tree/resource-list/index.vue +0 -41
  1381. package/template/.hermes/skills/yss-ui/assets/demos/tree/search-toolbar/index.vue +0 -156
  1382. package/template/.hermes/skills/yss-ui/assets/demos/tree/slot-icon/index.vue +0 -36
  1383. package/template/.hermes/skills/yss-ui/assets/demos/tree/slot-switcher-icon/index.vue +0 -34
  1384. package/template/.hermes/skills/yss-ui/assets/docs/components/button.md +0 -79
  1385. package/template/.hermes/skills/yss-ui/assets/docs/components/card.md +0 -162
  1386. package/template/.hermes/skills/yss-ui/assets/docs/components/conditionBuilder.md +0 -114
  1387. package/template/.hermes/skills/yss-ui/assets/docs/components/cron.md +0 -77
  1388. package/template/.hermes/skills/yss-ui/assets/docs/components/echarts.md +0 -110
  1389. package/template/.hermes/skills/yss-ui/assets/docs/components/editTable.md +0 -212
  1390. package/template/.hermes/skills/yss-ui/assets/docs/components/fileImport.md +0 -85
  1391. package/template/.hermes/skills/yss-ui/assets/docs/components/formily.md +0 -370
  1392. package/template/.hermes/skills/yss-ui/assets/docs/components/monaco.md +0 -369
  1393. package/template/.hermes/skills/yss-ui/assets/docs/components/sheet.md +0 -169
  1394. package/template/.hermes/skills/yss-ui/assets/docs/components/split-pane.md +0 -45
  1395. package/template/.hermes/skills/yss-ui/assets/docs/components/table.md +0 -398
  1396. package/template/.hermes/skills/yss-ui/assets/docs/components/tree.md +0 -102
  1397. package/template/.hermes/skills/yss-ui/assets/docs/guide/gitlab-ci-integration.md +0 -166
  1398. package/template/.hermes/skills/yss-ui/assets/docs/guide/index.md +0 -132
  1399. package/template/.hermes/skills/yss-ui/assets/docs/guide/installation.md +0 -97
  1400. package/template/.hermes/skills/yss-ui/assets/docs/guide/jsp.md +0 -227
  1401. package/template/.hermes/skills/yss-ui/assets/docs/guide/llms.md +0 -295
  1402. package/template/.hermes/skills/yss-ui/assets/docs/guide/monorepo-versioning.md +0 -149
  1403. package/template/.hermes/skills/yss-ui/assets/docs/guide/release-workflow.md +0 -251
  1404. package/template/.hermes/skills/yss-ui/assets/docs/hooks/use-table-height.md +0 -101
  1405. package/template/.hermes/skills/yss-ui/assets/docs/hooks/use-tree-height.md +0 -115
  1406. package/template/.hermes/skills/yss-ui/assets/docs/hooks/useFullscreen.md +0 -130
  1407. package/template/.hermes/skills/yss-ui/assets/docs/hooks/useLoading.md +0 -97
  1408. package/template/.hermes/skills/yss-ui/assets/docs/root/resources.md +0 -18
  1409. package/template/.hermes/skills/yss-ui/assets/keyword-index.json +0 -53
  1410. package/template/.hermes/skills/yss-ui/assets/keyword-index.md +0 -47
  1411. package/template/.hermes/skills/yss-ui/assets/reference-index.json +0 -55
  1412. package/template/.hermes/skills/yss-ui/assets/reference-index.md +0 -74
  1413. package/template/.hermes/skills/yss-ui/assets/scenario-index.json +0 -50
  1414. package/template/.hermes/skills/yss-ui/assets/scenario-index.md +0 -41
  1415. package/template/.hermes/skills/yss-ui/references/accessibility.md +0 -23
  1416. package/template/.hermes/skills/yss-ui/references/antdv-compatibility.md +0 -39
  1417. package/template/.hermes/skills/yss-ui/references/checklist.md +0 -110
  1418. package/template/.hermes/skills/yss-ui/references/component-routing.md +0 -31
  1419. package/template/.hermes/skills/yss-ui/references/frontend-docs.md +0 -11
  1420. package/template/.hermes/skills/yss-ui/references/migration-antdv-to-yss.md +0 -20
  1421. package/template/.hermes/skills/yss-ui/references/quick-recipes.md +0 -280
  1422. package/template/.hermes/skills/yss-ui/references/theme-locale-overlay.md +0 -25
  1423. package/template/.hermes/skills/yss-ui/references/verification.md +0 -20
  1424. package/template/.hermes/skills/yss-ui-business-page-generation/SKILL.md +0 -159
  1425. package/template/.hermes/skills/yss-ui-business-page-generation/references/component-map.md +0 -39
  1426. package/template/.hermes/skills/yss-ui-business-page-generation/references/hooks-map.md +0 -70
  1427. package/template/.hermes/skills/yss-ui-business-page-generation/references/utils-map.md +0 -51
  1428. package/template/.hermes/skills/yss-up-springboot3/SKILL.md +0 -40
  1429. package/template/.hermes/skills/yss-up-springboot3/agents/openai.yaml +0 -4
  1430. package/template/.hermes/skills/yss-use-table-height/SKILL.md +0 -130
  1431. package/template/.hermes/skills/yss-use-table-height/agents/openai.yaml +0 -5
  1432. package/template/.hermes/skills/yss-use-table-height/references/frontend-docs.md +0 -9
  1433. package/template/.hermes/skills/yss-use-tree-height/SKILL.md +0 -98
  1434. package/template/.hermes/skills/yss-use-tree-height/agents/openai.yaml +0 -5
  1435. package/template/.hermes/skills/yss-use-tree-height/references/frontend-docs.md +0 -9
  1436. package/template/.hermes/skills/yss-userinfo/SKILL.md +0 -49
  1437. package/template/.hermes/skills/yss-userinfo/agents/openai.yaml +0 -4
  1438. package/template/.hermes/skills/yss-userinfo/references/source-index.md +0 -34
  1439. package/template/.hermes/skills/yss-validation/SKILL.md +0 -56
  1440. package/template/.hermes/skills/yss-validation/agents/openai.yaml +0 -4
  1441. package/template/.hermes/skills/yss-validation/references/source-index.md +0 -33
  1442. package/template/.hermes/skills/yss-web-controller/SKILL.md +0 -85
  1443. package/template/.hermes/skills/yss-web-controller/agents/openai.yaml +0 -5
  1444. package/template/.hermes/skills/yss-web-controller/assets/templates/Controller.java.template +0 -72
  1445. package/template/.hermes/skills/yss-web-controller/assets/templates/WebConvertor.java.template +0 -30
  1446. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +0 -19
  1447. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +0 -21
  1448. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +0 -18
  1449. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +0 -19
  1450. package/template/.hermes/skills/yss-web-controller/references/web-adapter-layer-guide.md +0 -86
  1451. package/template/.hermes/skills/yss-web-controller/references/web-generation-contract.schema.json +0 -97
  1452. package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.mjs +0 -226
  1453. package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.test.mjs +0 -156
  1454. package/template/.hermes/skills/ytable-usage/SKILL.md +0 -251
  1455. package/template/.hermes/skills/ytree-usage/SKILL.md +0 -132
  1456. package/template/.kiro/settings/mcp.json +0 -8
  1457. package/template/.pi/skills/yss-router/SKILL.md +0 -51
  1458. package/template/.pi/skills/yss-router/agents/openai.yaml +0 -4
  1459. package/template/.pi/skills/yss-router/references/boundaries.md +0 -50
  1460. package/template/.pi/skills/yss-router/references/router-contract.yaml +0 -349
  1461. package/template/.pi/skills/yss-router/references/slice-implementation-contract.md +0 -185
  1462. package/template/.pi/skills/yss-router/references/yss-skill-execution-result.md +0 -67
  1463. package/template/.pi/skills/yss-source-index/SKILL.md +0 -63
  1464. package/template/.pi/skills/yss-source-index/agents/openai.yaml +0 -4
  1465. package/template/.pi/skills/yss-source-index/scripts/refresh-yss-skill-index.mjs +0 -24
  1466. package/template/.qoder/skills/yss-router/SKILL.md +0 -51
  1467. package/template/.qoder/skills/yss-router/agents/openai.yaml +0 -4
  1468. package/template/.qoder/skills/yss-router/references/boundaries.md +0 -50
  1469. package/template/.qoder/skills/yss-router/references/router-contract.yaml +0 -349
  1470. package/template/.qoder/skills/yss-router/references/slice-implementation-contract.md +0 -185
  1471. package/template/.qoder/skills/yss-router/references/yss-skill-execution-result.md +0 -67
  1472. package/template/.qoder/skills/yss-source-index/SKILL.md +0 -63
  1473. package/template/.qoder/skills/yss-source-index/agents/openai.yaml +0 -4
  1474. package/template/.qoder/skills/yss-source-index/scripts/refresh-yss-skill-index.mjs +0 -24
  1475. package/template/.trae/skills/yss-router/SKILL.md +0 -51
  1476. package/template/.trae/skills/yss-router/agents/openai.yaml +0 -4
  1477. package/template/.trae/skills/yss-router/references/boundaries.md +0 -50
  1478. package/template/.trae/skills/yss-router/references/router-contract.yaml +0 -349
  1479. package/template/.trae/skills/yss-router/references/slice-implementation-contract.md +0 -185
  1480. package/template/.trae/skills/yss-router/references/yss-skill-execution-result.md +0 -67
  1481. package/template/.trae/skills/yss-source-index/SKILL.md +0 -63
  1482. package/template/.trae/skills/yss-source-index/agents/openai.yaml +0 -4
  1483. package/template/.trae/skills/yss-source-index/references/source-location.md +0 -18
  1484. package/template/.trae/skills/yss-source-index/references/source-map-config.md +0 -30
  1485. package/template/.trae/skills/yss-source-index/scripts/refresh-yss-skill-index.mjs +0 -24
  1486. package/template/.trae/skills/yss-source-index/scripts/refresh-yss-skill-index.test.mjs +0 -15
  1487. package/template/scripts/verify-yss-router-scenarios +0 -3
  1488. /package/template/.agents/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1489. /package/template/.agents/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1490. /package/template/.agents/skills/{yss-source-index → yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1491. /package/template/.claude/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1492. /package/template/.claude/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1493. /package/template/.claude/skills/{yss-source-index → yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1494. /package/template/.codex/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1495. /package/template/.codex/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1496. /package/template/.codex/skills/{yss-source-index → yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1497. /package/template/.cursor/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1498. /package/template/.cursor/skills/{yss-source-index → yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1499. /package/template/.cursor/skills/{yss-source-index → yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1500. /package/template/{.hermes/skills/yss-source-index → .pi/skills/yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1501. /package/template/{.hermes/skills/yss-source-index → .pi/skills/yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1502. /package/template/{.hermes/skills/yss-source-index → .pi/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1503. /package/template/{.pi/skills/yss-source-index → .qoder/skills/yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1504. /package/template/{.pi/skills/yss-source-index → .qoder/skills/yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1505. /package/template/{.pi/skills/yss-source-index → .qoder/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
  1506. /package/template/{.qoder/skills/yss-source-index → .trae/skills/yss-skill-source-index-refresh}/references/source-location.md +0 -0
  1507. /package/template/{.qoder/skills/yss-source-index → .trae/skills/yss-skill-source-index-refresh}/references/source-map-config.md +0 -0
  1508. /package/template/{.qoder/skills/yss-source-index → .trae/skills/yss-skill-source-index-refresh}/scripts/refresh-yss-skill-index.test.mjs +0 -0
@@ -1,2135 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
-
4
- import { compileWorkflow } from '../renderers/workflow/workflow-compiler.mjs';
5
-
6
- function clone(value) {
7
- return JSON.parse(JSON.stringify(value));
8
- }
9
-
10
- function workflow({ lanes, nodes, edges }) {
11
- return {
12
- schema_version: 2,
13
- diagram_type: 'workflow',
14
- meta: {
15
- title: 'Workflow compiler hard-contract fixture',
16
- legend: { mode: 'hidden' },
17
- },
18
- lanes,
19
- nodes,
20
- edges,
21
- };
22
- }
23
-
24
- function oneLaneWorkflow(edges) {
25
- return workflow({
26
- lanes: [{ id: 'main', label: 'M' }],
27
- nodes: [
28
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
29
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
30
- ],
31
- edges,
32
- });
33
- }
34
-
35
- function nestedOutsideRightCorridorWorkflow() {
36
- return workflow({
37
- lanes: [0, 1, 2, 3].map((index) => ({ id: `l${index}`, label: `Lane ${index}` })),
38
- nodes: [
39
- { id: 'outer-from', lane: 'l0', col: 0, type: 'backend', label: 'Outer from' },
40
- { id: 'inner-from', lane: 'l1', col: 0, type: 'backend', label: 'Inner from' },
41
- { id: 'inner-to', lane: 'l2', col: 2, type: 'database', label: 'Inner to' },
42
- { id: 'outer-to', lane: 'l3', col: 2, type: 'database', label: 'Outer to' },
43
- ],
44
- edges: [
45
- {
46
- id: 'outer',
47
- from: 'outer-from',
48
- to: 'outer-to',
49
- route: 'outside-right',
50
- channelX: 800,
51
- fromSide: 'right',
52
- toSide: 'right',
53
- },
54
- {
55
- id: 'inner',
56
- from: 'inner-from',
57
- to: 'inner-to',
58
- route: 'outside-right',
59
- channelX: 800,
60
- fromSide: 'right',
61
- toSide: 'right',
62
- },
63
- ],
64
- });
65
- }
66
-
67
- function crossingAtForwardCollinearViaWorkflow({ pinHorizontal = false } = {}) {
68
- return workflow({
69
- lanes: [
70
- { id: 'top', label: 'Top' },
71
- { id: 'middle', label: 'Middle' },
72
- { id: 'bottom', label: 'Bottom' },
73
- ],
74
- nodes: [
75
- { id: 'left', lane: 'middle', col: 0, type: 'backend', label: 'Left' },
76
- { id: 'right', lane: 'middle', col: 4, type: 'backend', label: 'Right' },
77
- { id: 'above', lane: 'top', col: 2, type: 'backend', label: 'Above' },
78
- { id: 'below', lane: 'bottom', col: 2, type: 'backend', label: 'Below' },
79
- ],
80
- edges: [
81
- {
82
- id: pinHorizontal ? 'a-pinned' : 'a-auto',
83
- from: 'left',
84
- to: 'right',
85
- ...(pinHorizontal ? { via: [[334, 243]] } : {}),
86
- },
87
- {
88
- id: 'z-pinned',
89
- from: 'above',
90
- to: 'below',
91
- via: [[334, 243]],
92
- },
93
- ],
94
- });
95
- }
96
-
97
- function oneLaneAnchors() {
98
- const result = compileWorkflow({ workflow: oneLaneWorkflow([]), qualityProfile: 'standard' });
99
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
100
- const source = result.receipt.nodes.find(({ id }) => id === 'a');
101
- const target = result.receipt.nodes.find(({ id }) => id === 'b');
102
- assert.ok(source && target);
103
- return {
104
- start: [source.x + source.width, source.y + source.height / 2],
105
- end: [target.x, target.y + target.height / 2],
106
- };
107
- }
108
-
109
- function assertExplicitPinConflict(result, context) {
110
- assert.equal(result.ok, false, `${context} must not produce an SVG`);
111
- assert.equal(result.svg, undefined);
112
- assert.ok(Array.isArray(result.diagnostics) && result.diagnostics.length > 0);
113
- assert.ok(
114
- result.diagnostics.some(({ code }) => code === 'workflow/explicit-pin-conflict'),
115
- `${context} must report workflow/explicit-pin-conflict:\n${JSON.stringify(result.diagnostics, null, 2)}`,
116
- );
117
- assert.deepEqual(result.receipt.diagnostics, result.diagnostics);
118
- }
119
-
120
- function assertSupportedFixesNameChangedEdge(diagnostic, edgeIds) {
121
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
122
- for (const fix of diagnostic.supportedFixes) {
123
- assert.ok(
124
- edgeIds.some((edgeId) => fix.includes(`edge "${edgeId}"`)),
125
- `supported fix must name its changed edge (${edgeIds.join(', ')}): ${fix}`,
126
- );
127
- }
128
- }
129
-
130
- function assertOrthogonal(points) {
131
- for (let index = 0; index < points.length - 1; index += 1) {
132
- const [x1, y1] = points[index];
133
- const [x2, y2] = points[index + 1];
134
- assert.ok(x1 === x2 || y1 === y2, `segment ${index} must be orthogonal`);
135
- assert.notDeepEqual(points[index], points[index + 1], `segment ${index} must be non-zero`);
136
- }
137
- }
138
-
139
- function routeContainsChannel(points, field, value) {
140
- return points.slice(0, -1).some((start, index) => {
141
- const end = points[index + 1];
142
- if (field === 'channelX') {
143
- return start[0] === value && end[0] === value && start[1] !== end[1];
144
- }
145
- return start[1] === value && end[1] === value && start[0] !== end[0];
146
- });
147
- }
148
-
149
- function segmentMeetsRect(start, end, rect, clearance = 2) {
150
- const left = rect.x - clearance;
151
- const right = rect.x + rect.width + clearance;
152
- const top = rect.y - clearance;
153
- const bottom = rect.y + rect.height + clearance;
154
- if (start[1] === end[1]) {
155
- return start[1] >= top && start[1] <= bottom
156
- && Math.max(start[0], end[0]) >= left
157
- && Math.min(start[0], end[0]) <= right;
158
- }
159
- if (start[0] === end[0]) {
160
- return start[0] >= left && start[0] <= right
161
- && Math.max(start[1], end[1]) >= top
162
- && Math.min(start[1], end[1]) <= bottom;
163
- }
164
- return true;
165
- }
166
-
167
- test('readable-v2 auto routing selects a feasible corridor around a same-lane obstacle', () => {
168
- const document = workflow({
169
- lanes: [{ id: 'main', label: 'Main' }],
170
- nodes: [
171
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
172
- { id: 'obstacle', lane: 'main', col: 2, type: 'database', label: 'Obstacle' },
173
- { id: 'b', lane: 'main', col: 5, type: 'backend', label: 'B' },
174
- ],
175
- edges: [{ id: 'ab', from: 'a', to: 'b' }],
176
- });
177
-
178
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
179
- assert.equal(
180
- result.ok,
181
- true,
182
- `a feasible automatic corridor must compile:\n${JSON.stringify(result.diagnostics, null, 2)}`,
183
- );
184
-
185
- const points = result.receipt.edges.find(({ id }) => id === 'ab')?.points;
186
- const obstacle = result.receipt.nodes.find(({ id }) => id === 'obstacle');
187
- assert.ok(points && obstacle);
188
- assert.ok(points.length >= 3, 'the route must bend around the intervening node');
189
- assertOrthogonal(points);
190
- for (let index = 0; index < points.length - 1; index += 1) {
191
- assert.equal(
192
- segmentMeetsRect(points[index], points[index + 1], obstacle),
193
- false,
194
- `segment ${index} must clear the unrelated obstacle`,
195
- );
196
- }
197
- });
198
-
199
- test('readable-v2 evaluates automatic endpoint sides against the complete labeled route', () => {
200
- const document = workflow({
201
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
202
- nodes: [
203
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
204
- { id: 'b', lane: 'target', col: 1, type: 'backend', label: 'B' },
205
- ],
206
- edges: [{ id: 'ab', from: 'a', to: 'b', label: 'L'.repeat(50) }],
207
- });
208
-
209
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
210
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
211
- assert.deepEqual(result.receipt.viewBox, [768, 404]);
212
- assert.deepEqual(result.receipt.edges[0].points, [
213
- [94, 145], [94, 166], [214, 166], [214, 217],
214
- ]);
215
- });
216
-
217
- test('readable-v2 retries automatic endpoint sides against already planned routes', () => {
218
- const document = workflow({
219
- lanes: [0, 1, 2].map((index) => ({ id: `l${index}`, label: `Lane ${index}` })),
220
- nodes: [
221
- { id: 'a', lane: 'l0', col: 2, type: 'backend', label: 'A' },
222
- { id: 'b', lane: 'l0', col: 3, type: 'backend', label: 'B', yOffset: -1 },
223
- { id: 'c', lane: 'l2', col: 4, type: 'backend', label: 'C' },
224
- ],
225
- edges: [
226
- { id: 'e0', from: 'a', to: 'b', label: 'L'.repeat(17) },
227
- { id: 'e1', from: 'a', to: 'c' },
228
- ],
229
- });
230
-
231
- const first = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
232
- const second = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
233
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
234
- assert.equal(second.ok, true, JSON.stringify(second.diagnostics, null, 2));
235
- assert.equal(second.svg, first.svg);
236
- assert.equal(JSON.stringify(second.receipt), JSON.stringify(first.receipt));
237
- assertOrthogonal(first.receipt.edges.find(({ id }) => id === 'e1').points);
238
- });
239
-
240
- test('readable-v2 expands an outside corridor for deterministic labeled fan-out', () => {
241
- const document = workflow({
242
- lanes: Array.from({ length: 5 }, (_, index) => ({
243
- id: `l${index}`,
244
- label: `Lane ${index}`,
245
- })),
246
- nodes: [
247
- { id: 'hub', lane: 'l0', col: 0, type: 'backend', label: 'Hub', width: 64 },
248
- { id: 't0', lane: 'l1', col: 2, type: 'external', label: 'T0', width: 160 },
249
- { id: 't1', lane: 'l2', col: 4, type: 'database', label: 'T1', width: 160 },
250
- { id: 't2', lane: 'l3', col: 3, type: 'external', label: 'T2', width: 64 },
251
- { id: 't3', lane: 'l4', col: 4, type: 'database', label: 'T3', width: 120 },
252
- ],
253
- edges: [
254
- { id: 'e0', from: 'hub', to: 't0', label: 'A'.repeat(80) },
255
- { id: 'e1', from: 'hub', to: 't1', label: 'B'.repeat(80) },
256
- { id: 'e2', from: 'hub', to: 't2', label: 'C'.repeat(12) },
257
- { id: 'e3', from: 'hub', to: 't3', label: 'D'.repeat(24) },
258
- ],
259
- });
260
-
261
- const first = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
262
- const second = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
263
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
264
- assert.deepEqual(second, first);
265
- const route = first.receipt.edges.find(({ id }) => id === 'e3')?.points;
266
- assert.ok(route);
267
- assertOrthogonal(route);
268
- assert.ok(
269
- Math.max(...route.map(([x]) => x)) > 764,
270
- `the final fan-out edge must escape the occupied route/label region: ${JSON.stringify(route)}`,
271
- );
272
- });
273
-
274
- test('readable-v2 expands an outside corridor without moving the lane geometry', () => {
275
- const document = workflow({
276
- lanes: Array.from({ length: 5 }, (_, index) => ({
277
- id: `l${index}`,
278
- label: `Lane ${index}`,
279
- })),
280
- nodes: [
281
- { id: 'hub', lane: 'l0', col: 1, type: 'backend', label: 'Hub', width: 92 },
282
- { id: 't0', lane: 'l1', col: 2, type: 'external', label: 'T0', width: 120 },
283
- { id: 't1', lane: 'l2', col: 1, type: 'database', label: 'T1', width: 160 },
284
- { id: 't2', lane: 'l3', col: 1, type: 'external', label: 'T2', width: 120 },
285
- { id: 't3', lane: 'l4', col: 2, type: 'database', label: 'T3', width: 120 },
286
- ],
287
- edges: [
288
- { id: 'e0', from: 'hub', to: 't0', label: 'A'.repeat(120) },
289
- { id: 'e1', from: 'hub', to: 't1', label: 'B'.repeat(48) },
290
- { id: 'e2', from: 'hub', to: 't2', label: 'C'.repeat(24) },
291
- { id: 'e3', from: 'hub', to: 't3', label: 'D'.repeat(84) },
292
- ],
293
- });
294
-
295
- const first = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
296
- const second = compileWorkflow({ workflow: clone(document), qualityProfile: 'showcase' });
297
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
298
- assert.deepEqual(second, first);
299
- const route = first.receipt.edges.find(({ id }) => id === 'e3')?.points;
300
- assert.ok(route);
301
- assertOrthogonal(route);
302
- assert.ok(Math.max(...route.map(([x]) => x)) > 1200, JSON.stringify(route));
303
- assert.ok(first.receipt.viewBox[0] < 1400, JSON.stringify(first.receipt.viewBox));
304
- });
305
-
306
- test('readable-v2 may expand an unlabeled edge around already placed labels', () => {
307
- const document = workflow({
308
- lanes: Array.from({ length: 4 }, (_, index) => ({
309
- id: `l${index}`,
310
- label: `Lane ${index}`,
311
- })),
312
- nodes: [
313
- { id: 'hub', lane: 'l0', col: 0, type: 'backend', label: 'Hub', width: 120 },
314
- { id: 't0', lane: 'l1', col: 1, type: 'backend', label: 'T0', width: 92, yOffset: -4 },
315
- { id: 't1', lane: 'l2', col: 3, type: 'backend', label: 'T1', width: 92, yOffset: 4 },
316
- { id: 't2', lane: 'l3', col: 1, type: 'external', label: 'T2', width: 120, yOffset: -4 },
317
- { id: 't3', lane: 'l1', col: 5, type: 'backend', label: 'T3', width: 92, yOffset: -12 },
318
- { id: 't4', lane: 'l2', col: 1, type: 'backend', label: 'T4', width: 120, yOffset: -12 },
319
- ],
320
- edges: [
321
- { id: 'e00', from: 'hub', to: 't0', label: 'Z'.repeat(80) },
322
- { id: 'e01', from: 'hub', to: 't1', label: 'Q'.repeat(120) },
323
- { id: 'e02', from: 'hub', to: 't2', label: 'Q'.repeat(120) },
324
- { id: 'e03', from: 'hub', to: 't3', label: 'Z'.repeat(80) },
325
- { id: 'e04', from: 'hub', to: 't4' },
326
- ],
327
- });
328
-
329
- const first = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
330
- const second = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
331
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
332
- assert.deepEqual(second, first);
333
- const route = first.receipt.edges.find(({ id }) => id === 'e04')?.points;
334
- assert.ok(route);
335
- assertOrthogonal(route);
336
- assert.ok(Math.max(...route.map(([x]) => x)) > 764, JSON.stringify(route));
337
-
338
- const boundedDocument = clone(document);
339
- boundedDocument.meta.viewBox = [1378, 692];
340
- const bounded = compileWorkflow({ workflow: boundedDocument, qualityProfile: 'standard' });
341
- assert.equal(bounded.ok, true, JSON.stringify(bounded.diagnostics, null, 2));
342
- assert.deepEqual(bounded.receipt.viewBox, [1378, 692]);
343
- });
344
-
345
- test('readable-v2 feeds a measured outside-channel constraint back into layout', () => {
346
- const document = workflow({
347
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
348
- nodes: [
349
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
350
- { id: 'b', lane: 'target', col: 0, type: 'backend', label: 'B' },
351
- ],
352
- edges: [{ id: 'ab', from: 'a', to: 'b', label: 'L'.repeat(120) }],
353
- });
354
- document.meta.quality_profile = 'showcase';
355
-
356
- const first = compileWorkflow({ workflow: document });
357
- const second = compileWorkflow({ workflow: clone(document) });
358
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
359
- assert.deepEqual(first.receipt.viewBox, [780, 404]);
360
- assert.deepEqual(first.receipt.requiredViewBox, [780, 404]);
361
- assert.deepEqual(first.receipt.edges[0].points, [
362
- [140, 119], [764, 119], [764, 243], [140, 243],
363
- ]);
364
- assert.deepEqual(
365
- { x: first.receipt.labels[0].x, y: first.receipt.labels[0].y },
366
- { x: 452, y: 109 },
367
- );
368
- assert.equal(second.svg, first.svg);
369
- assert.equal(JSON.stringify(second.receipt), JSON.stringify(first.receipt));
370
- });
371
-
372
- test('readable-v2 feeds a measured adjacent-rank gutter back into layout', () => {
373
- const document = workflow({
374
- lanes: [{ id: 'l0', label: 'Lane 0' }, { id: 'l1', label: 'Lane 1' }],
375
- nodes: [
376
- { id: 'a', lane: 'l0', col: 0, type: 'backend', label: 'A' },
377
- { id: 'obstacle', lane: 'l0', col: 1, type: 'database', label: 'Obstacle' },
378
- { id: 'b', lane: 'l1', col: 1, type: 'backend', label: 'B' },
379
- ],
380
- edges: [{ id: 'ab', from: 'a', to: 'b', fromSide: 'right', toSide: 'left' }],
381
- });
382
-
383
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
384
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
385
- assert.deepEqual(result.receipt.columns.slice(0, 2), [94, 218]);
386
- assert.deepEqual(result.receipt.edges[0].points, [
387
- [140, 119], [156, 119], [156, 243], [172, 243],
388
- ]);
389
- });
390
-
391
- test('readable-v2 feeds a measured lane gap back into layout', () => {
392
- const document = workflow({
393
- lanes: [0, 1, 2].map((index) => ({ id: `l${index}`, label: `Lane ${index}` })),
394
- nodes: [0, 1, 2].map((index) => ({
395
- id: `n${index}`, lane: `l${index}`, col: 5, type: 'backend', label: `N${index}`,
396
- })),
397
- edges: [
398
- {
399
- id: 'e0', from: 'n1', to: 'n2', fromSide: 'bottom', toSide: 'right', label: 'LLLLLLLLLL',
400
- },
401
- {
402
- id: 'e2', from: 'n2', to: 'n1', fromSide: 'left', toSide: 'right', label: 'x',
403
- },
404
- ],
405
- });
406
-
407
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
408
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
409
- assert.deepEqual(result.receipt.columns, [94, 214, 334, 454, 574, 694]);
410
- assert.deepEqual(result.receipt.nodes.map(({ id, y }) => ({ id, y })), [
411
- { id: 'n0', y: 93 }, { id: 'n1', y: 229 }, { id: 'n2', y: 365 },
412
- ]);
413
- assert.deepEqual(result.receipt.edges.map(({ id, points }) => ({ id, points })), [
414
- {
415
- id: 'e0',
416
- points: [[694, 281], [694, 308], [756, 308], [756, 391], [740, 391]],
417
- },
418
- {
419
- id: 'e2',
420
- points: [[648, 391], [632, 391], [632, 172], [756, 172], [756, 255], [740, 255]],
421
- },
422
- ]);
423
- assert.deepEqual(result.receipt.requiredViewBox, [772, 552]);
424
- });
425
-
426
- for (const { name, makeDocument } of [
427
- {
428
- name: 'duplicate authored via points',
429
- makeDocument: () => {
430
- const { start } = oneLaneAnchors();
431
- const pin = [start[0] + 60, start[1]];
432
- return oneLaneWorkflow([{
433
- id: 'ab', from: 'a', to: 'b', via: [pin, [...pin]],
434
- }]);
435
- },
436
- },
437
- {
438
- name: 'diagonal authored via geometry',
439
- makeDocument: () => {
440
- const { start } = oneLaneAnchors();
441
- return oneLaneWorkflow([{
442
- id: 'ab', from: 'a', to: 'b', via: [[start[0] + 60, start[1] + 31]],
443
- }]);
444
- },
445
- },
446
- ]) {
447
- test(`readable-v2 rejects ${name} with a typed explicit-pin diagnostic`, () => {
448
- const result = compileWorkflow({ workflow: makeDocument(), qualityProfile: 'standard' });
449
- assertExplicitPinConflict(result, name);
450
- });
451
- }
452
-
453
- test('readable-v2 duplicate evidence excludes a compatible channel assertion', () => {
454
- const document = oneLaneWorkflow([{
455
- id: 'ab',
456
- from: 'a',
457
- to: 'b',
458
- via: [[200, 119], [200, 180], [200, 180], [260, 180], [260, 119]],
459
- channelY: 180,
460
- }]);
461
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
462
- assertExplicitPinConflict(result, 'duplicate via with compatible channelY');
463
- const diagnostic = result.diagnostics[0];
464
- assert.equal(diagnostic.evidence.invariant, 'non-zero route segments');
465
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
466
- edge: 'ab', field: 'via', path: '/edges/0/via',
467
- value: [[200, 119], [200, 180], [200, 180], [260, 180], [260, 119]],
468
- }]);
469
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
470
- });
471
-
472
- test('readable-v2 obstacle evidence excludes a compatible channel assertion', () => {
473
- const document = workflow({
474
- lanes: [{ id: 'main', label: 'Main' }],
475
- nodes: [
476
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
477
- { id: 'obstacle', lane: 'main', col: 1, type: 'database', label: 'Obstacle' },
478
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
479
- ],
480
- edges: [{
481
- id: 'ab',
482
- from: 'a',
483
- to: 'b',
484
- via: [[156, 119], [156, 180], [200, 180], [200, 119], [276, 119]],
485
- channelY: 180,
486
- }],
487
- });
488
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
489
- assertExplicitPinConflict(result, 'node collision with compatible channelY');
490
- const diagnostic = result.diagnostics[0];
491
- assert.equal(diagnostic.evidence.invariant, 'node clearance');
492
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
493
- edge: 'ab', field: 'via', path: '/edges/0/via',
494
- value: [[156, 119], [156, 180], [200, 180], [200, 119], [276, 119]],
495
- }]);
496
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
497
- });
498
-
499
- test('readable-v2 infers omitted endpoint sides around an authored via', () => {
500
- const expected = [[94, 93], [94, 77], [334, 77], [334, 93]];
501
- for (const qualityProfile of ['standard', 'showcase']) {
502
- for (const sides of [
503
- {},
504
- { fromSide: 'top' },
505
- { toSide: 'top' },
506
- { fromSide: 'top', toSide: 'top' },
507
- ]) {
508
- const document = oneLaneWorkflow([{
509
- id: 'ab', from: 'a', to: 'b', via: [[94, 77], [334, 77]], ...sides,
510
- }]);
511
- const result = compileWorkflow({ workflow: document, qualityProfile });
512
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
513
- assert.deepEqual(result.receipt.edges[0].points, expected);
514
- }
515
- }
516
-
517
- const restricted = oneLaneWorkflow([{
518
- id: 'ab',
519
- from: 'a',
520
- to: 'b',
521
- fromSide: 'right',
522
- via: [[94, 77], [334, 77]],
523
- }]);
524
- assertExplicitPinConflict(
525
- compileWorkflow({ workflow: restricted, qualityProfile: 'standard' }),
526
- 'authored fromSide must remain a hard restriction',
527
- );
528
-
529
- const duplicate = oneLaneWorkflow([{
530
- id: 'ab',
531
- from: 'a',
532
- to: 'b',
533
- via: [[94, 77], [94, 77], [334, 77]],
534
- }]);
535
- const duplicateResult = compileWorkflow({ workflow: duplicate, qualityProfile: 'standard' });
536
- assertExplicitPinConflict(duplicateResult, 'inferred top ports around duplicate via geometry');
537
- assert.equal(duplicateResult.diagnostics[0].evidence.invariant, 'non-zero route segments');
538
- assert.deepEqual(duplicateResult.diagnostics[0].evidence.from, [94, 77]);
539
- assert.deepEqual(duplicateResult.diagnostics[0].evidence.to, [94, 77]);
540
- });
541
-
542
- test('readable-v2 reports an infeasible authored target side with its verified single-pin repair', () => {
543
- const document = workflow({
544
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
545
- nodes: [
546
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
547
- { id: 'b', lane: 'bottom', col: 0, type: 'backend', label: 'B' },
548
- ],
549
- edges: [{ id: 'ab', from: 'a', to: 'b', toSide: 'top' }],
550
- });
551
- document.groups = [{
552
- id: 'g', label: 'Very long group label', lane: 'bottom', fromCol: 0, toCol: 0,
553
- }];
554
-
555
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
556
-
557
- assert.equal(result.ok, false);
558
- assert.equal(result.svg, undefined);
559
- assert.equal(result.diagnostics.length, 1, JSON.stringify(result.diagnostics, null, 2));
560
- const [diagnostic] = result.diagnostics;
561
- assert.equal(diagnostic.code, 'workflow/explicit-pin-conflict');
562
- assert.deepEqual(diagnostic.subject, {
563
- diagramType: 'workflow',
564
- edge: 'ab',
565
- from: 'a',
566
- to: 'b',
567
- path: '/edges/0/toSide',
568
- });
569
- assert.equal(
570
- diagnostic.evidence.invariant,
571
- 'readable route feasibility with authored endpoint sides',
572
- );
573
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
574
- edge: 'ab',
575
- field: 'toSide',
576
- path: '/edges/0/toSide',
577
- value: 'top',
578
- }]);
579
- assert.deepEqual(diagnostic.supportedFixes, [
580
- 'remove toSide from edge "ab" so readable-v2 can replan the remaining endpoint-side pins',
581
- ]);
582
- assert.deepEqual(result.receipt.diagnostics, result.diagnostics);
583
-
584
- const repaired = clone(document);
585
- delete repaired.edges[0].toSide;
586
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'showcase' });
587
- assert.equal(verified.ok, true, JSON.stringify(verified.diagnostics, null, 2));
588
- });
589
-
590
- test('readable-v2 reports via and fromSide as a minimal conflict with two verified repairs', () => {
591
- const document = oneLaneWorkflow([{
592
- id: 'ab',
593
- from: 'a',
594
- to: 'b',
595
- fromSide: 'right',
596
- toSide: 'top',
597
- via: [[20, 119], [20, 50], [334, 50]],
598
- }]);
599
-
600
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
601
-
602
- assert.equal(result.ok, false);
603
- assert.equal(result.svg, undefined);
604
- assert.equal(result.diagnostics.length, 1, JSON.stringify(result.diagnostics, null, 2));
605
- const [diagnostic] = result.diagnostics;
606
- assert.equal(diagnostic.code, 'workflow/explicit-pin-conflict');
607
- assert.equal(diagnostic.evidence.invariant, 'perpendicular endpoint-side direction');
608
- assert.deepEqual(diagnostic.evidence.conflictingPins, [
609
- {
610
- edge: 'ab',
611
- field: 'fromSide',
612
- path: '/edges/0/fromSide',
613
- value: 'right',
614
- },
615
- {
616
- edge: 'ab',
617
- field: 'via',
618
- path: '/edges/0/via',
619
- value: [[20, 119], [20, 50], [334, 50]],
620
- },
621
- ]);
622
- assert.deepEqual(diagnostic.supportedFixes, [
623
- 'remove fromSide from edge "ab" and replan the remaining explicit pins',
624
- 'remove via from edge "ab" and replan the remaining explicit pins',
625
- ]);
626
-
627
- for (const field of ['fromSide', 'via']) {
628
- const repaired = clone(document);
629
- delete repaired.edges[0][field];
630
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
631
- assert.equal(
632
- verified.ok,
633
- true,
634
- `removing ${field} must recompile:\n${JSON.stringify(verified.diagnostics, null, 2)}`,
635
- );
636
- }
637
- });
638
-
639
- test('readable-v2 infers endpoint sides for auto channel pins', () => {
640
- const cases = [
641
- {
642
- edge: { channelY: 77 },
643
- document: oneLaneWorkflow([]),
644
- expected: [[94, 93], [94, 77], [334, 77], [334, 93]],
645
- },
646
- {
647
- edge: { channelX: 20 },
648
- document: workflow({
649
- lanes: [{ id: 'l0', label: 'L0' }, { id: 'l1', label: 'L1' }],
650
- nodes: [
651
- { id: 'a', lane: 'l0', col: 0, type: 'backend', label: 'A' },
652
- { id: 'b', lane: 'l1', col: 2, type: 'backend', label: 'B' },
653
- ],
654
- edges: [],
655
- }),
656
- expected: [[48, 119], [20, 119], [20, 243], [288, 243]],
657
- },
658
- {
659
- edge: { channelX: 20, channelY: 181 },
660
- document: workflow({
661
- lanes: [{ id: 'l0', label: 'L0' }, { id: 'l1', label: 'L1' }],
662
- nodes: [
663
- { id: 'a', lane: 'l0', col: 0, type: 'backend', label: 'A' },
664
- { id: 'b', lane: 'l1', col: 2, type: 'backend', label: 'B' },
665
- ],
666
- edges: [],
667
- }),
668
- expected: [[48, 119], [20, 119], [20, 181], [334, 181], [334, 217]],
669
- },
670
- ];
671
-
672
- for (const qualityProfile of ['standard', 'showcase']) {
673
- for (const fixture of cases) {
674
- fixture.document.edges = [{ id: 'ab', from: 'a', to: 'b', ...fixture.edge }];
675
- const result = compileWorkflow({ workflow: clone(fixture.document), qualityProfile });
676
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
677
- assert.deepEqual(result.receipt.edges[0].points, fixture.expected);
678
- for (const [field, value] of Object.entries(fixture.edge)) {
679
- assert.ok(routeContainsChannel(result.receipt.edges[0].points, field, value));
680
- }
681
- }
682
- }
683
- });
684
-
685
- test('readable-v2 treats an omitted preset side as a solver choice', () => {
686
- const crossLane = (route, extra = {}) => workflow({
687
- lanes: [{ id: 'l0', label: 'X' }, { id: 'l1', label: 'Y' }],
688
- nodes: [
689
- { id: 'a', lane: 'l0', col: 0, type: 'backend', label: 'A' },
690
- { id: 'b', lane: 'l1', col: 2, type: 'backend', label: 'B' },
691
- ],
692
- edges: [{ id: 'ab', from: 'a', to: 'b', route, ...extra }],
693
- });
694
- const cases = [
695
- {
696
- route: 'straight',
697
- document: oneLaneWorkflow([{ id: 'ab', from: 'a', to: 'b', route: 'straight' }]),
698
- expected: [[140, 119], [288, 119]],
699
- },
700
- { route: 'drop', document: crossLane('drop'), expected: [[94, 145], [94, 166], [334, 166], [334, 217]] },
701
- { route: 'outside-right', document: crossLane('outside-right'), expected: [[140, 119], [764, 119], [764, 243], [380, 243]] },
702
- { route: 'return-left', document: crossLane('return-left'), expected: [[48, 119], [20, 119], [20, 243], [288, 243]] },
703
- { route: 'bottom-channel', document: crossLane('bottom-channel'), expected: [[94, 145], [94, 301], [334, 301], [334, 269]] },
704
- { route: 'up-channel', document: crossLane('up-channel'), expected: [[94, 93], [94, 65], [334, 65], [334, 217]] },
705
- { route: 'outside-right partial', document: crossLane('outside-right', { fromSide: 'right' }), expected: [[140, 119], [764, 119], [764, 243], [380, 243]] },
706
- ];
707
-
708
- for (const fixture of cases) {
709
- const result = compileWorkflow({ workflow: fixture.document, qualityProfile: 'standard' });
710
- assert.equal(result.ok, true, `${fixture.route}: ${JSON.stringify(result.diagnostics, null, 2)}`);
711
- assert.deepEqual(result.receipt.edges[0].points, fixture.expected);
712
- }
713
- });
714
-
715
- test('readable-v2 treats an infeasible route preset as a candidate-family conflict, not a coordinate pin', () => {
716
- const document = workflow({
717
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
718
- nodes: [
719
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
720
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
721
- ],
722
- edges: [{ id: 'ab', from: 'a', to: 'b', route: 'straight' }],
723
- });
724
-
725
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
726
- assert.equal(result.ok, false);
727
- assert.equal(result.svg, undefined);
728
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/route-preset-conflict');
729
- assert.ok(diagnostic);
730
- assert.ok(result.diagnostics.every(({ code }) => code !== 'workflow/explicit-pin-conflict'));
731
- assert.ok(diagnostic.supportedFixes.length > 0);
732
- assert.ok(diagnostic.supportedFixes.every((fix) => /^set edge |^remove route /.test(fix)));
733
- for (const fix of diagnostic.supportedFixes) {
734
- const repaired = clone(document);
735
- const preset = fix.match(/verified preset "([^"]+)"/)?.[1];
736
- if (preset) repaired.edges[0].route = preset;
737
- else delete repaired.edges[0].route;
738
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
739
- assert.equal(verified.ok, true, `advertised fix must recompile: ${fix}`);
740
- }
741
- });
742
-
743
- test('readable-v2 never accepts a same-lane drop through the preset-only fallback', () => {
744
- const document = oneLaneWorkflow([{
745
- id: 'ab',
746
- from: 'a',
747
- to: 'b',
748
- route: 'drop',
749
- fromSide: 'top',
750
- toSide: 'top',
751
- }]);
752
- document.nodes.forEach((node) => { node.yOffset = 20; });
753
-
754
- for (const qualityProfile of ['standard', 'showcase']) {
755
- const result = compileWorkflow({ workflow: clone(document), qualityProfile });
756
- assert.equal(result.ok, false);
757
- assert.equal(result.svg, undefined);
758
- assert.ok(result.diagnostics.some(({ code }) => code === 'workflow/route-preset-conflict'));
759
- assert.ok(result.diagnostics.every(({ code }) => code !== 'workflow/explicit-pin-conflict'));
760
- }
761
- });
762
-
763
- test('readable-v2 never silently ignores coordinate pins that conflict with a route preset', () => {
764
- const cases = [
765
- {
766
- name: 'straight with channelY',
767
- document: oneLaneWorkflow([{
768
- id: 'ab', from: 'a', to: 'b', route: 'straight', channelY: 300,
769
- }]),
770
- },
771
- {
772
- name: 'straight with channelX',
773
- document: oneLaneWorkflow([{
774
- id: 'ab', from: 'a', to: 'b', route: 'straight', channelX: 300,
775
- }]),
776
- },
777
- {
778
- name: 'drop with channelX',
779
- document: workflow({
780
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
781
- nodes: [
782
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
783
- { id: 'b', lane: 'target', col: 0, type: 'backend', label: 'B' },
784
- ],
785
- edges: [{ id: 'ab', from: 'a', to: 'b', route: 'drop', channelX: 777 }],
786
- }),
787
- },
788
- ...[
789
- ['outside-right', 'channelY'],
790
- ['return-left', 'channelY'],
791
- ['bottom-channel', 'channelX'],
792
- ['up-channel', 'channelX'],
793
- ].map(([route, field]) => ({
794
- name: `${route} with ${field}`,
795
- document: oneLaneWorkflow([{
796
- id: 'ab', from: 'a', to: 'b', route, [field]: 300,
797
- }]),
798
- })),
799
- ];
800
-
801
- for (const { name, document } of cases) {
802
- let result;
803
- assert.doesNotThrow(() => {
804
- result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
805
- }, `${name} must stay inside the public compiler result boundary`);
806
- assertExplicitPinConflict(result, name);
807
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
808
- assert.equal(diagnostic.evidence.route, document.edges[0].route);
809
- assert.ok(diagnostic.evidence.conflictingPins.length > 0);
810
- }
811
- });
812
-
813
- test('readable-v2 preset compatibility reports both authored causal paths and verified repairs', () => {
814
- const document = oneLaneWorkflow([{
815
- id: 'ab', from: 'a', to: 'b', route: 'straight', channelY: 300,
816
- }]);
817
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
818
- assertExplicitPinConflict(result, 'straight preset with channelY');
819
- const diagnostic = result.diagnostics[0];
820
- assert.equal(diagnostic.evidence.invariant, 'route preset compatibility');
821
- assert.deepEqual(diagnostic.evidence.conflictingPins, [
822
- {
823
- edge: 'ab', field: 'route', path: '/edges/0/route', value: 'straight',
824
- },
825
- {
826
- edge: 'ab', field: 'channelY', path: '/edges/0/channelY', value: 300,
827
- },
828
- ]);
829
- assert.deepEqual(diagnostic.supportedFixes, [
830
- 'remove route from edge "ab" and keep the remaining verified route assertions',
831
- 'remove channelY from edge "ab" and keep the remaining verified route assertions',
832
- ]);
833
-
834
- for (const field of ['route', 'channelY']) {
835
- const repaired = clone(document);
836
- delete repaired.edges[0][field];
837
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
838
- assert.equal(
839
- verified.ok,
840
- true,
841
- `removing ${field} must recompile:\n${JSON.stringify(verified.diagnostics, null, 2)}`,
842
- );
843
- }
844
- });
845
-
846
- test('readable-v2 rejects a raw via that does not belong to its route preset family', () => {
847
- const { start, end } = oneLaneAnchors();
848
- const document = oneLaneWorkflow([{
849
- id: 'ab',
850
- from: 'a',
851
- to: 'b',
852
- route: 'straight',
853
- via: [
854
- [start[0] + 20, start[1]],
855
- [start[0] + 20, start[1] + 40],
856
- [end[0] - 20, start[1] + 40],
857
- [end[0] - 20, end[1]],
858
- ],
859
- }]);
860
-
861
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
862
- assertExplicitPinConflict(result, 'straight preset with a detouring via');
863
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
864
- assert.equal(diagnostic.evidence.route, 'straight');
865
- assert.equal(diagnostic.evidence.invariant, 'route preset compatibility');
866
- });
867
-
868
- for (const fixture of [
869
- {
870
- preset: 'straight',
871
- lanes: [{ id: 'main', label: 'Main' }],
872
- nodes: [
873
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
874
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
875
- ],
876
- edge: { via: [[180, 119], [240, 119]] },
877
- expected: [[140, 119], [180, 119], [240, 119], [288, 119]],
878
- },
879
- {
880
- preset: 'drop',
881
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
882
- nodes: [
883
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
884
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
885
- ],
886
- edge: { fromSide: 'bottom', toSide: 'top', via: [[94, 181], [334, 181]] },
887
- expected: [[94, 145], [94, 181], [334, 181], [334, 217]],
888
- },
889
- {
890
- preset: 'outside-right',
891
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
892
- nodes: [
893
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
894
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
895
- ],
896
- edge: { fromSide: 'right', toSide: 'right', via: [[720, 119], [720, 243]] },
897
- expected: [[140, 119], [720, 119], [720, 243], [380, 243]],
898
- },
899
- {
900
- preset: 'return-left',
901
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
902
- nodes: [
903
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
904
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
905
- ],
906
- edge: { fromSide: 'left', toSide: 'left', via: [[20, 119], [20, 243]] },
907
- expected: [[48, 119], [20, 119], [20, 243], [288, 243]],
908
- },
909
- {
910
- preset: 'bottom-channel',
911
- lanes: [{ id: 'main', label: 'Main' }],
912
- nodes: [
913
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
914
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
915
- ],
916
- edge: { fromSide: 'bottom', toSide: 'bottom', via: [[94, 200], [334, 200]] },
917
- expected: [[94, 145], [94, 200], [334, 200], [334, 145]],
918
- },
919
- {
920
- preset: 'up-channel',
921
- lanes: [{ id: 'main', label: 'M' }],
922
- nodes: [
923
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
924
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
925
- ],
926
- edge: { fromSide: 'top', toSide: 'top', via: [[94, 20], [334, 20]] },
927
- expected: [[94, 93], [94, 20], [334, 20], [334, 93]],
928
- },
929
- ]) {
930
- test(`readable-v2 preserves a compatible ${fixture.preset} via without normalization`, () => {
931
- const document = workflow({
932
- lanes: fixture.lanes,
933
- nodes: fixture.nodes,
934
- edges: [{
935
- id: 'ab', from: 'a', to: 'b', route: fixture.preset, ...fixture.edge,
936
- }],
937
- });
938
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
939
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
940
- assert.deepEqual(result.receipt.edges[0].points, fixture.expected);
941
- });
942
- }
943
-
944
- test('readable-v2 keeps a compatible channel pin authoritative inside its route preset', () => {
945
- const document = workflow({
946
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
947
- nodes: [
948
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
949
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
950
- ],
951
- edges: [{
952
- id: 'ab',
953
- from: 'a',
954
- to: 'b',
955
- route: 'drop',
956
- channelY: 181,
957
- fromSide: 'bottom',
958
- toSide: 'top',
959
- }],
960
- });
961
-
962
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
963
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
964
- const points = result.receipt.edges.find(({ id }) => id === 'ab').points;
965
- assert.ok(
966
- points.slice(0, -1).some((point, index) => (
967
- point[1] === 181 && points[index + 1][1] === 181
968
- )),
969
- `the final path must contain the authored channelY: ${JSON.stringify(points)}`,
970
- );
971
- });
972
-
973
- for (const fixture of [
974
- {
975
- preset: 'outside-right', field: 'channelX', value: 720,
976
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
977
- nodes: [
978
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
979
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
980
- ],
981
- sides: { fromSide: 'right', toSide: 'right' },
982
- },
983
- {
984
- preset: 'return-left', field: 'channelX', value: 20,
985
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
986
- nodes: [
987
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
988
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
989
- ],
990
- sides: { fromSide: 'left', toSide: 'left' },
991
- },
992
- {
993
- preset: 'bottom-channel', field: 'channelY', value: 200,
994
- lanes: [{ id: 'main', label: 'Main' }],
995
- nodes: [
996
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
997
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
998
- ],
999
- sides: { fromSide: 'bottom', toSide: 'bottom' },
1000
- },
1001
- {
1002
- preset: 'up-channel', field: 'channelY', value: 20,
1003
- lanes: [{ id: 'main', label: 'Main' }],
1004
- nodes: [
1005
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
1006
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
1007
- ],
1008
- sides: { fromSide: 'top', toSide: 'top' },
1009
- },
1010
- ]) {
1011
- test(`readable-v2 keeps ${fixture.field} authoritative for ${fixture.preset}`, () => {
1012
- const document = workflow({
1013
- lanes: fixture.lanes,
1014
- nodes: fixture.nodes,
1015
- edges: [{
1016
- id: 'ab',
1017
- from: 'a',
1018
- to: 'b',
1019
- route: fixture.preset,
1020
- [fixture.field]: fixture.value,
1021
- ...fixture.sides,
1022
- }],
1023
- });
1024
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1025
- assert.equal(result.ok, true, JSON.stringify(result.diagnostics, null, 2));
1026
- const points = result.receipt.edges[0].points;
1027
- assert.ok(routeContainsChannel(points, fixture.field, fixture.value));
1028
- });
1029
- }
1030
-
1031
- for (const fixture of [
1032
- {
1033
- preset: 'outside-right', field: 'channelX', value: 20,
1034
- sides: { fromSide: 'left', toSide: 'left' },
1035
- crossLane: true,
1036
- },
1037
- {
1038
- preset: 'return-left', field: 'channelX', value: 720,
1039
- sides: { fromSide: 'right', toSide: 'right' },
1040
- crossLane: true,
1041
- },
1042
- {
1043
- preset: 'bottom-channel', field: 'channelY', value: 20,
1044
- sides: { fromSide: 'top', toSide: 'top' },
1045
- },
1046
- {
1047
- preset: 'up-channel', field: 'channelY', value: 340,
1048
- sides: { fromSide: 'bottom', toSide: 'bottom' },
1049
- },
1050
- {
1051
- preset: 'drop', field: 'channelY', value: 20,
1052
- sides: { fromSide: 'top', toSide: 'top' },
1053
- },
1054
- ]) {
1055
- test(`readable-v2 rejects ${fixture.preset} when its channel belongs to another route family`, () => {
1056
- for (const qualityProfile of ['standard', 'showcase']) {
1057
- const edges = [{
1058
- id: 'ab',
1059
- from: 'a',
1060
- to: 'b',
1061
- route: fixture.preset,
1062
- [fixture.field]: fixture.value,
1063
- ...fixture.sides,
1064
- }];
1065
- const document = fixture.crossLane
1066
- ? workflow({
1067
- lanes: [{ id: 'source', label: 'Source' }, { id: 'target', label: 'Target' }],
1068
- nodes: [
1069
- { id: 'a', lane: 'source', col: 0, type: 'backend', label: 'A' },
1070
- { id: 'b', lane: 'target', col: 2, type: 'backend', label: 'B' },
1071
- ],
1072
- edges,
1073
- })
1074
- : oneLaneWorkflow(edges);
1075
- const result = compileWorkflow({ workflow: document, qualityProfile });
1076
- assertExplicitPinConflict(result, `${fixture.preset} ${fixture.field} under ${qualityProfile}`);
1077
- const diagnostic = result.diagnostics.find(({ code }) => (
1078
- code === 'workflow/explicit-pin-conflict'
1079
- ));
1080
- assert.equal(diagnostic.evidence.invariant, 'route preset compatibility');
1081
- }
1082
- });
1083
- }
1084
-
1085
- test('readable-v2 treats channels beside via as assertions over the authored path', () => {
1086
- const { start, end } = oneLaneAnchors();
1087
- const document = oneLaneWorkflow([{
1088
- id: 'ab',
1089
- from: 'a',
1090
- to: 'b',
1091
- channelX: start[0] + 40,
1092
- channelY: start[1] + 61,
1093
- via: [
1094
- [start[0] + 40, start[1]],
1095
- [start[0] + 40, start[1] + 61],
1096
- [end[0] - 48, start[1] + 61],
1097
- [end[0] - 48, end[1]],
1098
- ],
1099
- }]);
1100
-
1101
- const matching = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1102
- assert.equal(matching.ok, true, JSON.stringify(matching.diagnostics, null, 2));
1103
- assert.deepEqual(matching.receipt.edges[0].points, [start, ...document.edges[0].via, end]);
1104
-
1105
- const mismatched = clone(document);
1106
- mismatched.edges[0].channelX += 1;
1107
- const result = compileWorkflow({ workflow: mismatched, qualityProfile: 'standard' });
1108
- assertExplicitPinConflict(result, 'via missing its asserted channelX');
1109
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
1110
- assert.equal(diagnostic.evidence.invariant, 'channel pin preservation');
1111
- assert.deepEqual(
1112
- diagnostic.evidence.conflictingPins.map(({ edge, field, path }) => ({ edge, field, path })),
1113
- [
1114
- { edge: 'ab', field: 'via', path: '/edges/0/via' },
1115
- { edge: 'ab', field: 'channelX', path: '/edges/0/channelX' },
1116
- ],
1117
- );
1118
-
1119
- const nearButNotExact = clone(document);
1120
- nearButNotExact.edges[0].channelX += 0.00005;
1121
- const nearResult = compileWorkflow({
1122
- workflow: nearButNotExact,
1123
- qualityProfile: 'standard',
1124
- });
1125
- assertExplicitPinConflict(nearResult, 'channel assertions must preserve exact authored numbers');
1126
- assert.equal(nearResult.diagnostics[0].evidence.invariant, 'channel pin preservation');
1127
- });
1128
-
1129
- test('readable-v2 reports via and channelY as a minimal assertion conflict with two verified repairs', () => {
1130
- const document = oneLaneWorkflow([{
1131
- id: 'ab',
1132
- from: 'a',
1133
- to: 'b',
1134
- via: [[94, 77], [334, 77]],
1135
- channelY: 200,
1136
- }]);
1137
-
1138
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1139
-
1140
- assert.equal(result.ok, false);
1141
- assert.equal(result.svg, undefined);
1142
- assert.equal(result.diagnostics.length, 1, JSON.stringify(result.diagnostics, null, 2));
1143
- const [diagnostic] = result.diagnostics;
1144
- assert.equal(diagnostic.code, 'workflow/explicit-pin-conflict');
1145
- assert.equal(diagnostic.evidence.invariant, 'channel pin preservation');
1146
- assert.deepEqual(diagnostic.evidence.conflictingPins, [
1147
- {
1148
- edge: 'ab',
1149
- field: 'via',
1150
- path: '/edges/0/via',
1151
- value: [[94, 77], [334, 77]],
1152
- },
1153
- {
1154
- edge: 'ab',
1155
- field: 'channelY',
1156
- path: '/edges/0/channelY',
1157
- value: 200,
1158
- },
1159
- ]);
1160
- assert.deepEqual(diagnostic.supportedFixes, [
1161
- 'remove via from edge "ab" and replan the remaining explicit route assertions',
1162
- 'remove channelY from edge "ab" and replan the remaining explicit route assertions',
1163
- ]);
1164
-
1165
- for (const field of ['via', 'channelY']) {
1166
- const repaired = clone(document);
1167
- delete repaired.edges[0][field];
1168
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
1169
- assert.equal(
1170
- verified.ok,
1171
- true,
1172
- `removing ${field} must recompile:\n${JSON.stringify(verified.diagnostics, null, 2)}`,
1173
- );
1174
- }
1175
- });
1176
-
1177
- test('readable-v2 reports conflicts between absolute label and route pins as typed geometry', () => {
1178
- const document = workflow({
1179
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
1180
- nodes: [
1181
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
1182
- { id: 'b', lane: 'top', col: 4, type: 'backend', label: 'B' },
1183
- { id: 'c', lane: 'bottom', col: 0, type: 'backend', label: 'C' },
1184
- { id: 'd', lane: 'bottom', col: 4, type: 'backend', label: 'D' },
1185
- ],
1186
- edges: [
1187
- { id: 'labelpin', from: 'a', to: 'b', label: 'PIN', labelAt: [334, 243] },
1188
- { id: 'routepin', from: 'c', to: 'd', via: [[334, 243]] },
1189
- ],
1190
- });
1191
-
1192
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
1193
- assertExplicitPinConflict(result, 'labelAt crossing an authored via');
1194
- const diagnostic = result.diagnostics[0];
1195
- assert.equal(diagnostic.evidence.invariant, 'explicit label-route clearance');
1196
- assert.deepEqual(diagnostic.evidence.conflictingPins.map(({ edge, field }) => ({ edge, field })), [
1197
- { edge: 'labelpin', field: 'labelAt' },
1198
- { edge: 'routepin', field: 'via' },
1199
- ]);
1200
- assert.equal(diagnostic.evidence.clearancePx, 0);
1201
- assertSupportedFixesNameChangedEdge(diagnostic, ['labelpin', 'routepin']);
1202
- assert.ok(
1203
- diagnostic.supportedFixes.some((fix) => fix.includes('edge "routepin"')),
1204
- `a routepin repair must identify routepin: ${diagnostic.supportedFixes}`,
1205
- );
1206
- assert.doesNotMatch(diagnostic.supportedFixes.join('\n'), /remove (?:one |the )?label(?!At)/i);
1207
- });
1208
-
1209
- test('readable-v2 derives label-route pins from joint verified removals when route plans first', () => {
1210
- const document = workflow({
1211
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
1212
- nodes: [
1213
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
1214
- { id: 'b', lane: 'top', col: 4, type: 'backend', label: 'B' },
1215
- { id: 'c', lane: 'bottom', col: 0, type: 'backend', label: 'C' },
1216
- { id: 'd', lane: 'bottom', col: 4, type: 'backend', label: 'D' },
1217
- ],
1218
- edges: [
1219
- { id: 'a-route', from: 'c', to: 'd', via: [[334, 243]] },
1220
- { id: 'z-label', from: 'a', to: 'b', label: 'PIN', labelAt: [334, 243] },
1221
- ],
1222
- });
1223
- document.meta.quality_profile = 'showcase';
1224
-
1225
- const result = compileWorkflow({ workflow: document });
1226
- assertExplicitPinConflict(result, 'route-first joint label-route conflict');
1227
- const diagnostic = result.diagnostics[0];
1228
- assert.equal(diagnostic.evidence.invariant, 'explicit label-route clearance');
1229
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1230
- edge: 'z-label', field: 'labelAt', path: '/edges/1/labelAt', value: [334, 243],
1231
- }]);
1232
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
1233
- for (const fix of diagnostic.supportedFixes) {
1234
- const replacement = fix.match(/^set labelAt on edge "z-label" to \[(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)\]$/);
1235
- assert.ok(replacement, `route removal is not causal and must not be advertised: ${fix}`);
1236
- const repaired = clone(document);
1237
- repaired.edges[1].labelAt = replacement.slice(1).map(Number);
1238
- const verified = compileWorkflow({ workflow: repaired });
1239
- assert.equal(verified.ok, true, `advertised label repair must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1240
- }
1241
- });
1242
-
1243
- test('readable-v2 derives both causal pins when label plans before the authored route', () => {
1244
- const document = workflow({
1245
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
1246
- nodes: [
1247
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
1248
- { id: 'b', lane: 'top', col: 4, type: 'backend', label: 'B' },
1249
- { id: 'c', lane: 'bottom', col: 0, type: 'backend', label: 'C' },
1250
- { id: 'd', lane: 'bottom', col: 4, type: 'backend', label: 'D' },
1251
- ],
1252
- edges: [
1253
- { id: 'z-route', from: 'c', to: 'd', via: [[334, 243]] },
1254
- { id: 'a-label', from: 'a', to: 'b', label: 'PIN', labelAt: [334, 243] },
1255
- ],
1256
- });
1257
- document.meta.quality_profile = 'showcase';
1258
-
1259
- const result = compileWorkflow({ workflow: document });
1260
- assertExplicitPinConflict(result, 'label-first joint label-route conflict');
1261
- const diagnostic = result.diagnostics[0];
1262
- assert.deepEqual(diagnostic.evidence.conflictingPins, [
1263
- { edge: 'a-label', field: 'labelAt', path: '/edges/1/labelAt', value: [334, 243] },
1264
- { edge: 'z-route', field: 'via', path: '/edges/0/via', value: [[334, 243]] },
1265
- ]);
1266
- assert.ok(
1267
- diagnostic.supportedFixes.some((fix) => fix.startsWith('set labelAt on edge "a-label"')),
1268
- JSON.stringify(diagnostic.supportedFixes, null, 2),
1269
- );
1270
- assert.ok(
1271
- diagnostic.supportedFixes.includes('remove via from edge "z-route" so readable-v2 can replan the remaining authored label-route pins'),
1272
- JSON.stringify(diagnostic.supportedFixes, null, 2),
1273
- );
1274
- });
1275
-
1276
- test('readable-v2 classifies an authored labelAt colliding with an earlier automatic route', () => {
1277
- const document = workflow({
1278
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
1279
- nodes: [
1280
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
1281
- { id: 'b', lane: 'top', col: 4, type: 'backend', label: 'B' },
1282
- { id: 'c', lane: 'bottom', col: 0, type: 'backend', label: 'C' },
1283
- { id: 'd', lane: 'bottom', col: 4, type: 'backend', label: 'D' },
1284
- ],
1285
- edges: [
1286
- { id: 'a-route', from: 'c', to: 'd' },
1287
- { id: 'z-label', from: 'a', to: 'b', label: 'PIN', labelAt: [334, 243] },
1288
- ],
1289
- });
1290
- document.meta.quality_profile = 'showcase';
1291
-
1292
- const result = compileWorkflow({ workflow: document });
1293
- assertExplicitPinConflict(result, 'labelAt colliding with an earlier automatic route');
1294
- const diagnostic = result.diagnostics[0];
1295
- assert.equal(diagnostic.evidence.invariant, 'explicit label-route clearance');
1296
- assert.equal(diagnostic.subject.path, '/edges/1/labelAt');
1297
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1298
- edge: 'z-label',
1299
- field: 'labelAt',
1300
- path: '/edges/1/labelAt',
1301
- value: [334, 243],
1302
- }]);
1303
- assert.deepEqual(diagnostic.evidence.labelAt, [334, 243]);
1304
- assert.deepEqual(diagnostic.evidence.collidedRoute, {
1305
- edge: 'a-route',
1306
- from: 'c',
1307
- to: 'd',
1308
- points: [[140, 243], [528, 243]],
1309
- });
1310
- assert.deepEqual(diagnostic.evidence.routeSegment, {
1311
- from: [140, 243],
1312
- to: [528, 243],
1313
- });
1314
-
1315
- for (const fix of diagnostic.supportedFixes) {
1316
- const replacement = fix.match(/^set labelAt on edge "z-label" to \[(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)\]$/);
1317
- assert.ok(replacement, `only a concrete labelAt alternative may be advertised: ${fix}`);
1318
- const repaired = clone(document);
1319
- repaired.edges[1].labelAt = replacement.slice(1).map(Number);
1320
- const verified = compileWorkflow({ workflow: repaired });
1321
- assert.equal(verified.ok, true, `advertised labelAt alternative must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1322
- }
1323
- });
1324
-
1325
- test('readable-v2 classifies an automatic label colliding with a later authored route', () => {
1326
- const document = workflow({
1327
- lanes: [
1328
- { id: 'top', label: 'Top' },
1329
- { id: 'mid', label: 'Mid' },
1330
- { id: 'bottom', label: 'Bottom' },
1331
- ],
1332
- nodes: [
1333
- { id: 'a', lane: 'mid', col: 0, type: 'backend', label: 'A' },
1334
- { id: 'b', lane: 'mid', col: 4, type: 'backend', label: 'B' },
1335
- { id: 'c', lane: 'top', col: 2, type: 'backend', label: 'C' },
1336
- { id: 'd', lane: 'bottom', col: 2, type: 'backend', label: 'D' },
1337
- ],
1338
- edges: [
1339
- { id: 'a-label', from: 'a', to: 'b', label: 'AUTO' },
1340
- { id: 'z-route', from: 'c', to: 'd', via: [[334, 243]] },
1341
- ],
1342
- });
1343
- document.meta.quality_profile = 'showcase';
1344
-
1345
- const result = compileWorkflow({ workflow: document });
1346
- assertExplicitPinConflict(result, 'automatic label colliding with a later authored route');
1347
- const diagnostic = result.diagnostics[0];
1348
- assert.equal(diagnostic.evidence.invariant, 'explicit label-route clearance');
1349
- assert.equal(diagnostic.subject.path, '/edges/1/via');
1350
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1351
- edge: 'z-route',
1352
- field: 'via',
1353
- path: '/edges/1/via',
1354
- value: [[334, 243]],
1355
- }]);
1356
- assert.deepEqual(diagnostic.evidence.collidedRoute, {
1357
- edge: 'z-route',
1358
- from: 'c',
1359
- to: 'd',
1360
- points: [[334, 145], [334, 243], [334, 341]],
1361
- });
1362
- assert.deepEqual(diagnostic.evidence.routeSegment, {
1363
- from: [334, 145],
1364
- to: [334, 341],
1365
- });
1366
-
1367
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
1368
- for (const fix of diagnostic.supportedFixes) {
1369
- assert.equal(
1370
- fix,
1371
- 'remove via from edge "z-route" so readable-v2 can replan the remaining authored route assertions',
1372
- );
1373
- const repaired = clone(document);
1374
- delete repaired.edges[1].via;
1375
- const verified = compileWorkflow({ workflow: repaired });
1376
- assert.equal(verified.ok, true, `advertised route alternative must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1377
- }
1378
- });
1379
-
1380
- test('readable-v2 classifies an authored labelAt colliding with an earlier automatic label', () => {
1381
- const document = oneLaneWorkflow([
1382
- { id: 'a-auto', from: 'a', to: 'b', label: 'AUTO' },
1383
- { id: 'z-pin', from: 'a', to: 'b', label: 'PIN', labelAt: [214, 119] },
1384
- ]);
1385
- document.meta.quality_profile = 'showcase';
1386
-
1387
- const result = compileWorkflow({ workflow: document });
1388
- assertExplicitPinConflict(result, 'labelAt colliding with an earlier automatic label');
1389
- const diagnostic = result.diagnostics[0];
1390
- assert.equal(diagnostic.evidence.invariant, 'explicit label-label clearance');
1391
- assert.equal(diagnostic.subject.path, '/edges/1/labelAt');
1392
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1393
- edge: 'z-pin',
1394
- field: 'labelAt',
1395
- path: '/edges/1/labelAt',
1396
- value: [214, 119],
1397
- }]);
1398
- assert.deepEqual(diagnostic.evidence.labelRects.map(({ edge, ...rect }) => ({ edge, ...rect })), [
1399
- { edge: 'z-pin', x: 199, y: 109, width: 30, height: 14 },
1400
- { edge: 'a-auto', x: 199, y: 99, width: 30, height: 14 },
1401
- ]);
1402
-
1403
- for (const fix of diagnostic.supportedFixes) {
1404
- const replacement = fix.match(/^set labelAt on edge "z-pin" to \[(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)\]$/);
1405
- assert.ok(replacement, `only a concrete labelAt alternative may be advertised: ${fix}`);
1406
- const repaired = clone(document);
1407
- repaired.edges[1].labelAt = replacement.slice(1).map(Number);
1408
- const verified = compileWorkflow({ workflow: repaired });
1409
- assert.equal(verified.ok, true, `advertised labelAt alternative must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1410
- }
1411
- });
1412
-
1413
- test('readable-v2 derives the causal labelAt from joint verified label removals', () => {
1414
- const document = workflow({
1415
- lanes: [{ id: 'top', label: 'Top' }, { id: 'bottom', label: 'Bottom' }],
1416
- nodes: [
1417
- { id: 'a', lane: 'top', col: 0, type: 'backend', label: 'A' },
1418
- { id: 'b', lane: 'top', col: 4, type: 'backend', label: 'B' },
1419
- { id: 'c', lane: 'bottom', col: 0, type: 'backend', label: 'C' },
1420
- { id: 'd', lane: 'bottom', col: 4, type: 'backend', label: 'D' },
1421
- ],
1422
- edges: [
1423
- { id: 'a-label', from: 'a', to: 'b', label: 'FIRST', labelAt: [334, 119] },
1424
- { id: 'z-label', from: 'c', to: 'd', label: 'SECOND', labelAt: [334, 119] },
1425
- ],
1426
- });
1427
- document.meta.quality_profile = 'showcase';
1428
-
1429
- const result = compileWorkflow({ workflow: document });
1430
- assertExplicitPinConflict(result, 'joint causal label-label conflict');
1431
- const diagnostic = result.diagnostics[0];
1432
- assert.equal(diagnostic.evidence.invariant, 'explicit label-label clearance');
1433
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1434
- edge: 'z-label', field: 'labelAt', path: '/edges/1/labelAt', value: [334, 119],
1435
- }]);
1436
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
1437
- for (const fix of diagnostic.supportedFixes) {
1438
- const replacement = fix.match(/^set labelAt on edge "z-label" to \[(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)\]$/);
1439
- assert.ok(replacement, `only the causal label pin may be changed: ${fix}`);
1440
- const repaired = clone(document);
1441
- repaired.edges[1].labelAt = replacement.slice(1).map(Number);
1442
- const verified = compileWorkflow({ workflow: repaired });
1443
- assert.equal(verified.ok, true, `advertised label repair must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1444
- }
1445
- });
1446
-
1447
- test('readable-v2 reports conflicts between two absolute label pins without deleting semantics', () => {
1448
- const document = oneLaneWorkflow([
1449
- {
1450
- id: 'one', from: 'a', to: 'b', label: 'ONE', via: [[214, 119]], labelAt: [214, 80],
1451
- },
1452
- {
1453
- id: 'two', from: 'a', to: 'b', label: 'TWO', via: [[214, 119]], labelAt: [214, 80],
1454
- },
1455
- ]);
1456
-
1457
- for (const qualityProfile of ['standard', 'showcase']) {
1458
- const result = compileWorkflow({ workflow: clone(document), qualityProfile });
1459
- assertExplicitPinConflict(result, `overlapping labelAt pins under ${qualityProfile}`);
1460
- const diagnostic = result.diagnostics[0];
1461
- assert.equal(diagnostic.evidence.invariant, 'explicit label-label clearance');
1462
- assert.deepEqual(diagnostic.evidence.conflictingPins.map(({ edge, field }) => ({ edge, field })), [
1463
- { edge: 'one', field: 'labelAt' },
1464
- { edge: 'two', field: 'labelAt' },
1465
- ]);
1466
- assertSupportedFixesNameChangedEdge(diagnostic, ['one', 'two']);
1467
- assert.doesNotMatch(diagnostic.supportedFixes.join('\n'), /remove (?:one |the )?label(?!At)/i);
1468
- }
1469
- });
1470
-
1471
- test('readable-v2 reports showcase crossings between two absolute route pins', () => {
1472
- const document = workflow({
1473
- lanes: [
1474
- { id: 'top', label: 'Top' },
1475
- { id: 'middle', label: 'Middle' },
1476
- { id: 'bottom', label: 'Bottom' },
1477
- ],
1478
- nodes: [
1479
- { id: 'left', lane: 'middle', col: 0, type: 'backend', label: 'Left' },
1480
- { id: 'right', lane: 'middle', col: 4, type: 'backend', label: 'Right' },
1481
- { id: 'above', lane: 'top', col: 2, type: 'backend', label: 'Above' },
1482
- { id: 'below', lane: 'bottom', col: 2, type: 'backend', label: 'Below' },
1483
- ],
1484
- edges: [
1485
- { id: 'horizontal', from: 'left', to: 'right', via: [[250, 243]] },
1486
- { id: 'vertical', from: 'above', to: 'below', via: [[334, 200]] },
1487
- ],
1488
- });
1489
-
1490
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
1491
- assertExplicitPinConflict(result, 'two crossing absolute routes');
1492
- const [diagnostic] = result.diagnostics;
1493
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route crossing');
1494
- assert.deepEqual(diagnostic.evidence.point, [334, 243]);
1495
- assertSupportedFixesNameChangedEdge(diagnostic, ['horizontal', 'vertical']);
1496
- assert.ok(
1497
- diagnostic.supportedFixes.some((fix) => fix.includes('edge "vertical"')),
1498
- `a vertical repair must identify vertical: ${diagnostic.supportedFixes}`,
1499
- );
1500
- });
1501
-
1502
- test('readable-v2 catches an automatic route crossing exactly at an authored straight-through via', () => {
1503
- const document = crossingAtForwardCollinearViaWorkflow();
1504
- const standard = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
1505
- assert.equal(standard.ok, true, JSON.stringify(standard.diagnostics, null, 2));
1506
- assert.deepEqual(
1507
- standard.receipt.edges.find(({ id }) => id === 'z-pinned').points,
1508
- [[334, 145], [334, 243], [334, 341]],
1509
- 'analysis must not remove the authored via from the receipt',
1510
- );
1511
-
1512
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
1513
- assertExplicitPinConflict(result, 'an automatic route crossing at an authored straight-through via');
1514
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
1515
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route crossing');
1516
- assert.deepEqual(diagnostic.evidence.point, [334, 243]);
1517
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1518
- edge: 'z-pinned',
1519
- field: 'via',
1520
- path: '/edges/1/via',
1521
- value: [[334, 243]],
1522
- }]);
1523
- assert.equal(diagnostic.subject.edge, 'z-pinned');
1524
- assert.equal(diagnostic.subject.path, '/edges/1/via');
1525
- assertSupportedFixesNameChangedEdge(diagnostic, ['z-pinned']);
1526
- });
1527
-
1528
- test('readable-v2 catches two pinned routes crossing exactly at their straight-through vias', () => {
1529
- const document = crossingAtForwardCollinearViaWorkflow({ pinHorizontal: true });
1530
- const standard = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
1531
- assert.equal(standard.ok, true, JSON.stringify(standard.diagnostics, null, 2));
1532
- assert.deepEqual(
1533
- standard.receipt.edges.map(({ id, points }) => ({ id, points })),
1534
- [
1535
- { id: 'a-pinned', points: [[140, 243], [334, 243], [528, 243]] },
1536
- { id: 'z-pinned', points: [[334, 145], [334, 243], [334, 341]] },
1537
- ],
1538
- 'analysis must retain both authored straight-through vias in the receipt',
1539
- );
1540
-
1541
- const result = compileWorkflow({ workflow: document, qualityProfile: 'showcase' });
1542
- assertExplicitPinConflict(result, 'two pinned routes crossing at straight-through vias');
1543
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
1544
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route crossing');
1545
- assert.deepEqual(diagnostic.evidence.point, [334, 243]);
1546
- assert.deepEqual(diagnostic.evidence.conflictingPins, [
1547
- { edge: 'a-pinned', field: 'via', path: '/edges/0/via', value: [[334, 243]] },
1548
- { edge: 'z-pinned', field: 'via', path: '/edges/1/via', value: [[334, 243]] },
1549
- ]);
1550
- assertSupportedFixesNameChangedEdge(diagnostic, ['a-pinned', 'z-pinned']);
1551
- });
1552
-
1553
- test('readable-v2 classifies a side-only authored route crossing an automatic route', () => {
1554
- const document = workflow({
1555
- lanes: ['l0', 'l1', 'l2'].map((id) => ({ id, label: id })),
1556
- nodes: [
1557
- { id: 'n00', lane: 'l0', col: 0, type: 'backend', label: 'N00' },
1558
- { id: 'n01', lane: 'l0', col: 1, type: 'backend', label: 'N01' },
1559
- { id: 'n02', lane: 'l0', col: 2, type: 'backend', label: 'N02' },
1560
- { id: 'n11', lane: 'l1', col: 1, type: 'backend', label: 'N11' },
1561
- ],
1562
- edges: [
1563
- { id: 'a-auto', from: 'n00', to: 'n01' },
1564
- { id: 'z-side', from: 'n02', to: 'n11', fromSide: 'top', toSide: 'left' },
1565
- ],
1566
- });
1567
- document.meta.quality_profile = 'showcase';
1568
-
1569
- const result = compileWorkflow({ workflow: document });
1570
- assertExplicitPinConflict(result, 'side-only route crossing an automatic route');
1571
- const diagnostic = result.diagnostics[0];
1572
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route crossing');
1573
- assert.ok(diagnostic.evidence.conflictingPins.length > 0);
1574
- assert.ok(diagnostic.evidence.conflictingPins.every(({ edge, field, path, value }) => (
1575
- edge === 'z-side'
1576
- && ['fromSide', 'toSide'].includes(field)
1577
- && path === `/edges/1/${field}`
1578
- && value === document.edges[1][field]
1579
- )), JSON.stringify(diagnostic.evidence.conflictingPins, null, 2));
1580
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
1581
-
1582
- for (const fix of diagnostic.supportedFixes) {
1583
- const removal = fix.match(/^remove (fromSide|toSide)(?: and (fromSide|toSide))? from edge "z-side" /);
1584
- assert.ok(removal, `supported fix must be a concrete side-pin removal: ${fix}`);
1585
- const repaired = clone(document);
1586
- for (const field of removal.slice(1).filter(Boolean)) delete repaired.edges[1][field];
1587
- const verified = compileWorkflow({ workflow: repaired });
1588
- assert.equal(verified.ok, true, `advertised side-pin repair must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1589
- }
1590
- });
1591
-
1592
- test('readable-v2 classifies a side-only authored route sharing an automatic corridor', () => {
1593
- const document = workflow({
1594
- lanes: ['l0', 'l1', 'l2'].map((id) => ({ id, label: id })),
1595
- nodes: [
1596
- { id: 'n00', lane: 'l0', col: 0, type: 'backend', label: 'N00' },
1597
- { id: 'n02', lane: 'l0', col: 2, type: 'backend', label: 'N02' },
1598
- { id: 'n01', lane: 'l0', col: 1, type: 'backend', label: 'N01' },
1599
- { id: 'n03', lane: 'l0', col: 3, type: 'backend', label: 'N03' },
1600
- ],
1601
- edges: [
1602
- { id: 'a-auto', from: 'n00', to: 'n02' },
1603
- { id: 'z-side', from: 'n01', to: 'n03', fromSide: 'bottom', toSide: 'top' },
1604
- ],
1605
- });
1606
- document.meta.quality_profile = 'showcase';
1607
-
1608
- const result = compileWorkflow({ workflow: document });
1609
- assertExplicitPinConflict(result, 'side-only route sharing an automatic corridor');
1610
- const diagnostic = result.diagnostics[0];
1611
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route corridor clearance');
1612
- assert.deepEqual(diagnostic.evidence.overlapStart, [214, 161]);
1613
- assert.deepEqual(diagnostic.evidence.overlapEnd, [334, 161]);
1614
- assert.equal(diagnostic.evidence.overlapLengthPx, 120);
1615
- assert.ok(diagnostic.evidence.conflictingPins.length > 0);
1616
- assert.ok(diagnostic.evidence.conflictingPins.every(({ edge, field, path, value }) => (
1617
- edge === 'z-side'
1618
- && ['fromSide', 'toSide'].includes(field)
1619
- && path === `/edges/1/${field}`
1620
- && value === document.edges[1][field]
1621
- )), JSON.stringify(diagnostic.evidence.conflictingPins, null, 2));
1622
- assert.ok(diagnostic.supportedFixes.length > 0, JSON.stringify(diagnostic, null, 2));
1623
-
1624
- for (const fix of diagnostic.supportedFixes) {
1625
- const removal = fix.match(/^remove (fromSide|toSide)(?: and (fromSide|toSide))? from edge "z-side" /);
1626
- assert.ok(removal, `supported fix must be a concrete side-pin removal: ${fix}`);
1627
- const repaired = clone(document);
1628
- for (const field of removal.slice(1).filter(Boolean)) delete repaired.edges[1][field];
1629
- const verified = compileWorkflow({ workflow: repaired });
1630
- assert.equal(verified.ok, true, `advertised side-pin repair must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
1631
- }
1632
- });
1633
-
1634
- test('readable-v2 classifies a preset-only route sharing an automatic corridor', () => {
1635
- const document = workflow({
1636
- lanes: [{ id: 'l0', label: 'l0' }, { id: 'l1', label: 'l1' }],
1637
- nodes: [
1638
- { id: 'n00', lane: 'l0', col: 0, type: 'backend', label: 'N00' },
1639
- { id: 'n11', lane: 'l1', col: 1, type: 'backend', label: 'N11' },
1640
- { id: 'n01', lane: 'l0', col: 1, type: 'backend', label: 'N01' },
1641
- { id: 'n02', lane: 'l0', col: 2, type: 'backend', label: 'N02' },
1642
- ],
1643
- edges: [
1644
- { id: 'a-auto', from: 'n00', to: 'n11' },
1645
- { id: 'z-route', from: 'n01', to: 'n02', route: 'bottom-channel' },
1646
- ],
1647
- });
1648
- document.meta.quality_profile = 'showcase';
1649
-
1650
- const result = compileWorkflow({ workflow: document });
1651
- assertExplicitPinConflict(result, 'preset-only route sharing an automatic corridor');
1652
- const diagnostic = result.diagnostics[0];
1653
- assert.equal(diagnostic.evidence.invariant, 'explicit route-route corridor clearance');
1654
- assert.deepEqual(diagnostic.subject, {
1655
- diagramType: 'workflow',
1656
- edge: 'z-route',
1657
- from: 'n01',
1658
- to: 'n02',
1659
- path: '/edges/1/route',
1660
- });
1661
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1662
- edge: 'z-route',
1663
- field: 'route',
1664
- path: '/edges/1/route',
1665
- value: 'bottom-channel',
1666
- }]);
1667
- assert.deepEqual(diagnostic.evidence.overlapStart, [214, 166]);
1668
- assert.deepEqual(diagnostic.evidence.overlapEnd, [214, 177]);
1669
- assert.equal(diagnostic.evidence.overlapLengthPx, 11);
1670
- assert.deepEqual(diagnostic.supportedFixes, [
1671
- 'remove route from edge "z-route" so readable-v2 can replan the remaining authored route assertions',
1672
- ]);
1673
-
1674
- const repaired = clone(document);
1675
- delete repaired.edges[1].route;
1676
- const verified = compileWorkflow({ workflow: repaired });
1677
- assert.equal(verified.ok, true, JSON.stringify(verified.diagnostics, null, 2));
1678
- });
1679
-
1680
- test('readable-v2 reports unknown edge endpoints with a precise semantic diagnostic', () => {
1681
- const document = oneLaneWorkflow([{ id: 'ab', from: 'a', to: 'ghost' }]);
1682
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1683
- assert.equal(result.ok, false);
1684
- assert.equal(result.diagnostics.length, 1);
1685
- assert.equal(result.diagnostics[0].code, 'workflow/unknown-edge-endpoint');
1686
- assert.equal(result.diagnostics[0].subject.edge, 'ab');
1687
- assert.equal(result.diagnostics[0].subject.path, '/edges/0/to');
1688
- assert.deepEqual(result.diagnostics[0].evidence, {
1689
- endpoint: 'target',
1690
- unknownNodeId: 'ghost',
1691
- availableNodeIds: ['a', 'b'],
1692
- });
1693
- });
1694
-
1695
- test('unknown endpoint diagnostics retain the authored edge pointer after canonical sorting', () => {
1696
- const document = oneLaneWorkflow([
1697
- { id: 'z-valid', from: 'a', to: 'b' },
1698
- { id: 'a-invalid', from: 'a', to: 'ghost' },
1699
- ]);
1700
-
1701
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1702
-
1703
- assert.equal(result.ok, false);
1704
- assert.equal(result.svg, undefined);
1705
- assert.equal(result.diagnostics.length, 1);
1706
- const [diagnostic] = result.diagnostics;
1707
- assert.equal(diagnostic.code, 'workflow/unknown-edge-endpoint');
1708
- assert.equal(diagnostic.subject.edge, 'a-invalid');
1709
- assert.equal(diagnostic.subject.path, '/edges/1/to');
1710
- assert.equal(diagnostic.evidence.endpoint, 'target');
1711
- assert.equal(diagnostic.evidence.unknownNodeId, 'ghost');
1712
- assert.ok(diagnostic.supportedFixes.length > 0);
1713
- });
1714
-
1715
- test('unknown node lane diagnostics retain the authored node pointer after canonical sorting', () => {
1716
- const document = oneLaneWorkflow([]);
1717
- document.nodes[0].lane = 'ghost';
1718
-
1719
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1720
-
1721
- assert.equal(result.ok, false);
1722
- assert.equal(result.svg, undefined);
1723
- assert.equal(result.diagnostics.length, 1);
1724
- const [diagnostic] = result.diagnostics;
1725
- assert.equal(diagnostic.code, 'workflow/unknown-node-lane');
1726
- assert.equal(diagnostic.subject.node, 'a');
1727
- assert.equal(diagnostic.subject.path, '/nodes/0/lane');
1728
- assert.deepEqual(diagnostic.evidence, {
1729
- unknownLaneId: 'ghost',
1730
- availableLaneIds: ['main'],
1731
- });
1732
- assert.ok(diagnostic.supportedFixes.length > 0);
1733
- });
1734
-
1735
- for (const fixture of [
1736
- {
1737
- name: 'lane id',
1738
- code: 'workflow/duplicate-lane-id',
1739
- expectedSubject: { lane: 'main', path: '/lanes/1/id' },
1740
- expectedEvidence: {
1741
- duplicateLaneId: 'main',
1742
- firstPath: '/lanes/0/id',
1743
- duplicatePath: '/lanes/1/id',
1744
- },
1745
- mutate(document) {
1746
- document.lanes.push({ id: 'main', label: 'Duplicate Main' });
1747
- },
1748
- },
1749
- {
1750
- name: 'node id',
1751
- code: 'workflow/duplicate-node-id',
1752
- expectedSubject: { node: 'a', path: '/nodes/2/id' },
1753
- expectedEvidence: {
1754
- duplicateNodeId: 'a',
1755
- firstPath: '/nodes/0/id',
1756
- duplicatePath: '/nodes/2/id',
1757
- },
1758
- mutate(document) {
1759
- document.nodes.push({
1760
- id: 'a', lane: 'main', col: 4, type: 'database', label: 'Duplicate A',
1761
- });
1762
- },
1763
- },
1764
- ]) {
1765
- test(`duplicate ${fixture.name} diagnostics name both authored source pointers`, () => {
1766
- const document = oneLaneWorkflow([]);
1767
- fixture.mutate(document);
1768
-
1769
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1770
-
1771
- assert.equal(result.ok, false);
1772
- assert.equal(result.svg, undefined);
1773
- assert.equal(result.diagnostics.length, 1);
1774
- const [diagnostic] = result.diagnostics;
1775
- assert.equal(diagnostic.code, fixture.code);
1776
- assert.deepEqual(
1777
- diagnostic.subject,
1778
- { diagramType: 'workflow', ...fixture.expectedSubject },
1779
- );
1780
- assert.deepEqual(diagnostic.evidence, fixture.expectedEvidence);
1781
- assert.ok(diagnostic.supportedFixes.length > 0);
1782
- });
1783
- }
1784
-
1785
- test('showcase rejects nested authored outside-right corridors while standard permits them', () => {
1786
- const document = nestedOutsideRightCorridorWorkflow();
1787
-
1788
- const standard = compileWorkflow({ workflow: clone(document), qualityProfile: 'standard' });
1789
- assert.equal(standard.ok, true, JSON.stringify(standard.diagnostics, null, 2));
1790
-
1791
- const showcase = compileWorkflow({ workflow: clone(document), qualityProfile: 'showcase' });
1792
- assertExplicitPinConflict(showcase, 'nested authored outside-right corridors');
1793
- const diagnostic = showcase.diagnostics.find(({ code }) => (
1794
- code === 'workflow/explicit-pin-conflict'
1795
- ));
1796
- assertSupportedFixesNameChangedEdge(diagnostic, ['inner', 'outer']);
1797
- assert.deepEqual(
1798
- diagnostic.evidence.conflictingPins.map(({ edge, field, value }) => ({ edge, field, value })),
1799
- [{ edge: 'inner', field: 'channelX', value: 800 }],
1800
- );
1801
- assert.deepEqual(diagnostic.supportedFixes, [
1802
- 'remove channelX from edge "inner" so readable-v2 can replan the remaining authored route assertions',
1803
- ]);
1804
- const repaired = clone(document);
1805
- delete repaired.edges.find(({ id }) => id === 'inner').channelX;
1806
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'showcase' });
1807
- assert.equal(verified.ok, true, JSON.stringify(verified.diagnostics, null, 2));
1808
- });
1809
-
1810
- test('an explicit standard profile overrides an ambient showcase profile', () => {
1811
- const document = nestedOutsideRightCorridorWorkflow();
1812
- document.meta.quality_profile = 'showcase';
1813
- const previousProfile = process.env.ARCHIFY_QUALITY_PROFILE;
1814
-
1815
- try {
1816
- process.env.ARCHIFY_QUALITY_PROFILE = 'showcase';
1817
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1818
- assert.equal(
1819
- result.ok,
1820
- true,
1821
- `the explicit standard profile must win:\n${JSON.stringify(result.diagnostics, null, 2)}`,
1822
- );
1823
- } finally {
1824
- if (previousProfile === undefined) delete process.env.ARCHIFY_QUALITY_PROFILE;
1825
- else process.env.ARCHIFY_QUALITY_PROFILE = previousProfile;
1826
- }
1827
- });
1828
-
1829
- test('readable-v2 never advertises an unverified blocking-node repair', () => {
1830
- const document = workflow({
1831
- lanes: [{ id: 'main', label: 'Main' }],
1832
- nodes: [{ id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' }],
1833
- edges: [{ id: 'self', from: 'a', to: 'a' }],
1834
- });
1835
-
1836
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1837
- assert.equal(result.ok, false);
1838
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/solver-budget-exhausted');
1839
- assert.ok(diagnostic, JSON.stringify(result.diagnostics, null, 2));
1840
- assert.deepEqual(diagnostic.supportedFixes, []);
1841
- });
1842
-
1843
- for (const { name, makeVia } of [
1844
- {
1845
- name: 'a 4px endpoint stub',
1846
- makeVia: ({ start, end }) => [
1847
- [start[0] + 4, start[1]],
1848
- [start[0] + 4, start[1] + 41],
1849
- [end[0], start[1] + 41],
1850
- ],
1851
- },
1852
- {
1853
- name: 'a 12px interior turn segment',
1854
- makeVia: ({ start }) => [
1855
- [start[0] + 20, start[1]],
1856
- [start[0] + 20, start[1] + 31],
1857
- [start[0] + 32, start[1] + 31],
1858
- [start[0] + 32, start[1]],
1859
- ],
1860
- },
1861
- ]) {
1862
- test(`standard profile rejects ${name} as a hard route constraint`, () => {
1863
- const via = makeVia(oneLaneAnchors());
1864
- const result = compileWorkflow({
1865
- workflow: oneLaneWorkflow([{ id: 'ab', from: 'a', to: 'b', via }]),
1866
- qualityProfile: 'standard',
1867
- });
1868
- assert.equal(result.ok, false, `${name} must be invalid in standard as well as showcase`);
1869
- assert.ok(Array.isArray(result.diagnostics) && result.diagnostics.length > 0);
1870
- });
1871
- }
1872
-
1873
- test('readable-v2 reports collapsed channel pins without escaping the compiler boundary', () => {
1874
- const { start } = oneLaneAnchors();
1875
- for (const pin of [
1876
- { channelX: start[0] },
1877
- { channelY: start[1] },
1878
- ]) {
1879
- let result;
1880
- assert.doesNotThrow(() => {
1881
- result = compileWorkflow({
1882
- workflow: oneLaneWorkflow([{ id: 'ab', from: 'a', to: 'b', ...pin }]),
1883
- qualityProfile: 'standard',
1884
- });
1885
- });
1886
- assertExplicitPinConflict(result, JSON.stringify(pin));
1887
- assert.ok(result.diagnostics.some(({ evidence }) => (
1888
- evidence?.invariant === 'non-zero route segments'
1889
- )));
1890
- }
1891
- });
1892
-
1893
- test('parallel anonymous edges remain byte-deterministic when their input order changes', () => {
1894
- const document = oneLaneWorkflow([
1895
- { from: 'a', to: 'b', variant: 'default', role: 'main' },
1896
- { from: 'a', to: 'b', variant: 'dashed', role: 'async' },
1897
- ]);
1898
- const reordered = clone(document);
1899
- reordered.edges.reverse();
1900
-
1901
- const first = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1902
- const second = compileWorkflow({ workflow: reordered, qualityProfile: 'standard' });
1903
- assert.equal(first.ok, true, JSON.stringify(first.diagnostics, null, 2));
1904
- assert.equal(second.ok, true, JSON.stringify(second.diagnostics, null, 2));
1905
- assert.equal(second.svg, first.svg);
1906
- assert.equal(JSON.stringify(second.receipt), JSON.stringify(first.receipt));
1907
- });
1908
-
1909
- test('compileWorkflow returns a diagnostic result instead of throwing when meta is absent', () => {
1910
- const document = oneLaneWorkflow([]);
1911
- delete document.meta;
1912
-
1913
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1914
- assert.equal(result.ok, false);
1915
- assert.equal(result.svg, undefined);
1916
- assert.ok(Array.isArray(result.diagnostics) && result.diagnostics.length > 0);
1917
- });
1918
-
1919
- test('compileWorkflow returns typed failures for non-document public inputs without throwing', () => {
1920
- for (const input of [undefined, null, [], {}]) {
1921
- const result = compileWorkflow({ workflow: input });
1922
- assert.equal(result.ok, false);
1923
- assert.equal(result.svg, undefined);
1924
- assert.ok(Array.isArray(result.diagnostics) && result.diagnostics.length > 0);
1925
- assert.ok(result.diagnostics.every(({ code }) => code !== 'internal/unclassified'));
1926
- assert.ok(result.diagnostics.every(({ supportedFixes }) => (
1927
- Array.isArray(supportedFixes) && supportedFixes.length === 0
1928
- )));
1929
- assert.deepEqual(result.receipt.diagnostics, result.diagnostics);
1930
- }
1931
- });
1932
-
1933
- test('compileWorkflow enforces the canonical workflow schema at its public boundary', () => {
1934
- for (const { expectedCode, mutate, qualityProfile } of [
1935
- { expectedCode: 'schema/additionalProperties', mutate: (document) => { document.unsupported = true; } },
1936
- { expectedCode: 'schema/enum', mutate: (document) => { document.nodes[0].type = 'bogus'; } },
1937
- { expectedCode: 'schema/minimum', mutate: (document) => { document.nodes[0].width = 31; } },
1938
- { expectedCode: 'schema/required', mutate: (document) => { delete document.nodes[0].label; } },
1939
- { expectedCode: 'schema/enum', mutate: () => {}, qualityProfile: 'impossible' },
1940
- ]) {
1941
- const document = oneLaneWorkflow([]);
1942
- mutate(document);
1943
- const result = compileWorkflow({ workflow: document, qualityProfile });
1944
- assert.equal(result.ok, false);
1945
- assert.equal(result.svg, undefined);
1946
- assert.ok(
1947
- result.diagnostics.some(({ code }) => code === expectedCode),
1948
- JSON.stringify(result.diagnostics, null, 2),
1949
- );
1950
- assert.ok(result.diagnostics.every(({ code }) => code !== 'internal/unclassified'));
1951
- assert.ok(result.diagnostics.every(({ supportedFixes }) => (
1952
- Array.isArray(supportedFixes) && supportedFixes.length === 0
1953
- )));
1954
- assert.deepEqual(result.receipt.diagnostics, result.diagnostics);
1955
- }
1956
- });
1957
-
1958
- test('readable-v2 rejects a negative absolute label pin without an explicit viewBox', () => {
1959
- const document = oneLaneWorkflow([{
1960
- id: 'ab', from: 'a', to: 'b', label: 'pinned', labelAt: [-20, 80],
1961
- }]);
1962
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
1963
- assert.equal(result.ok, false);
1964
- assert.equal(result.svg, undefined);
1965
- assert.equal(result.diagnostics.length, 1, JSON.stringify(result.diagnostics, null, 2));
1966
- const [diagnostic] = result.diagnostics;
1967
- assert.equal(diagnostic.code, 'workflow/explicit-pin-conflict');
1968
- assert.deepEqual(diagnostic.subject, {
1969
- diagramType: 'workflow',
1970
- edge: 'ab',
1971
- from: 'a',
1972
- to: 'b',
1973
- path: '/edges/0/labelAt',
1974
- });
1975
- assert.equal(diagnostic.evidence.invariant, 'viewBox-origin containment');
1976
- assert.deepEqual(diagnostic.evidence.conflictingPins, [{
1977
- edge: 'ab',
1978
- field: 'labelAt',
1979
- path: '/edges/0/labelAt',
1980
- value: [-20, 80],
1981
- }]);
1982
- assert.deepEqual(diagnostic.evidence.offendingRect, {
1983
- x: -39.4,
1984
- y: 70,
1985
- width: 38.8,
1986
- height: 14,
1987
- });
1988
- assert.deepEqual(result.receipt.diagnostics, result.diagnostics);
1989
-
1990
- assert.ok(diagnostic.supportedFixes.length > 0);
1991
- for (const fix of diagnostic.supportedFixes) {
1992
- const repaired = clone(document);
1993
- const target = repaired.edges.find(({ id }) => fix.includes(`edge "${id}"`));
1994
- assert.ok(target, `supported fix must name an existing edge: ${fix}`);
1995
- const replacement = fix.match(/^set labelAt on edge "[^"]+" to \[(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)\]$/);
1996
- if (replacement) {
1997
- target.labelAt = replacement.slice(1).map(Number);
1998
- } else {
1999
- assert.match(fix, /^remove labelAt from edge "[^"]+" /);
2000
- delete target.labelAt;
2001
- }
2002
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
2003
- assert.equal(verified.ok, true, `advertised fix must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`);
2004
- }
2005
- });
2006
-
2007
- test('readable-v2 rejects an explicit channel that crosses the measured legend', () => {
2008
- const document = oneLaneWorkflow([{
2009
- id: 'ab',
2010
- from: 'a',
2011
- to: 'b',
2012
- route: 'bottom-channel',
2013
- channelY: 200,
2014
- fromSide: 'bottom',
2015
- toSide: 'bottom',
2016
- }]);
2017
- document.meta.legend = { mode: 'all' };
2018
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
2019
- assertExplicitPinConflict(result, 'legend-crossing channelY');
2020
- assert.ok(result.diagnostics.some(({ evidence }) => evidence?.invariant === 'legend clearance'));
2021
- });
2022
-
2023
- test('readable-v2 explicit-pin diagnostics name the first intersected node and segment', () => {
2024
- const document = workflow({
2025
- lanes: [{ id: 'main', label: 'Main' }],
2026
- nodes: [
2027
- { id: 'a', lane: 'main', col: 0, type: 'backend', label: 'A' },
2028
- { id: 'obstacle', lane: 'main', col: 1, type: 'database', label: 'Obstacle' },
2029
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
2030
- ],
2031
- edges: [{
2032
- id: 'ab',
2033
- from: 'a',
2034
- to: 'b',
2035
- fromSide: 'right',
2036
- toSide: 'left',
2037
- via: [[200, 119], [260, 119]],
2038
- }],
2039
- });
2040
-
2041
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
2042
- assertExplicitPinConflict(result, 'unrelated node collision');
2043
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/explicit-pin-conflict');
2044
- assert.equal(diagnostic.evidence.invariant, 'node clearance');
2045
- assert.deepEqual({
2046
- obstacleNode: diagnostic.evidence.obstacleNode,
2047
- obstacleRole: diagnostic.evidence.obstacleRole,
2048
- segmentIndex: diagnostic.evidence.segmentIndex,
2049
- from: diagnostic.evidence.from,
2050
- to: diagnostic.evidence.to,
2051
- clearancePx: diagnostic.evidence.clearancePx,
2052
- }, {
2053
- obstacleNode: 'obstacle',
2054
- obstacleRole: 'unrelated',
2055
- segmentIndex: 0,
2056
- from: [140, 119],
2057
- to: [200, 119],
2058
- clearancePx: 2,
2059
- });
2060
- });
2061
-
2062
- test('fixed-v1 publishes only repairs that survive complete replanning', () => {
2063
- const document = {
2064
- schema_version: 1,
2065
- diagram_type: 'workflow',
2066
- meta: { title: 'Verified fixes', legend: { mode: 'hidden' } },
2067
- lanes: [{ id: 'main', label: 'Main' }],
2068
- groups: [{ id: 'target-only', label: 'Target', lane: 'main', fromCol: 2, toCol: 2 }],
2069
- nodes: [
2070
- { id: 'a', lane: 'main', col: 1, type: 'backend', label: 'A' },
2071
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B' },
2072
- ],
2073
- edges: [{ id: 'ab', from: 'a', to: 'b' }],
2074
- };
2075
-
2076
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
2077
- assert.equal(result.ok, false);
2078
- const diagnostic = result.diagnostics.find(({ code }) => code === 'workflow/column-capacity');
2079
- assert.ok(diagnostic);
2080
- assert.ok(
2081
- diagnostic.supportedFixes.every((fix) => !/^move node /.test(fix)),
2082
- `moving the group's only node must not be advertised as verified: ${diagnostic.supportedFixes}`,
2083
- );
2084
- });
2085
-
2086
- test('fixed-v1 verifies the exact serialized values in every rounded-width repair', () => {
2087
- const document = {
2088
- schema_version: 1,
2089
- diagram_type: 'workflow',
2090
- meta: { title: 'Rounded verified widths', legend: { mode: 'hidden' } },
2091
- lanes: [{ id: 'main', label: 'M' }],
2092
- nodes: [
2093
- { id: 'a', lane: 'main', col: 1, type: 'backend', label: 'A', width: 52.006 },
2094
- { id: 'b', lane: 'main', col: 2, type: 'backend', label: 'B', width: 51.995 },
2095
- ],
2096
- edges: [{ id: 'ab', from: 'a', to: 'b' }],
2097
- };
2098
-
2099
- const result = compileWorkflow({ workflow: document, qualityProfile: 'standard' });
2100
-
2101
- assert.equal(result.ok, false);
2102
- assert.equal(result.diagnostics.length, 1, JSON.stringify(result.diagnostics, null, 2));
2103
- const [diagnostic] = result.diagnostics;
2104
- assert.equal(diagnostic.code, 'workflow/column-capacity');
2105
- assert.deepEqual(diagnostic.evidence.nodeWidthsPx, [52.006, 51.995]);
2106
- assert.ok(diagnostic.supportedFixes.length > 0);
2107
- assert.ok(
2108
- diagnostic.supportedFixes.includes('set node widths "a"=52px and "b"=51.99px'),
2109
- JSON.stringify(diagnostic.supportedFixes, null, 2),
2110
- );
2111
-
2112
- for (const fix of diagnostic.supportedFixes) {
2113
- const repaired = clone(document);
2114
- if (fix === 'migrate this workflow to schema_version 2') {
2115
- repaired.schema_version = 2;
2116
- } else {
2117
- const move = fix.match(/^move node "([^"]+)" to verified free column (\d+)$/);
2118
- const widths = [...fix.matchAll(/"([^"]+)"=([\d.]+)px/g)];
2119
- if (move) {
2120
- repaired.nodes.find(({ id }) => id === move[1]).col = Number(move[2]);
2121
- } else {
2122
- assert.ok(widths.length > 0, `unsupported advertised repair: ${fix}`);
2123
- for (const [, nodeId, width] of widths) {
2124
- repaired.nodes.find(({ id }) => id === nodeId).width = Number(width);
2125
- }
2126
- }
2127
- }
2128
- const verified = compileWorkflow({ workflow: repaired, qualityProfile: 'standard' });
2129
- assert.equal(
2130
- verified.ok,
2131
- true,
2132
- `advertised fix must recompile: ${fix}\n${JSON.stringify(verified.diagnostics, null, 2)}`,
2133
- );
2134
- }
2135
- });