@next-friday/create-app 9.2.0 → 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/package.json +13 -10
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +2 -2
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +2 -2
- package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/{build-interviews-before-planning/graders/05-the-reply-is-in-thai.md → request-that-fits-no-row/graders/03-the-reply-is-short.md} +1 -1
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +1 -1
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +0 -1
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +1 -1
- package/templates/base/.agents/skills/sdlc/playbooks/build.md +1 -1
- package/templates/base/.agents/skills/sdlc/playbooks/design.md +1 -1
- package/templates/base/.agents/skills/sdlc/playbooks/fix.md +1 -1
- package/templates/base/.agents/skills/sdlc/playbooks/maintain.md +1 -1
- package/templates/base/.agents/skills/sdlc/playbooks/plan.md +1 -1
- package/templates/base/.agents/skills/sdlc-help/SKILL.md +1 -1
- package/templates/base/.claude/skills/sdlc/playbooks/build.md +1 -1
- package/templates/base/.claude/skills/sdlc/playbooks/design.md +1 -1
- package/templates/base/.claude/skills/sdlc/playbooks/fix.md +1 -1
- package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +1 -1
- package/templates/base/.claude/skills/sdlc/playbooks/plan.md +1 -1
- package/templates/base/.claude/skills/sdlc-help/SKILL.md +1 -1
- package/templates/base/.cursor/skills/sdlc/playbooks/build.md +1 -1
- package/templates/base/.cursor/skills/sdlc/playbooks/design.md +1 -1
- package/templates/base/.cursor/skills/sdlc/playbooks/fix.md +1 -1
- package/templates/base/.cursor/skills/sdlc/playbooks/maintain.md +1 -1
- package/templates/base/.cursor/skills/sdlc/playbooks/plan.md +1 -1
- package/templates/base/.cursor/skills/sdlc-help/SKILL.md +1 -1
- package/templates/base/scripts/check-agent-gates.ts +14 -1
- package/templates/base/scripts/run-agent-evals.ts +15 -4
- package/templates/nestjs/AGENTS.md +1 -1
- package/templates/nestjs/package.json +7 -7
- package/templates/nextjs/AGENTS.md +1 -1
- package/templates/nextjs/package.json +7 -7
- package/templates/nodejs/AGENTS.md +1 -1
- package/templates/nodejs/package.json +3 -3
- package/templates/payload/AGENTS.md +1 -1
- package/templates/payload/package.json +9 -9
- package/templates/turborepo/AGENTS.md +1 -1
- package/templates/turborepo/apps/app/package.json +6 -6
- package/templates/turborepo/apps/backoffice/package.json +8 -8
- package/templates/turborepo/package.json +1 -1
- package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/04-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/04-the-reply-is-in-thai.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/04-the-reply-is-in-the-language.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/05-the-reply-is-in-the.md +0 -7
- 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
- package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/06-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/04-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short-and-in-thai.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/04-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/03-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/06-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/05-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/04-the-reply-is-in-the.md +0 -7
- package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/03-the-reply-is-in-the.md +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@next-friday/create-app",
|
|
3
|
-
"version": "9.2.
|
|
3
|
+
"version": "9.2.1",
|
|
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
|
|
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.
|
|
56
|
-
"typescript": "
|
|
57
|
-
"vitest": "5.0
|
|
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": "
|
|
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
|
}
|
package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md
CHANGED
|
@@ -5,6 +5,6 @@ timeout_seconds: 900
|
|
|
5
5
|
allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
/sdlc
|
|
8
|
+
/sdlc build from intent/app-version/spec.md
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
My answers: the only file that changes is src/version/version.controller.ts, a new file. The order of work is the test first and then the controller. The proof is one unit test file that checks that GET /version answers 200 with the version from package.json. The option I rule out is reading the version from an environment variable. No open questions.
|
|
@@ -9,5 +9,4 @@ checks:
|
|
|
9
9
|
regex: '(?=[\s\S]*^## Problem$)(?=[\s\S]*^## Proposed outcome$)(?=[\s\S]*^## Affected users and systems$)(?=[\s\S]*^## Constraints$)(?=[\s\S]*^## Open questions$)'
|
|
10
10
|
- no_new_commits
|
|
11
11
|
- no_new_branch
|
|
12
|
-
- reply_matches: '[\u0E00-\u0E7F]{10}'
|
|
13
12
|
- reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
|
|
@@ -5,6 +5,6 @@ timeout_seconds: 600
|
|
|
5
5
|
allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
/sdlc
|
|
8
|
+
/sdlc write an intent for adding a CSV export button to the reports page
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
My answers: the users are the 12 people of the accounting team, who use it at every month end. Today they copy the table into Excel by hand, about 20 minutes each (the figure is from the head of accounting). The outcome I want is one button that gives a CSV file of the open report. The constraint is that access rights to reports must not change. Out of scope are PDF and Excel export. The reports page is in the web-app repo of the Finance Tools team; keep the intent in this repo. I am Joe from the Developer Productivity team. No open questions.
|
|
@@ -5,4 +5,4 @@ timeout_seconds: 900
|
|
|
5
5
|
allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
/sdlc
|
|
8
|
+
/sdlc fix a bug: parseVersion("1.2") in src/version.ts returns "1.NaN.0" where it should return "1.2.0"
|
package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md
CHANGED
|
@@ -5,4 +5,4 @@ timeout_seconds: 900
|
|
|
5
5
|
allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
/sdlc
|
|
8
|
+
/sdlc an automated check found that GET /health answers 500 every time since the latest commit. log: "TypeError: Cannot read properties of undefined (reading 'status')" at src/health/health.controller.ts. Nobody is available to ask.
|
|
@@ -38,5 +38,4 @@ checks:
|
|
|
38
38
|
regex: '(?=[\s\S]*^## Requirements$)(?=[\s\S]*^## Design$)(?=[\s\S]*^## Policies$)(?=[\s\S]*^## Areas of concern$)(?=[\s\S]*^## Open questions$)'
|
|
39
39
|
- commit_touches_only: intent/csv-export/spec.md
|
|
40
40
|
- branch_matches: "^(?!main$).+"
|
|
41
|
-
- reply_matches: '[\u0E00-\u0E7F]{10}'
|
|
42
41
|
- reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
|
|
@@ -13,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
|
|
|
13
13
|
3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. 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
14
|
- **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
|
|
15
15
|
- **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/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
|
|
16
|
+
4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
|
|
17
17
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
18
18
|
- **Order of work:** numbered steps. Each ends with the check that proves it.
|
|
19
19
|
- **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
|
|
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
|
|
|
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
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
|
|
10
|
+
3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
|
|
11
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`.
|
|
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.
|
|
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
|
|
|
5
5
|
1. Decide that the request qualifies. It qualifies only when the request is a defect in behaviour that already exists, and the fix adds no new behaviour and no new dependency and changes no schema and no public interface. When a condition fails, say which one in two lines and follow `.agents/skills/sdlc/playbooks/plan.md` instead.
|
|
6
6
|
2. Reproduce the defect yourself by running the code, and keep the output. Ask the person only when you can name the specific reason you cannot reach it, such as a credential or a service this session cannot use.
|
|
7
7
|
3. Find the cause from what running the code shows. List the candidate causes, rule each out with a command or an observation, and never guess. Name the one cause the evidence leaves. When it leaves none, or more than one, say so and ask for what is missing.
|
|
8
|
-
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md
|
|
8
|
+
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md`. The title is `# Plan: <title> (fix)`. Use exactly the template's four headings, and keep the plan short. Name the file `intent/<short-description>/plan.md`; the folder holds only this file.
|
|
9
9
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
10
10
|
- **Order of work:** the cause and the evidence for it, then numbered steps. Each ends with the check that proves it.
|
|
11
11
|
- **Risks:** what the fix could break, and each option you chose not to take and why.
|
|
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
|
|
|
4
4
|
|
|
5
5
|
1. Read the finding the request gives: what was seen, where, when, and its link or log. When the request gives no finding, say so in two lines and stop. When the finding asks for a new capability and reports no fault, say that a person sends it with `/sdlc`, and stop.
|
|
6
6
|
2. Diagnose without changing anything. Read the logs, the code, and the changes merged before the finding. When `bands.yaml` names the tools for the finding's tier, use only those. Write no file outside `intent/`, start no deploy, and act only through a route that `bands.yaml` lists for that tier: `pull_request` is the pull request in step 5, and any other route is a runbook of that name. When the finding names no tier, or the project has no `bands.yaml`, use read-only tools only. When the tier's action is only to log, put the finding in your reply and stop.
|
|
7
|
-
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md
|
|
7
|
+
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md`. Use exactly the template's five headings.
|
|
8
8
|
- **Problem:** the anomaly and its evidence: the number, its source, and the time.
|
|
9
9
|
- **Proposed outcome:** what the fixed system does, as its user would see it.
|
|
10
10
|
- **Open questions:** everything the evidence does not settle, including the cause when you could not prove it. Never state a cause you did not verify.
|
|
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
|
|
|
7
7
|
3. Interview until the originator has said four things: the problem, the outcome, the constraints, and what is out of scope. The problem names who is affected, how often, and a number with its source. The outcome is what the user would see.
|
|
8
8
|
- **When all four are already said, go to step 4 in the same turn.**
|
|
9
9
|
- **When one is missing, ask and stop.** Write no draft in that turn. Ask in rounds. Each round holds only questions that do not depend on another question in the same round. Number the questions. Each asks one thing and carries a concrete answer you recommend, worded so "yes" accepts it. A recommended answer is a fact or a choice, such as "Recommended: only the checkout page", never an instruction to the person. When you have no answer to recommend, write "No recommendation" and ask plainly. Wait for the answers, and build the next round on them.
|
|
10
|
-
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name.
|
|
10
|
+
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name. Use exactly the template's five headings. What is out of scope goes under **Proposed outcome**. Anything else that is unknown, unverified, or not yet decided goes under **Open questions**. Write "None" only when nothing is, and never list what the originator already answered. Show the whole draft, and name the file only as `intent/<change>/intent.md`. In plan mode you cannot write the file. Show the draft as the plan, and write the file once it is approved.
|
|
11
11
|
5. **Gate: the originator corrects the draft.** Ask whether it matches what they meant, and revise until they say yes. Commit nothing, push nothing, and open no pull request before that yes. In plan mode, the originator approving the plan is that yes.
|
|
12
12
|
6. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests.
|
|
13
13
|
7. **Gate: the product owner accepts or rejects the intent.** The product owner merges the pull request to accept the intent, or closes it to reject it. You do neither. The file stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the spec's pull request sets it. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
|
|
7
7
|
# SDLC help
|
|
8
8
|
|
|
9
|
-
1. When the message asks for work rather than how, open no project file. The whole reply is two lines
|
|
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` followed by their own words.
|
|
10
10
|
2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` 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
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
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,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
|
|
|
13
13
|
3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. 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
14
|
- **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
|
|
15
15
|
- **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/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
|
|
16
|
+
4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
|
|
17
17
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
18
18
|
- **Order of work:** numbered steps. Each ends with the check that proves it.
|
|
19
19
|
- **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
|
|
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
|
|
|
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
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
|
|
10
|
+
3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
|
|
11
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`.
|
|
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.
|
|
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
|
|
|
5
5
|
1. Decide that the request qualifies. It qualifies only when the request is a defect in behaviour that already exists, and the fix adds no new behaviour and no new dependency and changes no schema and no public interface. When a condition fails, say which one in two lines and follow `.agents/skills/sdlc/playbooks/plan.md` instead.
|
|
6
6
|
2. Reproduce the defect yourself by running the code, and keep the output. Ask the person only when you can name the specific reason you cannot reach it, such as a credential or a service this session cannot use.
|
|
7
7
|
3. Find the cause from what running the code shows. List the candidate causes, rule each out with a command or an observation, and never guess. Name the one cause the evidence leaves. When it leaves none, or more than one, say so and ask for what is missing.
|
|
8
|
-
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md
|
|
8
|
+
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md`. The title is `# Plan: <title> (fix)`. Use exactly the template's four headings, and keep the plan short. Name the file `intent/<short-description>/plan.md`; the folder holds only this file.
|
|
9
9
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
10
10
|
- **Order of work:** the cause and the evidence for it, then numbered steps. Each ends with the check that proves it.
|
|
11
11
|
- **Risks:** what the fix could break, and each option you chose not to take and why.
|
|
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
|
|
|
4
4
|
|
|
5
5
|
1. Read the finding the request gives: what was seen, where, when, and its link or log. When the request gives no finding, say so in two lines and stop. When the finding asks for a new capability and reports no fault, say that a person sends it with `/sdlc`, and stop.
|
|
6
6
|
2. Diagnose without changing anything. Read the logs, the code, and the changes merged before the finding. When `bands.yaml` names the tools for the finding's tier, use only those. Write no file outside `intent/`, start no deploy, and act only through a route that `bands.yaml` lists for that tier: `pull_request` is the pull request in step 5, and any other route is a runbook of that name. When the finding names no tier, or the project has no `bands.yaml`, use read-only tools only. When the tier's action is only to log, put the finding in your reply and stop.
|
|
7
|
-
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md
|
|
7
|
+
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md`. Use exactly the template's five headings.
|
|
8
8
|
- **Problem:** the anomaly and its evidence: the number, its source, and the time.
|
|
9
9
|
- **Proposed outcome:** what the fixed system does, as its user would see it.
|
|
10
10
|
- **Open questions:** everything the evidence does not settle, including the cause when you could not prove it. Never state a cause you did not verify.
|
|
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
|
|
|
7
7
|
3. Interview until the originator has said four things: the problem, the outcome, the constraints, and what is out of scope. The problem names who is affected, how often, and a number with its source. The outcome is what the user would see.
|
|
8
8
|
- **When all four are already said, go to step 4 in the same turn.**
|
|
9
9
|
- **When one is missing, ask and stop.** Write no draft in that turn. Ask in rounds. Each round holds only questions that do not depend on another question in the same round. Number the questions. Each asks one thing and carries a concrete answer you recommend, worded so "yes" accepts it. A recommended answer is a fact or a choice, such as "Recommended: only the checkout page", never an instruction to the person. When you have no answer to recommend, write "No recommendation" and ask plainly. Wait for the answers, and build the next round on them.
|
|
10
|
-
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name.
|
|
10
|
+
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name. Use exactly the template's five headings. What is out of scope goes under **Proposed outcome**. Anything else that is unknown, unverified, or not yet decided goes under **Open questions**. Write "None" only when nothing is, and never list what the originator already answered. Show the whole draft, and name the file only as `intent/<change>/intent.md`. In plan mode you cannot write the file. Show the draft as the plan, and write the file once it is approved.
|
|
11
11
|
5. **Gate: the originator corrects the draft.** Ask whether it matches what they meant, and revise until they say yes. Commit nothing, push nothing, and open no pull request before that yes. In plan mode, the originator approving the plan is that yes.
|
|
12
12
|
6. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests.
|
|
13
13
|
7. **Gate: the product owner accepts or rejects the intent.** The product owner merges the pull request to accept the intent, or closes it to reject it. You do neither. The file stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the spec's pull request sets it. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
|
|
7
7
|
# SDLC help
|
|
8
8
|
|
|
9
|
-
1. When the message asks for work rather than how, open no project file. The whole reply is two lines
|
|
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` followed by their own words.
|
|
10
10
|
2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` 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
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
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,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
|
|
|
13
13
|
3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. 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
14
|
- **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
|
|
15
15
|
- **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/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
|
|
16
|
+
4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
|
|
17
17
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
18
18
|
- **Order of work:** numbered steps. Each ends with the check that proves it.
|
|
19
19
|
- **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
|
|
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
|
|
|
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
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
|
|
10
|
+
3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
|
|
11
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`.
|
|
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.
|
|
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
|
|
|
5
5
|
1. Decide that the request qualifies. It qualifies only when the request is a defect in behaviour that already exists, and the fix adds no new behaviour and no new dependency and changes no schema and no public interface. When a condition fails, say which one in two lines and follow `.agents/skills/sdlc/playbooks/plan.md` instead.
|
|
6
6
|
2. Reproduce the defect yourself by running the code, and keep the output. Ask the person only when you can name the specific reason you cannot reach it, such as a credential or a service this session cannot use.
|
|
7
7
|
3. Find the cause from what running the code shows. List the candidate causes, rule each out with a command or an observation, and never guess. Name the one cause the evidence leaves. When it leaves none, or more than one, say so and ask for what is missing.
|
|
8
|
-
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md
|
|
8
|
+
4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md`. The title is `# Plan: <title> (fix)`. Use exactly the template's four headings, and keep the plan short. Name the file `intent/<short-description>/plan.md`; the folder holds only this file.
|
|
9
9
|
- **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
|
|
10
10
|
- **Order of work:** the cause and the evidence for it, then numbered steps. Each ends with the check that proves it.
|
|
11
11
|
- **Risks:** what the fix could break, and each option you chose not to take and why.
|
|
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
|
|
|
4
4
|
|
|
5
5
|
1. Read the finding the request gives: what was seen, where, when, and its link or log. When the request gives no finding, say so in two lines and stop. When the finding asks for a new capability and reports no fault, say that a person sends it with `/sdlc`, and stop.
|
|
6
6
|
2. Diagnose without changing anything. Read the logs, the code, and the changes merged before the finding. When `bands.yaml` names the tools for the finding's tier, use only those. Write no file outside `intent/`, start no deploy, and act only through a route that `bands.yaml` lists for that tier: `pull_request` is the pull request in step 5, and any other route is a runbook of that name. When the finding names no tier, or the project has no `bands.yaml`, use read-only tools only. When the tier's action is only to log, put the finding in your reply and stop.
|
|
7
|
-
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md
|
|
7
|
+
3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md`. Use exactly the template's five headings.
|
|
8
8
|
- **Problem:** the anomaly and its evidence: the number, its source, and the time.
|
|
9
9
|
- **Proposed outcome:** what the fixed system does, as its user would see it.
|
|
10
10
|
- **Open questions:** everything the evidence does not settle, including the cause when you could not prove it. Never state a cause you did not verify.
|
|
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
|
|
|
7
7
|
3. Interview until the originator has said four things: the problem, the outcome, the constraints, and what is out of scope. The problem names who is affected, how often, and a number with its source. The outcome is what the user would see.
|
|
8
8
|
- **When all four are already said, go to step 4 in the same turn.**
|
|
9
9
|
- **When one is missing, ask and stop.** Write no draft in that turn. Ask in rounds. Each round holds only questions that do not depend on another question in the same round. Number the questions. Each asks one thing and carries a concrete answer you recommend, worded so "yes" accepts it. A recommended answer is a fact or a choice, such as "Recommended: only the checkout page", never an instruction to the person. When you have no answer to recommend, write "No recommendation" and ask plainly. Wait for the answers, and build the next round on them.
|
|
10
|
-
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name.
|
|
10
|
+
4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name. Use exactly the template's five headings. What is out of scope goes under **Proposed outcome**. Anything else that is unknown, unverified, or not yet decided goes under **Open questions**. Write "None" only when nothing is, and never list what the originator already answered. Show the whole draft, and name the file only as `intent/<change>/intent.md`. In plan mode you cannot write the file. Show the draft as the plan, and write the file once it is approved.
|
|
11
11
|
5. **Gate: the originator corrects the draft.** Ask whether it matches what they meant, and revise until they say yes. Commit nothing, push nothing, and open no pull request before that yes. In plan mode, the originator approving the plan is that yes.
|
|
12
12
|
6. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests.
|
|
13
13
|
7. **Gate: the product owner accepts or rejects the intent.** The product owner merges the pull request to accept the intent, or closes it to reject it. You do neither. The file stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the spec's pull request sets it. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
|
|
7
7
|
# SDLC help
|
|
8
8
|
|
|
9
|
-
1. When the message asks for work rather than how, open no project file. The whole reply is two lines
|
|
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` followed by their own words.
|
|
10
10
|
2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` 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
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
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,6 +13,18 @@ type GateCase = {
|
|
|
13
13
|
releaseApproval?: string;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
const repositoryVariables = execFileSync("git", ["rev-parse", "--local-env-vars"], {
|
|
17
|
+
encoding: "utf8",
|
|
18
|
+
}).split("\n");
|
|
19
|
+
|
|
20
|
+
const childEnvironment = {
|
|
21
|
+
...process.env,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
for (const name of repositoryVariables) {
|
|
25
|
+
delete childEnvironment[name];
|
|
26
|
+
}
|
|
27
|
+
|
|
16
28
|
const shellGate = ".agents/hooks/agent-shell-gate.sh";
|
|
17
29
|
const constitutionGate = ".cursor/hooks/agent-constitution-gate.sh";
|
|
18
30
|
const mcpGate = ".agents/hooks/agent-mcp-gate.sh";
|
|
@@ -343,6 +355,7 @@ function createRepository(branch: string, committedFiles: string[]): string {
|
|
|
343
355
|
...gitArguments,
|
|
344
356
|
],
|
|
345
357
|
{
|
|
358
|
+
env: childEnvironment,
|
|
346
359
|
stdio: "ignore",
|
|
347
360
|
},
|
|
348
361
|
);
|
|
@@ -546,7 +559,7 @@ const cases: GateCase[] = [
|
|
|
546
559
|
const failures = cases.filter(gateCase => {
|
|
547
560
|
const result = spawnSync(gateCase.gate, {
|
|
548
561
|
env: {
|
|
549
|
-
...
|
|
562
|
+
...childEnvironment,
|
|
550
563
|
CLAUDE_PROJECT_DIR: gateCase.projectDirectory ?? process.cwd(),
|
|
551
564
|
CURSOR_PROJECT_DIR: gateCase.projectDirectory ?? process.cwd(),
|
|
552
565
|
RELEASE_APPROVAL: gateCase.releaseApproval,
|
|
@@ -104,6 +104,18 @@ const allowedTools = [
|
|
|
104
104
|
"Skill",
|
|
105
105
|
];
|
|
106
106
|
|
|
107
|
+
const repositoryVariables = execFileSync("git", ["rev-parse", "--local-env-vars"], {
|
|
108
|
+
encoding: "utf8",
|
|
109
|
+
}).split("\n");
|
|
110
|
+
|
|
111
|
+
const childEnvironment = {
|
|
112
|
+
...process.env,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
for (const name of repositoryVariables) {
|
|
116
|
+
delete childEnvironment[name];
|
|
117
|
+
}
|
|
118
|
+
|
|
107
119
|
/**
|
|
108
120
|
* Run git in a directory.
|
|
109
121
|
* @param directory Working directory.
|
|
@@ -113,6 +125,7 @@ const allowedTools = [
|
|
|
113
125
|
function runGit(directory: string, gitArguments: string[]): string {
|
|
114
126
|
return execFileSync("git", gitArguments, {
|
|
115
127
|
cwd: directory,
|
|
128
|
+
env: childEnvironment,
|
|
116
129
|
encoding: "utf8",
|
|
117
130
|
stdio: ["ignore", "pipe", "pipe"],
|
|
118
131
|
}).trim();
|
|
@@ -796,6 +809,7 @@ function runAgent(directory: string, prompt: string, timeoutSeconds: number): Ag
|
|
|
796
809
|
],
|
|
797
810
|
{
|
|
798
811
|
cwd: directory,
|
|
812
|
+
env: childEnvironment,
|
|
799
813
|
encoding: "utf8",
|
|
800
814
|
stdio: ["ignore", "pipe", "pipe"],
|
|
801
815
|
maxBuffer: 64 * 1024 * 1024,
|
|
@@ -952,14 +966,11 @@ function isRejectedCheck(entry: unknown): boolean {
|
|
|
952
966
|
}
|
|
953
967
|
}
|
|
954
968
|
|
|
955
|
-
const thaiWord = String.raw`[\u0E00-\u0E7F]{5}`;
|
|
956
969
|
const numberedLines = "1. first\n2. second\n";
|
|
957
970
|
|
|
958
971
|
const replyExpectations: Expectation[] = [
|
|
959
972
|
[makeCheck("reply_matches", "^2\\. second$"), true, numberedLines],
|
|
960
973
|
[makeCheck("reply_matches", "^second$"), false, numberedLines],
|
|
961
|
-
[makeCheck("reply_matches", thaiWord), true, "สวัสดีครับ"],
|
|
962
|
-
[makeCheck("reply_matches", thaiWord), false, "hello"],
|
|
963
974
|
[makeCheck("reply_lacks", "/home/"), true, "src/a.ts"],
|
|
964
975
|
[makeCheck("reply_lacks", "/home/"), false, "see /home/me/a.ts"],
|
|
965
976
|
];
|
|
@@ -1077,7 +1088,7 @@ function buildSelfTests(scratch: string): SelfTest[] {
|
|
|
1077
1088
|
passes: () => isFixtureApplied,
|
|
1078
1089
|
},
|
|
1079
1090
|
{
|
|
1080
|
-
name: "a run that changed nothing passes the no_* checks, and the reply checks read line anchors
|
|
1091
|
+
name: "a run that changed nothing passes the no_* checks, and the reply checks read line anchors",
|
|
1081
1092
|
passes: () => isUnchanged,
|
|
1082
1093
|
},
|
|
1083
1094
|
{
|
|
@@ -36,7 +36,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
|
|
|
36
36
|
5. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
|
|
37
37
|
6. **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 end with the message that would start it: `/sdlc` followed by their own words.
|
|
38
38
|
7. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
|
|
39
|
-
8. **Write replies a person can check.**
|
|
39
|
+
8. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and 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.
|
|
40
40
|
9. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
|
|
41
41
|
|
|
42
42
|
## Things Claude gets wrong
|
|
@@ -48,24 +48,24 @@
|
|
|
48
48
|
"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"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@nestjs/common": "12.3.
|
|
52
|
-
"@nestjs/core": "12.3.
|
|
53
|
-
"@nestjs/platform-express": "12.3.
|
|
51
|
+
"@nestjs/common": "12.3.3",
|
|
52
|
+
"@nestjs/core": "12.3.3",
|
|
53
|
+
"@nestjs/platform-express": "12.3.3",
|
|
54
54
|
"@nestjs/terminus": "12.1.0",
|
|
55
55
|
"reflect-metadata": "0.2.2",
|
|
56
56
|
"rxjs": "7.8.2"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@commitlint/cli": "21.2.4",
|
|
60
|
-
"@nestjs/testing": "12.3.
|
|
60
|
+
"@nestjs/testing": "12.3.3",
|
|
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
64
|
"@swc/core": "1.16.22",
|
|
65
65
|
"@types/node": "26.6.6",
|
|
66
66
|
"@types/supertest": "7.2.1",
|
|
67
|
-
"@vitest/coverage-v8": "5.0
|
|
68
|
-
"dependency-cruiser": "18.7.
|
|
67
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
68
|
+
"dependency-cruiser": "18.7.2",
|
|
69
69
|
"editorconfig-checker": "7.0.0",
|
|
70
70
|
"eslint": "10.14.0",
|
|
71
71
|
"fast-check": "4.10.2",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"sort-package-json": "4.1.0",
|
|
78
78
|
"supertest": "7.3.1",
|
|
79
79
|
"typescript": "7.0.2",
|
|
80
|
-
"vitest": "5.0
|
|
80
|
+
"vitest": "5.1.0",
|
|
81
81
|
"yaml": "2.9.1"
|
|
82
82
|
},
|
|
83
83
|
"packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
|
|
@@ -36,7 +36,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
|
|
|
36
36
|
5. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
|
|
37
37
|
6. **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 end with the message that would start it: `/sdlc` followed by their own words.
|
|
38
38
|
7. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
|
|
39
|
-
8. **Write replies a person can check.**
|
|
39
|
+
8. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and 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.
|
|
40
40
|
9. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
|
|
41
41
|
|
|
42
42
|
## Things Claude gets wrong
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"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"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"next": "16.4.
|
|
45
|
+
"next": "16.4.5",
|
|
46
46
|
"react": "19.3.1",
|
|
47
47
|
"react-dom": "19.3.1"
|
|
48
48
|
},
|
|
@@ -51,15 +51,15 @@
|
|
|
51
51
|
"@next-friday/commitlint-config-friday": "4.0.0",
|
|
52
52
|
"@next-friday/eslint-config-friday": "5.1.0",
|
|
53
53
|
"@next-friday/prettier-config-friday": "4.0.0",
|
|
54
|
-
"@next/eslint-plugin-next": "16.4.
|
|
54
|
+
"@next/eslint-plugin-next": "16.4.5",
|
|
55
55
|
"@playwright/test": "1.64.1",
|
|
56
56
|
"@swc/core": "1.16.22",
|
|
57
|
-
"@tailwindcss/postcss": "4.3.
|
|
57
|
+
"@tailwindcss/postcss": "4.3.4",
|
|
58
58
|
"@types/node": "26.6.6",
|
|
59
59
|
"@types/react": "19.3.0",
|
|
60
60
|
"@types/react-dom": "19.3.0",
|
|
61
|
-
"@vitest/coverage-v8": "5.0
|
|
62
|
-
"dependency-cruiser": "18.7.
|
|
61
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
62
|
+
"dependency-cruiser": "18.7.2",
|
|
63
63
|
"editorconfig-checker": "7.0.0",
|
|
64
64
|
"eslint": "10.14.0",
|
|
65
65
|
"husky": "9.1.7",
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
"prettier": "3.9.10",
|
|
70
70
|
"prettier-plugin-tailwindcss": "0.8.1",
|
|
71
71
|
"sort-package-json": "4.1.0",
|
|
72
|
-
"tailwindcss": "4.3.
|
|
72
|
+
"tailwindcss": "4.3.4",
|
|
73
73
|
"typescript": "7.0.2",
|
|
74
|
-
"vitest": "5.0
|
|
74
|
+
"vitest": "5.1.0",
|
|
75
75
|
"yaml": "2.9.1"
|
|
76
76
|
},
|
|
77
77
|
"packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
|
|
@@ -35,7 +35,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
|
|
|
35
35
|
4. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
|
|
36
36
|
5. **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 end with the message that would start it: `/sdlc` followed by their own words.
|
|
37
37
|
6. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
|
|
38
|
-
7. **Write replies a person can check.**
|
|
38
|
+
7. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and 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.
|
|
39
39
|
8. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
|
|
40
40
|
|
|
41
41
|
## Things Claude gets wrong
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"@next-friday/prettier-config-friday": "4.0.0",
|
|
49
49
|
"@swc/core": "1.16.22",
|
|
50
50
|
"@types/node": "26.6.6",
|
|
51
|
-
"@vitest/coverage-v8": "5.0
|
|
52
|
-
"dependency-cruiser": "18.7.
|
|
51
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
52
|
+
"dependency-cruiser": "18.7.2",
|
|
53
53
|
"editorconfig-checker": "7.0.0",
|
|
54
54
|
"eslint": "10.14.0",
|
|
55
55
|
"fast-check": "4.10.2",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"prettier": "3.9.10",
|
|
61
61
|
"sort-package-json": "4.1.0",
|
|
62
62
|
"typescript": "7.0.2",
|
|
63
|
-
"vitest": "5.0
|
|
63
|
+
"vitest": "5.1.0",
|
|
64
64
|
"yaml": "2.9.1"
|
|
65
65
|
},
|
|
66
66
|
"packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
|
|
@@ -39,7 +39,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
|
|
|
39
39
|
6. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
|
|
40
40
|
7. **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 end with the message that would start it: `/sdlc` followed by their own words.
|
|
41
41
|
8. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
|
|
42
|
-
9. **Write replies a person can check.**
|
|
42
|
+
9. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and 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.
|
|
43
43
|
10. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
|
|
44
44
|
|
|
45
45
|
## Things Claude gets wrong
|
|
@@ -47,11 +47,11 @@
|
|
|
47
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,14 +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
66
|
"@swc/core": "1.16.22",
|
|
67
67
|
"@types/node": "26.6.6",
|
|
68
68
|
"@types/react": "19.3.0",
|
|
69
69
|
"@types/react-dom": "19.3.0",
|
|
70
|
-
"@vitest/coverage-v8": "5.0
|
|
71
|
-
"dependency-cruiser": "18.7.
|
|
70
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
71
|
+
"dependency-cruiser": "18.7.2",
|
|
72
72
|
"editorconfig-checker": "7.0.0",
|
|
73
73
|
"eslint": "10.14.0",
|
|
74
74
|
"fast-check": "4.10.2",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"prettier": "3.9.10",
|
|
80
80
|
"sort-package-json": "4.1.0",
|
|
81
81
|
"typescript": "7.0.2",
|
|
82
|
-
"vitest": "5.0
|
|
82
|
+
"vitest": "5.1.0",
|
|
83
83
|
"yaml": "2.9.1"
|
|
84
84
|
},
|
|
85
85
|
"packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
|
|
@@ -41,7 +41,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
|
|
|
41
41
|
6. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
|
|
42
42
|
7. **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 end with the message that would start it: `/sdlc` followed by their own words.
|
|
43
43
|
8. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
|
|
44
|
-
9. **Write replies a person can check.**
|
|
44
|
+
9. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and 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.
|
|
45
45
|
10. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
|
|
46
46
|
|
|
47
47
|
## Things Claude gets wrong
|
|
@@ -18,22 +18,22 @@
|
|
|
18
18
|
"typecheck": "next typegen && tsc --noEmit -p tsconfig.json"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"next": "16.4.
|
|
21
|
+
"next": "16.4.5",
|
|
22
22
|
"react": "19.3.1",
|
|
23
23
|
"react-dom": "19.3.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@playwright/test": "1.64.1",
|
|
27
27
|
"@swc/core": "1.16.22",
|
|
28
|
-
"@tailwindcss/postcss": "4.3.
|
|
28
|
+
"@tailwindcss/postcss": "4.3.4",
|
|
29
29
|
"@types/node": "26.6.6",
|
|
30
30
|
"@types/react": "19.3.0",
|
|
31
31
|
"@types/react-dom": "19.3.0",
|
|
32
|
-
"@vitest/coverage-v8": "5.0
|
|
33
|
-
"dependency-cruiser": "18.7.
|
|
34
|
-
"tailwindcss": "4.3.
|
|
32
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
33
|
+
"dependency-cruiser": "18.7.2",
|
|
34
|
+
"tailwindcss": "4.3.4",
|
|
35
35
|
"typescript": "7.0.2",
|
|
36
|
-
"vitest": "5.0
|
|
36
|
+
"vitest": "5.1.0"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=24.22.1 <25"
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"typecheck": "next typegen && tsc --noEmit -p tsconfig.json"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@payloadcms/db-postgres": "3.
|
|
27
|
-
"@payloadcms/next": "3.
|
|
28
|
-
"@payloadcms/richtext-lexical": "3.
|
|
29
|
-
"next": "16.4.
|
|
30
|
-
"payload": "3.
|
|
26
|
+
"@payloadcms/db-postgres": "3.93.0",
|
|
27
|
+
"@payloadcms/next": "3.93.0",
|
|
28
|
+
"@payloadcms/richtext-lexical": "3.93.0",
|
|
29
|
+
"next": "16.4.5",
|
|
30
|
+
"payload": "3.93.0",
|
|
31
31
|
"react": "19.3.1",
|
|
32
32
|
"react-dom": "19.3.1",
|
|
33
33
|
"sharp": "0.35.5"
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"@types/node": "26.6.6",
|
|
39
39
|
"@types/react": "19.3.0",
|
|
40
40
|
"@types/react-dom": "19.3.0",
|
|
41
|
-
"@vitest/coverage-v8": "5.0
|
|
42
|
-
"dependency-cruiser": "18.7.
|
|
41
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
42
|
+
"dependency-cruiser": "18.7.2",
|
|
43
43
|
"fast-check": "4.10.2",
|
|
44
44
|
"typescript": "7.0.2",
|
|
45
|
-
"vitest": "5.0
|
|
45
|
+
"vitest": "5.1.0"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=24.22.1 <25"
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"@next-friday/commitlint-config-friday": "4.0.0",
|
|
51
51
|
"@next-friday/eslint-config-friday": "5.1.0",
|
|
52
52
|
"@next-friday/prettier-config-friday": "4.0.0",
|
|
53
|
-
"@next/eslint-plugin-next": "16.4.
|
|
53
|
+
"@next/eslint-plugin-next": "16.4.5",
|
|
54
54
|
"@types/node": "26.6.6",
|
|
55
55
|
"editorconfig-checker": "7.0.0",
|
|
56
56
|
"eslint": "10.14.0",
|