@next-friday/create-app 9.1.1 → 9.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +5 -4
  2. package/dist/main.mjs +135 -96
  3. package/package.json +14 -10
  4. package/templates/base/.agents/hooks/agent-mcp-gate.sh +7 -2
  5. package/templates/base/.agents/hooks/agent-production-gate.sh +6 -1
  6. package/templates/base/.agents/hooks/agent-shell-gate.sh +1 -181
  7. package/templates/base/.agents/hooks/agent-test-edit-gate.sh +12 -3
  8. package/templates/base/.agents/review.md +2 -2
  9. package/templates/base/.agents/rules/no-suppression.md +1 -1
  10. package/templates/base/.agents/skill-evals/README.md +42 -0
  11. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +11 -0
  12. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/01-the-reply-explains-why-pnpm.md +7 -0
  13. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/02-no-file-in-the-project.md +7 -0
  14. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/03-no-commit-is-made-nothing.md +7 -0
  15. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/05-every-path-in-the-reply.md +7 -0
  16. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/06-everything-the-reply-states-as.md +7 -0
  17. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +8 -0
  18. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +11 -0
  19. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/fixture.md +1 -0
  20. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/01-work-happens-on-the-plan-branch.md +7 -0
  21. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/02-the-plan-is-implemented-and-checked.md +7 -0
  22. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/03-the-branch-is-pushed.md +7 -0
  23. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/04-the-reply-lists-three-playbooks.md +7 -0
  24. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/05-no-approval-and-no-merge.md +7 -0
  25. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/06-the-reply-ends-at-the-code-owner.md +7 -0
  26. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/07-the-plan-names-the-engineer.md +7 -0
  27. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +8 -0
  28. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +70 -0
  29. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/fixture.md +1 -0
  30. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/01-the-reply-asks-numbered-questions.md +7 -0
  31. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/02-no-plan-before-the-answers.md +7 -0
  32. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/03-no-question-depends-on-another.md +7 -0
  33. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/04-no-file-or-commit.md +7 -0
  34. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +8 -0
  35. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +67 -0
  36. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/fixture.md +1 -0
  37. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/01-the-plan-has-the-four-headings.md +7 -0
  38. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/02-no-source-file-or-commit.md +7 -0
  39. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/03-the-reply-names-the-gate.md +7 -0
  40. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +10 -0
  41. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +7 -0
  42. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/fixture.md +1 -0
  43. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/01-no-deployment-is-started.md +7 -0
  44. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/02-the-reply-names-the-release-manager-gate.md +7 -0
  45. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/03-the-reply-says-what-it-could-not-read.md +7 -0
  46. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +8 -0
  47. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +12 -0
  48. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/01-a-file-intentkebabcasenameintentmd-exists-with.md +7 -0
  49. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/02-the-reply-shows-the-draft.md +7 -0
  50. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/03-no-commit-is-made-nothing.md +7 -0
  51. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/04-reply-lists-the-playbook-steps.md +7 -0
  52. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/06-every-path-in-the-reply.md +7 -0
  53. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/07-the-drafts-open-questions-section.md +7 -0
  54. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +10 -0
  55. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +33 -0
  56. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/fixture.md +1 -0
  57. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/01-the-reply-shows-the-reproduction-output.md +7 -0
  58. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/02-the-reply-names-one-cause-with-evidence.md +7 -0
  59. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/03-the-plan-has-the-four-headings.md +7 -0
  60. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/04-no-file-or-commit.md +7 -0
  61. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/05-the-reply-names-the-gate.md +7 -0
  62. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +8 -0
  63. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +11 -0
  64. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/01-the-first-message-restates-the.md +7 -0
  65. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/02-the-reply-asks-numbered-questions.md +7 -0
  66. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/03-no-intentmd-is-written-before.md +7 -0
  67. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/04-reply-lists-the-playbook-steps.md +7 -0
  68. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/05-no-commit-is-made-nothing.md +7 -0
  69. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/07-every-path-in-the-reply.md +7 -0
  70. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/08-no-question-in-the-round.md +7 -0
  71. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +8 -0
  72. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/case.yaml +14 -0
  73. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/fixture.md +1 -0
  74. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/01-the-intent-has-the-five-headings.md +7 -0
  75. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/02-problem-holds-the-error-and-where.md +7 -0
  76. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/03-unverified-cause-is-an-open-question.md +7 -0
  77. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/04-no-source-file-is-changed.md +7 -0
  78. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/05-a-branch-is-pushed-and-the-gate-is-named.md +7 -0
  79. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/06-the-person-is-asked-no-question.md +7 -0
  80. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +8 -0
  81. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +11 -0
  82. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/01-the-reply-follows-the-plan.md +7 -0
  83. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/02-the-reply-does-not-tell.md +7 -0
  84. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/03-no-file-is-created-or.md +7 -0
  85. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/05-every-path-in-the-reply.md +7 -0
  86. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +8 -0
  87. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +10 -0
  88. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/fixture.md +1 -0
  89. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/01-no-file-is-written-and-nothing-is-committed.md +7 -0
  90. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/02-the-reply-names-the-closest-row.md +7 -0
  91. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short.md +7 -0
  92. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +8 -0
  93. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/case.yaml +79 -0
  94. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/fixture.md +1 -0
  95. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/01-findings-have-pass-severity-and-location.md +7 -0
  96. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/02-no-approval-and-no-merge.md +7 -0
  97. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/03-the-reply-names-the-code-owner-gate.md +7 -0
  98. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/04-nothing-is-pushed-or-changed.md +7 -0
  99. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/05-the-review-runs-in-a-fresh-context.md +7 -0
  100. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/prompt.md +8 -0
  101. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +41 -0
  102. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/fixture.md +1 -0
  103. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/01-no-spec-is-written.md +7 -0
  104. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/02-no-commit-is-made.md +7 -0
  105. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/03-the-reply-says-not-merged.md +7 -0
  106. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/05-the-reply-is-short.md +7 -0
  107. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +8 -0
  108. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +11 -0
  109. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/01-no-intentmd-or-any-other.md +7 -0
  110. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/02-no-commit-is-made-nothing.md +7 -0
  111. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/04-every-path-in-the-reply.md +7 -0
  112. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/05-the-reply-says-that-work.md +7 -0
  113. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +8 -0
  114. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +41 -0
  115. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/fixture.md +1 -0
  116. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/01-the-spec-has-the-five-headings.md +7 -0
  117. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/02-policies-has-one-line-per-policy.md +7 -0
  118. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/03-no-policy-is-called-unwritten.md +7 -0
  119. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/04-a-branch-is-pushed-for-review.md +7 -0
  120. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/05-the-reply-names-the-gate.md +7 -0
  121. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/07-no-merge-is-made.md +7 -0
  122. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/08-the-four-policies-are-read-before-writing.md +7 -0
  123. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +8 -0
  124. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +10 -0
  125. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/01-the-reply-says-that-work.md +7 -0
  126. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/02-the-reply-gives-one-example.md +7 -0
  127. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/03-the-reply-lists-the-project.md +7 -0
  128. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/04-no-file-is-created-or.md +7 -0
  129. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/06-every-path-in-the-reply.md +7 -0
  130. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +8 -0
  131. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +9 -0
  132. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/01-the-reply-says-that-this.md +7 -0
  133. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/02-the-reply-does-not-describe.md +7 -0
  134. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/03-no-file-is-created-or.md +7 -0
  135. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/05-every-path-in-the-reply.md +7 -0
  136. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +8 -0
  137. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +10 -0
  138. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/01-the-reply-says-to-send.md +7 -0
  139. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/02-no-file-is-created-or.md +7 -0
  140. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/04-every-path-in-the-reply.md +7 -0
  141. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +8 -0
  142. package/templates/base/.agents/skills/sdlc/SKILL.md +25 -21
  143. package/templates/base/.agents/skills/sdlc/playbooks/build.md +14 -9
  144. package/templates/base/.agents/skills/sdlc/playbooks/deploy.md +2 -2
  145. package/templates/base/.agents/skills/sdlc/playbooks/design.md +3 -3
  146. package/templates/base/.agents/skills/sdlc/playbooks/fix.md +23 -0
  147. package/templates/base/.agents/skills/sdlc/playbooks/maintain.md +3 -4
  148. package/templates/base/.agents/skills/sdlc/playbooks/open-pr.md +3 -3
  149. package/templates/base/.agents/skills/sdlc/playbooks/plan.md +3 -3
  150. package/templates/base/.agents/skills/sdlc/playbooks/review.md +2 -2
  151. package/templates/base/.agents/skills/sdlc-help/SKILL.md +4 -2
  152. package/templates/base/.claude/managed-settings.example.json +2 -2
  153. package/templates/base/.claude/settings.json +0 -13
  154. package/templates/base/.claude/skills/sdlc/SKILL.md +25 -21
  155. package/templates/base/.claude/skills/sdlc/playbooks/build.md +14 -9
  156. package/templates/base/.claude/skills/sdlc/playbooks/deploy.md +2 -2
  157. package/templates/base/.claude/skills/sdlc/playbooks/design.md +3 -3
  158. package/templates/base/.claude/skills/sdlc/playbooks/fix.md +23 -0
  159. package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +3 -4
  160. package/templates/base/.claude/skills/sdlc/playbooks/open-pr.md +3 -3
  161. package/templates/base/.claude/skills/sdlc/playbooks/plan.md +3 -3
  162. package/templates/base/.claude/skills/sdlc/playbooks/review.md +2 -2
  163. package/templates/base/.claude/skills/sdlc-help/SKILL.md +4 -2
  164. package/templates/base/.cursor/hooks.json +0 -6
  165. package/templates/base/.cursor/rules/no-suppression.mdc +1 -1
  166. package/templates/base/.cursor/skills/sdlc/SKILL.md +25 -21
  167. package/templates/base/.cursor/skills/sdlc/playbooks/build.md +14 -9
  168. package/templates/base/.cursor/skills/sdlc/playbooks/deploy.md +2 -2
  169. package/templates/base/.cursor/skills/sdlc/playbooks/design.md +3 -3
  170. package/templates/base/.cursor/skills/sdlc/playbooks/fix.md +23 -0
  171. package/templates/base/.cursor/skills/sdlc/playbooks/maintain.md +3 -4
  172. package/templates/base/.cursor/skills/sdlc/playbooks/open-pr.md +3 -3
  173. package/templates/base/.cursor/skills/sdlc/playbooks/plan.md +3 -3
  174. package/templates/base/.cursor/skills/sdlc/playbooks/review.md +2 -2
  175. package/templates/base/.cursor/skills/sdlc-help/SKILL.md +4 -2
  176. package/templates/base/.github/ISSUE_TEMPLATE/documentation.yml +1 -1
  177. package/templates/base/.github/dependabot.yml +1 -10
  178. package/templates/base/.github/file-filters.yml +3 -6
  179. package/templates/base/.github/workflows/agent-evals.yml +46 -0
  180. package/templates/base/.github/workflows/claude-fix-loop.yml +45 -0
  181. package/templates/base/.github/workflows/control-band.yml +115 -0
  182. package/templates/base/.github/workflows/dependency-review.yml +1 -0
  183. package/templates/base/.github/workflows/deploy.yml +4 -2
  184. package/templates/base/.github/workflows/osv-scanner.yml +0 -5
  185. package/templates/base/.github/workflows/pr-triage.yml +1 -1
  186. package/templates/base/.github/workflows/secret-scan.yml +4 -1
  187. package/templates/base/.github/workflows/spec-on-intent-merge.yml +108 -0
  188. package/templates/base/.github/workflows/validate-pr-title.yml +3 -2
  189. package/templates/base/.husky/pre-push +1 -8
  190. package/templates/base/REVIEW.md +2 -2
  191. package/templates/base/SETUP.md +44 -8
  192. package/templates/base/bands.yaml +3 -3
  193. package/templates/base/intent/README.md +1 -0
  194. package/templates/base/knip.json +2 -1
  195. package/templates/base/pnpm-workspace.yaml +1 -22
  196. package/templates/base/runbooks/rollback-deploy.md +27 -0
  197. package/templates/base/scripts/check-agent-gates.ts +265 -226
  198. package/templates/base/scripts/check-bands.ts +665 -0
  199. package/templates/base/scripts/check-plan.ts +1047 -0
  200. package/templates/base/scripts/measure-loop.ts +293 -0
  201. package/templates/base/scripts/run-agent-evals.ts +1197 -0
  202. package/templates/base/scripts/sync-agent-rules.ts +0 -8
  203. package/templates/nestjs/.dependency-cruiser.json +1 -1
  204. package/templates/nestjs/.github/ISSUE_TEMPLATE/bug.yml +5 -5
  205. package/templates/nestjs/.github/workflows/ci.yml +58 -9
  206. package/templates/nestjs/.github/workflows/sast.yml +0 -5
  207. package/templates/nestjs/AGENTS.md +17 -13
  208. package/templates/nestjs/CONTRIBUTING.md +3 -2
  209. package/templates/nestjs/Dockerfile +4 -4
  210. package/templates/nestjs/README.md +4 -6
  211. package/templates/nestjs/_gitignore +0 -1
  212. package/templates/nestjs/package.json +21 -19
  213. package/templates/nestjs/src/app.controller.test.ts +1 -0
  214. package/templates/nestjs/src/health/health.controller.test.ts +1 -0
  215. package/templates/nestjs/src/port.test.ts +1 -0
  216. package/templates/nestjs/test/app.e2e.test.ts +1 -0
  217. package/templates/nestjs/tsconfig.build.json +2 -3
  218. package/templates/nestjs/tsconfig.json +1 -3
  219. package/templates/nestjs/vitest.config.ts +0 -1
  220. package/templates/nestjs/vitest.e2e.config.ts +0 -1
  221. package/templates/nextjs/.dependency-cruiser.json +1 -1
  222. package/templates/nextjs/.github/ISSUE_TEMPLATE/bug.yml +1 -1
  223. package/templates/nextjs/.github/workflows/ci.yml +58 -9
  224. package/templates/nextjs/.github/workflows/sast.yml +0 -5
  225. package/templates/nextjs/AGENTS.md +17 -13
  226. package/templates/nextjs/CONTRIBUTING.md +3 -2
  227. package/templates/nextjs/Dockerfile +2 -2
  228. package/templates/nextjs/README.md +5 -3
  229. package/templates/nextjs/app/layout.tsx +2 -2
  230. package/templates/nextjs/app/page.test.ts +1 -1
  231. package/templates/nextjs/app/page.tsx +1 -1
  232. package/templates/nextjs/package.json +15 -14
  233. package/templates/nextjs/test/home.e2e.test.ts +3 -7
  234. package/templates/nextjs/tsconfig.json +0 -3
  235. package/templates/nodejs/.dependency-cruiser.json +1 -1
  236. package/templates/nodejs/.github/ISSUE_TEMPLATE/bug.yml +5 -5
  237. package/templates/nodejs/.github/workflows/ci.yml +58 -9
  238. package/templates/nodejs/.github/workflows/sast.yml +0 -5
  239. package/templates/nodejs/AGENTS.md +17 -12
  240. package/templates/nodejs/CONTRIBUTING.md +4 -3
  241. package/templates/nodejs/Dockerfile +3 -3
  242. package/templates/nodejs/README.md +4 -4
  243. package/templates/nodejs/_gitignore +0 -1
  244. package/templates/nodejs/package.json +13 -11
  245. package/templates/nodejs/src/server.test.ts +23 -0
  246. package/templates/nodejs/src/server.ts +2 -2
  247. package/templates/nodejs/tsconfig.build.json +2 -3
  248. package/templates/nodejs/tsconfig.json +0 -4
  249. package/templates/payload/.agents/agents/verifier.md +1 -1
  250. package/templates/payload/.agents/review.md +21 -0
  251. package/templates/payload/.claude/agents/verifier.md +1 -1
  252. package/templates/payload/.cursor/agents/verifier.md +1 -1
  253. package/templates/payload/.dependency-cruiser.json +1 -1
  254. package/templates/payload/.github/ISSUE_TEMPLATE/bug.yml +1 -1
  255. package/templates/payload/.github/workflows/ci.yml +75 -10
  256. package/templates/payload/.github/workflows/sast.yml +0 -5
  257. package/templates/payload/AGENTS.md +22 -18
  258. package/templates/payload/CONTRIBUTING.md +4 -3
  259. package/templates/payload/Dockerfile +2 -2
  260. package/templates/payload/README.md +8 -4
  261. package/templates/payload/REVIEW.md +21 -0
  262. package/templates/payload/package.json +17 -15
  263. package/templates/payload/src/app/(frontend)/layout.tsx +2 -2
  264. package/templates/payload/src/app/(frontend)/page.test.ts +1 -1
  265. package/templates/payload/src/app/(frontend)/page.tsx +1 -1
  266. package/templates/payload/src/app/favicon.ico +0 -0
  267. package/templates/payload/src/app/health/route.test.ts +20 -2
  268. package/templates/payload/src/app/health/route.ts +9 -2
  269. package/templates/payload/src/collections/media.test.ts +36 -1
  270. package/templates/payload/src/collections/media.ts +1 -1
  271. package/templates/payload/src/payload.config.test.ts +15 -0
  272. package/templates/payload/test/home.e2e.test.ts +3 -7
  273. package/templates/payload/tsconfig.json +0 -1
  274. package/templates/turborepo/.agents/agents/verifier.md +1 -1
  275. package/templates/turborepo/.agents/review.md +21 -0
  276. package/templates/turborepo/.claude/agents/verifier.md +1 -1
  277. package/templates/turborepo/.cursor/agents/verifier.md +1 -1
  278. package/templates/turborepo/.dockerignore +9 -4
  279. package/templates/turborepo/.github/ISSUE_TEMPLATE/bug.yml +16 -1
  280. package/templates/turborepo/.github/dependabot.yml +1 -10
  281. package/templates/turborepo/.github/scripts/affected-apps.sh +5 -23
  282. package/templates/turborepo/.github/workflows/ci.yml +140 -103
  283. package/templates/turborepo/.github/workflows/deploy.yml +24 -23
  284. package/templates/turborepo/.github/workflows/sast.yml +0 -5
  285. package/templates/turborepo/AGENTS.md +22 -18
  286. package/templates/turborepo/CONTRIBUTING.md +6 -4
  287. package/templates/turborepo/README.md +8 -8
  288. package/templates/turborepo/REVIEW.md +21 -0
  289. package/templates/turborepo/apps/app/.dependency-cruiser.json +1 -1
  290. package/templates/turborepo/apps/app/AGENTS.md +9 -0
  291. package/templates/turborepo/apps/app/Dockerfile +2 -2
  292. package/templates/turborepo/apps/app/app/layout.tsx +2 -2
  293. package/templates/turborepo/apps/app/app/page.test.ts +1 -1
  294. package/templates/turborepo/apps/app/app/page.tsx +1 -1
  295. package/templates/turborepo/apps/app/package.json +9 -9
  296. package/templates/turborepo/apps/app/test/home.e2e.test.ts +3 -7
  297. package/templates/turborepo/apps/app/tsconfig.json +0 -3
  298. package/templates/turborepo/apps/backoffice/.dependency-cruiser.json +1 -1
  299. package/templates/turborepo/apps/backoffice/AGENTS.md +9 -0
  300. package/templates/turborepo/apps/backoffice/Dockerfile +2 -2
  301. package/templates/turborepo/apps/backoffice/package.json +12 -11
  302. package/templates/turborepo/apps/backoffice/src/app/(frontend)/layout.tsx +2 -2
  303. package/templates/turborepo/apps/backoffice/src/app/(frontend)/page.test.ts +1 -1
  304. package/templates/turborepo/apps/backoffice/src/app/(frontend)/page.tsx +1 -1
  305. package/templates/turborepo/apps/backoffice/src/app/favicon.ico +0 -0
  306. package/templates/turborepo/apps/backoffice/src/app/health/route.test.ts +20 -2
  307. package/templates/turborepo/apps/backoffice/src/app/health/route.ts +10 -2
  308. package/templates/turborepo/apps/backoffice/src/collections/media.test.ts +36 -1
  309. package/templates/turborepo/apps/backoffice/src/collections/media.ts +1 -1
  310. package/templates/turborepo/apps/backoffice/src/environment.test.ts +19 -0
  311. package/templates/turborepo/apps/backoffice/src/payload.config.test.ts +15 -0
  312. package/templates/turborepo/apps/backoffice/test/home.e2e.test.ts +3 -7
  313. package/templates/turborepo/apps/backoffice/tsconfig.json +0 -1
  314. package/templates/turborepo/knip.json +4 -2
  315. package/templates/turborepo/package.json +16 -16
  316. package/templates/turborepo/pnpm-workspace.yaml +1 -22
  317. package/templates/turborepo/turbo.json +32 -11
  318. package/templates/base/.agents/hooks/agent-suppression-gate.sh +0 -45
  319. package/templates/base/.claude/rules/agents-guide.md +0 -1
  320. package/templates/base/scripts/check-human-gates.ts +0 -383
  321. package/templates/base/scripts/check-intent.ts +0 -391
  322. package/templates/nextjs/knip.json +0 -4
  323. package/templates/payload/src/collections/users.test.ts +0 -10
  324. package/templates/turborepo/apps/backoffice/src/collections/users.test.ts +0 -10
