@next-friday/create-app 9.2.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/package.json +13 -10
  2. package/templates/base/.agents/review.md +1 -1
  3. package/templates/base/.claude/settings.json +11 -0
  4. package/templates/base/.claude-plugin/marketplace.json +16 -0
  5. package/templates/base/.cursor/hooks/load-project-plugins.sh +3 -0
  6. package/templates/base/.cursor/hooks.json +6 -0
  7. package/templates/base/.github/workflows/control-band.yml +4 -2
  8. package/templates/base/.github/workflows/spec-on-intent-merge.yml +2 -1
  9. package/templates/base/REVIEW.md +1 -1
  10. package/templates/base/SETUP.md +12 -9
  11. package/templates/base/intent/README.md +1 -1
  12. package/templates/base/plugins/sdlc/claude-code/.claude-plugin/plugin.json +7 -0
  13. package/templates/base/plugins/sdlc/claude-code/agents/verifier.md +7 -0
  14. package/templates/base/plugins/sdlc/claude-code/hooks/check-reply-shape.sh +53 -0
  15. package/templates/base/plugins/sdlc/claude-code/hooks/hooks.json +15 -0
  16. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/brand-policy/SKILL.md +1 -3
  17. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/compliance-policy/SKILL.md +0 -2
  18. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-help/SKILL.md +23 -0
  19. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/SKILL.md +22 -11
  20. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/build.md +46 -0
  21. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/deploy.md +4 -4
  22. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/design.md +8 -8
  23. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/fix.md +7 -7
  24. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/maintain.md +6 -8
  25. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/open-pr.md +17 -0
  26. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/plan.md +6 -6
  27. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/question.md +2 -2
  28. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/review.md +7 -8
  29. package/templates/base/{.claude → plugins/sdlc/claude-code}/skills/security-policy/SKILL.md +0 -2
  30. package/templates/base/plugins/sdlc/claude-code/skills/setup-sdlc/SKILL.md +51 -0
  31. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/ux-policy/SKILL.md +0 -2
  32. package/templates/base/plugins/sdlc/cursor/.cursor-plugin/plugin.json +10 -0
  33. package/templates/base/plugins/sdlc/cursor/agents/verifier.md +7 -0
  34. package/templates/base/plugins/sdlc/cursor/hooks/check-reply-shape.sh +53 -0
  35. package/templates/base/plugins/sdlc/cursor/hooks/hooks.json +16 -0
  36. package/templates/base/{.cursor → plugins/sdlc/cursor}/skills/brand-policy/SKILL.md +1 -3
  37. package/templates/base/{.claude → plugins/sdlc/cursor}/skills/compliance-policy/SKILL.md +0 -2
  38. package/templates/base/plugins/sdlc/cursor/skills/sdlc-help/SKILL.md +23 -0
  39. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/SKILL.md +22 -11
  40. package/templates/base/plugins/sdlc/cursor/skills/sdlc-mode/playbooks/build.md +46 -0
  41. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/deploy.md +4 -4
  42. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/design.md +8 -8
  43. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/fix.md +7 -7
  44. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/maintain.md +6 -8
  45. package/templates/base/plugins/sdlc/cursor/skills/sdlc-mode/playbooks/open-pr.md +17 -0
  46. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/plan.md +6 -6
  47. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/question.md +2 -2
  48. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/review.md +7 -8
  49. package/templates/base/{.agents → plugins/sdlc/cursor}/skills/security-policy/SKILL.md +0 -2
  50. package/templates/base/plugins/sdlc/cursor/skills/setup-sdlc/SKILL.md +51 -0
  51. package/templates/base/{.claude → plugins/sdlc/cursor}/skills/ux-policy/SKILL.md +0 -2
  52. package/templates/base/scripts/check-agent-gates.ts +14 -1
  53. package/templates/base/scripts/check-plan.ts +1 -1
  54. package/templates/base/scripts/sync-agent-rules.ts +0 -58
  55. package/templates/nestjs/AGENTS.md +6 -4
  56. package/templates/nestjs/CONTRIBUTING.md +0 -1
  57. package/templates/nestjs/package.json +7 -8
  58. package/templates/nextjs/AGENTS.md +6 -4
  59. package/templates/nextjs/CONTRIBUTING.md +0 -1
  60. package/templates/nextjs/package.json +7 -8
  61. package/templates/nodejs/AGENTS.md +6 -4
  62. package/templates/nodejs/CONTRIBUTING.md +0 -1
  63. package/templates/nodejs/package.json +3 -4
  64. package/templates/payload/.agents/review.md +1 -1
  65. package/templates/payload/AGENTS.md +6 -4
  66. package/templates/payload/CONTRIBUTING.md +0 -1
  67. package/templates/payload/REVIEW.md +1 -1
  68. package/templates/payload/package.json +9 -10
  69. package/templates/turborepo/.agents/review.md +1 -1
  70. package/templates/turborepo/AGENTS.md +6 -4
  71. package/templates/turborepo/CONTRIBUTING.md +0 -1
  72. package/templates/turborepo/REVIEW.md +1 -1
  73. package/templates/turborepo/apps/app/package.json +6 -6
  74. package/templates/turborepo/apps/backoffice/package.json +8 -8
  75. package/templates/turborepo/package.json +1 -2
  76. package/templates/base/.agents/agents.json +0 -7
  77. package/templates/base/.agents/skill-evals/README.md +0 -42
  78. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +0 -12
  79. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/01-the-reply-explains-why-pnpm.md +0 -7
  80. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/02-no-file-in-the-project.md +0 -7
  81. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/03-no-commit-is-made-nothing.md +0 -7
  82. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/04-the-reply-is-in-the.md +0 -7
  83. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/05-every-path-in-the-reply.md +0 -7
  84. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/06-everything-the-reply-states-as.md +0 -7
  85. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +0 -8
  86. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +0 -12
  87. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/fixture.md +0 -1
  88. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/01-work-happens-on-the-plan-branch.md +0 -7
  89. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/02-the-plan-is-implemented-and-checked.md +0 -7
  90. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/03-the-branch-is-pushed.md +0 -7
  91. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/04-the-reply-lists-three-playbooks.md +0 -7
  92. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/05-no-approval-and-no-merge.md +0 -7
  93. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/06-the-reply-ends-at-the-code-owner.md +0 -7
  94. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/07-the-plan-names-the-engineer.md +0 -7
  95. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +0 -8
  96. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +0 -71
  97. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/fixture.md +0 -1
  98. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/01-the-reply-asks-numbered-questions.md +0 -7
  99. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/02-no-plan-before-the-answers.md +0 -7
  100. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/03-no-question-depends-on-another.md +0 -7
  101. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/04-no-file-or-commit.md +0 -7
  102. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/05-the-reply-is-in-thai.md +0 -7
  103. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +0 -8
  104. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +0 -68
  105. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/fixture.md +0 -1
  106. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/01-the-plan-has-the-four-headings.md +0 -7
  107. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/02-no-source-file-or-commit.md +0 -7
  108. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/03-the-reply-names-the-gate.md +0 -7
  109. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/04-the-reply-is-in-thai.md +0 -7
  110. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +0 -10
  111. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +0 -8
  112. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/fixture.md +0 -1
  113. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/01-no-deployment-is-started.md +0 -7
  114. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/02-the-reply-names-the-release-manager-gate.md +0 -7
  115. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/03-the-reply-says-what-it-could-not-read.md +0 -7
  116. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/04-the-reply-is-in-the-language.md +0 -7
  117. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +0 -8
  118. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +0 -13
  119. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/01-a-file-intentkebabcasenameintentmd-exists-with.md +0 -7
  120. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/02-the-reply-shows-the-draft.md +0 -7
  121. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/03-no-commit-is-made-nothing.md +0 -7
  122. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/04-reply-lists-the-playbook-steps.md +0 -7
  123. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/05-the-reply-is-in-the.md +0 -7
  124. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/06-every-path-in-the-reply.md +0 -7
  125. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/07-the-drafts-open-questions-section.md +0 -7
  126. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +0 -10
  127. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +0 -34
  128. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/fixture.md +0 -1
  129. 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 +0 -7
  130. 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 +0 -7
  131. 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 +0 -7
  132. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/04-no-file-or-commit.md +0 -7
  133. 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 +0 -7
  134. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/06-the-reply-is-in-thai.md +0 -7
  135. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +0 -8
  136. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +0 -12
  137. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/01-the-first-message-restates-the.md +0 -7
  138. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/02-the-reply-asks-numbered-questions.md +0 -7
  139. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/03-no-intentmd-is-written-before.md +0 -7
  140. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/04-reply-lists-the-playbook-steps.md +0 -7
  141. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/05-no-commit-is-made-nothing.md +0 -7
  142. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/06-the-reply-is-in-the.md +0 -7
  143. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/07-every-path-in-the-reply.md +0 -7
  144. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/08-no-question-in-the-round.md +0 -7
  145. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +0 -8
  146. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/case.yaml +0 -14
  147. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/fixture.md +0 -1
  148. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/01-the-intent-has-the-five-headings.md +0 -7
  149. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/02-problem-holds-the-error-and-where.md +0 -7
  150. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/03-unverified-cause-is-an-open-question.md +0 -7
  151. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/04-no-source-file-is-changed.md +0 -7
  152. 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 +0 -7
  153. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/06-the-person-is-asked-no-question.md +0 -7
  154. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +0 -8
  155. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +0 -12
  156. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/01-the-reply-follows-the-plan.md +0 -7
  157. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/02-the-reply-does-not-tell.md +0 -7
  158. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/03-no-file-is-created-or.md +0 -7
  159. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/04-the-reply-is-in-the.md +0 -7
  160. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/05-every-path-in-the-reply.md +0 -7
  161. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +0 -8
  162. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +0 -11
  163. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/fixture.md +0 -1
  164. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/01-no-file-is-written-and-nothing-is-committed.md +0 -7
  165. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/02-the-reply-names-the-closest-row.md +0 -7
  166. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short-and-in-thai.md +0 -7
  167. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +0 -8
  168. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/case.yaml +0 -79
  169. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/fixture.md +0 -1
  170. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/01-findings-have-pass-severity-and-location.md +0 -7
  171. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/02-no-approval-and-no-merge.md +0 -7
  172. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/03-the-reply-names-the-code-owner-gate.md +0 -7
  173. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/04-nothing-is-pushed-or-changed.md +0 -7
  174. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/05-the-review-runs-in-a-fresh-context.md +0 -7
  175. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/prompt.md +0 -8
  176. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +0 -42
  177. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/fixture.md +0 -1
  178. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/01-no-spec-is-written.md +0 -7
  179. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/02-no-commit-is-made.md +0 -7
  180. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/03-the-reply-says-not-merged.md +0 -7
  181. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/04-the-reply-is-in-the.md +0 -7
  182. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/05-the-reply-is-short.md +0 -7
  183. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +0 -8
  184. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +0 -12
  185. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/01-no-intentmd-or-any-other.md +0 -7
  186. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/02-no-commit-is-made-nothing.md +0 -7
  187. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/03-the-reply-is-in-the.md +0 -7
  188. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/04-every-path-in-the-reply.md +0 -7
  189. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/05-the-reply-says-that-work.md +0 -7
  190. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +0 -8
  191. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +0 -42
  192. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/fixture.md +0 -1
  193. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/01-the-spec-has-the-five-headings.md +0 -7
  194. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/02-policies-has-one-line-per-policy.md +0 -7
  195. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/03-no-policy-is-called-unwritten.md +0 -7
  196. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/04-a-branch-is-pushed-for-review.md +0 -7
  197. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/05-the-reply-names-the-gate.md +0 -7
  198. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/06-the-reply-is-in-the.md +0 -7
  199. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/07-no-merge-is-made.md +0 -7
  200. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/08-the-four-policies-are-read-before-writing.md +0 -7
  201. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +0 -8
  202. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +0 -11
  203. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/01-the-reply-says-that-work.md +0 -7
  204. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/02-the-reply-gives-one-example.md +0 -7
  205. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/03-the-reply-lists-the-project.md +0 -7
  206. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/04-no-file-is-created-or.md +0 -7
  207. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/05-the-reply-is-in-the.md +0 -7
  208. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/06-every-path-in-the-reply.md +0 -7
  209. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +0 -8
  210. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +0 -10
  211. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/01-the-reply-says-that-this.md +0 -7
  212. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/02-the-reply-does-not-describe.md +0 -7
  213. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/03-no-file-is-created-or.md +0 -7
  214. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/04-the-reply-is-in-the.md +0 -7
  215. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/05-every-path-in-the-reply.md +0 -7
  216. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +0 -8
  217. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +0 -11
  218. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/01-the-reply-says-to-send.md +0 -7
  219. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/02-no-file-is-created-or.md +0 -7
  220. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/03-the-reply-is-in-the.md +0 -7
  221. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/04-every-path-in-the-reply.md +0 -7
  222. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +0 -8
  223. package/templates/base/.agents/skills/sdlc/SKILL.md +0 -54
  224. package/templates/base/.agents/skills/sdlc/playbooks/build.md +0 -46
  225. package/templates/base/.agents/skills/sdlc/playbooks/design.md +0 -40
  226. package/templates/base/.agents/skills/sdlc/playbooks/open-pr.md +0 -15
  227. package/templates/base/.agents/skills/sdlc-help/SKILL.md +0 -23
  228. package/templates/base/.claude/skills/brand-policy/SKILL.md +0 -18
  229. package/templates/base/.claude/skills/sdlc/playbooks/build.md +0 -46
  230. package/templates/base/.claude/skills/sdlc/playbooks/deploy.md +0 -9
  231. package/templates/base/.claude/skills/sdlc/playbooks/fix.md +0 -23
  232. package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +0 -20
  233. package/templates/base/.claude/skills/sdlc/playbooks/open-pr.md +0 -15
  234. package/templates/base/.claude/skills/sdlc/playbooks/plan.md +0 -33
  235. package/templates/base/.claude/skills/sdlc/playbooks/review.md +0 -17
  236. package/templates/base/.claude/skills/sdlc-help/SKILL.md +0 -23
  237. package/templates/base/.cursor/skills/compliance-policy/SKILL.md +0 -25
  238. package/templates/base/.cursor/skills/sdlc/playbooks/build.md +0 -46
  239. package/templates/base/.cursor/skills/sdlc/playbooks/open-pr.md +0 -15
  240. package/templates/base/.cursor/skills/sdlc/playbooks/question.md +0 -8
  241. package/templates/base/.cursor/skills/sdlc-help/SKILL.md +0 -23
  242. package/templates/base/.cursor/skills/security-policy/SKILL.md +0 -41
  243. package/templates/base/.cursor/skills/ux-policy/SKILL.md +0 -21
  244. package/templates/base/.github/workflows/agent-evals.yml +0 -46
  245. package/templates/base/scripts/run-agent-evals.ts +0 -1186
  246. package/templates/nestjs/.agents/agents/verifier.md +0 -1
  247. package/templates/nestjs/.claude/agents/verifier.md +0 -7
  248. package/templates/nestjs/.cursor/agents/verifier.md +0 -7
  249. package/templates/nextjs/.agents/agents/verifier.md +0 -1
  250. package/templates/nextjs/.claude/agents/verifier.md +0 -7
  251. package/templates/nextjs/.cursor/agents/verifier.md +0 -7
  252. package/templates/nodejs/.agents/agents/verifier.md +0 -1
  253. package/templates/nodejs/.claude/agents/verifier.md +0 -7
  254. package/templates/nodejs/.cursor/agents/verifier.md +0 -7
  255. package/templates/payload/.agents/agents/verifier.md +0 -1
  256. package/templates/payload/.claude/agents/verifier.md +0 -7
  257. package/templates/payload/.cursor/agents/verifier.md +0 -7
  258. package/templates/turborepo/.agents/agents/verifier.md +0 -1
  259. package/templates/turborepo/.claude/agents/verifier.md +0 -7
  260. package/templates/turborepo/.cursor/agents/verifier.md +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-friday/create-app",
