create-yss-spec 2.2.10 → 3.0.0

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 (381) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/template/.agents/skills/ask-matt/SKILL.md +1 -1
  4. package/template/.agents/skills/wayfinder/SKILL.md +2 -2
  5. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  6. package/template/.agents/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  7. package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  8. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  9. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  10. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  11. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  12. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  13. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  14. package/template/.agents/skills/yss-domain/SKILL.md +2 -1
  15. package/template/.agents/skills/yss-domain/agents/openai.yaml +2 -2
  16. package/template/.agents/skills/yss-domain/references/domain-layer-guide.md +2 -0
  17. package/template/.agents/skills/yss-dto/SKILL.md +6 -0
  18. package/template/.agents/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  19. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +1 -1
  20. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  21. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  22. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  23. package/template/.agents/skills/yss-repository/SKILL.md +15 -13
  24. package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
  25. package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  26. package/template/.agents/skills/yss-research/SKILL.md +73 -0
  27. package/template/.agents/skills/yss-research/agents/openai.yaml +3 -0
  28. package/template/.agents/skills/yss-research/assets/evidence-template.yaml +68 -0
  29. package/template/.agents/skills/yss-research/assets/research-brief-template.md +36 -0
  30. package/template/.agents/skills/yss-research/references/evidence-contract.md +42 -0
  31. package/template/.agents/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  32. package/template/.agents/skills/yss-research/tests/run-scenarios.mjs +81 -0
  33. package/template/.agents/skills/yss-router/references/router-contract.yaml +7 -3
  34. package/template/.agents/skills/yss-stage-decision/SKILL.md +2 -1
  35. package/template/.agents/skills/yss-web-controller/SKILL.md +16 -10
  36. package/template/.agents/skills/yss-web-controller/agents/openai.yaml +2 -2
  37. package/template/.agents/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  38. package/template/.agents/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  39. package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  40. package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  41. package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  42. package/template/.agents/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  43. package/template/.agents/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  44. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  45. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  46. package/template/.claude/skills/ask-matt/SKILL.md +1 -1
  47. package/template/.claude/skills/wayfinder/SKILL.md +2 -2
  48. package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  49. package/template/.claude/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  50. package/template/.claude/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  51. package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  52. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  53. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  54. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  55. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  56. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  57. package/template/.claude/skills/yss-domain/SKILL.md +2 -1
  58. package/template/.claude/skills/yss-domain/agents/openai.yaml +2 -2
  59. package/template/.claude/skills/yss-domain/references/domain-layer-guide.md +2 -0
  60. package/template/.claude/skills/yss-dto/SKILL.md +6 -0
  61. package/template/.claude/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  62. package/template/.claude/skills/yss-product-lifecycle/SKILL.md +1 -1
  63. package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  64. package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  65. package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  66. package/template/.claude/skills/yss-repository/SKILL.md +15 -13
  67. package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
  68. package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  69. package/template/.claude/skills/yss-research/SKILL.md +73 -0
  70. package/template/.claude/skills/yss-research/agents/openai.yaml +3 -0
  71. package/template/.claude/skills/yss-research/assets/evidence-template.yaml +68 -0
  72. package/template/.claude/skills/yss-research/assets/research-brief-template.md +36 -0
  73. package/template/.claude/skills/yss-research/references/evidence-contract.md +42 -0
  74. package/template/.claude/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  75. package/template/.claude/skills/yss-research/tests/run-scenarios.mjs +81 -0
  76. package/template/.claude/skills/yss-router/references/router-contract.yaml +7 -3
  77. package/template/.claude/skills/yss-stage-decision/SKILL.md +2 -1
  78. package/template/.claude/skills/yss-web-controller/SKILL.md +16 -10
  79. package/template/.claude/skills/yss-web-controller/agents/openai.yaml +2 -2
  80. package/template/.claude/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  81. package/template/.claude/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  82. package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  83. package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  84. package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  85. package/template/.claude/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  86. package/template/.claude/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  87. package/template/.claude/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  88. package/template/.claude/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  89. package/template/.codex/skills/ask-matt/SKILL.md +1 -1
  90. package/template/.codex/skills/product-design/package.json +4 -2
  91. package/template/.codex/skills/product-design/skills/research/SKILL.md +22 -0
  92. package/template/.codex/skills/product-design/skills/research/assets/evidence-template.yaml +65 -0
  93. package/template/.codex/skills/product-design/skills/research/assets/research-brief-template.md +33 -0
  94. package/template/.codex/skills/product-design/skills/research/references/evidence-audited.md +80 -0
  95. package/template/.codex/skills/product-design/skills/research/scripts/validate-research-package.mjs +149 -0
  96. package/template/.codex/skills/product-design/skills/research/tests/run-scenarios.mjs +72 -0
  97. package/template/.codex/skills/wayfinder/SKILL.md +2 -2
  98. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  99. package/template/.codex/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  100. package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  101. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  102. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  103. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  104. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  105. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  106. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  107. package/template/.codex/skills/yss-domain/SKILL.md +2 -1
  108. package/template/.codex/skills/yss-domain/agents/openai.yaml +2 -2
  109. package/template/.codex/skills/yss-domain/references/domain-layer-guide.md +2 -0
  110. package/template/.codex/skills/yss-dto/SKILL.md +6 -0
  111. package/template/.codex/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  112. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +1 -1
  113. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  114. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  115. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  116. package/template/.codex/skills/yss-repository/SKILL.md +15 -13
  117. package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
  118. package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  119. package/template/.codex/skills/yss-research/SKILL.md +73 -0
  120. package/template/.codex/skills/yss-research/agents/openai.yaml +3 -0
  121. package/template/.codex/skills/yss-research/assets/evidence-template.yaml +68 -0
  122. package/template/.codex/skills/yss-research/assets/research-brief-template.md +36 -0
  123. package/template/.codex/skills/yss-research/references/evidence-contract.md +42 -0
  124. package/template/.codex/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  125. package/template/.codex/skills/yss-research/tests/run-scenarios.mjs +81 -0
  126. package/template/.codex/skills/yss-router/references/router-contract.yaml +7 -3
  127. package/template/.codex/skills/yss-stage-decision/SKILL.md +2 -1
  128. package/template/.codex/skills/yss-web-controller/SKILL.md +16 -10
  129. package/template/.codex/skills/yss-web-controller/agents/openai.yaml +2 -2
  130. package/template/.codex/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  131. package/template/.codex/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  132. package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  133. package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  134. package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  135. package/template/.codex/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  136. package/template/.codex/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  137. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  138. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  139. package/template/.cursor/skills/ask-matt/SKILL.md +1 -1
  140. package/template/.cursor/skills/wayfinder/SKILL.md +2 -2
  141. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  142. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  143. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  144. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  145. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  146. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  147. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  148. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  149. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  150. package/template/.cursor/skills/yss-domain/SKILL.md +2 -1
  151. package/template/.cursor/skills/yss-domain/agents/openai.yaml +2 -2
  152. package/template/.cursor/skills/yss-domain/references/domain-layer-guide.md +2 -0
  153. package/template/.cursor/skills/yss-dto/SKILL.md +6 -0
  154. package/template/.cursor/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  155. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +1 -1
  156. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  157. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  158. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  159. package/template/.cursor/skills/yss-repository/SKILL.md +15 -13
  160. package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
  161. package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  162. package/template/.cursor/skills/yss-research/SKILL.md +73 -0
  163. package/template/.cursor/skills/yss-research/agents/openai.yaml +3 -0
  164. package/template/.cursor/skills/yss-research/assets/evidence-template.yaml +68 -0
  165. package/template/.cursor/skills/yss-research/assets/research-brief-template.md +36 -0
  166. package/template/.cursor/skills/yss-research/references/evidence-contract.md +42 -0
  167. package/template/.cursor/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  168. package/template/.cursor/skills/yss-research/tests/run-scenarios.mjs +81 -0
  169. package/template/.cursor/skills/yss-router/references/router-contract.yaml +7 -3
  170. package/template/.cursor/skills/yss-stage-decision/SKILL.md +2 -1
  171. package/template/.cursor/skills/yss-web-controller/SKILL.md +16 -10
  172. package/template/.cursor/skills/yss-web-controller/agents/openai.yaml +2 -2
  173. package/template/.cursor/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  174. package/template/.cursor/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  175. package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  176. package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  177. package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  178. package/template/.cursor/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  179. package/template/.cursor/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  180. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  181. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  182. package/template/.hermes/skills/ask-matt/SKILL.md +1 -1
  183. package/template/.hermes/skills/wayfinder/SKILL.md +2 -2
  184. package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  185. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  186. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  187. package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  188. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  189. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  190. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  191. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  192. package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  193. package/template/.hermes/skills/yss-domain/SKILL.md +2 -1
  194. package/template/.hermes/skills/yss-domain/agents/openai.yaml +2 -2
  195. package/template/.hermes/skills/yss-domain/references/domain-layer-guide.md +2 -0
  196. package/template/.hermes/skills/yss-dto/SKILL.md +6 -0
  197. package/template/.hermes/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  198. package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +1 -1
  199. package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  200. package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  201. package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  202. package/template/.hermes/skills/yss-repository/SKILL.md +15 -13
  203. package/template/.hermes/skills/yss-repository/agents/openai.yaml +2 -2
  204. package/template/.hermes/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  205. package/template/.hermes/skills/yss-research/SKILL.md +73 -0
  206. package/template/.hermes/skills/yss-research/agents/openai.yaml +3 -0
  207. package/template/.hermes/skills/yss-research/assets/evidence-template.yaml +68 -0
  208. package/template/.hermes/skills/yss-research/assets/research-brief-template.md +36 -0
  209. package/template/.hermes/skills/yss-research/references/evidence-contract.md +42 -0
  210. package/template/.hermes/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  211. package/template/.hermes/skills/yss-research/tests/run-scenarios.mjs +81 -0
  212. package/template/.hermes/skills/yss-router/references/router-contract.yaml +7 -3
  213. package/template/.hermes/skills/yss-stage-decision/SKILL.md +2 -1
  214. package/template/.hermes/skills/yss-web-controller/SKILL.md +16 -10
  215. package/template/.hermes/skills/yss-web-controller/agents/openai.yaml +2 -2
  216. package/template/.hermes/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  217. package/template/.hermes/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  218. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  219. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  220. package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  221. package/template/.hermes/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  222. package/template/.hermes/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  223. package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  224. package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  225. package/template/.pi/skills/ask-matt/SKILL.md +1 -1
  226. package/template/.pi/skills/wayfinder/SKILL.md +2 -2
  227. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  228. package/template/.pi/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  229. package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  230. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  231. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  232. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  233. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  234. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  235. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  236. package/template/.pi/skills/yss-domain/SKILL.md +2 -1
  237. package/template/.pi/skills/yss-domain/agents/openai.yaml +2 -2
  238. package/template/.pi/skills/yss-domain/references/domain-layer-guide.md +2 -0
  239. package/template/.pi/skills/yss-dto/SKILL.md +6 -0
  240. package/template/.pi/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  241. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +1 -1
  242. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  243. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  244. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  245. package/template/.pi/skills/yss-repository/SKILL.md +15 -13
  246. package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
  247. package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  248. package/template/.pi/skills/yss-research/SKILL.md +73 -0
  249. package/template/.pi/skills/yss-research/agents/openai.yaml +3 -0
  250. package/template/.pi/skills/yss-research/assets/evidence-template.yaml +68 -0
  251. package/template/.pi/skills/yss-research/assets/research-brief-template.md +36 -0
  252. package/template/.pi/skills/yss-research/references/evidence-contract.md +42 -0
  253. package/template/.pi/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  254. package/template/.pi/skills/yss-research/tests/run-scenarios.mjs +81 -0
  255. package/template/.pi/skills/yss-router/references/router-contract.yaml +7 -3
  256. package/template/.pi/skills/yss-stage-decision/SKILL.md +2 -1
  257. package/template/.pi/skills/yss-web-controller/SKILL.md +16 -10
  258. package/template/.pi/skills/yss-web-controller/agents/openai.yaml +2 -2
  259. package/template/.pi/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  260. package/template/.pi/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  261. package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  262. package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  263. package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  264. package/template/.pi/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  265. package/template/.pi/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  266. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  267. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  268. package/template/.qoder/skills/ask-matt/SKILL.md +1 -1
  269. package/template/.qoder/skills/wayfinder/SKILL.md +2 -2
  270. package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  271. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  272. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  273. package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  274. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  275. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  276. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  277. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  278. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  279. package/template/.qoder/skills/yss-domain/SKILL.md +2 -1
  280. package/template/.qoder/skills/yss-domain/agents/openai.yaml +2 -2
  281. package/template/.qoder/skills/yss-domain/references/domain-layer-guide.md +2 -0
  282. package/template/.qoder/skills/yss-dto/SKILL.md +6 -0
  283. package/template/.qoder/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  284. package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +1 -1
  285. package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  286. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  287. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  288. package/template/.qoder/skills/yss-repository/SKILL.md +15 -13
  289. package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
  290. package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  291. package/template/.qoder/skills/yss-research/SKILL.md +73 -0
  292. package/template/.qoder/skills/yss-research/agents/openai.yaml +3 -0
  293. package/template/.qoder/skills/yss-research/assets/evidence-template.yaml +68 -0
  294. package/template/.qoder/skills/yss-research/assets/research-brief-template.md +36 -0
  295. package/template/.qoder/skills/yss-research/references/evidence-contract.md +42 -0
  296. package/template/.qoder/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  297. package/template/.qoder/skills/yss-research/tests/run-scenarios.mjs +81 -0
  298. package/template/.qoder/skills/yss-router/references/router-contract.yaml +7 -3
  299. package/template/.qoder/skills/yss-stage-decision/SKILL.md +2 -1
  300. package/template/.qoder/skills/yss-web-controller/SKILL.md +16 -10
  301. package/template/.qoder/skills/yss-web-controller/agents/openai.yaml +2 -2
  302. package/template/.qoder/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  303. package/template/.qoder/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  304. package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  305. package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  306. package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  307. package/template/.qoder/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  308. package/template/.qoder/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  309. package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  310. package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  311. package/template/.trae/skills/ask-matt/SKILL.md +1 -1
  312. package/template/.trae/skills/wayfinder/SKILL.md +2 -2
  313. package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
  314. package/template/.trae/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
  315. package/template/.trae/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
  316. package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
  317. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
  318. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
  319. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
  320. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
  321. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
  322. package/template/.trae/skills/yss-domain/SKILL.md +2 -1
  323. package/template/.trae/skills/yss-domain/agents/openai.yaml +2 -2
  324. package/template/.trae/skills/yss-domain/references/domain-layer-guide.md +2 -0
  325. package/template/.trae/skills/yss-dto/SKILL.md +6 -0
  326. package/template/.trae/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
  327. package/template/.trae/skills/yss-product-lifecycle/SKILL.md +1 -1
  328. package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
  329. package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
  330. package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  331. package/template/.trae/skills/yss-repository/SKILL.md +15 -13
  332. package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
  333. package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
  334. package/template/.trae/skills/yss-research/SKILL.md +73 -0
  335. package/template/.trae/skills/yss-research/agents/openai.yaml +3 -0
  336. package/template/.trae/skills/yss-research/assets/evidence-template.yaml +68 -0
  337. package/template/.trae/skills/yss-research/assets/research-brief-template.md +36 -0
  338. package/template/.trae/skills/yss-research/references/evidence-contract.md +42 -0
  339. package/template/.trae/skills/yss-research/scripts/validate-research-package.mjs +128 -0
  340. package/template/.trae/skills/yss-research/tests/run-scenarios.mjs +81 -0
  341. package/template/.trae/skills/yss-router/references/router-contract.yaml +7 -3
  342. package/template/.trae/skills/yss-stage-decision/SKILL.md +2 -1
  343. package/template/.trae/skills/yss-web-controller/SKILL.md +16 -10
  344. package/template/.trae/skills/yss-web-controller/agents/openai.yaml +2 -2
  345. package/template/.trae/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
  346. package/template/.trae/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
  347. package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
  348. package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
  349. package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
  350. package/template/.trae/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
  351. package/template/.trae/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
  352. package/template/.trae/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
  353. package/template/.trae/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
  354. package/template/AGENTS.md +2 -2
  355. package/template/CONTEXT.md +1 -1
  356. package/template/docs/agents/digital-human-roles.yaml +2 -2
  357. package/template/docs/agents/yss-skill-registry.yaml +18 -3
  358. package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
  359. package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +1 -1
  360. package/template/scripts/lib/scenario-checks.mjs +8 -4
  361. package/template/scripts/lib/skill-registry.mjs +49 -5
  362. package/template/scripts/lib/skill-supply-chain.mjs +3 -2
  363. package/template/scripts/verify-yss-dto-openapi-profile +8 -0
  364. package/template/skills-lock.json +30 -30
  365. package/template.snapshot.json +4 -4
  366. package/template/.agents/skills/research/SKILL.md +0 -12
  367. package/template/.agents/skills/research/agents/openai.yaml +0 -3
  368. package/template/.claude/skills/research/SKILL.md +0 -12
  369. package/template/.claude/skills/research/agents/openai.yaml +0 -3
  370. package/template/.codex/skills/research/SKILL.md +0 -12
  371. package/template/.codex/skills/research/agents/openai.yaml +0 -3
  372. package/template/.cursor/skills/research/SKILL.md +0 -12
  373. package/template/.cursor/skills/research/agents/openai.yaml +0 -3
  374. package/template/.hermes/skills/research/SKILL.md +0 -12
  375. package/template/.hermes/skills/research/agents/openai.yaml +0 -3
  376. package/template/.pi/skills/research/SKILL.md +0 -12
  377. package/template/.pi/skills/research/agents/openai.yaml +0 -3
  378. package/template/.qoder/skills/research/SKILL.md +0 -12
  379. package/template/.qoder/skills/research/agents/openai.yaml +0 -3
  380. package/template/.trae/skills/research/SKILL.md +0 -12
  381. package/template/.trae/skills/research/agents/openai.yaml +0 -3