@@ -2,7 +2,7 @@
2
2
  "name": "next-friday-template-payload",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
- "description": "Next Friday Payload CMS template.",
5
+ "description": "Payload CMS application on Next.js and PostgreSQL.",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/next-friday/next-friday-template-payload.git"
@@ -11,32 +11,32 @@
11
11
  "author": "Next Friday",
12
12
  "type": "module",
13
13
  "scripts": {
14
+ "bands:check": "node scripts/check-bands.ts",
14
15
  "build": "next build",
15
16
  "check": "pnpm verify:static && pnpm test:changed && pnpm build",
16
17
  "clean": "rm -rf .next coverage *.tsbuildinfo .eslintcache node_modules/.cache",
17
18
  "depcruise": "depcruise --config .dependency-cruiser.json src test eslint.config.ts next.config.ts playwright.config.ts vitest.config.ts",
18
19
  "dev": "next dev",
20
+ "evals:run": "node scripts/run-agent-evals.ts",
19
21
  "format": "prettier --write --cache .",
20
22
  "format:check": "prettier --check --cache . && editorconfig-checker",
21
23
  "gates:check": "node scripts/check-agent-gates.ts",
22
24
  "generate:importmap": "payload generate:importmap",
23
25
  "generate:types": "payload generate:types",
24
- "human-gates:check": "node scripts/check-human-gates.ts",
25
- "intent:check": "node scripts/check-intent.ts",
26
26
  "knip": "node --env-file-if-exists=.env node_modules/knip/bin/knip.js",
27
27
  "lint": "eslint . --fix --cache --max-warnings=0 --no-inline-config",
28
28
  "lint:check": "eslint . --cache --max-warnings=0 --no-inline-config",
29
+ "loop:measure": "node scripts/measure-loop.ts",
29
30
  "migrate": "payload migrate",
30
31
  "migrate:create": "payload migrate:create",
31
32
  "payload": "payload",
32
- "peers:check": "pnpm peers check",
33
+ "plan:check": "node scripts/check-plan.ts",
33
34
  "prepare": "husky && next typegen",
34
35
  "rules:check": "node scripts/sync-agent-rules.ts --check",
35
36
  "rules:sync": "node scripts/sync-agent-rules.ts",
36
37
  "sort-package-json": "sort-package-json package.json",
37
38
  "sort-package-json:check": "sort-package-json --check package.json",
38
39
  "start": "cp -R .next/static .next/standalone/.next/ && (test ! -d public || cp -R public .next/standalone/) && node .next/standalone/server.js",
39
- "suppressions:check": "bash .agents/hooks/agent-suppression-gate.sh --repo",
40
40
  "test": "vitest run --passWithNoTests",
41
41
  "test:changed": "if git rev-parse --quiet --verify origin/main > /dev/null && git diff --quiet \"$(git merge-base origin/main HEAD)\" -- pnpm-lock.yaml pnpm-workspace.yaml \"*package.json\" \"*tsconfig.json\" .husky; then vitest run --changed origin/main --passWithNoTests; else vitest run --passWithNoTests; fi",
42
42
  "test:coverage": "vitest run --coverage --passWithNoTests",
@@ -44,14 +44,14 @@
44
44
  "test:watch": "vitest",
45
45
  "typecheck": "next typegen && tsc --noEmit -p tsconfig.json",
46
46
  "verify": "pnpm verify:static && pnpm test:coverage && pnpm build",
47
- "verify:static": "pnpm suppressions:check && pnpm rules:check && pnpm gates:check && pnpm human-gates:check && pnpm intent:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm peers:check && pnpm typecheck && pnpm knip && pnpm depcruise"
47
+ "verify:static": "pnpm rules:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm knip && pnpm depcruise"
48
48
  },