3
- "version": "9.2.0",
3
+ "version": "9.3.0",
4
4
  "description": "Create a Next Friday project from a template.",
5
5
  "keywords": [
6
6
  "create",
@@ -40,7 +40,7 @@
40
40
  "@next-friday/eslint-config-friday": "5.1.0",
41
41
  "@next-friday/prettier-config-friday": "4.0.0",
42
42
  "@types/node": "26.6.6",
43
- "@vitest/coverage-v8": "5.0.5",
43
+ "@vitest/coverage-v8": "5.1.0",
44
44
  "editorconfig-checker": "7.0.0",
45
45
  "eslint": "10.14.0",
46
46
  "fast-check": "4.10.2",
@@ -52,9 +52,9 @@
52
52
  "prettier": "3.9.10",
53
53
  "publint": "0.3.25",
54
54
  "sort-package-json": "4.1.0",
55
- "tsdown": "0.23.4",
56
- "typescript": "6.0.3",
57
- "vitest": "5.0.5",
55
+ "tsdown": "0.23.5",
56
+ "typescript": "7.0.2",
57
+ "vitest": "5.1.0",
58
58
  "yaml": "2.9.1"
59
59
  },
60
60
  "engines": {
@@ -66,7 +66,7 @@
66
66
  },
67
67
  "scripts": {
68
68
  "audit": "pnpm audit",
69
- "bands:check": "node scripts/check-bands.ts",
69
+ "bands:check": "node plugins/sdlc/source/scripts/check-bands.ts",
70
70
  "build": "tsdown",
71
71
  "changeset": "changeset",
72
72
  "changeset:status": "changeset status --since main",
@@ -74,15 +74,18 @@
74
74
  "check:publint": "publint",
75
75
  "clean": "rm -rf dist coverage *.tsbuildinfo .eslintcache node_modules/.cache",
76
76
  "dev": "tsdown --watch",
77
- "evals:run": "node scripts/run-agent-evals.ts",
77
+ "evals:run": "claude plugin eval plugins/sdlc/adapters/claude-code --scaffold --tag no-shell --allow-tools Write Edit",
78
+ "evals:run:write": "claude plugin eval plugins/sdlc/adapters/claude-code --scaffold --tag needs-write --allow-tools Write Edit Bash",
78
79
  "format": "prettier --write --cache .",
79
80
  "format:check": "prettier --check --cache . && editorconfig-checker",
80
81
  "gates:check": "node scripts/check-agent-gates.ts",
81
82
  "knip": "knip",
82
83
  "lint": "eslint . --fix --cache --max-warnings=0 --no-inline-config",
83
84
  "lint:check": "eslint . --cache --max-warnings=0 --no-inline-config",
84
- "loop:measure": "node scripts/measure-loop.ts",
85
- "plan:check": "node scripts/check-plan.ts",
85
+ "loop:measure": "node plugins/sdlc/source/scripts/measure-loop.ts",
86
+ "plan:check": "node plugins/sdlc/source/scripts/check-plan.ts",
87
+ "plugin:check": "node scripts/sync-plugin.ts --check",
88
+ "plugin:sync": "node scripts/sync-plugin.ts",
86
89
  "rules:check": "node scripts/sync-agent-rules.ts --check",
87
90
  "rules:sync": "node scripts/sync-agent-rules.ts",
88
91
  "sort-package-json": "sort-package-json package.json",
@@ -91,6 +94,6 @@
91
94
  "test:coverage": "vitest run --coverage",
92
95
  "test:watch": "vitest",
93
96
  "typecheck": "tsc --noEmit -p tsconfig.json",
94
- "verify": "pnpm rules:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm changesets:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm test:coverage && pnpm knip && pnpm build && pnpm check:publint"
97
+ "verify": "pnpm rules:check && pnpm plugin:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm changesets:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm test:coverage && pnpm knip && pnpm build && pnpm check:publint"
95
98
  }
