@sun-asterisk/sungen 2.7.0-beta.1 → 3.0.0-beta.72

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 (309) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/add.js +3 -3
  3. package/dist/cli/commands/add.js.map +1 -1
  4. package/dist/cli/commands/audit.d.ts +3 -0
  5. package/dist/cli/commands/audit.d.ts.map +1 -0
  6. package/dist/cli/commands/audit.js +134 -0
  7. package/dist/cli/commands/audit.js.map +1 -0
  8. package/dist/cli/commands/blindspot.d.ts +3 -0
  9. package/dist/cli/commands/blindspot.d.ts.map +1 -0
  10. package/dist/cli/commands/blindspot.js +58 -0
  11. package/dist/cli/commands/blindspot.js.map +1 -0
  12. package/dist/cli/commands/capability.d.ts +3 -0
  13. package/dist/cli/commands/capability.d.ts.map +1 -0
  14. package/dist/cli/commands/capability.js +196 -0
  15. package/dist/cli/commands/capability.js.map +1 -0
  16. package/dist/cli/commands/challenge.d.ts +3 -0
  17. package/dist/cli/commands/challenge.d.ts.map +1 -0
  18. package/dist/cli/commands/challenge.js +102 -0
  19. package/dist/cli/commands/challenge.js.map +1 -0
  20. package/dist/cli/commands/feedback.d.ts +3 -0
  21. package/dist/cli/commands/feedback.d.ts.map +1 -0
  22. package/dist/cli/commands/feedback.js +72 -0
  23. package/dist/cli/commands/feedback.js.map +1 -0
  24. package/dist/cli/commands/flow-check.d.ts +3 -0
  25. package/dist/cli/commands/flow-check.d.ts.map +1 -0
  26. package/dist/cli/commands/flow-check.js +136 -0
  27. package/dist/cli/commands/flow-check.js.map +1 -0
  28. package/dist/cli/commands/generate.d.ts.map +1 -1
  29. package/dist/cli/commands/generate.js +50 -2
  30. package/dist/cli/commands/generate.js.map +1 -1
  31. package/dist/cli/commands/ledger.d.ts +3 -0
  32. package/dist/cli/commands/ledger.d.ts.map +1 -0
  33. package/dist/cli/commands/ledger.js +71 -0
  34. package/dist/cli/commands/ledger.js.map +1 -0
  35. package/dist/cli/commands/manifest.d.ts +3 -0
  36. package/dist/cli/commands/manifest.d.ts.map +1 -0
  37. package/dist/cli/commands/manifest.js +101 -0
  38. package/dist/cli/commands/manifest.js.map +1 -0
  39. package/dist/cli/commands/script-check.d.ts +3 -0
  40. package/dist/cli/commands/script-check.d.ts.map +1 -0
  41. package/dist/cli/commands/script-check.js +97 -0
  42. package/dist/cli/commands/script-check.js.map +1 -0
  43. package/dist/cli/commands/trace.d.ts +3 -0
  44. package/dist/cli/commands/trace.d.ts.map +1 -0
  45. package/dist/cli/commands/trace.js +110 -0
  46. package/dist/cli/commands/trace.js.map +1 -0
  47. package/dist/cli/commands/update.d.ts.map +1 -1
  48. package/dist/cli/commands/update.js +22 -9
  49. package/dist/cli/commands/update.js.map +1 -1
  50. package/dist/cli/index.js +20 -0
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +1 -0
  53. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
  54. package/dist/generators/test-generator/adapters/adapter-registry.d.ts +13 -0
  55. package/dist/generators/test-generator/adapters/adapter-registry.d.ts.map +1 -1
  56. package/dist/generators/test-generator/adapters/adapter-registry.js +73 -1
  57. package/dist/generators/test-generator/adapters/adapter-registry.js.map +1 -1
  58. package/dist/generators/test-generator/adapters/index.d.ts +1 -1
  59. package/dist/generators/test-generator/adapters/index.d.ts.map +1 -1
  60. package/dist/generators/test-generator/adapters/index.js +5 -1
  61. package/dist/generators/test-generator/adapters/index.js.map +1 -1
  62. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +1 -0
  63. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/all-contain-assertion.hbs +7 -0
  64. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +6 -0
  65. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  66. package/dist/generators/test-generator/code-generator.js +6 -2
  67. package/dist/generators/test-generator/code-generator.js.map +1 -1
  68. package/dist/generators/test-generator/patterns/capture-patterns.d.ts +16 -0
  69. package/dist/generators/test-generator/patterns/capture-patterns.d.ts.map +1 -0
  70. package/dist/generators/test-generator/patterns/capture-patterns.js +54 -0
  71. package/dist/generators/test-generator/patterns/capture-patterns.js.map +1 -0
  72. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
  73. package/dist/generators/test-generator/patterns/form-patterns.js +3 -1
  74. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
  75. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  76. package/dist/generators/test-generator/patterns/index.js +2 -0
  77. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  78. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  79. package/dist/generators/test-generator/step-mapper.js +1 -0
  80. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  81. package/dist/generators/test-generator/utils/data-resolver.d.ts +5 -0
  82. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  83. package/dist/generators/test-generator/utils/data-resolver.js +17 -0
  84. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  85. package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -1
  86. package/dist/generators/test-generator/utils/runtime-data-transformer.js +4 -0
  87. package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -1
  88. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  89. package/dist/generators/test-generator/utils/selector-resolver.js +12 -6
  90. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  91. package/dist/harness/audit.d.ts +24 -0
  92. package/dist/harness/audit.d.ts.map +1 -0
  93. package/dist/harness/audit.js +115 -0
  94. package/dist/harness/audit.js.map +1 -0
  95. package/dist/harness/blindspot.d.ts +15 -0
  96. package/dist/harness/blindspot.d.ts.map +1 -0
  97. package/dist/harness/blindspot.js +85 -0
  98. package/dist/harness/blindspot.js.map +1 -0
  99. package/dist/harness/capability-plan.d.ts +49 -0
  100. package/dist/harness/capability-plan.d.ts.map +1 -0
  101. package/dist/harness/capability-plan.js +215 -0
  102. package/dist/harness/capability-plan.js.map +1 -0
  103. package/dist/harness/capability.d.ts +23 -0
  104. package/dist/harness/capability.d.ts.map +1 -0
  105. package/dist/harness/capability.js +98 -0
  106. package/dist/harness/capability.js.map +1 -0
  107. package/dist/harness/catalog/drivers.yaml +57 -0
  108. package/dist/harness/catalog/universal-viewpoints.yaml +114 -0
  109. package/dist/harness/challenge.d.ts +21 -0
  110. package/dist/harness/challenge.d.ts.map +1 -0
  111. package/dist/harness/challenge.js +151 -0
  112. package/dist/harness/challenge.js.map +1 -0
  113. package/dist/harness/feedback.d.ts +29 -0
  114. package/dist/harness/feedback.d.ts.map +1 -0
  115. package/dist/harness/feedback.js +106 -0
  116. package/dist/harness/feedback.js.map +1 -0
  117. package/dist/harness/flow-check.d.ts +23 -0
  118. package/dist/harness/flow-check.d.ts.map +1 -0
  119. package/dist/harness/flow-check.js +132 -0
  120. package/dist/harness/flow-check.js.map +1 -0
  121. package/dist/harness/flow-plan.d.ts +23 -0
  122. package/dist/harness/flow-plan.d.ts.map +1 -0
  123. package/dist/harness/flow-plan.js +166 -0
  124. package/dist/harness/flow-plan.js.map +1 -0
  125. package/dist/harness/intent.d.ts +11 -0
  126. package/dist/harness/intent.d.ts.map +1 -0
  127. package/dist/harness/intent.js +86 -0
  128. package/dist/harness/intent.js.map +1 -0
  129. package/dist/harness/ledger.d.ts +42 -0
  130. package/dist/harness/ledger.d.ts.map +1 -0
  131. package/dist/harness/ledger.js +171 -0
  132. package/dist/harness/ledger.js.map +1 -0
  133. package/dist/harness/manifest.d.ts +42 -0
  134. package/dist/harness/manifest.d.ts.map +1 -0
  135. package/dist/harness/manifest.js +209 -0
  136. package/dist/harness/manifest.js.map +1 -0
  137. package/dist/harness/parse.d.ts +22 -0
  138. package/dist/harness/parse.d.ts.map +1 -0
  139. package/dist/harness/parse.js +163 -0
  140. package/dist/harness/parse.js.map +1 -0
  141. package/dist/harness/script-check.d.ts +39 -0
  142. package/dist/harness/script-check.d.ts.map +1 -0
  143. package/dist/harness/script-check.js +251 -0
  144. package/dist/harness/script-check.js.map +1 -0
  145. package/dist/harness/secret-scan.d.ts +8 -0
  146. package/dist/harness/secret-scan.d.ts.map +1 -0
  147. package/dist/harness/secret-scan.js +88 -0
  148. package/dist/harness/secret-scan.js.map +1 -0
  149. package/dist/harness/sensors.d.ts +88 -0
  150. package/dist/harness/sensors.d.ts.map +1 -0
  151. package/dist/harness/sensors.js +232 -0
  152. package/dist/harness/sensors.js.map +1 -0
  153. package/dist/harness/trace.d.ts +31 -0
  154. package/dist/harness/trace.d.ts.map +1 -0
  155. package/dist/harness/trace.js +173 -0
  156. package/dist/harness/trace.js.map +1 -0
  157. package/dist/orchestrator/ai-rules-updater.d.ts +1 -0
  158. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  159. package/dist/orchestrator/ai-rules-updater.js +55 -11
  160. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  161. package/dist/orchestrator/figma/spec-figma-renderer.d.ts +2 -2
  162. package/dist/orchestrator/figma/spec-figma-renderer.js +2 -2
  163. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts +1 -1
  164. package/dist/orchestrator/figma/spec-figma-section-renderers.js +1 -1
  165. package/dist/orchestrator/project-initializer.d.ts +5 -0
  166. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  167. package/dist/orchestrator/project-initializer.js +30 -6
  168. package/dist/orchestrator/project-initializer.js.map +1 -1
  169. package/dist/orchestrator/templates/ai-instructions/claude-agent-challenge.md +46 -0
  170. package/dist/orchestrator/templates/ai-instructions/claude-agent-discovery.md +32 -0
  171. package/dist/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +37 -0
  172. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +3 -3
  173. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +5 -5
  174. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +36 -12
  175. package/dist/orchestrator/templates/ai-instructions/claude-cmd-design.md +12 -0
  176. package/dist/orchestrator/templates/ai-instructions/claude-cmd-feedback.md +36 -0
  177. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +27 -30
  178. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +4 -1
  179. package/dist/orchestrator/templates/ai-instructions/claude-config.md +1 -4
  180. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-mcp.md +82 -0
  181. package/dist/orchestrator/templates/ai-instructions/{github-skill-sungen-figma-source.md → claude-skill-capture-mode-figma-pat.md} +14 -48
  182. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-live.md +60 -0
  183. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-mode-local.md +38 -0
  184. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture.md +35 -0
  185. package/dist/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +84 -0
  186. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +40 -1
  187. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +3 -3
  188. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +4 -4
  189. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +18 -10
  190. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-design.md +13 -0
  191. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +24 -0
  192. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +20 -30
  193. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +2 -1
  194. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +1 -4
  195. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md +82 -0
  196. package/{src/orchestrator/templates/ai-instructions/claude-skill-figma-source.md → dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md} +14 -48
  197. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md +60 -0
  198. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md +38 -0
  199. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md +35 -0
  200. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +84 -0
  201. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +1 -1
  202. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +40 -1
  203. package/dist/orchestrator/templates/specs-test-data.ts +20 -6
  204. package/dist/tools/figma/figma-auth.d.ts +5 -2
  205. package/dist/tools/figma/figma-auth.d.ts.map +1 -1
  206. package/dist/tools/figma/figma-auth.js +19 -9
  207. package/dist/tools/figma/figma-auth.js.map +1 -1
  208. package/docs/orchestration-spec.md +267 -0
  209. package/package.json +12 -7
  210. package/src/cli/commands/add.ts +3 -3
  211. package/src/cli/commands/audit.ts +92 -0
  212. package/src/cli/commands/blindspot.ts +48 -0
  213. package/src/cli/commands/capability.ts +160 -0
  214. package/src/cli/commands/challenge.ts +55 -0
  215. package/src/cli/commands/feedback.ts +65 -0
  216. package/src/cli/commands/flow-check.ts +97 -0
  217. package/src/cli/commands/generate.ts +47 -2
  218. package/src/cli/commands/ledger.ts +61 -0
  219. package/src/cli/commands/manifest.ts +55 -0
  220. package/src/cli/commands/script-check.ts +50 -0
  221. package/src/cli/commands/trace.ts +60 -0
  222. package/src/cli/commands/update.ts +30 -10
  223. package/src/cli/index.ts +20 -0
  224. package/src/generators/test-generator/adapters/adapter-interface.ts +1 -0
  225. package/src/generators/test-generator/adapters/adapter-registry.ts +37 -0
  226. package/src/generators/test-generator/adapters/index.ts +4 -1
  227. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +1 -0
  228. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/all-contain-assertion.hbs +7 -0
  229. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +6 -0
  230. package/src/generators/test-generator/code-generator.ts +6 -2
  231. package/src/generators/test-generator/patterns/capture-patterns.ts +59 -0
  232. package/src/generators/test-generator/patterns/form-patterns.ts +3 -1
  233. package/src/generators/test-generator/patterns/index.ts +2 -0
  234. package/src/generators/test-generator/step-mapper.ts +1 -0
  235. package/src/generators/test-generator/utils/data-resolver.ts +20 -0
  236. package/src/generators/test-generator/utils/runtime-data-transformer.ts +8 -0
  237. package/src/generators/test-generator/utils/selector-resolver.ts +13 -6
  238. package/src/harness/audit.ts +112 -0
  239. package/src/harness/blindspot.ts +51 -0
  240. package/src/harness/capability-plan.ts +180 -0
  241. package/src/harness/capability.ts +75 -0
  242. package/src/harness/catalog/drivers.yaml +57 -0
  243. package/src/harness/catalog/universal-viewpoints.yaml +114 -0
  244. package/src/harness/challenge.ts +131 -0
  245. package/src/harness/feedback.ts +84 -0
  246. package/src/harness/flow-check.ts +99 -0
  247. package/src/harness/flow-plan.ts +135 -0
  248. package/src/harness/intent.ts +58 -0
  249. package/src/harness/ledger.ts +155 -0
  250. package/src/harness/manifest.ts +173 -0
  251. package/src/harness/parse.ts +145 -0
  252. package/src/harness/script-check.ts +222 -0
  253. package/src/harness/secret-scan.ts +51 -0
  254. package/src/harness/sensors.ts +279 -0
  255. package/src/harness/trace.ts +138 -0
  256. package/src/orchestrator/ai-rules-updater.ts +57 -10
  257. package/src/orchestrator/figma/spec-figma-renderer.ts +2 -2
  258. package/src/orchestrator/figma/spec-figma-section-renderers.ts +1 -1
  259. package/src/orchestrator/project-initializer.ts +33 -7
  260. package/src/orchestrator/templates/ai-instructions/claude-agent-challenge.md +46 -0
  261. package/src/orchestrator/templates/ai-instructions/claude-agent-discovery.md +32 -0
  262. package/src/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +37 -0
  263. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +3 -3
  264. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +5 -5
  265. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +36 -12
  266. package/src/orchestrator/templates/ai-instructions/claude-cmd-design.md +12 -0
  267. package/src/orchestrator/templates/ai-instructions/claude-cmd-feedback.md +36 -0
  268. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +27 -30
  269. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +4 -1
  270. package/src/orchestrator/templates/ai-instructions/claude-config.md +1 -4
  271. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-mcp.md +82 -0
  272. package/{dist/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md → src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-pat.md} +14 -48
  273. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-live.md +60 -0
  274. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-local.md +38 -0
  275. package/src/orchestrator/templates/ai-instructions/claude-skill-capture.md +35 -0
  276. package/src/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +84 -0
  277. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +40 -1
  278. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +3 -3
  279. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +4 -4
  280. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +18 -10
  281. package/src/orchestrator/templates/ai-instructions/copilot-cmd-design.md +13 -0
  282. package/src/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +24 -0
  283. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +20 -30
  284. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +2 -1
  285. package/src/orchestrator/templates/ai-instructions/copilot-config.md +1 -4
  286. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md +82 -0
  287. package/{dist/orchestrator/templates/ai-instructions/claude-skill-figma-source.md → src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md} +14 -48
  288. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md +60 -0
  289. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md +38 -0
  290. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md +35 -0
  291. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +84 -0
  292. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +1 -1
  293. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +40 -1
  294. package/src/orchestrator/templates/specs-test-data.ts +20 -6
  295. package/src/tools/figma/figma-auth.ts +20 -9
  296. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +0 -142
  297. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +0 -112
  298. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +0 -73
  299. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +0 -142
  300. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +0 -112
  301. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +0 -73
  302. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +0 -142
  303. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +0 -112
  304. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +0 -73
  305. package/src/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +0 -151
  306. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +0 -142
  307. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +0 -112
  308. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +0 -73
  309. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +0 -151
