@anselmdk/feature-spec-md 0.5.0-rc.3 → 0.6.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 (45) hide show
  1. package/dist/githubActionDiffReport.d.ts +61 -0
  2. package/dist/githubActionDiffReport.d.ts.map +1 -1
  3. package/dist/githubActionDiffReport.js +84 -7
  4. package/dist/githubActionDiffReport.js.map +1 -1
  5. package/dist/index.d.ts +4 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/mockReports.d.ts +36 -0
  10. package/dist/mockReports.d.ts.map +1 -0
  11. package/dist/mockReports.js +250 -0
  12. package/dist/mockReports.js.map +1 -0
  13. package/dist/mocks/current/app/supportDesk.d.ts +12 -0
  14. package/dist/mocks/current/app/supportDesk.d.ts.map +1 -0
  15. package/dist/mocks/current/app/supportDesk.js +19 -0
  16. package/dist/mocks/current/app/supportDesk.js.map +1 -0
  17. package/dist/mocks/current/tests/supportDesk.spec.d.ts +3 -0
  18. package/dist/mocks/current/tests/supportDesk.spec.d.ts.map +1 -0
  19. package/dist/mocks/current/tests/supportDesk.spec.js +15 -0
  20. package/dist/mocks/current/tests/supportDesk.spec.js.map +1 -0
  21. package/dist/mocks/previous/app/supportDesk.d.ts +10 -0
  22. package/dist/mocks/previous/app/supportDesk.d.ts.map +1 -0
  23. package/dist/mocks/previous/app/supportDesk.js +9 -0
  24. package/dist/mocks/previous/app/supportDesk.js.map +1 -0
  25. package/dist/mocks/previous/tests/supportDesk.spec.d.ts +3 -0
  26. package/dist/mocks/previous/tests/supportDesk.spec.d.ts.map +1 -0
  27. package/dist/mocks/previous/tests/supportDesk.spec.js +15 -0
  28. package/dist/mocks/previous/tests/supportDesk.spec.js.map +1 -0
  29. package/docs/report-development.md +102 -0
  30. package/package.json +3 -1
  31. package/src/mocks/current/app/supportDesk.ts +27 -0
  32. package/src/mocks/current/screenshots/SUPPORT-INBOX-S001-line-27-current.svg +10 -0
  33. package/src/mocks/current/screenshots/SUPPORT-REPLY-S001-line-27-current.svg +10 -0
  34. package/src/mocks/current/screenshots/screenshots.json +18 -0
  35. package/src/mocks/current/specs/support-desk.model.md +29 -0
  36. package/src/mocks/current/specs/ticket-inbox.feature.md +27 -0
  37. package/src/mocks/current/specs/ticket-reply.feature.md +33 -0
  38. package/src/mocks/current/tests/supportDesk.spec.ts +17 -0
  39. package/src/mocks/previous/app/supportDesk.ts +17 -0
  40. package/src/mocks/previous/screenshots/SUPPORT-INBOX-S001-line-27-previous.svg +10 -0
  41. package/src/mocks/previous/screenshots/screenshots.json +11 -0
  42. package/src/mocks/previous/specs/support-desk.model.md +29 -0
  43. package/src/mocks/previous/specs/ticket-inbox.feature.md +26 -0
  44. package/src/mocks/previous/specs/ticket-reply.feature.md +26 -0
  45. package/src/mocks/previous/tests/supportDesk.spec.ts +17 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockReports.js","sourceRoot":"","sources":["../src/mockReports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAA2B,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAsBvD,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA6B,SAAS;IAC7E,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,KAAK,EAAE;YACL,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC;SAC/C;QACD,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAChD,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,KAAK;QAC1B,uBAAuB,EAAE,KAAK;KAC/B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,wBAAwB,CAC1C,MAAM,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC,CAAC,EACtF,YAAY,EACZ,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,2CAA2C;QAClD,YAAY;QACZ,WAAW;QACX,SAAS,EAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;QAChE,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;QAC1D,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC9D,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;QAC1D,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;QAC5D,QAAQ,EAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC7D,WAAW;QACX,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvF,GAAG,KAAK;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;SACjG,CAAC,CAAC;QACH,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,UAA6B,SAAS,EACtC,WAAW,GAAG,kBAAkB;IAEhC,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,oBAAoB,CACzB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,WAAW;QACX,aAAa,EAAE,6CAA6C;QAC5D,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACxD,aAAa,EAAE,6CAA6C;KAC7D,CAAC,EACF,IAAI,CAAC,QAAQ,CACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAW,GAAG,kBAAkB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,MAAM,EAAE,EACR,6BAA6B,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CACzD,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,2BAA2B,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,2BAA2B,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAEtE,OAAO,qBAAqB,CAAC;QAC3B,WAAW;QACX,UAAU;QACV,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,UAAU;QAC3B,sBAAsB,EAAE,UAAU;QAClC,qBAAqB,EAAE,SAAS;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAmC,EAAE;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEjD,MAAM,2BAA2B,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACtE,MAAM,2BAA2B,CAAC,kBAAkB,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC/E,MAAM,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IACxE,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/D,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAChC,MAAM,qBAAqB,CAAC;QAC1B,WAAW,EAAE,kBAAkB;QAC/B,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,kCAAkC;QAChD,eAAe,EAAE,yBAAyB;QAC1C,sBAAsB,EAAE,UAAU;QAClC,qBAAqB,EAAE,SAAS;KACjC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;QACtD,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC;QACtE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,SAAiB,EACjB,OAA0B,EAC1B,WAAmB;IAEnB,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAClC,MAAM,2BAA2B,CAAC,OAAO,EAAE,WAAW,CAAC,CACxD,CAAC;IACF,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,EAC/C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAA0B;IAC9C,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,CAAC;IACxC,OAAO;QACL;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM;YACpD,GAAG,EAAE,oDAAoD,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,EAAE;SACzG;QACD;YACE,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;YAChC,GAAG,EAAE,4DAA4D,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;SAC7F;QACD;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACxC,GAAG,EAAE,sDAAsD,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE;SAC/F;QACD;YACE,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,qDAAqD;SAC3D;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;KAC3C,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACpD,CAAC;IAED,MAAM,IAAI,KAAK,CACb,+CAA+C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,SAAc,EACd,WAAmB;IAEnB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,GAAG,QAAQ;QACX,QAAQ,EAAE,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;KAClE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAqC,EACrC,WAAmB;IAEnB,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,OAAO;QACL,GAAG,QAAQ;QACX,aAAa,EAAE,QAAQ,CAAC,aAAa;YACnC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;YACjE,CAAC,CAAC,QAAQ,CAAC,aAAa;QAC1B,YAAY,EAAE,0BAA0B,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;QAC5E,gBAAgB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC;QACpF,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;YACnD,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC;YACtE,CAAC,CAAC,QAAQ,CAAC,qBAAqB;QAClC,oBAAoB,EAAE,uBAAuB,CAAC,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC;QACzF,wBAAwB,EAAE,uBAAuB,CAAC,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC;KAClG,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAU,EACV,WAAmB;IAEnB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,GAAG,IAAI;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;QAC7F,UAAU,EAAE,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;KAClE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAC9B,UAA2B,EAC3B,WAAmB;IAEnB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpC,GAAG,SAAS;QACZ,QAAQ,EAAE,uBAAuB,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;KACnE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAC/B,WAA6B,EAC7B,YAAoB,EACpB,WAAmB;IAEnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,UAAU;QACb,QAAQ,EAAE,uBAAuB,CAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,UAAU,CAAC,QAAQ;YACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,EAC7E,WAAW,CACZ;QACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC3B,CAAC,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC3D,CAAC,CAAC,UAAU,CAAC,QAAQ;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,WAAmB;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC7E,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,QAAQ;SACZ,KAAK,CAAC,IAAI,CAAC;SACX,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC;SAClD,OAAO,CAAC,yCAAyC,EAAE,EAAE,CAAC;SACtD,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,MAAc,EACd,UAAyC,GAAG,EAAE,CAAC,IAAI;IAEnD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC5D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,WAAW,EAAE,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,uCAAuC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gDAAgD,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type Ticket = {
2
+ id: string;
3
+ title: string;
4
+ status: "open" | "closed";
5
+ priority: "low" | "normal" | "high";
6
+ createdAt: string;
7
+ };
8
+ export declare function visibleTickets(tickets: Ticket[]): Ticket[];
9
+ export declare function priorityBadge(ticket: Ticket): "High priority" | "Low priority" | "Normal priority";
10
+ export declare function draftReply(existingDraft: string, nextText: string): string;
11
+ export declare function applySavedReply(template: string): string;
12
+ //# sourceMappingURL=supportDesk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.d.ts","sourceRoot":"","sources":["../../../../src/mocks/current/app/supportDesk.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAI/C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,wDAI3C;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAEjE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,UAE/C"}
@@ -0,0 +1,19 @@
1
+ export function visibleTickets(tickets) {
2
+ return tickets
3
+ .filter((ticket) => ticket.status === "open")
4
+ .sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
5
+ }
6
+ export function priorityBadge(ticket) {
7
+ if (ticket.priority === "high")
8
+ return "High priority";
9
+ if (ticket.priority === "low")
10
+ return "Low priority";
11
+ return "Normal priority";
12
+ }
13
+ export function draftReply(existingDraft, nextText) {
14
+ return nextText.trim() ? nextText : existingDraft;
15
+ }
16
+ export function applySavedReply(template) {
17
+ return template.trim();
18
+ }
19
+ //# sourceMappingURL=supportDesk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.js","sourceRoot":"","sources":["../../../../src/mocks/current/app/supportDesk.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IACvD,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,cAAc,CAAC;IACrD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,aAAqB,EAAE,QAAgB;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function verifiesTicketInboxMock(): ("High priority" | "Low priority" | "Normal priority")[];
2
+ export declare function verifiesReplyDraftMock(): string;
3
+ //# sourceMappingURL=supportDesk.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.spec.d.ts","sourceRoot":"","sources":["../../../../src/mocks/current/tests/supportDesk.spec.ts"],"names":[],"mappings":"AAOA,wBAAgB,uBAAuB,6DAItC;AAED,wBAAgB,sBAAsB,WAGrC"}
@@ -0,0 +1,15 @@
1
+ import { draftReply, priorityBadge, visibleTickets } from "../app/supportDesk.js";
2
+ const tickets = [
3
+ { id: "T-2", title: "Newer", status: "open", priority: "high", createdAt: "2026-01-02T10:00:00Z" },
4
+ { id: "T-1", title: "Older", status: "open", priority: "normal", createdAt: "2026-01-01T10:00:00Z" },
5
+ ];
6
+ export function verifiesTicketInboxMock() {
7
+ // Covers SUPPORT-M001, SUPPORT-M002, SUPPORT-M003 and SUPPORT-M-R001.
8
+ // Covers SUPPORT-INBOX-R001, SUPPORT-INBOX-R002 and SUPPORT-INBOX-S001.
9
+ return visibleTickets(tickets).map((ticket) => priorityBadge(ticket));
10
+ }
11
+ export function verifiesReplyDraftMock() {
12
+ // Covers SUPPORT-REPLY-R001 and SUPPORT-REPLY-S001.
13
+ return draftReply("Existing draft", "Updated draft");
14
+ }
15
+ //# sourceMappingURL=supportDesk.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.spec.js","sourceRoot":"","sources":["../../../../src/mocks/current/tests/supportDesk.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAElF,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,MAAe,EAAE,SAAS,EAAE,sBAAsB,EAAE;IACpH,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,QAAiB,EAAE,SAAS,EAAE,sBAAsB,EAAE;CACvH,CAAC;AAEF,MAAM,UAAU,uBAAuB;IACrC,sEAAsE;IACtE,wEAAwE;IACxE,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,oDAAoD;IACpD,OAAO,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type Ticket = {
2
+ id: string;
3
+ title: string;
4
+ status: "open" | "closed";
5
+ priority: "low" | "normal" | "high";
6
+ createdAt: string;
7
+ };
8
+ export declare function visibleTickets(tickets: Ticket[]): Ticket[];
9
+ export declare function draftReply(existingDraft: string, nextText: string): string;
10
+ //# sourceMappingURL=supportDesk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.d.ts","sourceRoot":"","sources":["../../../../src/mocks/previous/app/supportDesk.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAI/C;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAEjE"}
@@ -0,0 +1,9 @@
1
+ export function visibleTickets(tickets) {
2
+ return tickets
3
+ .filter((ticket) => ticket.status === "open")
4
+ .sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
5
+ }
6
+ export function draftReply(existingDraft, nextText) {
7
+ return nextText.trim() ? nextText : existingDraft;
8
+ }
9
+ //# sourceMappingURL=supportDesk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.js","sourceRoot":"","sources":["../../../../src/mocks/previous/app/supportDesk.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,aAAqB,EAAE,QAAgB;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function verifiesTicketInboxMock(): import("../app/supportDesk.js").Ticket[];
2
+ export declare function verifiesReplyDraftMock(): string;
3
+ //# sourceMappingURL=supportDesk.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.spec.d.ts","sourceRoot":"","sources":["../../../../src/mocks/previous/tests/supportDesk.spec.ts"],"names":[],"mappings":"AAOA,wBAAgB,uBAAuB,6CAItC;AAED,wBAAgB,sBAAsB,WAGrC"}
@@ -0,0 +1,15 @@
1
+ import { draftReply, visibleTickets } from "../app/supportDesk.js";
2
+ const tickets = [
3
+ { id: "T-2", title: "Newer", status: "open", priority: "high", createdAt: "2026-01-02T10:00:00Z" },
4
+ { id: "T-1", title: "Older", status: "open", priority: "normal", createdAt: "2026-01-01T10:00:00Z" },
5
+ ];
6
+ export function verifiesTicketInboxMock() {
7
+ // Covers SUPPORT-M001, SUPPORT-M002, SUPPORT-M003 and SUPPORT-M-R001.
8
+ // Covers SUPPORT-INBOX-R001 and SUPPORT-INBOX-S001.
9
+ return visibleTickets(tickets);
10
+ }
11
+ export function verifiesReplyDraftMock() {
12
+ // Covers SUPPORT-REPLY-R001 and SUPPORT-REPLY-S001.
13
+ return draftReply("Existing draft", "Updated draft");
14
+ }
15
+ //# sourceMappingURL=supportDesk.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportDesk.spec.js","sourceRoot":"","sources":["../../../../src/mocks/previous/tests/supportDesk.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,MAAe,EAAE,SAAS,EAAE,sBAAsB,EAAE;IACpH,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,QAAiB,EAAE,SAAS,EAAE,sBAAsB,EAAE;CACvH,CAAC;AAEF,MAAM,UAAU,uBAAuB;IACrC,sEAAsE;IACtE,oDAAoD;IACpD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,oDAAoD;IACpD,OAAO,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,102 @@
1
+ # Report development mock data
2
+
3
+ The report UI is easier to develop when it can be rendered without a real app build, Playwright run, FTP server, or multiple published builds.
4
+
5
+ The mock setup keeps the maintainable source material in `src/mocks/`:
6
+
7
+ ```txt
8
+ src/mocks/
9
+ ├── current/
10
+ │ ├── app/
11
+ │ ├── specs/
12
+ │ ├── tests/
13
+ │ └── screenshots/
14
+ └── previous/
15
+ ├── app/
16
+ ├── specs/
17
+ ├── tests/
18
+ └── screenshots/
19
+ ```
20
+
21
+ The feature reports are generated by the normal library pipeline. The mock command loads the Markdown specs, scans the test files for coverage references, loads the screenshot manifests, and then renders the report HTML.
22
+
23
+ The diff report is generated by the same implementation used by the PR diff workflow. `src/mockReports.ts` prepares previous/current published-report directories, then calls `renderLocalDiffReport` from `src/githubActionDiffReport.ts`. That means the mock report exercises the real diff extraction, file comparison, screenshot grouping, and diff renderer instead of maintaining a separate mock-only diff renderer.
24
+
25
+ Run the library-owned mock setup from this package:
26
+
27
+ ```bash
28
+ npm run report:mock
29
+ ```
30
+
31
+ It writes a deterministic set of report fixtures to `test-results/mock-reports/`:
32
+
33
+ ```txt
34
+ test-results/mock-reports/
35
+ ├── feature-spec-report/index.html
36
+ ├── previous-feature-spec-report/index.html
37
+ └── diff-report/index.html
38
+ ```
39
+
40
+ The fixtures intentionally include the states that are otherwise cumbersome to reproduce by hand:
41
+
42
+ - covered and missing model/rule/scenario coverage
43
+ - current and previous screenshot evidence
44
+ - report metadata for branch, build, commit, and pull request
45
+ - a PR diff report with changed spec text, added spec text, changed screenshots, and added screenshots
46
+
47
+ Use `--out` to write the mock reports somewhere else:
48
+
49
+ ```bash
50
+ npm run report:mock -- --out /tmp/feature-spec-md-reports
51
+ ```
52
+
53
+ ## FTP publishing
54
+
55
+ The `.github/workflows/mock-reports.yml` workflow publishes the generated mock reports on every push and on manual workflow dispatch.
56
+
57
+ It uses the same publishing command that consuming projects use:
58
+
59
+ ```bash
60
+ node dist/cli.js github-report --publish ftp --report-dir test-results/mock-reports --name mock-feature-spec-reports
61
+ ```
62
+
63
+ Before publishing, the workflow adds a root `test-results/mock-reports/index.html` that links to:
64
+
65
+ - `feature-spec-report/`
66
+ - `previous-feature-spec-report/`
67
+ - `diff-report/`
68
+
69
+ The FTP publisher then uploads the whole `test-results/mock-reports` directory to `build/<github.run_number>/` and updates the build index.
70
+
71
+ Configure these repository settings before enabling the workflow:
72
+
73
+ | Name | Source |
74
+ | --- | --- |
75
+ | `FEATURE_SPEC_FTP_HOST` | Repository variable |
76
+ | `FEATURE_SPEC_FTP_USER` | Repository variable |
77
+ | `FEATURE_SPEC_FTP_PASSWORD` | Repository secret |
78
+ | `FEATURE_SPEC_REPORT_BASE_URL` | Repository variable |
79
+ | `FEATURE_SPEC_FTP_REMOTE_DIR` | Repository variable |
80
+
81
+ Optional settings:
82
+
83
+ | Name | Source |
84
+ | --- | --- |
85
+ | `FEATURE_SPEC_FTP_PORT` | Repository variable |
86
+ | `FEATURE_SPEC_FTP_SECURE` | Repository variable |
87
+
88
+ Use a mock-specific base URL and remote directory value so these reports do not overwrite the demo or any consumer report. For example, use a public base URL ending in `/mocks/` and an FTP remote directory ending in `/mocks`.
89
+
90
+ The same data is available from the library for custom dev servers or visual tests:
91
+
92
+ ```ts
93
+ import {
94
+ loadMockReportData,
95
+ renderLocalDiffReport,
96
+ renderMockDiffReport,
97
+ renderMockFeatureSpecReport,
98
+ writeMockReports,
99
+ } from "@anselmdk/feature-spec-md";
100
+ ```
101
+
102
+ Keep new reusable report states in `src/mocks/` where possible, and only put report-generation glue in `src/mockReports.ts`. That keeps the fixtures readable as normal specs, tests, manifests, and app code instead of duplicating parsed TypeScript objects.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anselmdk/feature-spec-md",
3
- "version": "0.5.0-rc.3",
3
+ "version": "0.6.0",
4
4
  "description": "Markdown specs for AI-assisted, testable spec driven development across model, feature, stack, and design documents.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -26,6 +26,7 @@