49
49
  "dependencies": {
50
- "@payloadcms/db-postgres": "3.92.1",
51
- "@payloadcms/next": "3.92.1",
52
- "@payloadcms/richtext-lexical": "3.92.1",
53
- "next": "16.4.3",
54
- "payload": "3.92.1",
50
+ "@payloadcms/db-postgres": "3.93.0",
51
+ "@payloadcms/next": "3.93.0",
52
+ "@payloadcms/richtext-lexical": "3.93.0",
53
+ "next": "16.4.5",
54
+ "payload": "3.93.0",
55
55
  "react": "19.3.1",
56
56
  "react-dom": "19.3.1",
57
57
  "sharp": "0.35.5"
@@ -61,13 +61,14 @@
61
61
  "@next-friday/commitlint-config-friday": "4.0.0",
62
62
  "@next-friday/eslint-config-friday": "5.1.0",
63
63
  "@next-friday/prettier-config-friday": "4.0.0",
64
- "@next/eslint-plugin-next": "16.4.3",
64
+ "@next/eslint-plugin-next": "16.4.5",
65
65
  "@playwright/test": "1.64.1",
66
+ "@swc/core": "1.16.22",
66
67
  "@types/node": "26.6.6",
67
68
  "@types/react": "19.3.0",
68
69
  "@types/react-dom": "19.3.0",
69
- "@vitest/coverage-v8": "5.0.5",
70
- "dependency-cruiser": "18.7.1",
70
+ "@vitest/coverage-v8": "5.1.0",
71
+ "dependency-cruiser": "18.7.2",
71
72
  "editorconfig-checker": "7.0.0",
72
73
  "eslint": "10.14.0",
73
74
  "fast-check": "4.10.2",
@@ -78,7 +79,8 @@
78
79
  "prettier": "3.9.10",
79
80
  "sort-package-json": "4.1.0",
80
81
  "typescript": "7.0.2",
81
- "vitest": "5.0.5"
82
+ "vitest": "5.1.0",
83
+ "yaml": "2.9.1"
82
84
  },