96
99
  }
@@ -6,7 +6,7 @@ Run three passes and tag each finding with its pass:
6
6
 
7
7
  - Bugs: logic errors, broken edge cases, subtle regressions
8
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
9
+ - Compliance: the change matches spec.md, plan.md and the design principles that the policies in force state, each the project's own `.agents/skills/<area>-policy/SKILL.md` or else the `sdlc` plugin's default; flag a plan.md that has no `Accepted by:` line and a change that makes `AGENTS.md` outdated
10
10
 
11
11
  ## What Important means here
12
12
 
@@ -1,5 +1,16 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "extraKnownMarketplaces": {
4
+ "next-friday-plugins": {
5
+ "source": {
6
+ "source": "directory",
7
+ "path": "."
8
+ }
9
+ }
10
+ },
11
+ "enabledPlugins": {
12
+ "sdlc@next-friday-plugins": true
13
+ },
3
14
  "permissions": {
4
15
  "defaultMode": "plan",
5
16
  "allow": [
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "next-friday-plugins",
3
+ "owner": {
4
+ "name": "Next Friday"
5
+ },
6
+ "metadata": {
7
+ "description": "Plugins that run the Next Friday software development loop."
8
+ },
9
+ "plugins": [
10
+ {
11
+ "name": "sdlc",
12
+ "source": "./plugins/sdlc/claude-code",
13
+ "description": "Runs the software development loop: a skill that matches a request to a playbook and takes it to the next human gate, a help skill, a verifier subagent, and the default policies."
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ set -eu
3
+ jq -n --arg project "${CURSOR_PROJECT_DIR:?CURSOR_PROJECT_DIR is not set}" '{pluginPaths: [$project + "/plugins/sdlc/cursor"]}'
@@ -38,6 +38,12 @@
38
38
  {
39
39
  "command": ".agents/hooks/agent-format-after-edit.sh"
40
40
  }
41
+ ],
42
+ "workspaceOpen": [
43
+ {
44
+ "command": ".cursor/hooks/load-project-plugins.sh",
45
+ "timeout": 10
46
+ }
41
47
  ]
42
48
  }
43
49
  }
@@ -88,11 +88,12 @@ jobs:
88
88
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
89
89
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
90
90
  prompt: |
91
- /sdlc A scheduled job found a control band deviation in production. No one can answer questions.
91
+ /sdlc:sdlc-mode A scheduled job found a control band deviation in production. No one can answer questions.
92
92
  Detection report: ${{ needs.detect.outputs.report }}
93
93
  Metric values, oldest first: ${{ needs.detect.outputs.values }}
94
94
  The values come from the command in the CONTROL_BAND_METRIC_COMMAND repository variable. Run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
95
95
  claude_args: |
96
+ --plugin-dir plugins/sdlc/claude-code
96
97
  --model claude-haiku-5-5
97
98
  --max-turns 15
98
99
  --allowedTools "${{ needs.detect.outputs.tools || 'Read,Grep,Glob' }}"
@@ -103,12 +104,13 @@ jobs:
103
104
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
104
105
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
105
106
  prompt: |
106
- /sdlc A scheduled job found a control band deviation in production. No one can answer questions.
107
+ /sdlc:sdlc-mode A scheduled job found a control band deviation in production. No one can answer questions.
107
108
  Detection report: ${{ needs.detect.outputs.report }}
108
109
  Metric values, oldest first: ${{ needs.detect.outputs.values }}
109
110
  The values come from the command in the CONTROL_BAND_METRIC_COMMAND repository variable. Run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
110
111
  The branch docs/band-finding-${{ github.run_id }} exists and is checked out. Commit intent.md on it, push it with git push --set-upstream origin docs/band-finding-${{ github.run_id }}, open the pull request, and stop at the service owner's gate. A route other than pull_request is a runbook: name its command in the intent and do not run it.
111
112
  claude_args: |
113
+ --plugin-dir plugins/sdlc/claude-code
112
114
  --model claude-haiku-5-5
113
115
  --max-turns 25
114
116
  --permission-mode acceptEdits
@@ -91,9 +91,10 @@ jobs:
91
91
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
92
92
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
93
93
  prompt: |
94
- /sdlc ${{ matrix.intent }}
94
+ /sdlc:sdlc-mode ${{ matrix.intent }}
95
95
  The branch ${{ steps.branch.outputs.name }} exists and is checked out. Commit spec.md on it, push it with git push --set-upstream origin ${{ steps.branch.outputs.name }}, open the pull request, and stop at the product owner's gate.
96
96
  claude_args: |
97
+ --plugin-dir plugins/sdlc/claude-code
97
98
  --model claude-haiku-5-5
98
99
  --max-turns 30
99
100
  --permission-mode acceptEdits
@@ -6,7 +6,7 @@ Run three passes and tag each finding with its pass:
6
6
 
7
7
  - Bugs: logic errors, broken edge cases, subtle regressions
8
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
9
+ - Compliance: the change matches spec.md, plan.md and the design principles that the policies in force state, each the project's own `.agents/skills/<area>-policy/SKILL.md` or else the `sdlc` plugin's default; flag a plan.md that has no `Accepted by:` line and a change that makes `AGENTS.md` outdated
10
10
 
11
11
  ## What Important means here
12
12
 
@@ -4,7 +4,9 @@ This project runs an AI-native software development loop in Claude Code and Curs
4
4
 
5
5
  ## How a change flows
6
6
 
7
- Send a request with `/sdlc`. Only a person starts it; nothing routes work into it by itself. `.agents/skills/sdlc-help/SKILL.md` says how to keep `/sdlc` on for a session in Claude Code and Cursor. `intent/README.md` and the playbooks in `.agents/skills/sdlc/playbooks/` say who acts and who decides at each stage.
7
+ Send a request with `/sdlc:sdlc-mode`. Only a person starts it; nothing routes work into it by itself. `/sdlc:sdlc-help` says how to keep `/sdlc:sdlc-mode` on for a session in Claude Code and Cursor, and `/sdlc:setup-sdlc` chooses the models and reports which steps below are done. `intent/README.md` and the playbooks in `plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/` say who acts and who decides at each stage.
8
+
9
+ The project holds the `sdlc` plugin itself, in `plugins/sdlc/claude-code/` and `plugins/sdlc/cursor/`, so there is nothing to install. In Claude Code, `.claude/settings.json` registers the project folder as the marketplace `next-friday-plugins` (`.claude-plugin/marketplace.json`) and enables `sdlc@next-friday-plugins`; it applies once a person has trusted the folder. In Cursor, the `workspaceOpen` hook in `.cursor/hooks.json` hands `plugins/sdlc/cursor` to Cursor when it opens the workspace. The copy is the plugin's version: to take a later one, change the `source` entry of `.claude-plugin/marketplace.json`.
8
10
 
9
11
  ## 1. First commit and push
10
12
 
@@ -32,7 +34,7 @@ In `.github/CODEOWNERS`, add these lines in this order. GitHub uses the last mat
32
34
  ```text
33
35
  * @your-org/your-team
34
36
  /intent/ @the-product-owner
35
- /.agents/skills/sdlc/ @the-lead-who-signs-off-the-intent-template
37
+ /plugins/sdlc/ @the-lead-who-signs-off-the-intent-template
36
38
  /.agents/skills/brand-policy/ @the-brand-policy-owner
37
39
  /.agents/skills/security-policy/ @the-security-policy-owner
38
40
  /.agents/skills/compliance-policy/ @the-compliance-policy-owner
@@ -70,7 +72,7 @@ Replace `security@example.com` in `SECURITY.md` with the contact the security po
70
72
  **Who:** an Owner of the Claude organization, with an owner of the GitHub organization.
71
73
 
72
74
  - **Code Review:** in [**Admin settings → Claude Code**](https://claude.ai/admin-settings/claude-code#code-review), turn on **Allow code review**, install the Claude GitHub App, and add this repository ([set up Code Review](https://code.claude.com/docs/en/code-review-setup)). It needs a Team or Enterprise plan ([availability](https://code.claude.com/docs/en/code-review#availability)). Keep **Review runs** at **After every push**, the default, so every push to a pull request gets a review. Reviews run on Anthropic's infrastructure, so the repository has no review workflow. Anyone with write access can also comment `@claude review` on a pull request to start a review ([comment commands](https://code.claude.com/docs/en/code-review-pull-requests#comment-commands)).
73
- - **Managed settings:** deploy the non-negotiable settings and hooks as [managed settings](https://code.claude.com/docs/en/settings), tailored from the example in `.claude/managed-settings.example.json`. Engineers cannot override them.
75
+ - **Managed settings:** deploy the non-negotiable settings and hooks as [managed settings](https://code.claude.com/docs/en/settings), tailored from the example in `.claude/managed-settings.example.json`. Engineers cannot override them. When `strictKnownMarketplaces` is set, as in the example, add the marketplace `next-friday-plugins` of this project to it, or Claude Code does not register the project's plugin.
74
76
  - **Monitoring:** turn on the [OpenTelemetry export](https://code.claude.com/docs/en/monitoring-usage).
75
77
 
76
78
  **Check:** the test pull request gets a **Claude Code Review** check run within a few minutes.
@@ -90,14 +92,14 @@ Replace `security@example.com` in `SECURITY.md` with the contact the security po
90
92
 
91
93
  - **Sources of truth (engineering lead):** for each artifact, name one system as the source of truth: this repository, an existing tool such as Jira, or, as the minimum, a link both ways (the record id in the file and the commit SHA in the record).
92
94
  - **Higher risk (engineering lead):** decide which changes count as higher risk. A tech lead or architect approves their specs and plans.
93
- - **Policies (each policy owner, with an engineer):** each `.agents/skills/<area>-policy/SKILL.md` ships a default (security: OWASP ASVS 5.0.0 Level 1; UX: WCAG 2.2 Level AA; compliance: the OECD privacy principles; brand: one declared source for every brand value). Review it, replace or add the organization's own rules, then run `pnpm rules:sync`. Test that the skill triggers: ask for the relevant task in different ways and confirm the skill loads each time. The policy owner approves every later change as its code owner.
95
+ - **Policies (each policy owner, with an engineer):** the plugin ships a default for each area, `plugins/sdlc/claude-code/skills/<area>-policy/SKILL.md` (security: OWASP ASVS 5.0.0 Level 1; UX: WCAG 2.2 Level AA; compliance: the OECD privacy principles; brand: one declared source for every brand value). Review it. To replace a default, add the organization's own rules in `.agents/skills/<area>-policy/SKILL.md` in the project: that file wins over the plugin's default, and the `CODEOWNERS` line of step 2 for that area makes the policy owner its code owner. Do not edit the plugin's copy. Then run `pnpm rules:sync`, which renders the project's own policy skill for Claude Code and Cursor. Test that the skill triggers: ask for the relevant task in different ways and confirm the skill loads each time.
94
96
  - **Production gate (engineering leadership, with change management and compliance):** name the release managers and add them as required reviewers on the `prod` environment, as the README's deploy section describes. `.agents/hooks/agent-production-gate.sh` blocks an agent's shell commands that dispatch a `prod` deploy, run a Railway command with `prod` as its environment, or push a release tag. It does not read MCP tools. A release manager whose own agent session must do one of these starts the agent with `RELEASE_APPROVAL` set to the approval record, for example `RELEASE_APPROVAL=CHG-123 claude`. Any value lifts the gate except an empty value, `0`, `false`, and `no`, in any letter case.
95
97
  - **Review (tech lead):** `.agents/review.md` names this stack's generated files to skip; add a path when the project gains a generated file, then run `pnpm rules:sync`, which renders it to `REVIEW.md` for Claude Code Review. Once a month, rate the review findings and tune `.agents/review.md`.
96
98
  - **People without Git experience:** connect GitHub to Claude (claude.ai or Cowork), so Claude commits `intent.md` for them.
97
99
 
98
100
  ## 7. Later, as the guardrails mature
99
101
 
100
- - Send the intent's path with `/sdlc` by hand first. Then turn on `Spec on intent merge` (step 8).
102
+ - Send the intent's path with `/sdlc:sdlc-mode` by hand first. Then turn on `Spec on intent merge` (step 8).
101
103
  - Make auto mode the default for routine work: a tight `spec.md`, a small blast radius, and code the tests already cover.
102
104
  - Set the metric in `bands.yaml`, then turn on `Control band` (step 8).
103
105
 
@@ -107,13 +109,14 @@ Replace `security@example.com` in `SECURITY.md` with the contact the security po
107
109
 
108
110
  Each workflow below stays off until the repository variable `CLAUDE_CI_ENABLED` is `true`; until then nothing runs, on a schedule or otherwise, and nothing calls a model. When it is on, each needs one secret: `CLAUDE_CODE_OAUTH_TOKEN`, a Claude subscription token from `claude setup-token`, or `ANTHROPIC_API_KEY`, an API key. Either works; with neither set the job fails and says so. The jobs run the small model with a turn cap. Jobs that write install the Claude GitHub App from step 4 on the repository, and every change they make arrives as a pull request.
109
111
 
110
- - **`Agent evals`:** runs `pnpm evals:run` when a pull request changes `AGENTS.md`, `CLAUDE.md`, `.agents`, `.claude`, or `.cursor`, and every night. The job fails below the pass threshold, and it needs `claude` on the `PATH` of the job.
111
- - **`Spec on intent merge`:** when an `intent.md` reaches `main` with `Status: draft.` or `Status: accepted.` and no `spec.md` beside it, which is how the product owner accepts it, runs `/sdlc intent/<change>/intent.md`, so that `spec.md` arrives as a pull request for the product owner.
112
+ The jobs that send `/sdlc:sdlc-mode` load the plugin from `plugins/sdlc/claude-code` with `--plugin-dir`, because the folder of a CI job is not a trusted folder and `.claude/settings.json` applies only in a trusted one.
113
+
114
+ - **`Spec on intent merge`:** when an `intent.md` reaches `main` with `Status: draft.` or `Status: accepted.` and no `spec.md` beside it, which is how the product owner accepts it, runs `/sdlc:sdlc-mode intent/<change>/intent.md`, so that `spec.md` arrives as a pull request for the product owner.
112
115
  - **`Claude fix loop`:** when a person with write access comments `@claude` on a line of a pull request from this repository, Claude addresses the comment and pushes to that branch. It cannot approve or merge.
113
116
  - **`triage` job of `Verify`:** when a pull request from this repository fails a check, reads the failed logs with the `Read` tool only and posts a three-line summary.
114
- - **`Control band`:** every day, runs the command in the repository variable `CONTROL_BAND_METRIC_COMMAND`, which writes `metric-values.json` as `{"baseline": [...], "recent": [...]}`, then `pnpm bands:check metric-values.json`. A tier whose action is `diagnose` or `propose` runs `/sdlc` with the finding, and the `pull_request` route opens an intent pull request. It never acts on production.
117
+ - **`Control band`:** every day, runs the command in the repository variable `CONTROL_BAND_METRIC_COMMAND`, which writes `metric-values.json` as `{"baseline": [...], "recent": [...]}`, then `pnpm bands:check metric-values.json`. A tier whose action is `diagnose` or `propose` runs `/sdlc:sdlc-mode` with the finding, and the `pull_request` route opens an intent pull request. It never acts on production.
115
118
 
116
- On a machine, `pnpm evals:run` runs the evals with the developer's own Claude login, and `pnpm loop:measure` reports the loop's measures. Neither is part of `pnpm verify`.
119
+ On a machine, `pnpm loop:measure` reports the loop's measures. It is not part of `pnpm verify`.
117
120
 
118
121
  **Check:** with `CLAUDE_CI_ENABLED` unset, **Actions** shows these jobs as skipped.
119
122
 
@@ -3,7 +3,7 @@
3
3
  This folder is the intent home. Every change starts here as an `intent.md`, and its record stays here. Git history keeps the author, the time, and every revision of each file.
4
4
 
5
5
  - Each change has its own folder, `intent/<change>/`, where `<change>` is a short kebab-case name. The folder holds `intent.md` (Plan), then `spec.md` (Design), then `plan.md` (Build).
6
- - The playbooks in `.agents/skills/sdlc/playbooks/` say who writes and who accepts each file.
6
+ - The playbooks in `plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/` say who writes and who accepts each file.
7
7
  - A change is `done` when the tree meets every numbered requirement of its `spec.md`. The agent sets `Status: done.` in `intent.md` and `spec.md` in the pull request that meets the last requirement, and the code owner's approval of that pull request accepts it.
8
8
 
9
9
  ## Which file holds what
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "sdlc",
3
+ "description": "Runs the software development loop: a skill that matches a request to a playbook and takes it to the next human gate, a help skill, a verifier subagent, and the default policies.",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/next-friday/next-friday-create-app/tree/main/plugins/sdlc",
6
+ "repository": "https://github.com/next-friday/next-friday-create-app"
7
+ }
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: verifier
3
+ description: Runs the app and checks the change works before the session reports done
4
+ tools: Bash, Read
5
+ ---
6
+
7
+ Run the checks the project's agent instructions name. Then exercise the changed behavior the way a user reaches it: start the app or run the code, and watch the result. 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,53 @@
1
+ #!/bin/sh
2
+ command -v jq > /dev/null || exit 0
3
+ mode=${1:-}
4
+ input=$(cat)
5
+ state_directory=${TMPDIR:-/tmp}/sdlc-reply-shape
6
+ conversation=$(printf '%s' "$input" | jq -r '.conversation_id // ""' | tr -cd 'A-Za-z0-9_-')
7
+ case $mode in
8
+ save)
9
+ text=$(printf '%s' "$input" | jq -r '.text // ""')
10
+ [ -n "$text" ] && [ -n "$conversation" ] || exit 0
11
+ mkdir -p "$state_directory" && printf '%s' "$text" > "$state_directory/$conversation"
12
+ exit 0
13
+ ;;
14
+ followup)
15
+ [ -n "$conversation" ] && [ -f "$state_directory/$conversation" ] || exit 0
16
+ reply=$(cat "$state_directory/$conversation")
17
+ rm -f "$state_directory/$conversation"
18
+ [ "$(printf '%s' "$input" | jq -r '"\(.status // "") \(.loop_count // "")"')" = 'completed 0' ] || exit 0
19
+ ;;
20
+ *)
21
+ [ "$(printf '%s' "$input" | jq -r '.stop_hook_active // false')" = true ] && exit 0
22
+ reply=$(printf '%s' "$input" | jq -r '.last_assistant_message // ""')
23
+ ;;
24
+ esac
25
+ first=$(printf '%s\n' "$reply" | awk 'NF{print; exit}')
26
+ case $first in '**Request:**'*) ;; *) exit 0 ;; esac
27
+
28
+ last=$(printf '%s\n' "$reply" | awk 'NF{l=$0} END{print l}')
29
+ request=$(printf '%s\n' "$reply" | grep -m1 '^\*\*Request:\*\*')
30
+ outside_fences=$(printf '%s\n' "$reply" | awk '/^[[:space:]]*(```|~~~)/{f=!f; next} !f')
31
+ outside_urls=$(printf '%s\n' "$outside_fences" | sed -E 's#https?://[^][:space:])>]*# #g')
32
+ outside_code=$(printf '%s\n' "$outside_urls" | tr 'A-Z' 'a-z' \
33
+ | sed -E 's/`((#|(pr|pull request|issue)s?[[:space:]]+#?)[0-9]+)`/ \1 /g; s/`[^`]*`/ /g' \
34
+ | sed -E 's/(step|item|number|requirement|rule|point|option|case|line)s?[[:space:]]+#[0-9]+/ /g; s/#[0-9]{6,}/ /g')
35
+
36
+ number=$(printf '%s\n' "$outside_code" \
37
+ | grep -Eo '(^|[^[:alnum:]_&#/])#[0-9]+([^[:alnum:]_]|$)|(^|[^[:alnum:]_])(pr|pull request|issue)s?[[:space:]]+#?[0-9]+([^[:alnum:]_.]|\.[^0-9]|\.?$)(of[[:space:]]+(the|this|that|a|an|my|our|your|these|those)[[:space:]])?' \
38
+ | grep -Ev '[[:space:]]of[[:space:]]' | head -1 | sed -E 's/^[^#[:alnum:]]//; s/[^[:alnum:]]$//')
39
+ problems=
40
+ [ -n "$number" ] && problems="Replace \"$number\" with the full URL of that pull request or issue, or with \"this pull request\". "
41
+ case $last in
42
+ '**Status:**'*)
43
+ if printf '%s' "$request" | grep -Eq 'https?://' \
44
+ && ! printf '%s' "$last" | grep -Eiq 'Next:\**[[:space:]]*[<(]?https?://[^[:space:]]+[[:space:]]*$|no next page'; then
45
+ problems="${problems}End the **Status:** line with \`Next: <full URL of the page where the person acts next>\`, or say \"no next page\" when none waits. "
46
+ fi
47
+ ;;
48
+ *) problems="${problems}End the reply with a line that starts with **Status:**; nothing may follow it. " ;;
49
+ esac
50
+
51
+ [ -z "$problems" ] && exit 0
52
+ jq -n --arg mode "$mode" --arg reason "${problems}Send the whole reply again." \
53
+ 'if $mode == "followup" then {followup_message:$reason} else {decision:"block",reason:$reason} end'
@@ -0,0 +1,15 @@
1
+ {
2
+ "hooks": {
3
+ "Stop": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "timeout": 10,
8
+ "type": "command",
9
+ "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/check-reply-shape.sh\""
10
+ }
11
+ ]
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -5,8 +5,6 @@ description: Apply the organization's brand policy. Use whenever writing or revi
5
5
 