@@ -1,45 +1,42 @@
1
1
  ---
2
2
  name: review
3
- description: 'Review test cases for a Sungen screen validate syntax, score coverage, check viewpoint quality.'
3
+ description: 'Independent quality checkpoint for test cases runs the harness (audit gate + reviewer + script-check) from a fresh context and presents one unified scorecard. Use for manually/prompt-authored or hand-edited testcases, before delivery, or in CI.'
4
4
  argument-hint: [screen-name]
5
- allowed-tools: Read, Grep, Glob, Edit, Write, AskUserQuestion
5
+ allowed-tools: Read, Grep, Glob, Bash, Edit, Write, AskUserQuestion
6
6
  ---
7
7
 
8
8
  ## Role
9
9
 
10
- You are a **Senior QA Reviewer**. You evaluate Gherkin test cases using the `sungen-tc-review`, `sungen-viewpoint`, and `sungen-gherkin-syntax` skills.
10
+ You are an **independent QA Reviewer** running in a **fresh context** — you did not author these tests. You do **not** invent a parallel score; you run the **harness** and present its signals as a human scorecard. Skills: `sungen-tc-review` (presentation rubric), `sungen-viewpoint`, `sungen-gherkin-syntax`.
11
11
 
12
- ## Parameters
12
+ ## When this matters (positioning)
13
13
 
