@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.
- package/README.md +5 -4
- package/dist/main.mjs +135 -96
- package/package.json +14 -10
- package/templates/base/.agents/hooks/agent-mcp-gate.sh +7 -2
- package/templates/base/.agents/hooks/agent-production-gate.sh +6 -1
- package/templates/base/.agents/hooks/agent-shell-gate.sh +1 -181
- package/templates/base/.agents/hooks/agent-test-edit-gate.sh +12 -3
- package/templates/base/.agents/review.md +2 -2
- package/templates/base/.agents/rules/no-suppression.md +1 -1
- package/templates/base/.agents/skill-evals/README.md +42 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +11 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/01-the-reply-explains-why-pnpm.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/02-no-file-in-the-project.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/03-no-commit-is-made-nothing.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/05-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/06-everything-the-reply-states-as.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +11 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/01-work-happens-on-the-plan-branch.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/02-the-plan-is-implemented-and-checked.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/03-the-branch-is-pushed.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/04-the-reply-lists-three-playbooks.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/05-no-approval-and-no-merge.md +7 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/07-the-plan-names-the-engineer.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +70 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/01-the-reply-asks-numbered-questions.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/02-no-plan-before-the-answers.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/03-no-question-depends-on-another.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/04-no-file-or-commit.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +67 -0
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/fixture.md +1 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/02-no-source-file-or-commit.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/03-the-reply-names-the-gate.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +10 -0
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +7 -0
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/01-no-deployment-is-started.md +7 -0
- 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
- 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
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +12 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/01-a-file-intentkebabcasenameintentmd-exists-with.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/02-the-reply-shows-the-draft.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/03-no-commit-is-made-nothing.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/04-reply-lists-the-playbook-steps.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/06-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/07-the-drafts-open-questions-section.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +10 -0
- package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +33 -0
- package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/fixture.md +1 -0
- 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
- 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
- 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
- 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
- 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
- package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +11 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/01-the-first-message-restates-the.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/02-the-reply-asks-numbered-questions.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/03-no-intentmd-is-written-before.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/04-reply-lists-the-playbook-steps.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/05-no-commit-is-made-nothing.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/07-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/08-no-question-in-the-round.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/case.yaml +14 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/01-the-intent-has-the-five-headings.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/02-problem-holds-the-error-and-where.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/03-unverified-cause-is-an-open-question.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/04-no-source-file-is-changed.md +7 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/06-the-person-is-asked-no-question.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +11 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/01-the-reply-follows-the-plan.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/02-the-reply-does-not-tell.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/03-no-file-is-created-or.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/05-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +10 -0
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/fixture.md +1 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/02-the-reply-names-the-closest-row.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/case.yaml +79 -0
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/01-findings-have-pass-severity-and-location.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/02-no-approval-and-no-merge.md +7 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/04-nothing-is-pushed-or-changed.md +7 -0
- 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
- package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +41 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/01-no-spec-is-written.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/02-no-commit-is-made.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/03-the-reply-says-not-merged.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/05-the-reply-is-short.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +11 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/01-no-intentmd-or-any-other.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/02-no-commit-is-made-nothing.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/04-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/05-the-reply-says-that-work.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +41 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/fixture.md +1 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/01-the-spec-has-the-five-headings.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/02-policies-has-one-line-per-policy.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/03-no-policy-is-called-unwritten.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/04-a-branch-is-pushed-for-review.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/05-the-reply-names-the-gate.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/07-no-merge-is-made.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/08-the-four-policies-are-read-before-writing.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +10 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/01-the-reply-says-that-work.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/02-the-reply-gives-one-example.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/03-the-reply-lists-the-project.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/04-no-file-is-created-or.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/06-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +9 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/01-the-reply-says-that-this.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/02-the-reply-does-not-describe.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/03-no-file-is-created-or.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/05-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +8 -0
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +10 -0
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/01-the-reply-says-to-send.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/02-no-file-is-created-or.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/04-every-path-in-the-reply.md +7 -0
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +8 -0
- package/templates/base/.agents/skills/sdlc/SKILL.md +25 -21
- package/templates/base/.agents/skills/sdlc/playbooks/build.md +14 -9
- package/templates/base/.agents/skills/sdlc/playbooks/deploy.md +2 -2
- package/templates/base/.agents/skills/sdlc/playbooks/design.md +3 -3
- package/templates/base/.agents/skills/sdlc/playbooks/fix.md +23 -0
- package/templates/base/.agents/skills/sdlc/playbooks/maintain.md +3 -4
- package/templates/base/.agents/skills/sdlc/playbooks/open-pr.md +3 -3
- package/templates/base/.agents/skills/sdlc/playbooks/plan.md +3 -3
- package/templates/base/.agents/skills/sdlc/playbooks/review.md +2 -2
- package/templates/base/.agents/skills/sdlc-help/SKILL.md +4 -2
- package/templates/base/.claude/managed-settings.example.json +2 -2
- package/templates/base/.claude/settings.json +0 -13
- package/templates/base/.claude/skills/sdlc/SKILL.md +25 -21
- package/templates/base/.claude/skills/sdlc/playbooks/build.md +14 -9
- package/templates/base/.claude/skills/sdlc/playbooks/deploy.md +2 -2
- package/templates/base/.claude/skills/sdlc/playbooks/design.md +3 -3
- package/templates/base/.claude/skills/sdlc/playbooks/fix.md +23 -0
- package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +3 -4
- package/templates/base/.claude/skills/sdlc/playbooks/open-pr.md +3 -3
- package/templates/base/.claude/skills/sdlc/playbooks/plan.md +3 -3
- package/templates/base/.claude/skills/sdlc/playbooks/review.md +2 -2
- package/templates/base/.claude/skills/sdlc-help/SKILL.md +4 -2
- package/templates/base/.cursor/hooks.json +0 -6
- package/templates/base/.cursor/rules/no-suppression.mdc +1 -1
- package/templates/base/.cursor/skills/sdlc/SKILL.md +25 -21
- package/templates/base/.cursor/skills/sdlc/playbooks/build.md +14 -9
- package/templates/base/.cursor/skills/sdlc/playbooks/deploy.md +2 -2
- package/templates/base/.cursor/skills/sdlc/playbooks/design.md +3 -3
- package/templates/base/.cursor/skills/sdlc/playbooks/fix.md +23 -0
- package/templates/base/.cursor/skills/sdlc/playbooks/maintain.md +3 -4
- package/templates/base/.cursor/skills/sdlc/playbooks/open-pr.md +3 -3
- package/templates/base/.cursor/skills/sdlc/playbooks/plan.md +3 -3
- package/templates/base/.cursor/skills/sdlc/playbooks/review.md +2 -2
- package/templates/base/.cursor/skills/sdlc-help/SKILL.md +4 -2
- package/templates/base/.github/ISSUE_TEMPLATE/documentation.yml +1 -1
- package/templates/base/.github/dependabot.yml +1 -10
- package/templates/base/.github/file-filters.yml +3 -6
- package/templates/base/.github/workflows/agent-evals.yml +46 -0
- package/templates/base/.github/workflows/claude-fix-loop.yml +45 -0
- package/templates/base/.github/workflows/control-band.yml +115 -0
- package/templates/base/.github/workflows/dependency-review.yml +1 -0
- package/templates/base/.github/workflows/deploy.yml +4 -2
- package/templates/base/.github/workflows/osv-scanner.yml +0 -5
- package/templates/base/.github/workflows/pr-triage.yml +1 -1
- package/templates/base/.github/workflows/secret-scan.yml +4 -1
- package/templates/base/.github/workflows/spec-on-intent-merge.yml +108 -0
- package/templates/base/.github/workflows/validate-pr-title.yml +3 -2
- package/templates/base/.husky/pre-push +1 -8
- package/templates/base/REVIEW.md +2 -2
- package/templates/base/SETUP.md +44 -8
- package/templates/base/bands.yaml +3 -3
- package/templates/base/intent/README.md +1 -0
- package/templates/base/knip.json +2 -1
- package/templates/base/pnpm-workspace.yaml +1 -22
- package/templates/base/runbooks/rollback-deploy.md +27 -0
- package/templates/base/scripts/check-agent-gates.ts +265 -226
- package/templates/base/scripts/check-bands.ts +665 -0
- package/templates/base/scripts/check-plan.ts +1047 -0
- package/templates/base/scripts/measure-loop.ts +293 -0
- package/templates/base/scripts/run-agent-evals.ts +1197 -0
- package/templates/base/scripts/sync-agent-rules.ts +0 -8
- package/templates/nestjs/.dependency-cruiser.json +1 -1
- package/templates/nestjs/.github/ISSUE_TEMPLATE/bug.yml +5 -5
- package/templates/nestjs/.github/workflows/ci.yml +58 -9
- package/templates/nestjs/.github/workflows/sast.yml +0 -5
- package/templates/nestjs/AGENTS.md +17 -13
- package/templates/nestjs/CONTRIBUTING.md +3 -2
- package/templates/nestjs/Dockerfile +4 -4
- package/templates/nestjs/README.md +4 -6
- package/templates/nestjs/_gitignore +0 -1
- package/templates/nestjs/package.json +21 -19
- package/templates/nestjs/src/app.controller.test.ts +1 -0
- package/templates/nestjs/src/health/health.controller.test.ts +1 -0
- package/templates/nestjs/src/port.test.ts +1 -0
- package/templates/nestjs/test/app.e2e.test.ts +1 -0
- package/templates/nestjs/tsconfig.build.json +2 -3
- package/templates/nestjs/tsconfig.json +1 -3
- package/templates/nestjs/vitest.config.ts +0 -1
- package/templates/nestjs/vitest.e2e.config.ts +0 -1
- package/templates/nextjs/.dependency-cruiser.json +1 -1
- package/templates/nextjs/.github/ISSUE_TEMPLATE/bug.yml +1 -1
- package/templates/nextjs/.github/workflows/ci.yml +58 -9
- package/templates/nextjs/.github/workflows/sast.yml +0 -5
- package/templates/nextjs/AGENTS.md +17 -13
- package/templates/nextjs/CONTRIBUTING.md +3 -2
- package/templates/nextjs/Dockerfile +2 -2
- package/templates/nextjs/README.md +5 -3
- package/templates/nextjs/app/layout.tsx +2 -2
- package/templates/nextjs/app/page.test.ts +1 -1
- package/templates/nextjs/app/page.tsx +1 -1
- package/templates/nextjs/package.json +15 -14
- package/templates/nextjs/test/home.e2e.test.ts +3 -7
- package/templates/nextjs/tsconfig.json +0 -3
- package/templates/nodejs/.dependency-cruiser.json +1 -1
- package/templates/nodejs/.github/ISSUE_TEMPLATE/bug.yml +5 -5
- package/templates/nodejs/.github/workflows/ci.yml +58 -9
- package/templates/nodejs/.github/workflows/sast.yml +0 -5
- package/templates/nodejs/AGENTS.md +17 -12
- package/templates/nodejs/CONTRIBUTING.md +4 -3
- package/templates/nodejs/Dockerfile +3 -3
- package/templates/nodejs/README.md +4 -4
- package/templates/nodejs/_gitignore +0 -1
- package/templates/nodejs/package.json +13 -11
- package/templates/nodejs/src/server.test.ts +23 -0
- package/templates/nodejs/src/server.ts +2 -2
- package/templates/nodejs/tsconfig.build.json +2 -3
- package/templates/nodejs/tsconfig.json +0 -4
- package/templates/payload/.agents/agents/verifier.md +1 -1
- package/templates/payload/.agents/review.md +21 -0
- package/templates/payload/.claude/agents/verifier.md +1 -1
- package/templates/payload/.cursor/agents/verifier.md +1 -1
- package/templates/payload/.dependency-cruiser.json +1 -1
- package/templates/payload/.github/ISSUE_TEMPLATE/bug.yml +1 -1
- package/templates/payload/.github/workflows/ci.yml +75 -10
- package/templates/payload/.github/workflows/sast.yml +0 -5
- package/templates/payload/AGENTS.md +22 -18
- package/templates/payload/CONTRIBUTING.md +4 -3
- package/templates/payload/Dockerfile +2 -2
- package/templates/payload/README.md +8 -4
- package/templates/payload/REVIEW.md +21 -0
- package/templates/payload/package.json +17 -15
- package/templates/payload/src/app/(frontend)/layout.tsx +2 -2
- package/templates/payload/src/app/(frontend)/page.test.ts +1 -1
- package/templates/payload/src/app/(frontend)/page.tsx +1 -1
- package/templates/payload/src/app/favicon.ico +0 -0
- package/templates/payload/src/app/health/route.test.ts +20 -2
- package/templates/payload/src/app/health/route.ts +9 -2
- package/templates/payload/src/collections/media.test.ts +36 -1
- package/templates/payload/src/collections/media.ts +1 -1
- package/templates/payload/src/payload.config.test.ts +15 -0
- package/templates/payload/test/home.e2e.test.ts +3 -7
- package/templates/payload/tsconfig.json +0 -1
- package/templates/turborepo/.agents/agents/verifier.md +1 -1
- package/templates/turborepo/.agents/review.md +21 -0
- package/templates/turborepo/.claude/agents/verifier.md +1 -1
- package/templates/turborepo/.cursor/agents/verifier.md +1 -1
- package/templates/turborepo/.dockerignore +9 -4
- package/templates/turborepo/.github/ISSUE_TEMPLATE/bug.yml +16 -1
- package/templates/turborepo/.github/dependabot.yml +1 -10
- package/templates/turborepo/.github/scripts/affected-apps.sh +5 -23
- package/templates/turborepo/.github/workflows/ci.yml +140 -103
- package/templates/turborepo/.github/workflows/deploy.yml +24 -23
- package/templates/turborepo/.github/workflows/sast.yml +0 -5
- package/templates/turborepo/AGENTS.md +22 -18
- package/templates/turborepo/CONTRIBUTING.md +6 -4
- package/templates/turborepo/README.md +8 -8
- package/templates/turborepo/REVIEW.md +21 -0
- package/templates/turborepo/apps/app/.dependency-cruiser.json +1 -1
- package/templates/turborepo/apps/app/AGENTS.md +9 -0
- package/templates/turborepo/apps/app/Dockerfile +2 -2
- package/templates/turborepo/apps/app/app/layout.tsx +2 -2
- package/templates/turborepo/apps/app/app/page.test.ts +1 -1
- package/templates/turborepo/apps/app/app/page.tsx +1 -1
- package/templates/turborepo/apps/app/package.json +9 -9
- package/templates/turborepo/apps/app/test/home.e2e.test.ts +3 -7
- package/templates/turborepo/apps/app/tsconfig.json +0 -3
- package/templates/turborepo/apps/backoffice/.dependency-cruiser.json +1 -1
- package/templates/turborepo/apps/backoffice/AGENTS.md +9 -0
- package/templates/turborepo/apps/backoffice/Dockerfile +2 -2
- package/templates/turborepo/apps/backoffice/package.json +12 -11
- package/templates/turborepo/apps/backoffice/src/app/(frontend)/layout.tsx +2 -2
- package/templates/turborepo/apps/backoffice/src/app/(frontend)/page.test.ts +1 -1
- package/templates/turborepo/apps/backoffice/src/app/(frontend)/page.tsx +1 -1
- package/templates/turborepo/apps/backoffice/src/app/favicon.ico +0 -0
- package/templates/turborepo/apps/backoffice/src/app/health/route.test.ts +20 -2
- package/templates/turborepo/apps/backoffice/src/app/health/route.ts +10 -2
- package/templates/turborepo/apps/backoffice/src/collections/media.test.ts +36 -1
- package/templates/turborepo/apps/backoffice/src/collections/media.ts +1 -1
- package/templates/turborepo/apps/backoffice/src/environment.test.ts +19 -0
- package/templates/turborepo/apps/backoffice/src/payload.config.test.ts +15 -0
- package/templates/turborepo/apps/backoffice/test/home.e2e.test.ts +3 -7
- package/templates/turborepo/apps/backoffice/tsconfig.json +0 -1
- package/templates/turborepo/knip.json +4 -2
- package/templates/turborepo/package.json +16 -16
- package/templates/turborepo/pnpm-workspace.yaml +1 -22
- package/templates/turborepo/turbo.json +32 -11
- package/templates/base/.agents/hooks/agent-suppression-gate.sh +0 -45
- package/templates/base/.claude/rules/agents-guide.md +0 -1
- package/templates/base/scripts/check-human-gates.ts +0 -383
- package/templates/base/scripts/check-intent.ts +0 -391
- package/templates/nextjs/knip.json +0 -4
- package/templates/payload/src/collections/users.test.ts +0 -10
- 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": "
|
|
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
|
-
"
|
|
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
|
|
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.
|
|
51
|
-
"@payloadcms/next": "3.
|
|
52
|
-
"@payloadcms/richtext-lexical": "3.
|
|
53
|
-
"next": "16.4.
|
|
54
|
-
"payload": "3.
|
|
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.
|
|
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
|
|
70
|
-
"dependency-cruiser": "18.7.
|
|
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
|
|
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: "
|
|
7
|
-
description: "
|
|
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("
|
|
11
|
+
expect(html).toContain("Payload application");
|
|
12
12
|
expect(html).toContain('href="/admin"');
|
|
13
13
|
});
|
|
14
14
|
});
|
|
Binary file
|
|
@@ -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
|
-
|
|
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.
|
|
5
|
-
*
|
|
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
|
});
|
|
@@ -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("
|
|
4
|
-
await page.goto("/");
|
|
3
|
+
test("serves the home page", async ({page}) => {
|
|
4
|
+
const response = await page.goto("/");
|
|
5
5
|
|
|
6
|
-
|
|
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}) => {
|
|
@@ -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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
query
|
|
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
|