@@ -0,0 +1,68 @@
1
+ {
2
+ "schema_version": 1,
3
+ "profile": "strategy-evidence",
4
+ "mode": "evidence-audited",
5
+ "scope": {
6
+ "topic": "<topic>",
7
+ "audience": "<audience>",
8
+ "time_horizon": "<time horizon>",
9
+ "research_questions": ["<question>"],
10
+ "inclusion_criteria": ["<criterion>"],
11
+ "exclusion_criteria": ["<criterion>"]
12
+ },
13
+ "ownership": {
14
+ "research_owner": "yss-research",
15
+ "downstream_owner": "<lifecycle skill or role>",
16
+ "decision_ref": null
17
+ },
18
+ "search_log": [
19
+ {
20
+ "id": "search-001",
21
+ "channel": "<channel or corpus>",
22
+ "query_or_corpus": "<query or inspected material>",
23
+ "searched_at": "YYYY-MM-DD",
24
+ "result": "results-found"
25
+ },
26
+ {
27
+ "id": "search-002",
28
+ "channel": "<counter-signal channel>",
29
+ "query_or_corpus": "<counter-signal query>",
30
+ "searched_at": "YYYY-MM-DD",
31
+ "result": "none-found"
32
+ }
33
+ ],
34
+ "evidence_items": [
35
+ {
36
+ "id": "evidence-001",
37
+ "source_level": "direct-experience",
38
+ "visibility": "internal",
39
+ "source_class": "<interview, support, ticket, docs, specification, source-code, dataset, report>",
40
+ "source_ref": "<URL or repository reference>",
41
+ "locator": "<line, section, record, timestamp, or comment>",
42
+ "stance": "support",
43
+ "observed_at": "YYYY-MM-DD",
44
+ "evidence_date": "YYYY-MM-DD",
45
+ "observation": "<what the source directly shows>",
46
+ "limitations": ["<sampling, recency, access, or independence limit>"]
47
+ }
48
+ ],
49
+ "claims": [
50
+ {
51
+ "id": "claim-001",
52
+ "claim_kind": "user-problem",
53
+ "statement": "<decision-bearing claim>",
54
+ "decision_bearing": true,
55
+ "evidence_refs": ["evidence-001"],
56
+ "counter_signal_refs": ["search-002"],
57
+ "audit_status": "supported",
58
+ "confidence": "medium",
59
+ "disposition": "publish"
60
+ }
61
+ ],
62
+ "source_gaps": [],
63
+ "audit_summary": {
64
+ "status": "complete",
65
+ "audited_claim_ids": ["claim-001"],
66
+ "notes": []
67
+ }
68
+ }
@@ -0,0 +1,36 @@
1
+ # <Topic> Research Brief
2
+
3
+ ## Research Scope
4
+
5
+ - Profile: `technical-evidence` or `strategy-evidence`
6
+ - Mode: `evidence-audited`
7
+ - Decision informed:
8
+ - Audience:
9
+ - Time horizon:
10
+ - Inclusion criteria:
11
+ - Exclusion criteria:
12
+ - Access limitations:
13
+
14
+ ## Executive Read
15
+
16
+ Summarize the evidence-backed answer and its decision boundary.
17
+
18
+ ## Findings
19
+
20
+ For every decision-bearing finding, cite its `claim-*` ID and source links. Separate observation, inference, hypothesis, and recommendation.
21
+
22
+ ## Counter-Signals
23
+
24
+ Describe conflicting evidence and unsuccessful counterexample searches without treating `none-found` as proof of absence.
25
+
26
+ ## Source Map
27
+
28
+ Explain what each source class contributed, exclusions, access failures, and weak areas.
29
+
30
+ ## Decision Handoff
31
+
32
+ Identify the downstream owner and asset. State explicitly that this research does not approve or mutate that asset.
33
+
34
+ ## Evidence Limitations
35
+
36
+ List sampling, recency, independence, access, and provenance limits plus any `needs-deeper-research` claims.
@@ -0,0 +1,42 @@
1
+ # YSS Research Evidence Contract
2
+
3
+ This contract defines the persisted `evidence-audited` package. The Markdown brief is the readable narrative; the adjacent evidence file is the source of truth for search execution, provenance, claim mapping, audit state, and downstream ownership.
4
+
5
+ ## Evidence levels
6
+
7
+ | Level | Meaning | Allowed use |
8
+ |---|---|---|
9
+ | `primary` | Official specification, official documentation, first-party API, source code, filing, or original dataset | Required for decision-bearing `technical-evidence` claims |
10
+ | `direct-experience` | Interview, support record, ticket, direct observation, telemetry, or original user report | May support `strategy-evidence`; state sampling and access limits |
11
+ | `near-primary` | Dated review, vendor case study, marketplace record, or a report with inspectable methodology | May support strategy claims with qualification |
12
+ | `secondary` | Reputable synthesis that identifies its underlying evidence | Context or corroboration; avoid as the sole basis for high-impact decisions |
13
+ | `lead-only` | Aggregator snippet, unattributed repost, or AI-generated summary | Search lead only; never a supporting evidence reference |
14
+
15
+ ## Search and counter-signals
16
+
17
+ Each material query or corpus inspection has a stable `search-*` ID, execution date, channel, query/corpus, and result. Allowed results are `results-found`, `none-found`, `access-failed`, and `excluded`.
18
+
19
+ Each claim must name supporting evidence and at least one counter-signal. A counter-signal is either an `evidence-*` item marked `counter` or a `search-*` entry with `none-found`. A `none-found` search only proves that the declared search did not find a counterexample.
20
+
21
+ ## Claim audit
22
+
23
+ Allowed outcomes:
24
+
25
+ - `supported`: the evidence directly supports the wording;
26
+ - `partially-supported`: only a narrower, qualified wording is supportable;
27
+ - `unsupported`: the source does not support the claim;
28
+ - `not-audited`: temporary state, forbidden when the package says audit is complete.
29
+
30
+ `partially-supported` requires disposition `qualify`. `unsupported` requires `needs-deeper-research`. `lead-only` items cannot be cited as support. In `technical-evidence`, every decision-bearing claim needs at least one `primary` supporting item.
31
+
32
+ In `strategy-evidence`, decision-bearing kinds are `user-problem`, `business-constraint`, `domain-boundary`, `business-rule`, `mvp`, `non-goal`, `success-criterion`, and `stage-decision-basis`. These claims must all be present in `audit_summary.audited_claim_ids` before downstream lifecycle consumption.
33
+
34
+ ## Ownership and failure
35
+
36
+ The package names its downstream owner and optional decision reference. It does not change the owned artifact or gate. Structure errors, unresolved references, decision-bearing unaudited claims, or a false `complete` declaration fail validation. Access gaps and conflicting evidence are recorded in `source_gaps`; they do not fail the entire brief unless they leave a decision-bearing claim unsupported.
37
+
38
+ The evidence file uses JSON syntax, which is valid YAML 1.2, so validation is portable and dependency-free.
39
+
40
+ ## Design provenance
41
+
42
+ The Search Log, evidence passport, and claim-source alignment concepts are adapted from [Academic Research Skills](https://github.com/Imbad0202/academic-research-skills). This YSS contract omits academic writing, publication, fixed agent teams, and cross-model review machinery, and retains YSS lifecycle ownership boundaries.
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+
5
+ const PROFILE_VALUES = ["technical-evidence", "strategy-evidence"];
6
+ const SOURCE_LEVELS = ["primary", "direct-experience", "near-primary", "secondary", "lead-only"];
7
+ const CLAIM_KINDS = ["technical-fact", "user-problem", "business-constraint", "domain-boundary", "business-rule", "mvp", "non-goal", "success-criterion", "stage-decision-basis", "background"];
8
+ const STRATEGY_DECISION_KINDS = new Set(["user-problem", "business-constraint", "domain-boundary", "business-rule", "mvp", "non-goal", "success-criterion", "stage-decision-basis"]);
9
+
10
+ function fail(message) { throw new TypeError(message); }
11
+ function requireString(value, label) { if (typeof value !== "string" || !value.trim()) fail(`${label} must be a non-empty string`); }
12
+ function requireArray(value, label, nonEmpty = false) { if (!Array.isArray(value) || (nonEmpty && value.length === 0)) fail(`${label} must be ${nonEmpty ? "a non-empty" : "an"} array`); }
13
+ function requireChoice(value, choices, label) { if (!choices.includes(value)) fail(`${label} must be one of: ${choices.join(", ")}`); }
14
+
15
+ function indexed(items, label) {
16
+ const result = new Map();
17
+ items.forEach((item, index) => {
18
+ requireString(item?.id, `${label}[${index}].id`);
19
+ if (result.has(item.id)) fail(`${label} contains duplicate id: ${item.id}`);
20
+ result.set(item.id, item);
21
+ });
22
+ return result;
23
+ }
24
+
25
+ function readEvidence(file) {
26
+ try {
27
+ const value = JSON.parse(readFileSync(file, "utf8"));
28
+ if (!value || typeof value !== "object" || Array.isArray(value)) fail("evidence root must be an object");
29
+ return value;
30
+ } catch (error) {
31
+ if (error instanceof TypeError && error.message === "evidence root must be an object") throw error;
32
+ fail(`${path.basename(file)} must use JSON-compatible YAML 1.2 syntax: ${error.message}`);
33
+ }
34
+ }
35
+
36
+ function validate(briefFile, evidenceFile) {
37
+ if (!briefFile || !evidenceFile) fail("usage: validate-research-package.mjs <brief.md> <evidence.yaml>");
38
+ const briefPath = path.resolve(briefFile);
39
+ const evidencePath = path.resolve(evidenceFile);
40
+ if (path.dirname(briefPath) !== path.dirname(evidencePath)) fail("brief and evidence files must be adjacent");
41
+ if (!briefPath.endsWith("-research-brief.md") || !evidencePath.endsWith("-evidence.yaml")) fail("expected <slug>-research-brief.md and <slug>-evidence.yaml");
42
+ const briefSlug = path.basename(briefPath, "-research-brief.md");
43
+ if (!briefSlug || briefSlug !== path.basename(evidencePath, "-evidence.yaml")) fail("brief and evidence files must use the same non-empty slug");
44
+
45
+ const brief = readFileSync(briefPath, "utf8");
46
+ ["Research Scope", "Executive Read", "Findings", "Counter-Signals", "Source Map", "Decision Handoff", "Evidence Limitations"].forEach((heading) => {
47
+ if (!brief.includes(`## ${heading}`)) fail(`brief is missing heading: ## ${heading}`);
48
+ });
49
+
50
+ const data = readEvidence(evidencePath);
51
+ if (data.schema_version !== 1) fail("schema_version must be 1");
52
+ requireChoice(data.profile, PROFILE_VALUES, "profile");
53
+ if (data.mode !== "evidence-audited") fail("mode must be evidence-audited");
54
+ ["topic", "audience", "time_horizon"].forEach((field) => requireString(data.scope?.[field], `scope.${field}`));
55
+ ["research_questions", "inclusion_criteria", "exclusion_criteria"].forEach((field) => requireArray(data.scope?.[field], `scope.${field}`, true));
56
+ if (data.ownership?.research_owner !== "yss-research") fail("ownership.research_owner must be yss-research");
57
+ requireString(data.ownership?.downstream_owner, "ownership.downstream_owner");
58
+ if (data.ownership.decision_ref !== null && (typeof data.ownership.decision_ref !== "string" || !data.ownership.decision_ref.trim())) fail("ownership.decision_ref must be null or a non-empty string");
59
+
60
+ requireArray(data.search_log, "search_log", true);
61
+ const searches = indexed(data.search_log, "search_log");
62
+ data.search_log.forEach((entry, index) => {
63
+ ["channel", "query_or_corpus", "searched_at"].forEach((field) => requireString(entry[field], `search_log[${index}].${field}`));
64
+ requireChoice(entry.result, ["results-found", "none-found", "access-failed", "excluded"], `search_log[${index}].result`);
65
+ });
66
+
67
+ requireArray(data.evidence_items, "evidence_items", true);
68
+ const evidence = indexed(data.evidence_items, "evidence_items");
69
+ data.evidence_items.forEach((item, index) => {
70
+ requireChoice(item.source_level, SOURCE_LEVELS, `evidence_items[${index}].source_level`);
71
+ requireChoice(item.visibility, ["public", "internal"], `evidence_items[${index}].visibility`);
72
+ requireChoice(item.stance, ["support", "counter"], `evidence_items[${index}].stance`);
73
+ ["source_class", "source_ref", "locator", "observed_at", "observation"].forEach((field) => requireString(item[field], `evidence_items[${index}].${field}`));
74
+ requireArray(item.limitations, `evidence_items[${index}].limitations`);
75
+ });
76
+
77
+ requireArray(data.claims, "claims", true);
78
+ const claims = indexed(data.claims, "claims");
79
+ data.claims.forEach((claim, index) => {
80
+ requireChoice(claim.claim_kind, CLAIM_KINDS, `claims[${index}].claim_kind`);
81
+ requireString(claim.statement, `claims[${index}].statement`);
82
+ if (typeof claim.decision_bearing !== "boolean") fail(`claims[${index}].decision_bearing must be boolean`);
83
+ requireArray(claim.evidence_refs, `claims[${index}].evidence_refs`, true);
84
+ requireArray(claim.counter_signal_refs, `claims[${index}].counter_signal_refs`, true);
85
+ requireChoice(claim.audit_status, ["supported", "partially-supported", "unsupported", "not-audited"], `claims[${index}].audit_status`);
86
+ requireChoice(claim.confidence, ["low", "medium", "high"], `claims[${index}].confidence`);
87
+ requireChoice(claim.disposition, ["publish", "qualify", "needs-deeper-research"], `claims[${index}].disposition`);
88
+
89
+ const supporting = claim.evidence_refs.map((ref) => {
90
+ if (!evidence.has(ref)) fail(`${claim.id} has unresolved evidence ref: ${ref}`);
91
+ const item = evidence.get(ref);
92
+ if (item.stance !== "support") fail(`${claim.id} support ref is not marked support: ${ref}`);
93
+ if (item.source_level === "lead-only") fail(`${claim.id} uses lead-only evidence as support: ${ref}`);
94
+ return item;
95
+ });
96
+ claim.counter_signal_refs.forEach((ref) => {
97
+ if (!evidence.has(ref) && !searches.has(ref)) fail(`${claim.id} has unresolved counter-signal ref: ${ref}`);
98
+ if (evidence.has(ref) && evidence.get(ref).stance !== "counter") fail(`${claim.id} counter-signal evidence is not marked counter: ${ref}`);
99
+ if (searches.has(ref) && searches.get(ref).result !== "none-found") fail(`${claim.id} counter-signal search must have result none-found: ${ref}`);
100
+ });
101
+ if (data.profile === "technical-evidence" && claim.decision_bearing && !supporting.some((item) => item.source_level === "primary")) fail(`${claim.id} is a decision-bearing technical claim without primary evidence`);
102
+ if (data.profile === "strategy-evidence" && STRATEGY_DECISION_KINDS.has(claim.claim_kind) && claim.decision_bearing !== true) fail(`${claim.id} strategy claim kind must be decision-bearing: ${claim.claim_kind}`);
103
+ if (claim.audit_status === "partially-supported" && claim.disposition !== "qualify") fail(`${claim.id} is partially supported and must use qualify`);
104
+ if (claim.audit_status === "unsupported" && claim.disposition !== "needs-deeper-research") fail(`${claim.id} is unsupported and must use needs-deeper-research`);
105
+ if (claim.decision_bearing && claim.audit_status === "unsupported") fail(`${claim.id} is decision-bearing and cannot remain unsupported`);
106
+ if (!brief.includes(claim.id)) fail(`brief does not reference claim: ${claim.id}`);
107
+ });
108
+
109
+ requireArray(data.source_gaps, "source_gaps");
110
+ if (data.audit_summary?.status !== "complete") fail("audit_summary.status must be complete");
111
+ requireArray(data.audit_summary.audited_claim_ids, "audit_summary.audited_claim_ids", true);
112
+ requireArray(data.audit_summary.notes, "audit_summary.notes");
113
+ const audited = new Set(data.audit_summary.audited_claim_ids);
114
+ audited.forEach((id) => { if (!claims.has(id)) fail(`audit_summary has unknown claim: ${id}`); });
115
+ claims.forEach((claim, id) => {
116
+ if (claim.decision_bearing && !audited.has(id)) fail(`audit_summary is missing decision-bearing claim: ${id}`);
117
+ if (claim.decision_bearing && claim.audit_status === "not-audited") fail(`${id} remains not-audited`);
118
+ });
119
+ return { claims: claims.size, evidence: evidence.size, searches: searches.size, profile: data.profile };
120
+ }
121
+
122
+ try {
123
+ const result = validate(process.argv[2], process.argv[3]);
124
+ process.stdout.write(`YSS research package valid (${result.profile}, ${result.claims} claims, ${result.evidence} evidence items, ${result.searches} searches)\n`);
125
+ } catch (error) {
126
+ process.stderr.write(`YSS research package invalid: ${error.message}\n`);
127
+ process.exitCode = 1;
128
+ }
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { spawnSync } from "node:child_process";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
9
+ const validator = path.join(root, "scripts/validate-research-package.mjs");
10
+ const template = JSON.parse(readFileSync(path.join(root, "assets/evidence-template.yaml"), "utf8"));
11
+ const directory = mkdtempSync(path.join(tmpdir(), "yss-research-"));
12
+ const brief = path.join(directory, "sample-research-brief.md");
13
+ const evidence = path.join(directory, "sample-evidence.yaml");
14
+ const headings = ["Research Scope", "Executive Read", "Findings", "Counter-Signals", "Source Map", "Decision Handoff", "Evidence Limitations"];
15
+
16
+ function run(payload, status, expected) {
17
+ writeFileSync(brief, `${headings.map((heading) => `## ${heading}`).join("\n\n")}\n\n${payload.claims.map((claim) => claim.id).join(" ")}\n`);
18
+ writeFileSync(evidence, `${JSON.stringify(payload, null, 2)}\n`);
19
+ const result = spawnSync(process.execPath, [validator, brief, evidence], { encoding: "utf8" });
20
+ if (result.status !== status || !`${result.stdout}${result.stderr}`.includes(expected)) throw new Error(`expected ${status}/${expected}, got ${result.status}: ${result.stdout}${result.stderr}`);
21
+ }
22
+
23
+ try {
24
+ template.scope.topic = "Example strategy question";
25
+ template.scope.audience = "Product team";
26
+ template.scope.time_horizon = "Last 12 months";
27
+ template.scope.research_questions = ["Which problem should the domain address?"];
28
+ template.scope.inclusion_criteria = ["Direct experience in scope"];
29
+ template.scope.exclusion_criteria = ["Untraceable reposts"];
30
+ template.ownership.downstream_owner = "yss-stage-decision";
31
+ template.search_log[0].channel = "Support records";
32
+ template.search_log[0].query_or_corpus = "failed approval workflow";
33
+ template.search_log[0].searched_at = "2026-09-03";
34
+ template.search_log[1].channel = "Support records";
35
+ template.search_log[1].query_or_corpus = "successful approval workflow";
36
+ template.search_log[1].searched_at = "2026-09-03";
37
+ template.evidence_items[0].source_class = "support";
38
+ template.evidence_items[0].source_ref = "support-case-001";
39
+ template.evidence_items[0].locator = "event-3";
40
+ template.evidence_items[0].observed_at = "2026-09-03";
41
+ template.evidence_items[0].evidence_date = "2026-08-30";
42
+ template.evidence_items[0].observation = "The approval stopped when the owner was missing.";
43
+ template.evidence_items[0].limitations = ["Single support case"];
44
+ template.claims[0].statement = "A missing owner can block the approval workflow.";
45
+ run(template, 0, "YSS research package valid");
46
+
47
+ const falseStrategyBackground = structuredClone(template);
48
+ falseStrategyBackground.claims[0].decision_bearing = false;
49
+ run(falseStrategyBackground, 1, "strategy claim kind must be decision-bearing");
50
+
51
+ const unsupported = structuredClone(template);
52
+ unsupported.claims[0].audit_status = "unsupported";
53
+ unsupported.claims[0].disposition = "publish";
54
+ run(unsupported, 1, "must use needs-deeper-research");
55
+
56
+ const unsupportedDecision = structuredClone(template);
57
+ unsupportedDecision.claims[0].audit_status = "unsupported";
58
+ unsupportedDecision.claims[0].disposition = "needs-deeper-research";
59
+ run(unsupportedDecision, 1, "decision-bearing and cannot remain unsupported");
60
+
61
+ const falseCounter = structuredClone(template);
62
+ falseCounter.claims[0].counter_signal_refs = ["search-001"];
63
+ run(falseCounter, 1, "counter-signal search must have result none-found");
64
+
65
+ const technicalWithoutPrimary = structuredClone(template);
66
+ technicalWithoutPrimary.profile = "technical-evidence";
67
+ technicalWithoutPrimary.claims[0].claim_kind = "technical-fact";
68
+ run(technicalWithoutPrimary, 1, "technical claim without primary evidence");
69
+
70
+ const leadOnly = structuredClone(template);
71
+ leadOnly.evidence_items[0].source_level = "lead-only";
72
+ run(leadOnly, 1, "uses lead-only evidence as support");
73
+
74
+ const unaudited = structuredClone(template);
75
+ unaudited.audit_summary.audited_claim_ids = [];
76
+ run(unaudited, 1, "must be a non-empty array");
77
+
78
+ process.stdout.write("YSS research scenarios passed (8)\n");
79
+ } finally {
80
+ rmSync(directory, { recursive: true, force: true });
81
+ }
@@ -5,6 +5,7 @@ skill_aliases:
5
5
  api-integration: yss-api-integration
6
6
  microapp-commit: yss-microapp-commit
7
7
  page-module-development: yss-page-module-development
8
+ research: yss-research
8
9
  use-table-height: yss-use-table-height
9
10
  use-tree-height: yss-use-tree-height
10
11
  implementation_path_policy:
@@ -197,10 +198,10 @@ dependency_closure:
197
198
  always: [alibaba-java-code-style]
198
199
  when_conversion: [mapstruct, lombok]
199
200
  yss-repository:
200
- always: [mapstruct, lombok, alibaba-java-code-style]
201
- when_mybatis: [yss-mybatis]
201
+ always: [yss-mybatis, mapstruct, lombok, alibaba-java-code-style]
202
202
  yss-web-controller:
203
- always: [yss-dto, mapstruct, lombok, alibaba-java-code-style]
203
+ always: [yss-dto, yss-validation, mapstruct, lombok, alibaba-java-code-style]
204
+ when_error_mapping: [yss-exception]
204
205
  yss-userinfo:
205
206
  always: [yss-dto]
206
207
  when_cache_lookup: [yss-cache]
@@ -245,8 +246,11 @@ end_to_end_backend_required:
245
246
  - yss-domain
246
247
  - yss-application
247
248
  - yss-repository
249
+ - yss-mybatis
248
250
  - yss-web-controller
249
251
  - yss-dto
252
+ - yss-exception
253
+ - yss-validation
250
254
  - mapstruct
251
255
  - lombok
252
256
  - alibaba-java-code-style
@@ -17,7 +17,7 @@ description: 编排 Discovery 到 Spec 入口的阶段决策与 DDD 战略设计
17
17
  ## 执行顺序
18
18
 
19
19
  1. 读取 `yss-project.yaml`、`CONTEXT.md`、既有 Discovery/Spec、ADR 和父 Ticket/checkpoint。
20
- 2. 分离事实、决策、假设、约束和未决项;技术事实走 `research`,市场/竞品事实走 `competitive-intelligence`。
20
+ 2. 分离事实、决策、假设、约束和未决项;技术事实走 `yss-research` 的 `technical-evidence`,领域边界、业务规则、MVP、非目标、成功标准或阶段推进依据等决策证据走 `strategy-evidence`,市场/竞品事实走 `competitive-intelligence`。
21
21
  3. 从业务场景、事件、规则、责任人和失败路径识别子域及限界上下文,不从数据库表或调用链直接反推边界。
22
22
  4. 为每个上下文建立本地统一语言;为跨上下文关系记录语义上游/下游、业务决策权、技术传输方向和翻译责任。
23
23
  5. 记录核心领域概念候选,不提前锁定 Entity 或 Aggregate。
@@ -31,6 +31,7 @@ description: 编排 Discovery 到 Spec 入口的阶段决策与 DDD 战略设计
31
31
  ## 产物与批准
32
32
 
33
33
  - DDD 资产是事实源,阶段决策包只通过 `domain_strategy_ref` 引用它们。
34
+ - 进入 `gate.domain-strategy-approved` 或 `gate.stage-decision-package-approved` 的外部决策证据必须引用通过校验的 `yss-research` `evidence-audited` 研究包;研究包只提供证据,不得直接修改本技能资产或批准门禁。
34
35
  - `stage_decision_package` 必须经过 `draft → ready-for-human → approved`;起草者不得自签。
35
36
  - 建议门禁为 `gate.domain-strategy-approved` 和 `gate.stage-decision-package-approved`,实际状态由 `yss-product-lifecycle` 维护;阶段包批准引用必须通过 `scripts/verify-approval-record`,不得用不可读路径或聊天确认替代。
36
37
  - 下游只能消费批准且版本当前的包;发现语义冲突返回 `drift` / `new_impacts`,不得静默修改上游。
@@ -16,16 +16,17 @@ description: Use when generating or refactoring YSS Web Adapter Controllers, req
16
16
  ## 不适用
17
17
 
18
18
  - 用户只是要新增一个手写复杂接口,不一定要用脚本。
19
- - 用户还没有稳定的领域模型或 metadata,先补 `yss-domain` 并准备完整的 metadata 输入。
19
+ - 用户还没有稳定的 Application Service、冻结 OpenAPI 或 metadata,先回 Router 补 `yss-application` / `yss-domain` 和相应合同输入。
20
20
 
21
21
  ## 优先流程
22
22
 
23
- 1. 先确认冻结 OpenAPI、批准的 Web generation contract、Application Service 接口、metadata、基础包、模块名、领域 segment 和 web 落盘目录;合同中的 `base_package`、`module_name`、`domain_segment` 必须与 CLI 一致。
24
- 2. 涉及 DTO / VO / CMD / Query POJO 样板代码时,加载并遵守 `lombok`。
25
- 3. 涉及 Domain / Application Result 到 VO / DTO 或 CMD / Query 到输入模型的转换时,加载并遵守 `mapstruct`。
26
- 4. 运行 `node scripts/generate_controller.mjs`。
27
- 5. 生成后检查路径、命名、返回值包装、Application Service 引用、`@Valid`、Lombok 注解和 MapStruct WebConvertor 是否对齐项目。
28
- 6. 对复杂接口做少量手工修正,不在 skill 中承诺自动覆盖全部业务逻辑。
23
+ 1. 先确认冻结 OpenAPI、批准且版本当前的 Web generation contract schema v2、Application Service 接口、metadata、基础包、模块名、领域 segment 和 web 落盘目录;合同必须绑定 Slice `contract_id` / `contract_version` / `slice_id`、`yss-dto` wire profile 引用与 digest、允许写路径、证据与验证命令。
24
+ 2. 加载并遵守 `yss-dto` 与 `yss-validation`;错误映射影响命中时再加载 `yss-exception`。
25
+ 3. 涉及 DTO / VO / CMD / Query POJO 样板代码时,加载并遵守 `lombok`。
26
+ 4. 涉及 Domain / Application Result 到 VO / DTO 或 CMD / Query 到输入模型的转换时,加载并遵守 `mapstruct`。
27
+ 5. 运行 `node scripts/generate_controller.mjs`。
28
+ 6. 生成后检查路径、命名、返回值包装、Application Service 引用、`@Valid`、Lombok 注解和 MapStruct WebConvertor 是否对齐项目。
29
+ 7. 对复杂接口做少量手工修正,不在 skill 中承诺自动覆盖全部业务逻辑。
29
30
 
30
31
  ## 推荐命令
31
32
 
@@ -33,6 +34,8 @@ description: Use when generating or refactoring YSS Web Adapter Controllers, req
33
34
  node scripts/generate_controller.mjs \
34
35
  --metadata-file /path/metadata.json \
35
36
  --contract-file /path/approved-web-generation-contract.json \
37
+ --dto-wire-profile-file /path/to/yss-dto/references/openapi-wire-profile.yaml \
38
+ --scaffold-manifest-file /path/service/.yss/scaffold-generation.json \
36
39
  --base-package com.yss.demo \
37
40
  --module-name demo \
38
41
  --domain-segment example \
@@ -53,18 +56,21 @@ node scripts/generate_controller.mjs \
53
56
  ## 约束
54
57
 
55
58
  - 生成代码只依赖既有 Application Service;读写操作都禁止绕过 Application。复杂查询经 Application Query Port 接入 Infrastructure。
56
- - 返回结构保持项目既有 `SingleResult`、`PageResult`、`MultiResult` 体系。
59
+ - 返回包装类、分页默认值、允许字段与 `PageResult.of(...)` 参数语义必须消费合同绑定的 `yss-dto/references/openapi-wire-profile.yaml`;Web skill 不复制或自行维护第二套协议。
57
60
  - DTO / VO / CMD / Query 默认用 Lombok 处理 getter/setter、constructor、builder 和日志样板;不要在 Controller 内部类或非约定包临时定义主要 DTO / VO。
58
61
  - `WebConvertor` 使用 `@Mapper(componentModel = "spring")` 和构造器注入;禁止静态 `INSTANCE`、在 Controller / Application 中大段手写字段赋值、使用 `BeanUtils.copyProperties` 或反射式通用拷贝。
59
62
  - HTTP Request 不继承会暴露内部协作字段的 `PageQuery`;只生成冻结 OpenAPI allowlist 字段,禁止把 `offset`、`needTotalCount`、`tempTotalCount` 变成客户端输入。
63
+ - `fields.<table>.pagination` 必须显式列出 `yss-dto` wire profile 允许暴露的字段子集;模板不得无条件生成字段或自行定义默认值。
60
64
  - 先跑脚本,再按项目规范做少量手调。
61
65
  - `javax` / `jakarta` validation namespace 必须来自工程基线,不得按记忆选择。
62
66
  - 若用户只是要改单个 Controller,先看现有代码,不要盲覆盖整个目录。
63
- - 脚本是 initialize-only;写入前先规划全部目标,任一目标已存在或传入 `--force` 时整体返回 `unsupported` 且不得留下部分文件。旧项目迁移不属于该生成器。
67
+ - 脚本是 initialize-only;写入前先规划全部目标并校验 `allowed_write_paths`,任一目标已存在或传入 `--force` 时整体返回 `unsupported`。落盘使用排他创建和失败回滚,不得留下部分文件;旧项目迁移不属于该生成器。
68
+ - `integration_mode=existing-project` 保留已登记工程的 Boot 2/Boot 3 能力;`integration_mode=scaffold-v2` 必须提供 `--scaffold-manifest-file`,且 Manifest 已达到 `empty-scaffold-verified`,Profile、基础包和标准 Web module 路径全部一致。
64
69
 
65
70
  ## 按需读取
66
71
 
67
72
  - 分层开发规范:`references/web-adapter-layer-guide.md`
73
+ - Web 生成合同 schema:`references/web-generation-contract.schema.json`
68
74
  - 生成脚本:`scripts/generate_controller.mjs`
69
75
  - Controller 模板:`assets/templates/Controller.java.template`
70
76
  - Convertor 模板:`assets/templates/WebConvertor.java.template`
@@ -73,7 +79,7 @@ node scripts/generate_controller.mjs \
73
79
 
74
80
  ## 阶段 7 合同
75
81
 
76
- - 只消费已批准合同和冻结 OpenAPI/no-impact record;不得用 Controller 或半成品 backend 反向定义产品契约。
82
+ - 只消费已批准且当前的 schema v2 Web generation contract 和冻结 OpenAPI/no-impact record;schema v1 为 `unsupported`,不得自动升级,也不得用 Controller 或半成品 backend 反向定义产品契约。
77
83
  - DTO/VO/WebConvertor 机械骨架可用 `controlled-generation`;权限、错误映射、校验语义和接口行为必须使用 `behavior-tdd`。
78
84
  - 写入必须位于合同 `allowed_write_paths`,并提供 Controller、DTO/VO、WebConvertor、契约/API 测试和实际验证结果。
79
85
  - 按统一 `YSS Skill Execution Result` 返回偏离与新增影响;出现新 API/schema、权限或响应包装变化时暂停并回到 Router/生命周期。
@@ -1,5 +1,5 @@
1
1
  version: 1
2
2
  interface:
3
3
  display_name: "YSS Web Controller"
4
- short_description: "Web Controller、DTO、VO 与响应封装规范"
5
- default_prompt: "Use $yss-web-controller to generate or refactor a YSS REST controller, request DTO, and response VO."
4
+ short_description: "按批准 Slice/Web 合同生成 Controller、Wire DTO 与 Convertor"
5
+ default_prompt: "Use $yss-web-controller with an approved schema v2 Web generation contract, frozen OpenAPI, stable Application interfaces, and allowed write paths to generate YSS REST adapters atomically."
@@ -3,8 +3,8 @@ package ${base_package}.rest;
3
3
  ${application_service_import}
4
4
  ${dto_imports}
5
5
  ${web_convertor_import}
6
- import com.yss.cloud.dto.result.PageResult;
7
- import com.yss.cloud.dto.result.SingleResult;
6
+ import ${page_result_type};
7
+ import ${single_result_type};
8
8
  import lombok.RequiredArgsConstructor;
9
9
  import org.springframework.web.bind.annotation.*;
10
10
  import io.swagger.v3.oas.annotations.Operation;
@@ -30,7 +30,7 @@ public class ${domain_class}Controller {
30
30
  */
31
31
  @PostMapping("/page")
32
32
  @Operation(summary = "分页查询")
33
- public PageResult<${response_class}> page(@Valid @RequestBody ${page_request_class} request) {
33
+ public ${page_result_simple_name}<${response_class}> page(@Valid @RequestBody ${page_request_class} request) {
34
34
  return webConvertor.toResponsePage(${query_call});
35
35
  }
36
36
 
@@ -39,8 +39,8 @@ public class ${domain_class}Controller {
39
39
  */
40
40
  @GetMapping("/{id}")
41
41
  @Operation(summary = "详情查询")
42
- public SingleResult<${response_class}> detail(@PathVariable Long id) {
43
- return SingleResult.of(webConvertor.toResponse(${detail_call}));
42
+ public ${single_result_simple_name}<${response_class}> detail(@PathVariable Long id) {
43
+ return ${single_result_simple_name}.${single_result_factory_method}(webConvertor.toResponse(${detail_call}));
44
44
  }
45
45
 
46
46
  /**
@@ -48,8 +48,8 @@ public class ${domain_class}Controller {
48
48
  */
49
49
  @PostMapping
50
50
  @Operation(summary = "新增")
51
- public SingleResult<Long> add(@Valid @RequestBody ${create_request_class} request) {
52
- return SingleResult.of(${add_call});
51
+ public ${single_result_simple_name}<Long> add(@Valid @RequestBody ${create_request_class} request) {
52
+ return ${single_result_simple_name}.${single_result_factory_method}(${add_call});
53
53
  }
54
54
 
55
55
  /**
@@ -57,8 +57,8 @@ public class ${domain_class}Controller {
57
57
  */
58
58
  @PutMapping
59
59
  @Operation(summary = "更新")
60
- public SingleResult<Boolean> update(@Valid @RequestBody ${update_request_class} request) {
61
- return SingleResult.of(${update_call});
60
+ public ${single_result_simple_name}<Boolean> update(@Valid @RequestBody ${update_request_class} request) {
61
+ return ${single_result_simple_name}.${single_result_factory_method}(${update_call});
62
62
  }
63
63
 
64
64
  /**
@@ -66,7 +66,7 @@ public class ${domain_class}Controller {
66
66
  */
67
67
  @DeleteMapping("/{id}")
68
68
  @Operation(summary = "删除")
69
- public SingleResult<Boolean> delete(@PathVariable Long id) {
70
- return SingleResult.of(${delete_call});
69
+ public ${single_result_simple_name}<Boolean> delete(@PathVariable Long id) {
70
+ return ${single_result_simple_name}.${single_result_factory_method}(${delete_call});
71
71
  }
72
72
  }
@@ -1,6 +1,6 @@
1
1
  package ${base_package}.rest.convertor;
2
2
 
3
- import com.yss.cloud.dto.result.PageResult;
3
+ import ${page_result_type};
4
4
  ${application_type_imports}
5
5
  import ${base_package}.rest.dto.request.${domain_class}CreateRequest;
6
6
  import ${base_package}.rest.dto.request.${domain_class}UpdateRequest;
@@ -22,12 +22,9 @@ public interface ${web_convertor_class} {
22
22
 
23
23
  List<${domain_class}Response> toResponses(List<${domain_class}Result> source);
24
24
 
25
- default PageResult<${domain_class}Response> toResponsePage(PageResult<${domain_class}Result> source) {
26
- return PageResult.of(
27
- toResponses(source.getData()),
28
- source.getTotalCount(),
29
- source.getPageSize(),
30
- source.getPageIndex()
25
+ default ${page_result_simple_name}<${domain_class}Response> toResponsePage(${page_result_simple_name}<${domain_class}Result> source) {
26
+ return ${page_result_simple_name}.${page_result_factory_method}(
27
+ ${page_result_factory_arguments}
31
28
  );
32
29
  }
33
30
  }
@@ -1,6 +1,6 @@
1
1
  package ${base_package}.rest.dto.request;
2
2
 
3
- import com.yss.cloud.dto.CommandDTO;
3
+ import ${command_dto_type};
4
4
  import lombok.Getter;
5
5
  import lombok.Setter;
6
6
  import ${validation_namespace}.validation.constraints.NotBlank;
@@ -13,7 +13,7 @@ import java.time.LocalDate;
13
13
  /** ${domain_desc}新增请求。字段来自批准的 OpenAPI allowlist。 */
14
14
  @Getter
15
15
  @Setter
16
- public class ${domain_class}CreateRequest extends CommandDTO {
16
+ public class ${domain_class}CreateRequest extends ${command_dto_simple_name} {
17
17
 
18
18
  ${field_declarations}
19
19
  }
@@ -1,8 +1,9 @@
1
1
  package ${base_package}.rest.dto.request;
2
2
 
3
- import com.yss.cloud.dto.QueryDTO;
3
+ import ${query_dto_type};
4
4
  import lombok.Getter;
5
5
  import lombok.Setter;
6
+ import ${validation_namespace}.validation.constraints.Pattern;
6
7
  import java.util.Date;
7
8
  import java.math.BigDecimal;
8
9
  import java.time.LocalDateTime;
@@ -13,12 +14,8 @@ import java.time.LocalDate;
13
14
  */
14
15
  @Getter
15
16
  @Setter
16
- public class ${domain_class}PageRequest extends QueryDTO {
17
- private int pageIndex = 1;
18
- private int pageSize = 20;
19
- private String orderBy;
20
- private String orderDirection;
21
- private String groupBy;
17
+ public class ${domain_class}PageRequest extends ${query_dto_simple_name} {
18
+ ${pagination_field_declarations}
22
19
 
23
20
  ${field_declarations}
24
21
  }
@@ -1,6 +1,6 @@
1
1
  package ${base_package}.rest.dto.request;
2
2
 
3
- import com.yss.cloud.dto.CommandDTO;
3
+ import ${command_dto_type};
4
4
  import lombok.Getter;
5
5
  import lombok.Setter;
6
6
  import ${validation_namespace}.validation.constraints.NotBlank;
@@ -13,7 +13,7 @@ import java.time.LocalDate;
13
13
  /** ${domain_desc}更新请求。字段来自批准的 OpenAPI allowlist。 */
14
14
  @Getter
15
15
  @Setter
16
- public class ${domain_class}UpdateRequest extends CommandDTO {
16
+ public class ${domain_class}UpdateRequest extends ${command_dto_simple_name} {
17
17
 
18
18
  ${field_declarations}
19
19
  }