14
- Parse **name** from `$ARGUMENTS`. If missing, ask the user.
15
-
16
- **Auto-detect context**: check if `qa/flows/<name>/` exists flow mode (base path: `qa/flows/<name>/`). Else check `qa/screens/<name>/` → screen mode (base path: `qa/screens/<name>/`).
14
+ `/sungen:create-test` already runs the harness gate + repair while generating, so you do **not** need to review right after it. Run `/sungen:review` when the harness did **not** run, or when you need an independent sign-off:
15
+ - Test cases **written by hand or by a free-form prompt** (bypassing create-test).
16
+ - A `.feature` that was **hand-edited** after generation.
17
+ - **Before `/sungen:delivery`** — an independent quality + integrity gate before client hand-off.
18
+ - In **CI** — fail the build on a failing gate or spec drift.
17
19
 
18
20
  ## Steps
19
21
 
20
- 1. **Enumerate feature files** — glob `<base>/<name>/features/*.feature`. A screen may have one main file (`<name>.feature`) plus sub-features (`<name>-<sub>.feature` like `awards-modal.feature`); a flow has a single `<name>.feature`. If zero `.feature` files found → `/sungen:create-test` first.
21
- 2. **Review every feature file**for each `<basename>.feature` discovered in step 1:
22
- - Read `<basename>.feature` and the matching `test-data/<basename>.yaml`.
23
- - Apply the `sungen-tc-review` skill — score the **7-dimension rubric (100 pts)**: Structure & Format (15), Coverage (30), Assertion Quality (20), Test Data (10), Security & Permission (10), Automation Readiness (10), Maintainability (5). **For flows**, also apply the flow-specific checks (Layer A7 "Tags & Flow"). Use `sungen-viewpoint` for pattern checklists.
24
- - Apply the **Unverified Selectors check** if `<base>/<name>/selectors/<basename>.yaml` exists, count lines matching `@needs-live-verify`. Include in the per-file report as a non-scoring metric. Does NOT affect the score or the PASS threshold.
25
- 3. **Aggregated output** — present scores in a per-feature table, then a screen-level rollup:
22
+ 1. **Enumerate feature files** — glob `<base>/<name>/features/*.feature` (main + any sub-features). If none → `/sungen:create-test` first.
23
+ 2. **Run the harness (source of truth) do NOT re-score with a separate rubric:**
24
+ - `sungen audit --screen <name>` (Bash) → gate status, business-weighted score, findings, gaps (coverage / assertion-depth / balance / duplicate / traceability).
25
+ - **`sungen-reviewer`** sub-agent (Task tool, `subagent_type: sungen-reviewer`) semantic verdict the gate can't see (do steps prove the title, observable Then, @manual justified). Copilot/no-sub-agents: apply the `sungen-reviewer` criteria inline.
26
+ - `sungen script-check --screen <name>` (Bash) is the generated spec a 1:1 of the Gherkin (only if a spec exists; flags hand-edit / stale drift).
27
+ 3. **Unified scorecard** — present ONE report per feature, anchored on the harness signals (the `sungen-tc-review` 7 dimensions are a *presentation layer* over these, not a competing score):
26
28
 
27
29
  ```
28
- Feature Total Verdict Unverified
29
- ─────────────────────────────────────────────────────
30
- home.feature 88 PASS 0
31
- home-modal.feature 64 CONDITIONAL 2
32
- ─────────────────────────────────────────────────────
33
- Screen rollup (mean) 76 PASS
30
+ Feature Gate Score Reviewer Spec 1:1 Verdict
31
+ ───────────────────────────────────────────────────────────────────
32
+ home.feature PASS 8.4/10 2 minor issues in-sync PASS
34
33
  ```