6
6
  # Brand policy
7
7
 
8
- Owner: the code owner of this folder in `.github/CODEOWNERS`.
9
-
10
8
  This is the default; the owner adds the brand's names, colours, typefaces, and tone of voice by editing this file.
11
9
 
12
10
  ## Rules
@@ -14,5 +12,5 @@ This is the default; the owner adds the brand's names, colours, typefaces, and t
14
12
  1. A change with no user-visible text, colour, typeface, logo, or message meets this policy; say "Does not apply" and why.
15
13
  2. The organization's name, product names, colours, typefaces, and logo files each have one declared source in the project. The spec names that source for every brand value the change shows. When the source does not exist yet, creating it is a requirement of the spec.
16
14
  3. No code, style, email, or message the user sees holds a brand value as a literal; each reads it from that source. Project metadata such as `package.json`, `README.md`, and `LICENSE` is outside this rule.
17
- 4. Text the user reads uses one name for one thing and the same words for the same action on every screen, and shows no internal identifier or stack trace.
15
+ 4. Text the user reads uses one name for one thing and the same words for the same action on every screen.
18
16
  5. A brand value this file does not give, such as an exact colour or a tone of voice, is an area of concern. Never invent one.
@@ -5,8 +5,6 @@ description: Apply the organization's compliance policy. Use whenever writing or
5
5
 