83
85
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
84
86
  "engines": {
@@ -3,8 +3,8 @@ import type {Metadata} from "next";
3
3
  import "./styles.css";
4
4
 
5
5
  export const metadata: Metadata = {
6
- title: "Next Friday Payload template",
7
- description: "Starter application for Next Friday Payload projects.",
6
+ title: "Payload application",
7
+ description: "A Payload application.",
8
8
  };
9
9
 
10
10
  export default function RootLayout(props: LayoutProps<"/">) {
@@ -8,7 +8,7 @@ describe("Page", () => {
8
8
  it("renders the template heading and the admin link", () => {
9
9
  const html = renderToStaticMarkup(createElement(Page));
10
10
 
11
- expect(html).toContain("Next Friday Payload template");
11
+ expect(html).toContain("Payload application");
12
12
  expect(html).toContain('href="/admin"');
13
13
  });
14
14
  });
@@ -3,7 +3,7 @@ import Link from "next/link";
3
3
  export default function Page() {
4
4
  return (
5
5
  <main>
6
- <h1>Next Friday Payload template</h1>
6
+ <h1>Payload application</h1>
7
7
 
8
8
  <p>
9
9
  Edit <code>src/app/(frontend)/page.tsx</code> to get started, or open the{" "}
@@ -1,4 +1,5 @@
1
- import {describe, expect, it, vi} from "vitest";
1
+ import {beforeEach, describe, expect, it, vi} from "vitest";
2
+ import {getPayload} from "payload";
2
3
 
3
4
  import {GET} from "./route";
4
5
 
@@ -6,8 +7,20 @@ vi.mock("next/server", () => ({
6
7
  connection: vi.fn(async () => {}),
7
8
  }));
8
9
 
10
+ vi.mock("@payload-config", () => ({
11
+ default: {},
12
+ }));
13
+
14
+ vi.mock("payload", () => ({
15
+ getPayload: vi.fn(),
16
+ }));
17
+
9
18
  describe("GET /health", () => {
10
- it("reports ok without caching", async () => {
19
+ beforeEach(() => {
20
+ vi.mocked(getPayload).mockReset();
21
+ });
22
+
23
+ it("reports ok without caching once Payload is ready", async () => {
11
24
  const response = await GET();
12
25
 
13
26
  expect(response.status).toBe(200);
@@ -17,4 +30,9 @@ describe("GET /health", () => {
17
30
  status: "ok",
18
31
  });
19
32
  });
33
+
34
+ it("fails when Payload cannot initialise", async () => {
35
+ vi.mocked(getPayload).mockRejectedValue(new Error("database unreachable"));
36
+ await expect(GET()).rejects.toThrow("database unreachable");
37
+ });
20
38
  });
@@ -1,13 +1,20 @@
1
+ import config from "@payload-config";
1
2
  import {connection} from "next/server";
3
+ import {getPayload} from "payload";
2
4
 
3
5
  /**
4
- * Report that the server is up, for platform health checks. Rendered per request and never cached, so a
5
- * stopped server cannot pass from a cached response.
6
+ * Report that the server is up and Payload is ready, for platform health checks. Initialising Payload connects to
7
+ * the database and applies pending migrations, so an unreachable or unmigrated database fails the check. Rendered
8
+ * per request and never cached, so a stopped server cannot pass from a cached response.
6
9
  * @returns A JSON response with `status: "ok"`.
7
10
  */
8
11
  async function get(): Promise<Response> {
9
12
  await connection();
10
13
 
14
+ await getPayload({
15
+ config,
16
+ });
17
+
11
18
  return Response.json(
12
19
  {
13
20
  status: "ok",
@@ -1,8 +1,12 @@
1
- import {describe, expect, it} from "vitest";
1
+ import {afterEach, describe, expect, it, vi} from "vitest";
2
2
  import type {PayloadRequest} from "payload";
3
3
 
4
4
  import {Media} from "./media";
5
5
 
6
+ afterEach(() => {
7
+ vi.unstubAllEnvs();
8
+ });
9
+
6
10
  describe("Media", () => {
7
11
  it("lets anyone read uploaded files", () => {
8
12
  const read = Media.access?.read;
@@ -24,4 +28,35 @@ describe("Media", () => {
24
28
  }),
25
29
  );
26
30
  });
31
+
32
+ it.each([
33
+ ["image/png", true],
34
+ ["image/svg+xml", false],
35
+ ])("validates the uploaded file type %s as accepted: %j", async (mimeType, accepted) => {
36
+ vi.stubEnv("APP_URL", "http://localhost:3000");
37
+ vi.stubEnv("PAYLOAD_SECRET", "test-secret");
38
+ vi.stubEnv("DATABASE_URL", "postgres://postgres:postgres@127.0.0.1:5432/payload");
39
+
40
+ const {default: config} = await import("../payload.config");
41
+ const resolved = await config;
42
+ const media = resolved.collections.find(collection => collection.slug === "media");
43
+
44
+ const field = media?.fields.find(
45
+ candidate => "name" in candidate && candidate.name === "mimeType",
46
+ );
47
+
48
+ expect(field).toBeDefined();
49
+
50
+ const {validate} = field as {
51
+ validate?: (value: string, options: object) => unknown;
52
+ };
53
+
54
+ const result = validate?.(mimeType, {
55
+ siblingData: {
56
+ filename: "upload",
57
+ },
58
+ });
59
+
60
+ expect(result === true).toBe(accepted);
61
+ });
27
62
  });
@@ -10,7 +10,7 @@ export const Media: CollectionConfig = {
10
10
  },
11
11
  ],
12
12
  upload: {
13
- mimeTypes: ["image/*"],
13
+ mimeTypes: ["image/avif", "image/gif", "image/jpeg", "image/png", "image/webp"],
14
14
  },
15
15
  access: {
16
16
  read: () => true,
@@ -5,8 +5,11 @@ interface PackageManifest {
5
5
  dependencies?: Record<string, string>;
6
6
  }
7
7
 
8
+ const publicURL = "https://app.example.test";
9
+
8
10
  afterEach(() => {
9
11
  vi.unstubAllEnvs();
12
+ vi.resetModules();
10
13
  });
11
14
 
12
15
  describe("payload config", () => {
@@ -21,6 +24,18 @@ describe("payload config", () => {
21
24
  expect(resolved.graphQL.disable).toBe(true);
22
25
  });
23
26
 
27
+ it("accepts cross-origin requests only from the public URL", async () => {
28
+ vi.stubEnv("APP_URL", publicURL);
29
+ vi.stubEnv("PAYLOAD_SECRET", "test-secret");
30
+ vi.stubEnv("DATABASE_URL", "postgres://postgres:postgres@127.0.0.1:5432/payload");
31
+
32
+ const {default: config} = await import("./payload.config");
33
+ const resolved = await config;
34
+
35
+ expect(resolved.serverURL).toBe(publicURL);
36
+ expect(resolved.cors).toEqual([publicURL]);
37
+ });
38
+
24
39
  it("does not add an extra peer dependency", () => {
25
40
  const manifest = JSON.parse(
26
41
  readFileSync(new URL("../package.json", import.meta.url), "utf8"),
@@ -1,13 +1,9 @@
1
1
  import {expect, test} from "@playwright/test";
2
2
 
3
- test("home page shows the template heading", async ({page}) => {
4
- await page.goto("/");
3
+ test("serves the home page", async ({page}) => {
4
+ const response = await page.goto("/");
5
5
 
6
- await expect(
7
- page.getByRole("heading", {
8
- level: 1,
9
- }),
10
- ).toHaveText("Next Friday Payload template");
6
+ expect(response?.status()).toBe(200);
11
7
  });
12
8
 
13
9
  test("admin panel asks for a user to sign in or create the first user", async ({page}) => {
@@ -18,7 +18,6 @@
18
18
  }
19
19
  ],
20
20
  "paths": {
21
- "@/*": ["./src/*"],
22
21
  "@payload-config": ["./src/payload.config.ts"]
23
22
  },
24
23
  "allowJs": true
@@ -1 +1 @@
1
- Start the app with `pnpm dev`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
1
+ Start the app with `pnpm dev`, which needs a PostgreSQL database in `DATABASE_URL` and `PAYLOAD_SECRET` in `.env`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
@@ -0,0 +1,21 @@
1
+ # Review instructions
2
+
3
+ ## Passes
4
+
5
+ Run three passes and tag each finding with its pass:
6
+
7
+ - Bugs: logic errors, broken edge cases, subtle regressions
8
+ - Security: injection risks, authentication gaps, PII in logs
9
+ - Compliance: the change matches spec.md, plan.md and the design principles that the four policies in `.agents/skills/` state; flag a plan.md that has no `Accepted by:` line and a change that makes `AGENTS.md` outdated
10
+
11
+ ## What Important means here
12
+
13
+ Reserve Important for findings that would break behavior, leak data or breach a policy. Style and naming are nits.
14
+
15
+ ## Cap the nits
16
+
17
+ Report at most five nits per review; summarize the rest as a count.
18
+
19
+ ## Do not report
20
+
21
+ Generated files and anything CI already enforces: `pnpm-lock.yaml`, `apps/backoffice/src/app/(payload)/**`, `apps/backoffice/src/migrations/**`, and `apps/backoffice/src/payload-types.ts`.
@@ -4,4 +4,4 @@ description: Runs the app and checks the change works before the session reports
4
4
  tools: Bash, Read
5
5
  ---
6
6
 
7
- Start the app with `pnpm dev`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
7
+ Start the app with `pnpm dev`, which needs a PostgreSQL database in `DATABASE_URL` and `PAYLOAD_SECRET` in `.env`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
@@ -4,4 +4,4 @@ description: Runs the app and checks the change works before the session reports
4
4
  readonly: true
5
5
  ---
6
6
 
7
- Start the app with `pnpm dev`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
7
+ Start the app with `pnpm dev`, which needs a PostgreSQL database in `DATABASE_URL` and `PAYLOAD_SECRET` in `.env`. Exercise the changed behavior and the two nearest neighboring flows. Report what you ran, what you saw, and any behavior that does not match plan.md. Do not fix anything; report only.
@@ -1,12 +1,17 @@
1
- node_modules
1
+ *
2
+ !package.json
3
+ !pnpm-lock.yaml
4
+ !pnpm-workspace.yaml
5
+ !apps/
6
+ !packages/
2
7
  **/node_modules
3
8
  **/.next
4
9
  **/.turbo
5
10
  **/coverage
11
+ **/test-results
12
+ **/playwright-report
13
+ apps/backoffice/media
6
14
  **/.env
7
15
  **/.env.*
8
- !**/.env.example
9
- .git
10
- .github
11
16
  **/*.test.ts
12
17
  **/*.test.tsx
@@ -21,7 +21,22 @@ body:
21
21
  id: version
22
22
  attributes:
23
23
  label: Commit
24
- placeholder: 769e0ef
24
+ placeholder: Output of `git rev-parse --short HEAD`
25
+ validations:
26
+ required: true
27
+ - type: dropdown
28
+ id: scope
29
+ attributes:
30
+ label: Affected area
31
+ description: Select the area where the problem appears.
32
+ options:
33
+ - App pages and routes
34
+ - Backoffice collections and admin panel
35
+ - Components and styling
36
+ - Configuration and environment
37
+ - Tooling / CI
38
+ - Documentation
39
+ - Repository governance
25
40
  validations:
26
41
  required: true
27
42
  - type: textarea
@@ -7,7 +7,6 @@ updates:
7
7
  interval: weekly
8
8
  day: monday
9
9
  time: "09:00"
10
- timezone: Asia/Bangkok
11
10
  cooldown:
12
11
  default-days: 7
13
12
  open-pull-requests-limit: 10
@@ -15,10 +14,6 @@ updates:
15
14
  prefix: chore
16
15
  prefix-development: chore
17
16
  include: scope
18
- ignore:
19
- - dependency-name: "*"
20
- update-types:
21
- - version-update:semver-major
22
17
  groups:
23
18
  minor-patch:
24
19
  applies-to: version-updates
@@ -29,13 +24,11 @@ updates:
29
24
  - patch
30
25
 
31
26
  - package-ecosystem: github-actions
32
- directories:
33
- - /
27
+ directory: /
34
28
  schedule:
35
29
  interval: weekly
36
30
  day: monday
37
31
  time: "09:30"
38
- timezone: Asia/Bangkok
39
32
  cooldown:
40
33
  default-days: 7
41
34
  commit-message:
@@ -54,7 +47,6 @@ updates:
54
47
  interval: weekly
55
48
  day: monday
56
49
  time: "10:00"
57
- timezone: Asia/Bangkok
58
50
  cooldown:
59
51
  default-days: 7
60
52
  commit-message:
@@ -71,7 +63,6 @@ updates:
71
63
  interval: weekly
72
64
  day: monday
73
65
  time: "10:30"
74
- timezone: Asia/Bangkok
75
66
  cooldown:
76
67
  default-days: 7
77
68
  commit-message:
@@ -5,27 +5,9 @@ base="${1-}"
5
5
  head="${2:-HEAD}"
6
6
 
7
7
  if [[ -z "$base" ]]; then
8
- printf '%s\n' app backoffice
9
- exit 0
10
- fi
11
-
12
- query="$(pnpm exec turbo query affected --packages --base "$base" --head "$head")"
13
- paths="$(printf '%s' "$query" | jq -r '.data.affectedPackages.items[].path // empty')"
14
-
15
- app=false
16
- backoffice=false
17
-
18
- while IFS= read -r path; do
19
- case "$path" in
20
- apps/app) app=true ;;
21
- apps/backoffice) backoffice=true ;;
22
- esac
23
- done <<< "$paths"
24
-
25
- if [[ "$app" == true ]]; then
26
- printf '%s\n' app
27
- fi
28
-
29
- if [[ "$backoffice" == true ]]; then
30
- printf '%s\n' backoffice
8
+ query="$(pnpm exec turbo query 'query { packages { items { path } } }')"
9
+ printf '%s' "$query" | jq --compact-output '[.data.packages.items[].path | select(startswith("apps/")) | ltrimstr("apps/")]'
10
+ else
11
+ query="$(pnpm exec turbo query affected --packages --base "$base" --head "$head")"
12
+ printf '%s' "$query" | jq --compact-output '[.data.affectedPackages.items[].path | select(startswith("apps/")) | ltrimstr("apps/")]'
31
13
  fi