35
-
36
- - **>= 70**: PASS that file.
37
- - **50–69**: CONDITIONALfix before execution.
38
- - **< 50**: FAILrevise & re-review.
39
- - "Unverified" = count of `@needs-live-verify` selectors (non-scoring). Show the full per-file report (dimension breakdown, recommendations, top issues) **only for files that are CONDITIONAL or FAIL**, or when the user asks for the deep report.
40
- 4. If any file is CONDITIONAL or FAIL and user confirms → update that file's test cases following `sungen-gherkin-syntax` and `sungen-tc-generation` skills, then re-review **only those files** (skip already-passing ones to save time).
41
- 5. After all files PASS (or user decides to proceed), use `AskUserQuestion` to offer next steps:
42
-
43
- - **`/sungen:run-test <name>`** — Generate selectors, compile, and run tests for **every feature** in this screen (Recommended)
44
- - **`/sungen:create-test <name>`** — Add more test cases before running
45
- - **Done for now** — I'll come back later
34
+ - **Gate PASS + reviewer clean + spec in-sync** → PASS.
35
+ - **Gate FAIL or reviewer NEEDS-REPAIR or drift** → CONDITIONAL/FAIL — show the findings + reviewer issues + fixes.
36
+ - The score is the **audit business-weighted score** adjusted down by unresolved reviewer issues never a parallel number that contradicts the gate.
37
+ 4. **Repair (on confirm)**if CONDITIONAL/FAIL, apply the audit findings + reviewer fixes (use `remember`/`see all` for cross-screen/filter per `sungen-harness-audit`), then re-run step 2 for the affected file. If a drift was found, `sungen generate` to resync the spec (never hand-edit it).
38
+ 5. **Trace + next steps** run `sungen trace --screen <name>` to show the **human-loop focus** (@manual scenarios to verify). Then `AskUserQuestion`:
39
+ - **`/sungen:run-test <name>`** generate selectors, compile, run (if not yet run) **(Recommended)**
40
+ - **`/sungen:delivery <name>`** export the deliverable (review passed)
41
+ - **`/sungen:create-test <name>`** — add more coverage
42
+ - **Done for now**
@@ -45,7 +45,7 @@ Skip this pre-flight when `--env` matches the base locale (no overlay needed in
45
45
  one browser_snapshot → cross-verify every [Reference] label vs snapshot name →
46
46
  generate selectors.yaml (verified entries; explicit YAML for any label≠DOM-name mismatch)
47
47
  NO → spec_figma.md exists in requirements/?
48
- YES → provisional flow (sungen-figma-source + sungen-selector-fix skills):
48
+ YES → provisional flow (sungen-capture mode figma-pat + sungen-selector-fix skills):
49
49
  1. Read filtered Figma node data from spec_figma.md (## Components + ## Text Inventory)
50
50
  2. Apply selector priority from sungen-selector-fix § Step 3 (testid > role+name > label > placeholder > text > locator CSS last)
51
51
  3. Write selectors.yaml — every provisional entry gets this comment on the line above:
@@ -83,6 +83,9 @@ Skip this pre-flight when `--env` matches the base locale (no overlay needed in
83
83
  6. **Phase 2 — Priority Wave**: Run all `@high` scenarios. Fix only failures from this wave. Max 2 attempts. Shared selectors fixed here cascade to later phases.
84
84
  7. **Phase 3 — Full Run**: Run all tests. Fix only **new** failures (elements unique to `@normal`/`@low`). Max 1 attempt. Don't loop on low-priority failures.
85
85
  8. **Phase 4 — Regression**: One final full run. Report results. No more fix loops.
86
+ 9. **Integrity check & trace (always run after the final run).**
87
+ - `sungen script-check --screen <name>` — verify the generated spec is a **1:1** of the Gherkin (every non-@manual scenario ↔ one `test()`, no drift). If it reports **DRIFT** (spec hand-edited or stale), re-run `sungen generate --screen <name>` so the spec matches the feature, then re-run — **never hand-edit the generated spec** (auto-fix must edit `selectors.yaml`, not the `.spec.ts`).
88
+ - `sungen ledger record --screen <name> --step run --ms <elapsed>` (record this run), then `sungen trace --screen <name>` — show the process map + bottlenecks + **HUMAN-LOOP FOCUS** (the @manual scenarios the QA must verify) to the user.
86
89
 
87
90
  ## Playwright command guidelines
88
91
 
@@ -16,10 +16,7 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
16
16
  | `sungen-selector-keys` | YAML key generation from `[Reference]` names, suffixes, lookup priority |
17
17
  | `sungen-selector-fix` | Selector generation from live page, auto-fix strategy |
18
18
  | `sungen-delivery` | Export Gherkin + Playwright results → CSV test case deliverable |
19
- | `sungen-capture-figma` | Fetch design context + PNG from a Figma frame URL via Figma Dev Mode MCP |
20
- | `sungen-capture-local` | Load existing UI assets (screenshots, mockups, Figma exports) from `requirements/ui/` |
21
- | `sungen-capture-live` | Capture a live running page via Playwright MCP (snapshot + screenshot) |
22
- | `sungen-figma-source` | Figma URL → spec_figma.md + ui/*.png + provisional selectors |
19
+ | `sungen-capture` | Acquire visual/design context one skill, 4 modes: figma-mcp (Dev Mode MCP), figma-pat (URL spec_figma.md), live (Playwright MCP scan), local (images in `requirements/ui/`) |
23
20
  | `sungen-locale` | Bootstrap i18n — audit selectors, detect locale switch mechanism, generate test-data overlay |
24
21
 
25
22
  ## Workflow (7 AI commands)
@@ -0,0 +1,82 @@
1
+ # Capture mode: figma-mcp
2
+
3
+ Pull **structured design data** (layout, typography, colors, component tree, design tokens) and a **PNG screenshot** from a Figma frame URL via the **Figma Dev Mode MCP**, so `sungen-tc-generation` can author Gherkin + test-data before a live domain exists. Use when the project is pre-launch or Figma is the source of truth and the live build lags the design.
4
+
5
+ ## Prerequisites
6
+
7
+ - **Figma MCP server** (`https://mcp.figma.com/mcp`, HTTP transport) connected in `.mcp.json` — `sungen init` scaffolds this. On first use, Claude Code opens a browser for Figma OAuth. Official tools: `get_design_context`, `get_variable_defs`, `get_screenshot`.
8
+ - Figma account signed in with access to the file. **Dev/Full seats** get per-minute rate limits; **Starter/View seats** get monthly tool-call limits.
9
+ - A Figma URL with both **fileKey** and **nodeId**.
10
+
11
+ If the MCP is not connected, **do not fail silently** — tell the user:
12
+ > "Figma MCP not detected. Run `sungen init` to scaffold the config, or manually add `figma` with `url: https://mcp.figma.com/mcp` to `.mcp.json`. Then sign in when Claude Code prompts."
13
+
14
+ Then stop.
15
+
16
+ ## Steps
17
+
18
+ ### 1. Resolve Figma URL
19
+
20
+ Prefer in this order:
21
+ 1. `Figma URL` field in `requirements/spec.md` (Overview section)
22
+ 2. If empty/missing → `AskUserQuestion`: *"Paste the Figma frame URL"* (free text)
23
+
24
+ Accept any of these shapes:
25
+ ```
26
+ https://www.figma.com/file/<fileKey>/<title>?node-id=<nodeId>
27
+ https://www.figma.com/design/<fileKey>/<title>?node-id=<nodeId>
28
+ https://www.figma.com/proto/<fileKey>/<title>?node-id=<nodeId>
29
+ ```
30
+ Parse: `fileKey` = segment after `/file/`, `/design/`, or `/proto/`; `nodeId` = the `node-id` query param (pass `-` or `:` through as-is). If `node-id` is missing, ask the user to select a frame in Figma and copy the **frame URL** (not the file root).
31
+
32
+ ### 2. Fetch design context
33
+
34
+ Call **both** in parallel:
35
+ ```
36
+ get_design_context({ fileKey, nodeId })
37
+ get_variable_defs({ fileKey, nodeId })
38
+ ```
39
+ `get_design_context` → layout, typography, colors, component structure, spacing. `get_variable_defs` → named design tokens.
40
+
41
+ ### 3. Fetch screenshot
42
+
43
+ ```
44
+ get_screenshot({ fileKey, nodeId })
45
+ ```
46
+ Save the PNG to `requirements/ui/figma-<sanitized-nodeId>.png` (replace `:` and `-` with `_`, e.g. `42-15` → `figma-42_15.png`).
47
+
48
+ ### 4. Write metadata dump
49
+
50
+ Combine design context + variables into `requirements/ui/figma-meta.md`:
51
+ ```markdown
52
+ # Figma Capture — <nodeId>
53
+ **Source:** <full Figma URL>
54
+ **Captured:** <ISO date>
55
+ ## Components
56
+ <component names + variants>
57
+ ## Typography
58
+ <font families, sizes, weights, line heights>
59
+ ## Colors
60
+ <color tokens + raw hex>
61
+ ## Spacing & Layout
62
+ <spacing tokens, auto-layout specs>
63
+ ## Text Content
64
+ <visible text strings — used by tc-generation to populate test-data>
65
+ ```
66
+ Consumed by `sungen-tc-generation` as a secondary source alongside `spec.md`.
67
+
68
+ ### 5. Report back
69
+
70
+ > Captured Figma frame `<nodeId>`: Components N · Text strings M · Design tokens K · Screenshot `requirements/ui/figma-<nodeId>.png` · Metadata `requirements/ui/figma-meta.md`
71
+
72
+ Then hand back to the calling command.
73
+
74
+ ## Error handling
75
+
76
+ | Error | Action |
77
+ |---|---|
78
+ | MCP tool not available | Print setup instructions, stop, do not fall back silently |
79
+ | `fileKey` missing from URL | Ask user to paste a valid frame URL |
80
+ | `nodeId` missing from URL | Ask user to right-click a frame in Figma → *Copy link to selection* |
81
+ | `get_design_context` 403 | Ask user to check Dev Mode seat on that file |
82
+ | `get_screenshot` returns no image | Continue with metadata only; warn no PNG was captured |
@@ -1,18 +1,6 @@
1
- ---
2
- name: sungen-figma-source
3
- description: 'Figma URL → spec_figma.md envelope + LLM-synthesized narrative from cached raw node JSON. Auto-loaded when --figma flag present or spec_figma.md exists.'
4
- user-invocable: false
5
- ---
1
+ # Capture mode: figma-pat
6
2
 
7
- ## When This Skill Loads
8
-
9
- Auto-load triggers (any one is sufficient):
10
-
11
- - Any sungen AI command invoked with `--figma` flag
12
- - `requirements/spec_figma.md` exists in the screen directory
13
- - User mentions a Figma URL or says "generate from Figma"
14
-
15
- ---
3
+ Figma URL → `spec_figma.md` envelope + LLM-synthesized narrative from cached raw node JSON. This mode is the active one when any of these is true: a sungen command was invoked with `--figma`, `requirements/spec_figma.md` exists, or the user says "generate from Figma".
16
4
 
17
5
  ## Prerequisites
18
6
 
@@ -22,8 +10,6 @@ Auto-load triggers (any one is sufficient):
22
10
 
23
11
  **Never paste the PAT into any transcript, spec file, or commit.**
24
12
 
25
- ---
26
-
27
13
  ## Two-Layer Architecture
28
14
 
29
15
  `spec_figma.md` has two layers separated by the `<!-- SYNTHESIS-BELOW -->` marker:
@@ -31,34 +17,27 @@ Auto-load triggers (any one is sufficient):
31
17
  | Layer | Producer | Overwrite Rule |
32
18
  |---|---|---|
33
19
  | **Envelope** (above marker) | sungen CLI | Regenerated each `sungen figma` run — deterministic |
34
- | **Narrative** (below marker) | This skill (LLM) | Replaced on re-synthesis — everything from marker to EOF |
20
+ | **Narrative** (below marker) | This mode (LLM) | Replaced on re-synthesis — everything from marker to EOF |
35
21
 
36
22
  The envelope contains: YAML frontmatter, Frame metadata, Screenshots. The narrative is synthesized by YOU from the cached raw Figma node JSON.
37
23
 
38
- ---
39
-
40
24
  ## Inputs You Read
41
25
 
42
26
  The scaffolder persists a raw (unfiltered) Figma node tree to:
43
-
44
27
  ```
45
28
  .sungen/figma-cache/<fileKey>/<versionId>/<nodeId>-raw.json
46
29
  ```
47
-
48
30
  Read this file + the envelope frontmatter of `requirements/spec_figma.md` + any PNGs under `requirements/ui/`. You MUST NOT call the Figma REST API directly — the PAT is not available to you.
49
31
 
50
- ---
51
-
52
32
  ## Synthesis Task
53
33
 
54
- Append 7 narrative sections below `<!-- SYNTHESIS-BELOW -->`. Each section is inferred from the raw node tree (names, types, `characters`, layout bounds, auto-layout direction, componentProperties):
34
+ Append 7 narrative sections below `<!-- SYNTHESIS-BELOW -->`. Each is inferred from the raw node tree (names, types, `characters`, layout bounds, auto-layout direction, componentProperties):
55
35
 
56
36
  ### 1. Purpose
57
37
  One paragraph. What screen is this? Primary user goal? Infer from frame name + top-level text + dominant CTA.
58
38
 
59
39
  ### 2. ASCII Layout
60
- Rough spatial sketch using box characters. Reflect top-bottom / left-right ordering from absoluteBoundingBox. Keep under ~20 lines. Example:
61
-
40
+ Rough spatial sketch using box characters. Reflect top-bottom / left-right ordering from absoluteBoundingBox. Keep under ~20 lines:
62
41
  ```
63
42
  ┌──────────────────────────────────────┐
64
43
  │ [Logo] [Sign In] │
@@ -72,55 +51,46 @@ Rough spatial sketch using box characters. Reflect top-bottom / left-right order
72
51
  ```
73
52
 
74
53
  ### 3. Regions
75
- Bulleted list of the major layout regions (header, sidebar, main, footer, modal, etc.) with a one-line purpose each. Use auto-layout frames as region hints.
54
+ Bulleted list of major layout regions (header, sidebar, main, footer, modal) with a one-line purpose each. Use auto-layout frames as region hints.
76
55
 
77
56
  ### 4. Actions
78
- Every interactive element the user can trigger. Derive from nodes whose name/type suggests a button, link, icon-button, menu-item, toggle, etc. Format:
79
-
57
+ Every interactive element the user can trigger (button, link, icon-button, menu-item, toggle…):
80
58
  ```
81
59
  - **<Action name>** — <what it does> (source: <node name>)
82
60
  ```
83
61
 
84
62
  ### 5. Form Fields
85
- Every input the user can fill. Include label, type (text/email/password/select/checkbox/radio/textarea/date), required hint if inferable, and placeholder.
86
-
63
+ Every input. Include label, type (text/email/password/select/checkbox/radio/textarea/date), required hint if inferable, placeholder:
87
64
  ```
88
65
  | Label | Type | Required | Placeholder |
89
66
  |---|---|---|---|
90
67
  ```
91
-
92
- Omit entirely (write `_none_`) if no inputs exist.
68
+ Omit (write `_none_`) if no inputs exist.
93
69
 
94
70
  ### 6. Data Columns
95
- If the screen shows a table, list, or card grid — enumerate the columns/fields displayed per row. Otherwise write `_none_`.
71
+ If the screen shows a table/list/card grid — enumerate the columns/fields per row. Otherwise `_none_`.
96
72
 
97
73
  ### 7. Navigation
98
- Outgoing links, tab bars, breadcrumbs, back buttons — anything that moves the user to another screen. Include both explicit navigation components and implicit CTAs that navigate.
99
-
100
- ---
74
+ Outgoing links, tab bars, breadcrumbs, back buttons — anything that moves to another screen. Include explicit nav components and implicit CTAs that navigate.
101
75
 
102
76
  ## Synthesis Workflow
103
77
 
104
78
  1. Read `requirements/spec_figma.md` — note `file_key`, `node_id`, `figma_version_id` from frontmatter
105
79
  2. Read `.sungen/figma-cache/<file_key>/<figma_version_id>/<safe_node_id>-raw.json` (colons in node_id become underscores)
106
- 3. Traverse the tree. Collect: names, types, `characters`, `componentProperties`, `absoluteBoundingBox`
80
+ 3. Traverse the tree. Collect names, types, `characters`, `componentProperties`, `absoluteBoundingBox`
107
81
  4. Produce the 7 sections above
108
82
  5. **Locate the insertion point** in `spec_figma.md`:
109
83
  - **If `<!-- SYNTHESIS-BELOW -->` is present** → replace everything from the marker (inclusive) to EOF with: the marker line, a blank line, then the 7 sections.
110
- - **If the marker is NOT present** (older `spec_figma.md` pre-envelope-refactor, or hand-edited file) → locate the last non-empty line of the envelope (usually the end of `## Screenshots`), append a blank line, then write the marker, another blank line, then the 7 sections. Do NOT delete any existing envelope content.
84
+ - **If the marker is NOT present** (older file or hand-edited) → locate the last non-empty line of the envelope (usually the end of `## Screenshots`), append a blank line, then the marker, another blank line, then the 7 sections. Do NOT delete any envelope content.
111
85
  - **If the file is missing entirely** → advise the user to re-run `sungen add --screen <screen> --figma <url> --refresh` to regenerate the envelope first. Do not fabricate one.
112
86
  6. Preserve the envelope (frontmatter + Frame + Screenshots) byte-for-byte. Never touch content above the marker.
113
87
 
114
- ---
115
-
116
88
  ## Re-synthesis
117
89
 
118
90
  - If the envelope's `figma_version_id` changed → envelope is fresh; re-run synthesis
119
- - If only the narrative is stale (user wants a rewrite) → truncate from marker to EOF and regenerate
91
+ - If only the narrative is stale → truncate from marker to EOF and regenerate
120
92
  - Never edit content ABOVE the marker — that is the scaffolder's territory
121
93
 
122
- ---
123
-
124
94
  ## Selector Heuristics (for downstream `run-test`)
125
95
 
126
96
  During `run-test` Phase 0, provisional selectors can be seeded from the raw JSON:
@@ -135,15 +105,11 @@ During `run-test` Phase 0, provisional selectors can be seeded from the raw JSON
135
105
  | Node name ends `Icon` | `role: img` + `name: "<accessible name>"` |
136
106
 
137
107
  Every provisional entry MUST carry:
138
-
139
108
  ```
140
109
  # @needs-live-verify source=figma node_id=<id>
141
110
  ```
142
-
143
111
  Provisional selectors feed `selectors.yaml` as candidates. `run-test` Phase 0 verifies them against the live page and overwrites incorrect entries.
144
112
 
145
- ---
146
-
147
113
  ## Security
148
114
 
149
115
  - Never include the PAT in `spec_figma.md`, selectors, test data, or any committed file
@@ -0,0 +1,60 @@
1
+ # Capture mode: live
2
+
3
+ Navigate a running application, take **one accessibility snapshot** and **one screenshot**, and save them as visual context for test generation. Use when the app is live (dev, staging, or production with read-only access) and you want tests grounded in the actual rendered UI. Handles auth gracefully: if the page redirects to login, ask the user to sign in manually rather than injecting cookies.
4
+
5
+ ## Prerequisites
6
+
7
+ - Playwright MCP connected.
8
+ - Dev/staging server reachable (or a public URL).
9
+ - `playwright.config.ts` exists at the project root (for `baseURL` fallback).
10
+
11
+ ## Steps
12
+
13
+ ### 1. Resolve target URL
14
+
15
+ 1. `Live URL` field in `requirements/spec.md` (Overview section)
16
+ 2. `baseURL` from `playwright.config.ts` + `URL Path` from `spec.md`
17
+ 3. Neither → `AskUserQuestion`: *"Paste the full URL for the page to scan"*
18
+
19
+ ### 2. Navigate
20
+
21
+ `browser_navigate` to the resolved URL.
22
+
23
+ ### 3. Handle auth redirect
24
+
25
+ If the page redirects to a login route (URL contains `/login`, `/signin`, `/auth`, or content indicates a login screen):
26
+ 1. Tell the user which login URL they landed on.
27
+ 2. `AskUserQuestion`:
28
+ - **I'll log in manually** — wait for confirmation, then re-navigate to the target URL
29
+ - **Skip live scan** — switch to mode `local`
30
+ - **Cancel**
31
+ 3. **Never** inject cookies or localStorage via `browser_evaluate` / `browser_run_code`. Auth belongs to the user.
32
+
33
+ ### 4. Snapshot
34
+
35
+ Take **ONE** `browser_snapshot`. This accessibility tree is the primary AI context — roles, names, text, structure that tc-generation uses to identify sections and fields.
36
+
37
+ ### 5. Screenshot (recommended)
38
+
39
+ Take **ONE** `browser_take_screenshot` with `fullPage: true`. Save to `requirements/ui/live-<timestamp>.png`, where `<timestamp>` is `YYYYMMDD-HHMM` local time (e.g. `live-20260421-1430.png`).
40
+
41
+ ### 6a. Verify unauthenticated redirect target (flow capture only)
42
+
43
+ When capturing for a **flow** with security scenarios (e.g. "unauthenticated user cannot access X"):
44
+ 1. Open a **fresh incognito/unauthenticated** context (no storage state).
45
+ 2. `browser_navigate` to the protected route.
46
+ 3. Record the **actual redirect URL** — do NOT assume `/login`; it may be `/register`, `/`, etc.
47
+ 4. Report the redirect target: *"Unauthenticated access to `/dashboard` redirects to `/register`"*.
48
+ 5. The caller must use the **actual redirect URL** in Gherkin assertions, never an assumed one.
49
+
50
+ Skip if the flow has no security scenarios or the user says to skip.
51
+
52
+ ### 6. Detect discrepancies vs spec
53
+
54
+ If `spec.md` exists, cross-check the snapshot against spec sections: fields in spec but not in snapshot → *missing in UI*; elements in snapshot but not in spec → *missing in spec*. Report findings but **do not** auto-edit `spec.md`.
55
+
56
+ ### 7. Report back
57
+
58
+ > Captured live page `<URL>`: Snapshot N interactive elements · Screenshot `requirements/ui/live-<timestamp>.png` · Discrepancies vs spec: <count or "none">
59
+
60
+ Hand back to the calling command. Scans **exactly one** page per invocation.
@@ -0,0 +1,38 @@
1
+ # Capture mode: local
2
+
3
+ Use **pre-existing images** in `requirements/ui/` as visual context. No network, no MCP, no live site — works for any design tool (Figma export, Sketch, Penpot, Zeplin, hand-drawn, staging screenshots). This is the **baseline fallback**: if the live domain is down and Figma MCP isn't configured, this always works as long as the user drops images in the folder.
4
+
5
+ ## Steps
6
+
7
+ ### 1. List available images
8
+
9
+ Glob `requirements/ui/*.{png,jpg,jpeg,webp,gif}` and report count + filenames. Filter out metadata files (e.g. `figma-meta.md` written by mode figma-mcp) — those are read by `tc-generation` separately, not treated as images here.
10
+
11
+ ### 2. Handle empty folder
12
+
13
+ If no images found:
14
+ 1. Tell the user the folder is empty, with the full path so they can open it in Finder.
15
+ 2. `AskUserQuestion`:
16
+ - **I'll drop images now** — wait for confirmation, then re-glob
17
+ - **Switch to Figma** — switch to mode `figma-mcp`
18
+ - **Switch to live page scan** — switch to mode `live`
19
+ - **Cancel** — abort create-test
20
+ 3. If "drop images now", wait for confirmation (e.g. "done") then re-run step 1.
21
+
22
+ ### 3. Read images for context
23
+
24
+ Use the `Read` tool on each image — Claude Code reads PNG/JPG/WebP directly as visual context. For large sets (>10 images), ask which are primary and which are states/variants to avoid loading too much at once.
25
+
26
+ ### 4. Summarize
27
+
28
+ > Loaded N image(s) from `requirements/ui/`:
29
+ > - `<filename-1>` — <one-line description of what's visible>
30
+ > - `<filename-2>` — <one-line description>
31
+
32
+ Hand back to the calling command.
33
+
34
+ ## File naming hints for users
35
+
36
+ Nudge users toward consistent filenames (don't enforce):
37
+ - `<section>-default.png` / `-error.png` / `-loading.png` / `-empty.png` — section states
38
+ - `full-page.png` / `viewport.png` — whole screen (auto-generated by `sungen add --capture`)
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: sungen-capture
3
+ description: 'Acquire visual/design context for test generation from one of four sources (modes): figma-mcp, figma-pat, live, local. Auto-loaded by create-test/add-screen when a visual source is needed, or when --figma flag / spec_figma.md is present. Router skill — read only the mode file you need.'
4
+ user-invocable: false
5
+ ---
6
+
7
+ ## Purpose
8
+
9
+ Bring **visual + design context** into test generation so `sungen-tc-generation` can author Gherkin + test-data grounded in the real UI. This is a **router**: pick exactly **one mode** for the run, then read only that mode's file. Do **not** read all four.
10
+
11
+ This skill never generates Gherkin or `selectors.yaml` — it only acquires context and reports back to the calling command.
12
+
13
+ ## Pick the mode
14
+
15
+ | Mode | Read | Use when | Needs |
16
+ |---|---|---|---|
17
+ | **figma-mcp** | `mode-figma-mcp.md` | Pre-launch / Figma is source of truth, **Figma Dev Mode MCP** connected | Figma MCP + frame URL |
18
+ | **figma-pat** | `mode-figma-pat.md` | `--figma` flag was used, or `requirements/spec_figma.md` exists (synthesize narrative from cached raw node JSON) | `sungen figma auth` PAT |
19
+ | **live** | `mode-live.md` | App is running (dev/staging/prod read-only) and you want the actual rendered UI | Playwright MCP + reachable URL |
20
+ | **local** | `mode-local.md` | Images already dropped in `requirements/ui/` (any design tool, screenshots, mockups) — baseline fallback, no network | nothing |
21
+
22
+ ### How the mode is chosen (when the caller didn't specify)
23
+
24
+ 1. `requirements/spec_figma.md` exists → **figma-pat** (PAT flow already ran during `add-screen`).
25
+ 2. `requirements/ui/` has images → **local**.
26
+ 3. Neither → ask the user which source (figma-mcp / live / local), then load that one mode file.
27
+
28
+ Modes are **mutually exclusive per run**, but the user can run `create-test` again with a different mode to layer context. All modes write to `requirements/ui/` and report back.
29
+
30
+ ## What this skill (any mode) does NOT do
31
+
32
+ - Does not generate Gherkin — that's `sungen-tc-generation`.
33
+ - Does not write `selectors.yaml` — that's `/sungen:run-test`.
34
+ - Does not inject auth/cookies — the user logs in manually (see `live`).
35
+ - Does not crawl or generate images.
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: sungen-harness-audit
3
+ description: 'How to read `sungen audit` output and repair test-design findings. Auto-loaded by the design orchestrator.'
4
+ user-invocable: false
5
+ ---
6
+
7
+ ## What `sungen audit` measures
8
+
9
+ `sungen audit --screen <name>` runs deterministic sensors over `features/<name>.feature` + `requirements/test-viewpoint.md` and writes `.sungen/reports/<name>-audit.json`. It is the **gate** the orchestrator repairs against. Run with `--json` to parse it.
10
+
11
+ ### Report shape (key fields)
12
+ ```jsonc
13
+ {
14
+ "score": { "overall": 3.9, "coverage": 0.4, "businessDepth": 0.18, "balance": 0.5, "traceability": 0.7 },
15
+ "gateStatus": "PASS" | "FAIL",
16
+ "gate": { "pageType": "ecommerce-list", "themesCovered": 2, "themesTotal": 5,
17
+ "gaps": [ { "theme": "cart-correctness", "keywords": [...] } ] },
18
+ "depth": { "businessCriticalShallow": 9, "businessCriticalTotal": 11,
19
+ "shallowBusinessCritical": [ { "name": "...", "category": "PRODUCT" } ] },
20
+ "balance": { "imbalanced": true, "coreCount": 11, "secondaryCount": 22, "byBucket": {...} },
21
+ "duplicates": { "clusters": [ { "sameDataLikely": false, "scenarios": [...] } ] },
22
+ "trace": { "mappedRatio": 0.4, "note": "..." },
23
+ "findings": [ "GATE: ...", "DEPTH: ...", "BALANCE: ...", "TRACE: ..." ]
24
+ }
25
+ ```
26
+ - **`overall` score is business-weighted** (coverage 0.4 + businessDepth 0.3 + balance 0.15 + traceability 0.15). It is intentionally strict on business value — a high count with shallow business coverage scores low. Don't optimize the count; optimize coverage + depth.
27
+ - Exit code **2** when `gateStatus == FAIL` (usable in CI / loop).
28
+
29
+ ## Finding → repair mapping
30
+
31
+ | Finding prefix | Meaning | Repair action |
32
+ |---|---|---|
33
+ | **GATE** | a critical theme for the page-type has no covering scenario | Generate scenarios for that theme. **If cross-screen** (cart-correctness, product-detail-consistency, filter-result-correctness, multi-item cart) → do NOT fake it on a single screen; plan a **flow** (`/sungen:add-flow`) and record the deferral. |
34
+ | **DEPTH** | business-critical scenarios assert only visibility/navigation | Replace `Then User see [X] page/section` with **observable data assertions**: `Then User see [X] with {{value}}`, `Then User see [T] table match data:`. Capture real expected values into `test-data.yaml`. |
35
+ | **BALANCE** | secondary viewpoints (UI/validation/security) outweigh business-core | **Stop expanding** secondary viewpoints; generate the missing business-core scenarios first. Do not add more subscription/UI variants while core is thin. |
36
+ | **TRACE** | scenarios use ad-hoc `VP-<CAT>-NNN` codes not linked to the viewpoint-overview | Make each scenario map to a viewpoint-overview id (align category codes, or add a mapping comment). |
37
+ | **UNIVERSAL** | a universal theme (error/empty-state, accessibility) is absent | Low priority — add if in scope; otherwise note as out-of-scope with reason. |
38
+
39
+ ## P5 steps for deep cross-screen / list coverage
40
+
41
+ Use these when repairing GATE/DEPTH findings for the hard viewpoints (cart/detail/filter correctness). They need **runtime data mode** (the default).
42
+
43
+ - **Capture a value to compare across screens** (product-detail-consistency, cart-correctness):
44
+ ```gherkin
45
+ When User remember [Product Name] text as {{selected_product_name}}
46
+ And User remember [Product Price] text as {{selected_product_price}}
47
+ And User click [View Product] link
48
+ Then User see [Detail Product Name] header with {{selected_product_name}}
49
+ And User see [Detail Product Price] text with {{selected_product_price}}
50
+ ```
51
+ `remember` stores the element's text/value at runtime; later `{{var}}` resolves to it. This proves the detail/cart shows the SAME product, not a random one.
52
+
53
+ - **Assert every item in a result matches** (category/brand-filter-correctness):
54
+ ```gherkin
55
+ When User click [Women] link
56
+ And User click [Dress] link
57
+ Then User see all [Result Product Name] contain {{selected_category}}
58
+ ```
59
+ `see all [X] contain {{v}}` asserts EVERY matching element contains the value → "all displayed products belong to the selected category/brand", not just one.
60
+
61
+ > Cross-screen flows (home → detail/cart): if the target screen is a separate screen, prefer a **flow** (`/sungen:add-flow`) so the journey is one test. On a single screen, keep the cross-screen assertion but tag `@manual` with a `# Deferred to a flow` comment.
62
+
63
+ ## Repair loop rules
64
+
65
+ 1. **Budget = 3 rounds.** Re-run `sungen audit` after each repair; track score delta.
66
+ 2. **Stop when** `gateStatus == PASS` AND `findings` empty — or budget exhausted.
67
+ 3. **Never fake a pass.** A shallow `see [Cart] page` does not satisfy `cart-correctness`. If a gap is genuinely cross-screen or needs capabilities the DSL lacks (e.g. capture an element value to compare elsewhere), **report it as a residual gap / flow item** instead of forcing a green gate.
68
+ 4. **EP/data families are OK.** A `duplicates` cluster with `sameDataLikely=false` is an intentional equivalence-partition family (e.g. many invalid-email cases) — keep it; only collapse `sameDataLikely=true` exact duplicates.
69
+
70
+ ## Discovery / fallback tree (when input is limited)
71
+
72
+ ```
73
+ spec.md đủ tốt? → YES: Spec-first
74
+ │ NO
75
+ source code có? → YES: Source-first (mine behavior từ code)
76
+ │ NO
77
+ testcase cũ tương tự?→ YES: History-first
78
+ │ NO
79
+ domain rủi ro+defect?→ YES: Defect-first
80
+ │ NO
81
+ → hỏi QA; QA chưa phản hồi → OUTPUT kèm ASSUMPTION LIST rõ ràng (không stall)
82
+ ```
83
+
84
+ See `docs/orchestration-spec.md` for the full flow and `reports/sungen_refactor_spec.md` for the design rationale.
@@ -7,7 +7,7 @@ user-invocable: false
7
7
  ## ⚠️ Gotchas — read before generating
8
8
 
9
9
  - `spec_figma.md` exists → read file only, **NEVER** call `mcp__figma__*`
10
- → PAT auth flow already done by `sungen-figma-source`; re-calling fails or duplicates work.
10
+ → PAT auth flow already done by `sungen-capture` (mode figma-pat); re-calling fails or duplicates work.
11
11
 
12
12
  - `selectors.yaml` → do **NOT** generate — handled by `run-test`
13
13
  → Selectors need live DOM inspection via Playwright MCP, only `run-test` triggers it.
@@ -221,6 +221,45 @@ Security: [S1 – admin only]
221
221
 
222
222
  **✅ Good** — see admin notice example above: `Display surfaces` lists every URL spec mentions as output, `Cross-surface rules` maps each admin action to its user-facing outcome, `Inclusive bounds` flags every `<=`/`>=` for BVA. Every item maps to a VP-ID in `Tier 1 output`.
223
223
 
224
+ #### Critical business-viewpoint pre-gate — pass `sungen audit` on the FIRST pass
225
+
226
+ > The harness gate FAILS (and forces repair rounds → wasted tokens) when a page-type's critical **business** viewpoints are missing or **shallow**. Generate them correctly the first time. A business-critical `Then` must assert **DATA**, never just `see [X] page/section/modal`.
227
+
228
+ **By page-type, generate a DEEP scenario for each (before expanding UI/validation/subscription):**
229
+
230
+ | Page-type | Must-cover viewpoints (each with a data assertion) |
231
+ |---|---|
232
+ | **e-commerce list / home** | list-data (card has image+name+price+add) · product-detail-consistency · cart-correctness · category-filter-correctness · **brand-filter-correctness (separate from category)** · add-to-cart success · nav-core |
233
+ | **form** | required-validation · format/boundary · submit-success |
234
+ | **auth** | valid-login · invalid-credential · access-control |
235
+
236
+ **Required assertion shapes (use these, not bare visibility):**
237
+ - Card info: assert at **card level** (image+name+price together), e.g. `User see all [Product Card] contain {{...}}` — not `see [Section]` (section-level passes even if one card lacks price).
238
+ - Cross-screen consistency (detail/cart): **capture then compare** —
239
+ ```gherkin
240
+ When User remember [Product Name] text as {{selected_product_name}}
241
+ And User remember [Product Price] text as {{selected_product_price}}
242
+ And User click [View Product] link
243
+ Then User see [Detail Product Name] header with {{selected_product_name}}
244
+ And User see [Detail Product Price] text contains {{selected_product_price}}
245
+ ```
246
+ Cross-screen target → tag `@manual` + `# Deferred to a flow (home -> detail)`.
247
+ - Filter result (category AND brand, separately): `Then User see all [Result Product Name] contain {{selected_category}}` — proves EVERY item belongs, not one.
248
+
249
+ **Depth is a GATE dimension (harness-roadmap P1) — self-raise, never silently go shallow:**
250
+ - For every data-correctness theme the catalog marks `depth.requires: data-assertion`, emit its `depth.template` shape by **default** — don't wait for the repair loop. `sungen audit` measures `businessDepth` (ratio of these scenarios that assert data) against an intent threshold (functional ≥ 0.70); below it the **gate FAILs**.
251
+ - `depth.cross_screen: true` (cart / detail / filter / brand correctness) → write the deep capture/compare shape but tag `@manual` + `# Deferred to a flow (...)`. These are excluded from the ratio (they're correctly deferred), so they don't hurt depth.
252
+ - **If the spec lacks the concrete value** a deep assertion needs (exact message, price, count): still write the deep shape with a `{{var}}` placeholder and leave a `# SPEC-GAP: <field> value not in spec` comment — do **not** downgrade to `see [X] section`. A visible gap is better than a silent shallow pass.
253
+ - **Blind-Spot Memory:** before finishing, run `sungen blindspot list --prompt` (Bash) and make sure the suite satisfies each recorded pattern (e.g. "for any Add/Create action: check success + resulting data state + duplicate/double-submit"). These are gaps QA hit before — don't repeat them.
254
+
255
+ **First-pass anti-patterns (these are exactly what the gate/reviewer reject — avoid them):**
256
+ - Title↔steps mismatch: e.g. a "no-result state" scenario that clicks a query which **returns** products. Steps must create the condition the title claims.
257
+ - Tautology `Then`: `click [Next Slide]` → `see [Carousel] section` (always visible, proves nothing). Assert the change (new slide title differs).
258
+ - Business-critical scenario ending at `see [Added] modal` / `see [Cart] page` / `see [Category Products] page` with no data assertion.
259
+ - Brand filter covered only as navigation (must assert products belong to the brand).
260
+
261
+ **Balance:** cover all the above (deep) BEFORE expanding subscription / UI-presence / extra validation edge cases. Do not over-invest in subscription while cart/detail/filter correctness are shallow.
262
+
224
263
  #### Tier 1 guard — minimum before writing scenarios
225
264
 
226
265
  | Spec section | Minimum requirement | Tag |