26
26
  },
27
27
  "files": [
28
28
  "dist",
29
+ "src/mocks",
29
30
  "README.md",
30
31
  "SPEC_FORMAT.md",
31
32
  "docs",
@@ -43,6 +44,7 @@
43
44
  "spec": "tsx src/cli.ts check",
44
45
  "spec:init": "tsx src/cli.ts init",
45
46
  "spec:report": "tsx src/cli.ts report",
47
+ "report:mock": "tsx src/mockReports.ts",
46
48
  "format": "prettier --write .",
47
49
  "check:example": "tsx src/cli.ts check --specs examples/**/*.feature.md --require-scenario-coverage=false",
48
50
  "report:example": "tsx src/cli.ts report --specs examples/**/*.feature.md --tests tests/**/*.test.ts --out test-results/feature-spec-report/index.html",
@@ -0,0 +1,27 @@
1
+ export type Ticket = {
2
+ id: string;
3
+ title: string;
4
+ status: "open" | "closed";
5
+ priority: "low" | "normal" | "high";
6
+ createdAt: string;
7
+ };
8
+
9
+ export function visibleTickets(tickets: Ticket[]) {
10
+ return tickets
11
+ .filter((ticket) => ticket.status === "open")
12
+ .sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
13
+ }
14
+
15
+ export function priorityBadge(ticket: Ticket) {
16
+ if (ticket.priority === "high") return "High priority";
17
+ if (ticket.priority === "low") return "Low priority";
18
+ return "Normal priority";
19
+ }
20
+
21
+ export function draftReply(existingDraft: string, nextText: string) {
22
+ return nextText.trim() ? nextText : existingDraft;
23
+ }
24
+
25
+ export function applySavedReply(template: string) {
26
+ return template.trim();
27
+ }
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="540" viewBox="0 0 960 540" role="img" aria-label="Inbox with priority badges">
2
+ <rect width="960" height="540" fill="#f6f8fa"/>
3
+ <rect x="72" y="64" width="816" height="412" rx="24" fill="white" stroke="#d0d7de"/>
4
+ <rect x="112" y="112" width="736" height="72" rx="14" fill="#ddf4ff" stroke="#54aeff"/>
5
+ <text x="144" y="158" font-family="system-ui, sans-serif" font-size="28" font-weight="700" fill="#1f2328">Inbox with priority badges</text>
6
+ <rect x="112" y="224" width="520" height="44" rx="10" fill="#f6f8fa"/>
7
+ <rect x="112" y="292" width="660" height="44" rx="10" fill="#f6f8fa"/>
8
+ <rect x="112" y="360" width="420" height="44" rx="10" fill="#f6f8fa"/>
9
+ <circle cx="812" cy="384" r="34" fill="#ddf4ff" stroke="#54aeff"/>
10
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="540" viewBox="0 0 960 540" role="img" aria-label="Reply composer with suggested answer">
2
+ <rect width="960" height="540" fill="#f6f8fa"/>
3
+ <rect x="72" y="64" width="816" height="412" rx="24" fill="white" stroke="#d0d7de"/>
4
+ <rect x="112" y="112" width="736" height="72" rx="14" fill="#ddf4ff" stroke="#54aeff"/>
5
+ <text x="144" y="158" font-family="system-ui, sans-serif" font-size="28" font-weight="700" fill="#1f2328">Reply composer with suggested answer</text>
6
+ <rect x="112" y="224" width="680" height="44" rx="10" fill="#f6f8fa"/>
7
+ <rect x="112" y="292" width="620" height="44" rx="10" fill="#f6f8fa"/>
8
+ <rect x="112" y="360" width="300" height="44" rx="10" fill="#ddf4ff" stroke="#54aeff"/>
9
+ <circle cx="812" cy="384" r="34" fill="#ddf4ff" stroke="#54aeff"/>
10
+ </svg>
@@ -0,0 +1,18 @@
1
+ {
2
+ "screenshots": [
3
+ {
4
+ "specPath": "src/mocks/current/specs/ticket-inbox.feature.md",
5
+ "line": 27,
6
+ "path": "screenshots/SUPPORT-INBOX-S001-line-27-current.svg",
7
+ "title": "Inbox with priority badges",
8
+ "testPath": "src/mocks/current/tests/supportDesk.spec.ts"
9
+ },
10
+ {
11
+ "specPath": "src/mocks/current/specs/ticket-reply.feature.md",
12
+ "line": 27,
13
+ "path": "screenshots/SUPPORT-REPLY-S001-line-27-current.svg",
14
+ "title": "Reply composer with suggested answer",
15
+ "testPath": "src/mocks/current/tests/supportDesk.spec.ts"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: SUPPORT
3
+ title: Support desk
4
+ status: active
5
+ ---
6
+
7
+ # Support desk
8
+
9
+ ## Purpose
10
+
11
+ Define the shared vocabulary for a small customer support workflow.
12
+
13
+ ## Model
14
+
15
+ ### SUPPORT-M001: Ticket
16
+
17
+ A customer request that needs a response from an agent.
18
+
19
+ ### SUPPORT-M002: Agent
20
+
21
+ A team member who reviews tickets and sends replies.
22
+
23
+ ### SUPPORT-M003: Priority
24
+
25
+ A visible urgency label used to sort the queue.
26
+
27
+ ## Rules
28
+
29
+ - SUPPORT-M-R001: Tickets MUST keep a stable public reference.
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: SUPPORT-INBOX
3
+ title: Ticket inbox
4
+ status: active
5
+ model: SUPPORT
6
+ test: playwright
7
+ screenshots: optional
8
+ ---
9
+
10
+ # Ticket inbox
11
+
12
+ ## Purpose
13
+
14
+ Let agents find the next ticket to work on without losing context.
15
+
16
+ ## Rules
17
+
18
+ - SUPPORT-INBOX-R001: The inbox MUST show open tickets first.
19
+ - SUPPORT-INBOX-R002: The inbox SHOULD highlight high priority tickets.
20
+
21
+ ## Scenarios
22
+
23
+ ### SUPPORT-INBOX-S001: Agent reviews the queue
24
+
25
+ Given an agent has open tickets
26
+ When they open the inbox
27
+ Then open tickets are listed by age with priority badges
@@ -0,0 +1,33 @@
1
+ ---
2
+ id: SUPPORT-REPLY
3
+ title: Ticket replies
4
+ status: active
5
+ model: SUPPORT
6
+ test: playwright
7
+ screenshots: optional
8
+ ---
9
+
10
+ # Ticket replies
11
+
12
+ ## Purpose
13
+
14
+ Help agents answer a customer without leaving the ticket.
15
+
16
+ ## Rules
17
+
18
+ - SUPPORT-REPLY-R001: The reply composer MUST preserve unsent text.
19
+ - SUPPORT-REPLY-R002: Saved replies SHOULD be reusable across tickets.
20
+
21
+ ## Scenarios
22
+
23
+ ### SUPPORT-REPLY-S001: Agent drafts a reply
24
+
25
+ Given an agent has selected a ticket
26
+ When they write a reply
27
+ Then the draft remains visible
28
+
29
+ ### SUPPORT-REPLY-S002: Agent sends a saved reply
30
+
31
+ Given an agent has selected a ticket
32
+ When they choose a saved reply
33
+ Then the composer is filled with reusable text
@@ -0,0 +1,17 @@
1
+ import { draftReply, priorityBadge, visibleTickets } from "../app/supportDesk.js";
2
+
3
+ const tickets = [
4
+ { id: "T-2", title: "Newer", status: "open" as const, priority: "high" as const, createdAt: "2026-01-02T10:00:00Z" },
5
+ { id: "T-1", title: "Older", status: "open" as const, priority: "normal" as const, createdAt: "2026-01-01T10:00:00Z" },
6
+ ];
7
+
8
+ export function verifiesTicketInboxMock() {
9
+ // Covers SUPPORT-M001, SUPPORT-M002, SUPPORT-M003 and SUPPORT-M-R001.
10
+ // Covers SUPPORT-INBOX-R001, SUPPORT-INBOX-R002 and SUPPORT-INBOX-S001.
11
+ return visibleTickets(tickets).map((ticket) => priorityBadge(ticket));
12
+ }
13
+
14
+ export function verifiesReplyDraftMock() {
15
+ // Covers SUPPORT-REPLY-R001 and SUPPORT-REPLY-S001.
16
+ return draftReply("Existing draft", "Updated draft");
17
+ }
@@ -0,0 +1,17 @@
1
+ export type Ticket = {
2
+ id: string;
3
+ title: string;
4
+ status: "open" | "closed";
5
+ priority: "low" | "normal" | "high";
6
+ createdAt: string;
7
+ };
8
+
9
+ export function visibleTickets(tickets: Ticket[]) {
10
+ return tickets
11
+ .filter((ticket) => ticket.status === "open")
12
+ .sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
13
+ }
14
+
15
+ export function draftReply(existingDraft: string, nextText: string) {
16
+ return nextText.trim() ? nextText : existingDraft;
17
+ }
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="540" viewBox="0 0 960 540" role="img" aria-label="Inbox before priority badges">
2
+ <rect width="960" height="540" fill="#f6f8fa"/>
3
+ <rect x="72" y="64" width="816" height="412" rx="24" fill="white" stroke="#d0d7de"/>
4
+ <rect x="112" y="112" width="736" height="72" rx="14" fill="#fff8c5" stroke="#d4a72c"/>
5
+ <text x="144" y="158" font-family="system-ui, sans-serif" font-size="28" font-weight="700" fill="#1f2328">Inbox before priority badges</text>
6
+ <rect x="112" y="224" width="520" height="44" rx="10" fill="#f6f8fa"/>
7
+ <rect x="112" y="292" width="660" height="44" rx="10" fill="#f6f8fa"/>
8
+ <rect x="112" y="360" width="420" height="44" rx="10" fill="#f6f8fa"/>
9
+ <circle cx="812" cy="384" r="34" fill="#fff8c5" stroke="#d4a72c"/>
10
+ </svg>
@@ -0,0 +1,11 @@
1
+ {
2
+ "screenshots": [
3
+ {
4
+ "specPath": "src/mocks/previous/specs/ticket-inbox.feature.md",
5
+ "line": 27,
6
+ "path": "screenshots/SUPPORT-INBOX-S001-line-27-previous.svg",
7
+ "title": "Inbox before priority badges",
8
+ "testPath": "src/mocks/previous/tests/supportDesk.spec.ts"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: SUPPORT
3
+ title: Support desk
4
+ status: active
5
+ ---
6
+
7
+ # Support desk
8
+
9
+ ## Purpose
10
+
11
+ Define the shared vocabulary for a small customer support workflow.
12
+
13
+ ## Model
14
+
15
+ ### SUPPORT-M001: Ticket
16
+
17
+ A customer request that needs a response from an agent.
18
+
19
+ ### SUPPORT-M002: Agent
20
+
21
+ A team member who reviews tickets and sends replies.
22
+
23
+ ### SUPPORT-M003: Priority
24
+
25
+ An internal urgency label.
26
+
27
+ ## Rules
28
+
29
+ - SUPPORT-M-R001: Tickets MUST keep a stable public reference.
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: SUPPORT-INBOX
3
+ title: Ticket inbox
4
+ status: active
5
+ model: SUPPORT
6
+ test: playwright
7
+ screenshots: optional
8
+ ---
9
+
10
+ # Ticket inbox
11
+
12
+ ## Purpose
13
+
14
+ Let agents find the next ticket to work on without losing context.
15
+
16
+ ## Rules
17
+
18
+ - SUPPORT-INBOX-R001: The inbox MUST show open tickets first.
19
+
20
+ ## Scenarios
21
+
22
+ ### SUPPORT-INBOX-S001: Agent reviews the queue
23
+
24
+ Given an agent has open tickets
25
+ When they open the inbox
26
+ Then open tickets are listed by age
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: SUPPORT-REPLY
3
+ title: Ticket replies
4
+ status: draft
5
+ model: SUPPORT
6
+ test: playwright
7
+ screenshots: optional
8
+ ---
9
+
10
+ # Ticket replies
11
+
12
+ ## Purpose
13
+
14
+ Help agents answer a customer without leaving the ticket.
15
+
16
+ ## Rules
17
+
18
+ - SUPPORT-REPLY-R001: The reply composer MUST preserve unsent text.
19
+
20
+ ## Scenarios
21
+
22
+ ### SUPPORT-REPLY-S001: Agent drafts a reply
23
+
24
+ Given an agent has selected a ticket
25
+ When they write a reply
26
+ Then the draft remains visible
@@ -0,0 +1,17 @@
1
+ import { draftReply, visibleTickets } from "../app/supportDesk.js";
2
+
3
+ const tickets = [
4
+ { id: "T-2", title: "Newer", status: "open" as const, priority: "high" as const, createdAt: "2026-01-02T10:00:00Z" },
5
+ { id: "T-1", title: "Older", status: "open" as const, priority: "normal" as const, createdAt: "2026-01-01T10:00:00Z" },
6
+ ];
7
+
8
+ export function verifiesTicketInboxMock() {
9
+ // Covers SUPPORT-M001, SUPPORT-M002, SUPPORT-M003 and SUPPORT-M-R001.
10
+ // Covers SUPPORT-INBOX-R001 and SUPPORT-INBOX-S001.
11
+ return visibleTickets(tickets);
12
+ }
13
+
14
+ export function verifiesReplyDraftMock() {
15
+ // Covers SUPPORT-REPLY-R001 and SUPPORT-REPLY-S001.
16
+ return draftReply("Existing draft", "Updated draft");
17
+ }