6
6
  # Compliance policy
7
7
 
8
- Owner: the code owner of this folder in `.github/CODEOWNERS`.
9
-
10
8
  Standard: the eight basic principles of the [OECD Guidelines Governing the Protection of Privacy and Transborder Flows of Personal Data](https://legalinstruments.oecd.org/en/instruments/OECD-LEGAL-0188) (adopted 1980, revised 2013), paragraphs 7 to 14. This is the default and names no country's law; the owner adds the laws and contracts that bind the organization by editing this file. The points below summarize those paragraphs; the standard's text governs.
11
9
 
12
10
  ## Rules
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: sdlc-help
3
+ description: Explains how this project's workflow runs and how to use /sdlc:sdlc-mode. It answers and starts no work. Run it with /sdlc:sdlc-help.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # SDLC help
8
+
9
+ 1. When the message asks for work rather than how, open no project file. The whole reply is two lines: this command starts no work; and the message to send instead, which is `/sdlc:sdlc-mode` followed by their own words.
10
+ 2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc:sdlc-mode` on for a session, fixing a defect in behaviour that already exists, who decides at each gate, a mistake the agent repeats, or company policy.
11
+ 3. Read the files the topic points to before you answer. When a file disagrees with the map below, the file is right.
12
+ 4. When the person asks about a playbook, a command, or a file that this project does not have, the whole reply is three lines: it does not exist; what exists instead, as one file path; and one message they can send next. Stop there. Do not explain the topic from other files.
13
+ 5. Otherwise answer, then give one message the person can send as is, with real words from their question and no blanks to fill in, then list the files the answer came from.
14
+ 6. Write the reply by the reply rules in `../sdlc-mode/SKILL.md`.
15
+
16
+ ## Map
17
+
18
+ - **How the workflow runs, and starting work:** the table in `../sdlc-mode/SKILL.md`.
19
+ - **Keeping `/sdlc:sdlc-mode` on for a session:** a person starts it; nothing routes work into it. How long an invoked skill's text stays in the conversation depends on the agent tool: a person sends `/sdlc:sdlc-mode` again to restore the full text, or uses the agent tool's own way to keep a command active for a session.
20
+ - **Fixing a defect in behaviour that already exists:** `playbooks/fix.md` is the path with no intent and no spec, for a person's request: a plan an engineer accepts, then a failing test, the fix, and a pull request. A finding from a job always starts at intent. Every other change runs intent, spec, plan, then build.
21
+ - **Who decides:** the steps marked **Gate** in the playbooks.
22
+ - **A mistake the agent repeats:** the project's agent instructions.
23
+ - **Company policy:** the policy files, each the project's `.agents/skills/<area>-policy/SKILL.md` when it exists and the plugin's default at `../<area>-policy/SKILL.md` otherwise.
@@ -1,6 +1,6 @@
1
1
  ---
2
- name: sdlc
3
- description: The front door for work in this project. Matches a request to a playbook and runs it to the next human gate. Run it with /sdlc.
2
+ name: sdlc-mode
3
+ description: The front door for work in this project. Matches a request to a playbook and runs it to the next human gate. Run it with /sdlc:sdlc-mode.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -23,18 +23,29 @@ Do these steps in order.
23
23
  | A pull request to open for the current branch | Follow [`playbooks/open-pr.md`](playbooks/open-pr.md). |
24
24
  | Anything else | Say which of the rows above is closest and why it does not fit, answer what you can as `playbooks/question.md` says, and stop. |
25
25
 
26
- When a request both asks a question and reports a problem, use `question` and offer `plan` in one line. A problem reported with `/sdlc` is the person's ask for `plan`.
26
+ When a request both asks a question and reports a problem, use `question` and offer `plan` in one line. A problem reported with `/sdlc:sdlc-mode` is the person's ask for `plan`.
27
+
28
+ Do not start work a person did not ask for. When a message reports a problem without asking for work, answer in a few lines and give, on the **Status** line, the message that would start it: `/sdlc:sdlc-mode` followed by their own words.
27
29
 
28
30
  2. **Open the task list** when the session offers a task-list tool. Its first items are the matched playbook's numbered steps, copied word for word, before any other task. A step you do not do stays in the list with `skip: <reason>`. Use `skip` only for a step you decide never to do. A step marked **Gate** is never skipped. When the session offers no such tool, the steps go in the reply instead, under **Steps**, and are never left out, except for `question`. When a playbook's **Next** line chains another playbook, add that playbook's steps when you start it.
29
- 3. **Do the playbook's steps yourself,** stopping only as `.agents/rules/agent-owned-work.md` says. At a step marked **Gate**, wait for the person it names. When a playbook's **Next** line says an agent runs the next file "in the same turn", read that file and continue without asking; otherwise stop at the Gate. Mark each step done in the task list as you finish it.
31
+ 3. **Do the playbook's steps yourself,** stopping only at a step marked **Gate**, or before an action that cannot be undone. At a step marked **Gate**, wait for the person it names. When a playbook's **Next** line says an agent runs the next file "in the same turn", read that file and continue without asking; otherwise stop at the Gate. Mark each step done in the task list as you finish it.
30
32
  4. **Write the reply in the shape below.**
31
33
 
32
34
  ## Reply shape
33
35
 
34
- Write the reply as the **Write replies a person can check** convention in `AGENTS.md` says, even when the message also holds a command, a path, or English technical terms. Only paths, commands, and a draft file's own text stay as they are.
36
+ Write replies a person can check. State as a fact only what you opened or ran in this turn, say what you ran, and mark what you did not open or run in this turn as inferred or not checked. Answer what was asked and stop: never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
37
+
38
+ Name a pull request, an issue, a branch, a workflow run, or a file by its full URL on the host that holds it, never by a number or a bare name. The person often reads the reply on a phone: a URL opens the page with one tap, and a number opens nothing.
39
+
40
+ When the person writes a number and a repository, build the URL before you write anything else: the repository's URL, then the host's path for the thing, such as `/pull/<number>` for a pull request or `/issues/<number>` for an issue. Use that URL where the person wrote the number, from the **Request** line on. After the first mention you may say "this pull request", with no number.
41
+
42
+ For example, the person writes "who must approve pull request #7 of https://host.example/acme/shop":
43
+
44
+ - **Request** line: "**Request:** Who must approve https://host.example/acme/shop/pull/7, and which page to open next."
45
+ - **Status** line: "**Status:** Not checked yet who must approve this pull request. It waits for a code owner. Next: https://host.example/acme/shop/pull/7"
35
46
 
36
47
  ```markdown
37
- **Request:** <the goal, the problem it solves, and the smallest change you expect to meet it, in your own words. When you cannot name the smallest change yet, say what you must learn first. For a question, only the question.>
48
+ **Request:** <the goal, the problem it solves, and the smallest change you expect to meet it, in your own words. When you cannot name the smallest change yet, say what you must learn first. For a question, only the question. Where the request holds a number, write the URL you built from it.>
38
49
 
39
50
  **Steps:** <only when the session has no task-list tool, and never for the `question` playbook. One line for each numbered step of the playbook: `1. <the step, copied word for word>: done | open | skip: <reason>`. When the turn ran more than one playbook, one list for each, under its file name on a line of its own, such as `playbooks/build.md`.>
40
51
 
@@ -42,13 +53,13 @@ Write the reply as the **Write replies a person can check** convention in `AGENT
42
53
 
43
54
  <What the current step produces: the round of questions, or the whole draft. For a question or a request no row fits, the answer.>
44
55
 
45
- **Status:** <what is done, what comes next, and which gate it waits on and for whom.>
56
+ **Status:** <what is done, what comes next, and which gate it waits on and for whom, all on this one line. When there is a page where the person acts next, the line ends with `Next: <its full URL>`, and nothing follows that URL.>
46
57
  ```
47
58
 
48
- A step that is not finished is `open`, including one at its Gate.
59
+ The **Status** line is the last line of the reply.
49
60
 
50
- A reply that ends before a **Gate** step says which step stopped it and why. "Waiting for an instruction" is not a reason.
61
+ A step that is not finished is `open`, including one at its Gate.
51
62
 
52
- When the evidence shows that the change cannot be made in this project, say so under **Request**. In the `plan` playbook, the first round then asks the one question that settles where the change belongs.
63
+ A reply that ends before a **Gate** step says which step stopped it and why.
53
64
 
54
- "new task" starts again at step 1. "don't change anything" keeps the session on `question`.
65
+ When the evidence shows that the change cannot be made in this project, say so under **Request**.
@@ -0,0 +1,46 @@
1
+ # Build phase: plan, then implement
2
+
3
+ This playbook turns a merged spec into a plan the engineer accepts, and then into working code.
4
+
5
+ 1. Find the change: the `intent/<change>/` folder whose `spec.md` or `plan.md` the request names. Its `spec.md` must be on the default branch beside its `intent.md`. In each case below, say only that, in two or three lines, and stop: write no file.
6
+ - The request names no change, or the folder has no `spec.md` on any branch: list each `intent/*/` on the default branch that has a `spec.md` and no `plan.md`, or say that there is none.
7
+ - The spec exists only on another branch: say that the spec is not merged yet, and name that branch.
8
+ - `intent/<change>/plan.md` is already on the default branch: say that the plan is merged, name the file, and say that the change is built only when each requirement of `spec.md` is checked against the tree.
9
+
10
+ When the request is a bug fix with no spec, none of these cases applies: follow `playbooks/fix.md` instead.
11
+
12
+ 2. When `intent/<change>/plan.md` exists on a branch that is not merged, check out that branch. When the request says the plan is accepted, go to step 6. Otherwise show that plan and go to step 5.
13
+ 3. Read `intent.md`, `spec.md`, the four policies, found as `playbooks/design.md` step 2 says, and the code the change touches. Start from the accepted spec, in the agent tool's plan mode when it has one, and give the plan the change's `intent.md` and `spec.md`. Then interview the engineer until they have said four things: the files the change touches, the order of the work, the tests that prove it, and each option they rule out.
14
+ - **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
15
+ - **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `playbooks/plan.md` does: numbered questions, each with a recommended answer or "No recommendation". Wait for the answers, and build the next round on them.
16
+ 4. Write the plan from the template below. Use exactly the template's headings. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
17
+ - **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
18
+ - **Order of work:** numbered steps. Each ends with the check that proves it.
19
+ - **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
20
+ - **Proof:** the tests and commands that show every requirement of the spec is met, by requirement number, and the test or review step for each policy requirement the spec cites.
21
+
22
+ Show the whole plan and name the file only as `intent/<change>/plan.md`. In plan mode you cannot write the file. Show the plan as the plan.
23
+
24
+ 5. **Gate: the engineer accepts the plan.** Ask whether an engineer could build from it, and for their GitHub handle when you cannot read it. Revise until they say yes. Change no code and commit nothing before that yes. In plan mode, approving the plan is that yes. When the spec classes the change as higher risk, say that a tech lead or an architect accepts the plan with the engineer.
25
+ 6. Create the branch as `playbooks/open-pr.md` says, unless step 2 checked one out. Set the plan's `Accepted by:` line, under its title, to the handle of the engineer who said yes in step 5 or whom the request names, and commit `intent/<change>/plan.md` before any other change. In that commit, set the spec's status line to `Status: accepted.`, because its pull request is merged.
26
+ 7. Implement the plan in its order. After each step, run the check that proves it and fix what fails. For a bug fix, follow `playbooks/fix.md` steps 7 and 8: commit the failing test on a `fix/` branch, and the gate then blocks test edits. When the work departs from the plan, change `plan.md` in the same commit. When the change meets the last requirement of `spec.md`, set `Status: done.` in `intent.md` and `spec.md`.
27
+ 8. Run every check the project's agent instructions name and keep the output. Every check must pass: fix the code, and never skip, delete, or weaken a test. Then run the `verifier` subagent and fix what it reports. Start it on the model that `.agents/sdlc-models.md` names after `verify:`, at the effort on that line when the session can set one; when you cannot start a subagent, do what `../../../agents/verifier.md`, relative to this playbook, says yourself. For UI work, when the session has a browser tool, also close the loop with a visual check: start the app, give the browser tool the page and the mock the spec or the request names, screenshot, compare, and adjust, and repeat until it matches; two or three rounds is normal. When a check cannot run in this session, say which one and why, and never report it as passed.
28
+ 9. Go on in the same turn, without asking: follow `playbooks/open-pr.md`, and then `playbooks/review.md`. Pushing the branch and opening the pull request are part of this task.
29
+
30
+ **Next:** `playbooks/open-pr.md`; an agent; in the same turn, as soon as step 8 passes.
31
+
32
+ ## Template
33
+
34
+ ```markdown
35
+ # Plan: <title>
36
+
37
+ Accepted by: @<engineer>.
38
+
39
+ ## Files that change
40
+
41
+ ## Order of work
42
+
43
+ ## Risks
44
+
45
+ ## Proof
46
+ ```
@@ -2,8 +2,8 @@
2
2
 
3
3
  1. Find the commit: the full SHA on the default branch that the request names, or the latest commit there. Read its CI run. When a check failed or is still running, say which one in two lines and stop. When you cannot read the CI run from this session, say so and carry on with the commit marked as not verified.
4
4
  2. Read how this project deploys: the deploy section of `README.md` and `.github/workflows/deploy.yml`, or the release workflow under `.github/workflows/` when the project releases that way. When the project has no deploy workflow, or deploying is switched off, say so in two lines and stop. When you cannot tell whether deploying is switched on, say so and carry on.
5
- 3. Report where the commit is. For each environment, in the order the project promotes them, say whether this commit is deployed there, and give the deployment's link or the output that shows it. Read production only from the deploy workflow's run history, never with a command that names the production environment. Where you cannot read an environment, write "not read" and why.
6
- 4. Promote the commit to an environment before production only when the request asks for that environment. Do it the way `README.md` says, one environment at a time, and read the health check after each. When a deployment fails, stop: report the failing step and its log, and promote no further. When the request names production, by any name such as `prod`, go to step 5. When it names an environment the project does not have, say so and list the ones it has.
7
- 5. **Gate: the release manager authorizes production.** Never start a production deployment, run a command that names the production environment, or push a release tag. Report the commit's SHA, the environments it has passed, the checks' results, and the exact action the release manager takes to promote it. When the request is to return production to an earlier commit, and the project has `runbooks/rollback-deploy.md`, report that runbook's command with the earlier commit's SHA as that exact action; the release manager runs it. Then wait.
5
+ 3. Report where the commit is. For each environment, in the order the project promotes them, say whether this commit is deployed there, and give the deployment's link or the output that shows it. Where you cannot read an environment, write "not read" and why.
6
+ 4. Promote the commit to an environment before production only when the request asks for that environment. Do it the way `README.md` says, one environment at a time. When a deployment fails, stop: report the failing step and its log, and promote no further. When the request names production, by any name such as `prod`, go to step 5. When it names an environment the project does not have, say so and list the ones it has.
7
+ 5. **Gate: the release manager authorizes production.** Never start a production deployment, run a command that names the production environment, or push a release tag. Report the commit's SHA, the environments it has passed, the checks' results, and the exact action the release manager takes to promote it. Then wait.
8
8
 
9
- **Next:** `.agents/skills/sdlc/playbooks/maintain.md`; a job or a person; when monitoring or a ticket reports a finding in production.
9
+ **Next:** `playbooks/maintain.md`; a job or a person; when monitoring or a ticket reports a finding in production.
@@ -6,18 +6,18 @@ This playbook turns a merged intent into the requirements and design spec.
6
6
  - The request names no intent, or the file does not exist on any branch: list each `intent/*/intent.md` on the default branch that has no `spec.md`, or say that there is none.
7
7
  - The file exists only on another branch: say that the intent is not merged yet, and name that branch.
8
8
  - `spec.md` already exists: say so and name the file.
9
- 2. Read the four policies, every time, before you write: `.agents/skills/brand-policy/SKILL.md`, `.agents/skills/security-policy/SKILL.md`, `.agents/skills/compliance-policy/SKILL.md`, and `.agents/skills/ux-policy/SKILL.md`. Then read the code and the docs the change touches.
10
- 3. Write `intent/<change>/spec.md` from the template below, in the language of the files already in `intent/`. Use exactly the template's headings.
11
- - **Request:** under the status line, quote the words of the request that started this spec. End the line with the template's "Skills at" sentence; its commit is the output of `git log -1 --format=%h -- .agents/skills`.
9
+ 2. Read the four policies, every time, before you write: for each of `brand`, `security`, `compliance`, and `ux`, read the project's `.agents/skills/<area>-policy/SKILL.md` when it exists, and the plugin's default at `../../<area>-policy/SKILL.md`, relative to this playbook, otherwise. Then read the code and the docs the change touches.
10
+ 3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
11
+ - **Request:** under the status line, quote the words of the request that started this spec.
12
12
  - **Requirements:** numbered. Each one states a result a test or a reader can check.
13
13
  - **Design:** how the change fits the existing code: the files that change, and what each one does afterwards.
14
14
  - **Policies:** one line for each of the four policies. State which rules of that policy the change must meet, each as a requirement number, or write "Does not apply" and why.
15
- - **Areas of concern:** a policy rule the change cannot meet, two policies that contradict, or a decision the files do not settle. Give each one a number, the policy it comes from, and that policy's owner from `.github/CODEOWNERS`. When `.github/CODEOWNERS` names no owner for a policy's folder, write "no owner in `.github/CODEOWNERS`" in place of the owner. Add one area of concern that says so. Write "None" only when there are none.
15
+ - **Areas of concern:** a policy rule the change cannot meet, two policies that contradict, or a decision the files do not settle. Give each one a number and the policy it comes from. Write "None" only when there are none.
16
16
  - **Open questions:** each open question from `intent.md`, answered with its evidence or carried forward. Write "None" only when the intent has none.
17
- 4. Commit `spec.md` on a new branch. In the same commit, set the intent's status line to `Status: accepted.`, because its pull request is merged. Push the branch, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests. Put the areas of concern first in the pull request's description, under the template's first heading. When you cannot open a pull request from this session, say so and give the pushed branch's name.
18
- 5. **Gate: the product owner reviews the spec.** The product owner resolves each area of concern with its policy owner, then merges the pull request to accept the spec, or closes it to reject it. For a change the spec classes as higher risk, the product owner consults a tech lead before accepting. You do none of these. The spec stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the plan's commit sets it. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
17
+ 4. Commit `spec.md` on a new branch. In the same commit, set the intent's status line to `Status: accepted.`, because its pull request is merged. Push the branch, and open a pull request ready for review, as the opening paragraph of `playbooks/open-pr.md` says for branches and pull requests. When you cannot open a pull request from this session, say so and give the pushed branch's name.
18
+ 5. **Gate: the product owner reviews the spec.** The product owner resolves each area of concern with its policy owner, then merges the pull request to accept the spec, or closes it to reject it. For a change the spec classes as higher risk, the product owner consults a tech lead before accepting. You do none of these. The spec stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the plan's commit sets it. Report the pull request's URL, keep it green as `playbooks/review.md` says, and wait.
19
19
 
20
- **Next:** `.agents/skills/sdlc/playbooks/build.md`; an engineer with an agent; when the product owner has merged the spec's pull request and the engineer sends `/sdlc build` with the spec's path.
20
+ **Next:** `playbooks/build.md`; an engineer with an agent; when the product owner has merged the spec's pull request and the engineer sends `/sdlc:sdlc-mode build` with the spec's path.
21
21
 
22
22
  ## Template
23
23
 
@@ -26,7 +26,7 @@ This playbook turns a merged intent into the requirements and design spec.
26
26
 
27
27
  From `intent/<change>/intent.md`. Status: draft.
28
28
 
29
- Request: "<the words of the request that started this spec>". Skills at `<commit>`.
29
+ Request: "<the words of the request that started this spec>".
30
30
 
31
31
  ## Requirements
32
32