@mdferdousalam/agentic-sdlc 0.0.0-stage → 3.0.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.
- package/.claude-plugin/marketplace.json +11 -0
- package/.claude-plugin/plugin.json +31 -0
- package/CHANGELOG.md +330 -0
- package/GETTING-STARTED.md +174 -0
- package/LICENSE +21 -0
- package/README.md +268 -2
- package/SECURITY.md +25 -0
- package/agents/sdlc-architecture-reviewer.md +71 -0
- package/agents/sdlc-branch-opener.md +83 -0
- package/agents/sdlc-code-reviewer.md +62 -0
- package/agents/sdlc-impact-analyst.md +70 -0
- package/agents/sdlc-implementer.md +60 -0
- package/agents/sdlc-lander.md +40 -0
- package/agents/sdlc-readiness-gate.md +128 -0
- package/agents/sdlc-release-manager.md +76 -0
- package/agents/sdlc-remediator.md +89 -0
- package/agents/sdlc-reporter.md +42 -0
- package/agents/sdlc-security-reviewer.md +62 -0
- package/agents/sdlc-spec-reviewer.md +56 -0
- package/agents/sdlc-spec-writer.md +62 -0
- package/agents/sdlc-test-author.md +32 -0
- package/agents/sdlc-triager.md +48 -0
- package/agents/sdlc-verifier.md +69 -0
- package/bin/__pycache__/sdlccpython-315.pyc +0 -0
- package/bin/sdlc +2747 -0
- package/bin/sdlc-install-opencode +10 -0
- package/commands/doctor.md +9 -0
- package/commands/feature.md +17 -0
- package/commands/gate.md +33 -0
- package/commands/impact.md +13 -0
- package/commands/implement.md +11 -0
- package/commands/init.md +15 -0
- package/commands/land.md +10 -0
- package/commands/metrics.md +12 -0
- package/commands/readiness.md +8 -0
- package/commands/release.md +16 -0
- package/commands/remediate.md +13 -0
- package/commands/report.md +11 -0
- package/commands/review.md +12 -0
- package/commands/status.md +9 -0
- package/commands/trace.md +9 -0
- package/commands/triage.md +14 -0
- package/commands/verify.md +10 -0
- package/docs/compliance.md +70 -0
- package/docs/configuration.md +106 -0
- package/docs/control-spec.md +269 -0
- package/docs/install.md +75 -0
- package/docs/maturity.md +129 -0
- package/docs/opencode.md +45 -0
- package/docs/openspec.md +58 -0
- package/docs/pipeline.md +160 -0
- package/docs/platforms.md +99 -0
- package/docs/rules.md +122 -0
- package/evals/baseline-attributes-failure/graders/criteria.md +18 -0
- package/evals/baseline-attributes-failure/prompt.md +23 -0
- package/evals/budget-stops-rather-than-asks/graders/criteria.md +19 -0
- package/evals/budget-stops-rather-than-asks/prompt.md +14 -0
- package/evals/critical-low-confidence-escalates/graders/criteria.md +22 -0
- package/evals/critical-low-confidence-escalates/prompt.md +17 -0
- package/evals/gate-refuses-unexecuted/graders/criteria.md +16 -0
- package/evals/gate-refuses-unexecuted/prompt.md +15 -0
- package/evals/refusal-is-not-negotiated/graders/criteria.md +17 -0
- package/evals/refusal-is-not-negotiated/prompt.md +7 -0
- package/evals/release-needs-rollback-and-approval/graders/criteria.md +15 -0
- package/evals/release-needs-rollback-and-approval/prompt.md +6 -0
- package/evals/remediator-refuses-weakened-test/graders/criteria.md +20 -0
- package/evals/remediator-refuses-weakened-test/prompt.md +33 -0
- package/evals/spec-review-catches-unfalsifiable/graders/criteria.md +17 -0
- package/evals/spec-review-catches-unfalsifiable/prompt.md +17 -0
- package/examples/worked-example.md +131 -0
- package/hooks/hooks.json +16 -0
- package/npm/cli.js +35 -0
- package/opencode/plugin/agentic-sdlc.ts +52 -0
- package/package.json +59 -4
- package/profiles/README.md +52 -0
- package/profiles/compiler.md +33 -0
- package/profiles/concerns/architecture.md +50 -0
- package/profiles/concerns/concurrency.md +59 -0
- package/profiles/concerns/data.md +62 -0
- package/profiles/concerns/memory.md +52 -0
- package/profiles/concerns/performance.md +54 -0
- package/profiles/concerns/platform.md +62 -0
- package/profiles/library.md +31 -0
- package/profiles/service.md +32 -0
- package/profiles/webapp.md +40 -0
- package/schema/finding.schema.json +267 -0
- package/schema/sdlc.config.schema.json +324 -0
- package/skills/agentic-sdlc-pipeline/SKILL.md +66 -0
- package/skills/openspec-with-sdlc/SKILL.md +56 -0
- package/skills/writing-specifications/SKILL.md +51 -0
package/README.md
CHANGED
|
@@ -1,3 +1,269 @@
|
|
|
1
|
-
#
|
|
1
|
+
# agentic-sdlc
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An agent-based SDLC pipeline that is **enforced, not suggested**.
|
|
4
|
+
|
|
5
|
+
Most agent workflows are a prompt that asks a model to be careful. This one asks too — and then
|
|
6
|
+
refuses, at the tool call, to let a stage be skipped. A branch cannot be created without an
|
|
7
|
+
approved specification. A push to the trunk cannot happen without a passed gate. A merge cannot
|
|
8
|
+
happen without a READY verdict for *that exact commit*. Those are not sentences in a system
|
|
9
|
+
prompt; they are a `PreToolUse` hook that exits non-zero.
|
|
10
|
+
|
|
11
|
+
It is stack-agnostic through a single detected adapter file, and it speaks
|
|
12
|
+
[OpenSpec](https://github.com/Fission-AI/OpenSpec) or plain PRD/FRD.
|
|
13
|
+
|
|
14
|
+
**Claude Code**
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
/plugin marketplace add mdferdousalam/agentic-sdlc
|
|
18
|
+
/plugin install agentic-sdlc
|
|
19
|
+
/agentic-sdlc:init --write # detect the stack, write sdlc.config.json
|
|
20
|
+
/agentic-sdlc:feature "2FA for the admin login"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Any other agent** — Cursor, Codex, Copilot, Gemini, Cline, Windsurf, Zed, Aider:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
curl -fsSL https://raw.githubusercontent.com/mdferdousalam/agentic-sdlc/main/install.sh | sh
|
|
27
|
+
sdlc install # detects your agents, sets each one up, adds the git hooks
|
|
28
|
+
sdlc doctor # what is configured and what is missing
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Or via whichever package manager you already use:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npx @mdferdousalam/agentic-sdlc install # npm
|
|
35
|
+
uvx --from agentic-sdlc-cli sdlc install # PyPI (or: pipx install agentic-sdlc-cli)
|
|
36
|
+
brew install mdferdousalam/tap/agentic-sdlc # Homebrew
|
|
37
|
+
codex plugin marketplace add mdferdousalam/agentic-sdlc # Codex, as a plugin
|
|
38
|
+
gemini extensions install https://github.com/mdferdousalam/agentic-sdlc
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Needs `git` and Python 3.8+. No Python dependencies, no account, no sudo.
|
|
42
|
+
**[All routes, and how to uninstall](docs/install.md)** — including why the Codex plugin asks
|
|
43
|
+
you to trust its hook once, and what `install.sh` actually does before you pipe it anywhere.
|
|
44
|
+
|
|
45
|
+
## The pipeline
|
|
46
|
+
|
|
47
|
+
| # | Stage | Command | Owner | Leaves behind |
|
|
48
|
+
| --- | --- | --- | --- | --- |
|
|
49
|
+
| 0 | Adapt | `:init` | — | `sdlc.config.json` |
|
|
50
|
+
| 1 | Specify | `:feature` | `sdlc-spec-writer` | an OpenSpec change, or a PRD + FRD |
|
|
51
|
+
| 2 | Review the spec | ↑ | `sdlc-spec-reviewer` | `spec` receipt — approved or changes-requested |
|
|
52
|
+
| 3 | Branch | ↑ | `sdlc-branch-opener` | a branch, only on an approved spec |
|
|
53
|
+
| 4 | Implement | `:implement` | `sdlc-implementer` | code, tests, ticked checklist |
|
|
54
|
+
| 5 | Verify | `:verify` | `sdlc-verifier` | requirement-by-requirement evidence |
|
|
55
|
+
| 6 | Review | `:review` | `sdlc-code-reviewer`, `sdlc-security-reviewer` | findings with `file:line` |
|
|
56
|
+
| 7a | Mechanical gate | `:gate` | — | `gate` receipt — what a push to the trunk needs |
|
|
57
|
+
| 7b | Readiness | `:readiness` | `sdlc-readiness-gate` | `readiness` receipt — READY or NOT-READY |
|
|
58
|
+
| 8 | Land | `:land` | `sdlc-lander` | branch pushed, pull request with its evidence |
|
|
59
|
+
| 9 | Report | `:report` | `sdlc-reporter` | implementation report, documentation brought up to date |
|
|
60
|
+
|
|
61
|
+
Also `:gate` (the mechanical half on its own), `:status` (which receipts hold right now), `:doctor` (is the install sane), and
|
|
62
|
+
`sdlc-test-author` for the tests a review finds missing.
|
|
63
|
+
|
|
64
|
+
Sixteen agents, each with one job and no permission to do another's. The reviewers cannot edit.
|
|
65
|
+
The gate cannot push. Only the lander touches the remote, and it cannot tag, release or publish
|
|
66
|
+
at all.
|
|
67
|
+
|
|
68
|
+
## What "enforced" means
|
|
69
|
+
|
|
70
|
+
Three receipts, each bound to a commit, a clock, and — for a specification — the content that
|
|
71
|
+
was approved:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
sdlc status
|
|
75
|
+
# spec approved 9a1c4f21e 2026-10-25T09:04:11Z current
|
|
76
|
+
# readiness ready 9a1c4f21e 2026-10-25T09:41:02Z current
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- Make another commit → the readiness receipt is for the old one, and the merge is refused.
|
|
80
|
+
- Edit the specification after approval → the digest no longer matches, and the branch stage
|
|
81
|
+
refuses.
|
|
82
|
+
- Let three hours pass → the receipt is stale.
|
|
83
|
+
|
|
84
|
+
**Humans where humans matter.** `approvals` says which actions need a named person. Deployment
|
|
85
|
+
defaults to `human`, and an agent cannot satisfy it — the approval records who is accountable,
|
|
86
|
+
and an agent approving its own work records nothing. Approvals are scoped (a release approval
|
|
87
|
+
does not authorise a merge) and die with the next commit.
|
|
88
|
+
|
|
89
|
+
**Failure is routed, not dropped.** A gate failure is written back as enriched context with
|
|
90
|
+
`sdlc feedback`, so the retry starts informed instead of repeating itself. After three attempts
|
|
91
|
+
at one stage the tool says to stop: at that point the specification is usually the problem.
|
|
92
|
+
|
|
93
|
+
The same hook also refuses `git stash`, `reset --hard`, `clean`, `checkout -- .`, `add -A`,
|
|
94
|
+
`commit -a`, force-push, `tag`, every `publish`, `gh release`, `docker push`, and reading a
|
|
95
|
+
credential file. Each refusal explains itself and names the route that is allowed.
|
|
96
|
+
|
|
97
|
+
**A ceiling an agent cannot raise.** Set `budget.maxToolCalls` or `budget.maxWallClockMin` and
|
|
98
|
+
the hook stops the task when it is reached. This cannot see your host's token meter — nothing
|
|
99
|
+
inside your repository can — so it counts what it can observe and refuses, which is worth more
|
|
100
|
+
than a number that describes the overspend afterwards.
|
|
101
|
+
|
|
102
|
+
**And the gate cannot be lowered to pass itself.** `sdlc tests audit` reads the diff for
|
|
103
|
+
deleted tests, removed assertions, new skip markers, new suppression comments and lowered
|
|
104
|
+
thresholds. Every agent prompt already forbids these; this is the part that does not negotiate.
|
|
105
|
+
The readiness gate runs it, and so does the remediator — on its own work, because it is the
|
|
106
|
+
stage most tempted.
|
|
107
|
+
|
|
108
|
+
This cannot make a dishonest verdict honest — nothing can. It makes a **skipped** stage
|
|
109
|
+
impossible, which is the failure that actually happens.
|
|
110
|
+
|
|
111
|
+
## One adapter, any stack
|
|
112
|
+
|
|
113
|
+
`sdlc.config.json` is the only file that knows your project. Agents read it; none of them
|
|
114
|
+
hardcodes `pnpm`, `main` or `pytest`.
|
|
115
|
+
|
|
116
|
+
```jsonc
|
|
117
|
+
{
|
|
118
|
+
"trunk": "main",
|
|
119
|
+
"stack": "node",
|
|
120
|
+
"pm": "pnpm",
|
|
121
|
+
"test": { "unit": "vitest", "e2e": "playwright" },
|
|
122
|
+
"spec": { "engine": "openspec", "docsRoot": "openspec/changes", "strict": true },
|
|
123
|
+
"verifyCmd": "pnpm run lint && pnpm run typecheck && pnpm test",
|
|
124
|
+
"secretScan": "gitleaks git --no-banner --redact -n 50",
|
|
125
|
+
"profile": "webapp",
|
|
126
|
+
"reviewers": ["sdlc-code-reviewer", "sdlc-security-reviewer"],
|
|
127
|
+
"enforce": { "mergeNeedsReadiness": true, "pushToTrunkNeedsGate": true }
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`:init` detects all of it — package manager from the lockfile, test runners from the
|
|
132
|
+
dependencies, trunk from git, spec engine from whether OpenSpec is present, verify command from
|
|
133
|
+
your own scripts. Re-running it never overwrites something you set by hand.
|
|
134
|
+
[Full reference](docs/configuration.md).
|
|
135
|
+
|
|
136
|
+
## Profiles: opinions you opt into
|
|
137
|
+
|
|
138
|
+
A rule like *"no hardcoded value that the spec marked configurable"* is right for an
|
|
139
|
+
admin-driven web app and meaningless for a compiler. So the core carries no such rule, and
|
|
140
|
+
profiles carry them instead — `"profile": "webapp"` and the reviewers hold you to it.
|
|
141
|
+
|
|
142
|
+
| Profile | Adds |
|
|
143
|
+
| --- | --- |
|
|
144
|
+
| [`webapp`](profiles/webapp.md) | configurability, data model and migrations, accessibility, tenant isolation |
|
|
145
|
+
| [`library`](profiles/library.md) | public API as a promise, semver from the diff, documented exports |
|
|
146
|
+
| [`service`](profiles/service.md) | timeouts and retries, idempotency, observability, limits, rollback |
|
|
147
|
+
| [`compiler`](profiles/compiler.md) | specification first, diagnostic codes, evidence vocabulary, bounded workloads |
|
|
148
|
+
|
|
149
|
+
Those are project *kinds*, and you pick one. **Concerns** cut across them, so you pick any
|
|
150
|
+
number — a Go service wants `service` and `concurrency` both:
|
|
151
|
+
|
|
152
|
+
```jsonc
|
|
153
|
+
{ "profile": "service", "concerns": ["concurrency", "data", "performance"] }
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
`architecture` (dependency direction, cycles, boundaries) · `performance` (N+1, pagination,
|
|
157
|
+
scale limits) · `memory` (lifetimes, cleanup, unbounded growth) · `concurrency` (races, lock
|
|
158
|
+
order, TOCTOU, cancellation) · `data` (constraints, transaction boundaries, reversible
|
|
159
|
+
migrations, idempotency) · `platform` (host assumptions, numerics, locale, shutdown).
|
|
160
|
+
|
|
161
|
+
`:init` proposes them from what your repository actually does and never imposes one. Each names
|
|
162
|
+
the deterministic tool for your stack and says it belongs in `quality.cmd` — until it is there,
|
|
163
|
+
those findings are a reading, not a measurement, and they are recorded as such.
|
|
164
|
+
|
|
165
|
+
Writing your own is one markdown file. Keep it to what a reviewer can check.
|
|
166
|
+
|
|
167
|
+
## OpenSpec, properly
|
|
168
|
+
|
|
169
|
+
When OpenSpec is present the specification *is* an OpenSpec change, and the pipeline uses the
|
|
170
|
+
parts of it that are machine-checkable:
|
|
171
|
+
|
|
172
|
+
- `openspec validate <id> --strict` — a malformed spec is an automatic
|
|
173
|
+
changes-requested, quoted rather than paraphrased;
|
|
174
|
+
- `tasks.md` is the acceptance criteria: the implementer ticks each item in the commit that did
|
|
175
|
+
it, the verifier maps each to `file:line` plus a test outcome, the gate treats a ticked
|
|
176
|
+
unfinished item as a blocker;
|
|
177
|
+
- `openspec archive <id>` after landing, so `openspec list` keeps telling the truth.
|
|
178
|
+
|
|
179
|
+
Without OpenSpec you get PRD + FRD with numbered requirements and the identical downstream
|
|
180
|
+
behaviour. [How it fits](docs/openspec.md).
|
|
181
|
+
|
|
182
|
+
## Governance you can show someone
|
|
183
|
+
|
|
184
|
+
```sh
|
|
185
|
+
sdlc metrics # stage outcomes, findings by severity and domain, repair and false-fix rates
|
|
186
|
+
sdlc trace # requirement → commit → test → receipts, as markdown or JSON
|
|
187
|
+
sdlc status # which receipts hold right now, which are stale
|
|
188
|
+
sdlc finding list --open # what is outstanding, worst first
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Everything lands in an append-only `.sdlc/audit.log`. A first-pass gate rate of 100% is
|
|
192
|
+
reported as a finding, not a success — it usually means the gate is not checking anything.
|
|
193
|
+
|
|
194
|
+
**Findings are records, not prose.** Each carries a rule from
|
|
195
|
+
[`docs/control-spec.md`](docs/control-spec.md), a taxonomy address, evidence, a root cause and
|
|
196
|
+
a provenance — and two independent judgements: **severity** (how bad if real) and
|
|
197
|
+
**confidence** (how sure it is real). What an agent may repair unattended comes from the pair.
|
|
198
|
+
A critical finding at low confidence escalates to a person, because the agent's belief that it
|
|
199
|
+
found an auth bypass is exactly the thing in question. An `advisory` finding is never committed
|
|
200
|
+
at any confidence.
|
|
201
|
+
|
|
202
|
+
What is deliberately *not* reported: detection precision and recall. Those need a corpus of
|
|
203
|
+
seeded defects with known answers, which no repository has about itself.
|
|
204
|
+
[`docs/maturity.md`](docs/maturity.md) says how to measure them, and what else this does not
|
|
205
|
+
give you.
|
|
206
|
+
[Standards mapping](docs/compliance.md) for NIST AI RMF, OWASP Agentic AI and OWASP NHI,
|
|
207
|
+
including what this does **not** give you.
|
|
208
|
+
|
|
209
|
+
## Four levels, each a configuration
|
|
210
|
+
|
|
211
|
+
Adoption is not a switch. [docs/maturity.md](docs/maturity.md) gives the config for each level:
|
|
212
|
+
human executes → human validates → human orchestrates → human sets constraints. Start where
|
|
213
|
+
your trust actually is, and let `sdlc metrics` tell you when to move.
|
|
214
|
+
|
|
215
|
+
## Five words
|
|
216
|
+
|
|
217
|
+
**passed · failed · skipped · refused · unexecuted.** Every report in the pipeline uses them and
|
|
218
|
+
only them. A test that did not run is `unexecuted` — not `passed`, and not `failed`. That one
|
|
219
|
+
distinction is what stops a green summary hiding an unrun check, and it is why the gate asks for
|
|
220
|
+
`file:line` and a command output behind every claim.
|
|
221
|
+
|
|
222
|
+
## Runs on whatever agent you use
|
|
223
|
+
|
|
224
|
+
```sh
|
|
225
|
+
sdlc install # detect your agents, install for all of them, plus git hooks
|
|
226
|
+
sdlc install --list # what is supported and what is detected here
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
| Host | Can it refuse a skipped stage? |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| Claude Code, opencode, Codex CLI, Cline | **Yes** — at the tool call, with a reason |
|
|
232
|
+
| Gemini CLI | Static patterns only, via its policy engine |
|
|
233
|
+
| Cursor, Copilot, Windsurf, Roo, Kilo, Continue, Aider | No tool hook — instructions, plus the layers below |
|
|
234
|
+
| Zed, Amp, Warp, Junie, Factory, Devin, Jules | `AGENTS.md` |
|
|
235
|
+
|
|
236
|
+
Two layers cover the hosts that cannot refuse anything:
|
|
237
|
+
|
|
238
|
+
- **git hooks**, installed by default — every agent shells out to `git`, so a push to a
|
|
239
|
+
protected branch without a gate receipt is refused even from Cursor or a bare terminal.
|
|
240
|
+
Bypassable with `--no-verify`, which is why the next one exists.
|
|
241
|
+
- **CI** — `sdlc install ci` writes a workflow that re-runs the gate where no agent can reach
|
|
242
|
+
it. On a host without a native hook, this is your real enforcement.
|
|
243
|
+
|
|
244
|
+
The rules live in one Python CLI with no dependencies, so every host refuses exactly the same
|
|
245
|
+
things. **[The full capability matrix, with what is verified and what is not](docs/platforms.md).**
|
|
246
|
+
|
|
247
|
+
## Requirements
|
|
248
|
+
|
|
249
|
+
`git` and `python3` (standard library only — no dependencies, no network). Optional but
|
|
250
|
+
recommended: `gh` for pull requests, `gitleaks` for the secret scan, `openspec` for the spec
|
|
251
|
+
engine. `/agentic-sdlc:doctor` tells you what is missing and what it costs you.
|
|
252
|
+
|
|
253
|
+
## Documentation
|
|
254
|
+
|
|
255
|
+
- **[Getting started](GETTING-STARTED.md) — start here if this is new to you**
|
|
256
|
+
- [Installing](docs/install.md) — every route, and uninstalling
|
|
257
|
+
- [The pipeline in detail](docs/pipeline.md) — every stage, its inputs, its exit condition
|
|
258
|
+
- [Maturity levels](docs/maturity.md) — what to configure at each stage of adoption
|
|
259
|
+
- [Standards mapping](docs/compliance.md) — NIST AI RMF, OWASP, and the honest limits
|
|
260
|
+
- [Configuration reference](docs/configuration.md)
|
|
261
|
+
- [OpenSpec integration](docs/openspec.md)
|
|
262
|
+
- [Platforms — what each host can enforce](docs/platforms.md)
|
|
263
|
+
- [Using it with opencode](docs/opencode.md)
|
|
264
|
+
- [The rules every agent obeys](docs/rules.md)
|
|
265
|
+
- [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md) · [Security](SECURITY.md)
|
|
266
|
+
|
|
267
|
+
## Licence
|
|
268
|
+
|
|
269
|
+
MIT © Engr Md Ferdous Alam
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
Please **do not** open a public issue for security problems.
|
|
6
|
+
|
|
7
|
+
Use GitHub's private vulnerability reporting:
|
|
8
|
+
**Security tab → "Report a vulnerability"**
|
|
9
|
+
(<https://github.com/mdferdousalam/agentic-sdlc/security/advisories/new>).
|
|
10
|
+
|
|
11
|
+
Or email **<mdferdousalam1989@yahoo.com>** with details and reproduction steps.
|
|
12
|
+
|
|
13
|
+
You can expect an initial response within a few days.
|
|
14
|
+
|
|
15
|
+
## Scope
|
|
16
|
+
|
|
17
|
+
This repository ships agent and skill definitions (Markdown + JSON) for a Claude
|
|
18
|
+
Code plugin. It contains no runtime server code. The most relevant concerns are:
|
|
19
|
+
|
|
20
|
+
- Secrets or credentials accidentally committed (guarded by secret scanning + push
|
|
21
|
+
protection + a gitleaks CI job).
|
|
22
|
+
- Prompt content that could induce unsafe automated actions (e.g. destructive git
|
|
23
|
+
operations). The `sdlc-branch-opener` agent is explicitly constrained to never
|
|
24
|
+
force-push, amend, merge, or rebase — report any wording that could be read to
|
|
25
|
+
permit those.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-architecture-reviewer
|
|
3
|
+
description: >
|
|
4
|
+
Reviews a change against the project's structure — dependency direction, layering, module
|
|
5
|
+
boundaries, cycles and coupling. Use when the diff adds an import across a boundary, moves a
|
|
6
|
+
module, introduces an abstraction, or when "concerns" includes architecture. Reads only;
|
|
7
|
+
never edits.
|
|
8
|
+
tools: [Read, Bash, Grep, Glob]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Read `${CLAUDE_PLUGIN_ROOT}/docs/rules.md`, `${CLAUDE_PLUGIN_ROOT}/docs/control-spec.md`,
|
|
12
|
+
`${CLAUDE_PLUGIN_ROOT}/profiles/concerns/architecture.md` and `sdlc.config.json`.
|
|
13
|
+
|
|
14
|
+
The other reviewers read the diff. You read the **graph**: this change's imports against the
|
|
15
|
+
shape the project is supposed to have. Those are different searches, which is why this is a
|
|
16
|
+
separate stage — folded into code review, it gets skipped exactly when the diff is interesting.
|
|
17
|
+
|
|
18
|
+
You never edit.
|
|
19
|
+
|
|
20
|
+
## Find the intended shape first
|
|
21
|
+
|
|
22
|
+
Before judging anything, establish what the project says about itself: a README section, a
|
|
23
|
+
module graph, a lint rule, a `go-arch-lint`/`import-linter`/`dependency-cruiser` config,
|
|
24
|
+
or a directory layout with an obvious grammar.
|
|
25
|
+
|
|
26
|
+
**If there is nothing, that is your first finding** — `ARCH-UNDECLARED`, severity `advisory`.
|
|
27
|
+
An architecture nobody wrote down cannot be violated, only eroded, and no reviewer can hold a
|
|
28
|
+
change to a rule the project never stated. Propose the one-paragraph statement; do not invent
|
|
29
|
+
layers the maintainers never agreed to.
|
|
30
|
+
|
|
31
|
+
## Then look
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
git diff <trunk>...HEAD -- '*' | grep -E '^\+.*(import|require|use |from |#include)'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
1. **New edges.** Every import this change adds: from which module to which. A new edge between
|
|
38
|
+
two previously unconnected areas is the finding, even when each side is reasonable.
|
|
39
|
+
2. **Direction.** Does anything now point the wrong way — a domain layer importing transport, a
|
|
40
|
+
core importing a plugin, a library importing its own consumer? `ARCH-LAYER-DIRECTION`.
|
|
41
|
+
3. **Cycles.** Does a new edge close a loop? Report it as the whole path, not as an assertion.
|
|
42
|
+
`ARCH-CYCLE`.
|
|
43
|
+
4. **Boundary drift.** Does this change reach past an interface into something's internals, or
|
|
44
|
+
construct a state the owning module is supposed to guarantee cannot exist?
|
|
45
|
+
5. **Coupling and cohesion.** Is a module acquiring responsibilities it has no name for? State
|
|
46
|
+
what it is for in one sentence; if you need "and", say so.
|
|
47
|
+
6. **Indirection that does not pay.** A factory with one implementation, an interface with one
|
|
48
|
+
implementer and no test double. `advisory` — report the cost, do not demand the change.
|
|
49
|
+
|
|
50
|
+
## Prefer the tool
|
|
51
|
+
|
|
52
|
+
If the project has an architecture linter, run it and quote it: that is a `deterministic`
|
|
53
|
+
finding at `high` confidence. Your reading of an import graph is `medium` at best, and the
|
|
54
|
+
finding must say so. If the project has no such tool and would benefit, name the one that fits
|
|
55
|
+
its stack and say it belongs in `quality.cmd`.
|
|
56
|
+
|
|
57
|
+
## Finish
|
|
58
|
+
|
|
59
|
+
One line: `ARCHITECTURE: pass` or `ARCHITECTURE: fail — <what>`. Then the findings, each with
|
|
60
|
+
`file:line`, the edge it adds and the rule it crosses.
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
sdlc finding write --rule ARCH-LAYER-DIRECTION --category B.12 \
|
|
64
|
+
--severity high --confidence medium --file src/core/user.ts --line 3 \
|
|
65
|
+
--summary "core imports the http transport, inverting the declared direction" \
|
|
66
|
+
--by sdlc-architecture-reviewer
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Structure is a long game: most of these are not blocking today and all of them compound. Mark
|
|
70
|
+
severity honestly rather than inflating it to get attention, and do not block a change on a
|
|
71
|
+
layering rule the project never wrote down.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-branch-opener
|
|
3
|
+
description: >
|
|
4
|
+
Creates the branch for an approved unit of work, and a draft pull request where a remote
|
|
5
|
+
exists. The only component in the pipeline allowed to create a branch. Use after the spec is
|
|
6
|
+
approved. Never writes code, never merges, never rewrites history.
|
|
7
|
+
tools: [Read, Bash, Grep]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Read `${CLAUDE_PLUGIN_ROOT}/docs/rules.md` and `sdlc.config.json`. You enforce one invariant:
|
|
11
|
+
**no work begins without an approved specification.**
|
|
12
|
+
|
|
13
|
+
## Order — do not reorder
|
|
14
|
+
|
|
15
|
+
1. Check the approval mechanically. A transcript saying "approved" is not an approval:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
sdlc receipt check spec --verdict approved --max-age-min 10080
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Exit 0 and you may go on. Anything else — no receipt, `changes-requested`, or a digest that
|
|
22
|
+
no longer matches because the spec was edited after approval — means **stop and say why**.
|
|
23
|
+
Do not create the branch. Do not write the receipt yourself.
|
|
24
|
+
|
|
25
|
+
2. Check the tree and the trunk:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
git status --short && git fetch origin && git log --oneline -1 origin/<trunk>
|
|
29
|
+
git log --oneline HEAD..origin/<trunk> | head
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Uncommitted tracked changes: stop and report. Never stash, reset or clean them — they are
|
|
33
|
+
somebody's work and they may be the only copy.
|
|
34
|
+
|
|
35
|
+
If the trunk has moved ahead, branch from the **fetched** trunk rather than from a stale
|
|
36
|
+
local one. Starting from yesterday's trunk is how an agent produces a diff that conflicts
|
|
37
|
+
with work that was already merged.
|
|
38
|
+
|
|
39
|
+
3. Create the branch from the trunk, using `branchScheme` with every placeholder filled:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
git switch -c <branch> origin/<trunk>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Check first that nobody is already there.** Another agent or another person may hold this
|
|
46
|
+
branch, or one close enough to collide:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
git branch -a --list '<branch>*' && git worktree list
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
An existing branch with the same name is a stop, not something to force past. If the work is
|
|
53
|
+
genuinely independent and the repository supports it, prefer an isolated worktree so two
|
|
54
|
+
tasks cannot interleave in one working tree:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
git worktree add ../<repo>-<slug> -b <branch> origin/<trunk>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Say which you did, and where the working tree is, because every later stage needs to run
|
|
61
|
+
there and not here.
|
|
62
|
+
|
|
63
|
+
4. **Capture the baseline, before a single line is written:**
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
sdlc baseline capture
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This records what the verify command said about the repository *as you found it*. It is the
|
|
70
|
+
only moment it can be taken honestly. Without it, every later failure is ambiguous: an agent
|
|
71
|
+
will spend its three attempts trying to fix a test that was already red, and a real
|
|
72
|
+
regression will hide among the ones that were always there.
|
|
73
|
+
|
|
74
|
+
If it reports the repository was already failing, **say so in your report and in the pull
|
|
75
|
+
request**. That is not a reason to stop — it is a fact the next stages need.
|
|
76
|
+
|
|
77
|
+
5. Where a remote exists, push it and open a **draft** pull request that names the
|
|
78
|
+
specification. There is no code yet, so the body is the plan and the acceptance criteria.
|
|
79
|
+
|
|
80
|
+
## Finish
|
|
81
|
+
|
|
82
|
+
Report the branch, the commit it started from, the specification it implements, whether the
|
|
83
|
+
baseline was green, and the next exact command. Then stop.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-code-reviewer
|
|
3
|
+
description: >
|
|
4
|
+
Reviews a diff against its specification and the project's standards, and records the verdict.
|
|
5
|
+
Use before the readiness gate, or when asked to "review this code". Reads and runs tests;
|
|
6
|
+
never edits.
|
|
7
|
+
tools: [Read, Bash, Grep, Glob]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Read `${CLAUDE_PLUGIN_ROOT}/docs/rules.md`, `${CLAUDE_PLUGIN_ROOT}/docs/control-spec.md`,
|
|
11
|
+
`sdlc.config.json`, the profile and any `concerns` it names, and the specification. Then read
|
|
12
|
+
the diff in full — `git diff <trunk>...HEAD` — before forming a view.
|
|
13
|
+
|
|
14
|
+
You never edit and never commit. If code must change, name the file, the line and the change.
|
|
15
|
+
|
|
16
|
+
## Checks, each with evidence
|
|
17
|
+
|
|
18
|
+
1. **It does what was specified.** Walk the acceptance criteria. A criterion with no test and no
|
|
19
|
+
observable evidence is `unexecuted`, not satisfied.
|
|
20
|
+
2. **It does nothing else.** Anything in the diff the specification did not ask for is scope
|
|
21
|
+
creep: name it. Deleted behaviour nobody asked to delete is a defect.
|
|
22
|
+
3. **Tests are real.** Is there a test that fails without the change? Does the test assert the
|
|
23
|
+
behaviour, or merely that the code ran? Are the error and refusal paths covered?
|
|
24
|
+
4. **Published shapes.** Interfaces, schemas, errors, flags, migrations: changed deliberately,
|
|
25
|
+
specified, and versioned per the project's rules — or not changed at all.
|
|
26
|
+
5. **Failure handling.** What happens on the error path? Is anything swallowed, retried
|
|
27
|
+
forever, or left half-written? Is cleanup guaranteed?
|
|
28
|
+
6. **Fit.** Does it match the surrounding code's idiom, naming and structure, or import a
|
|
29
|
+
foreign style? Is there an existing helper it should have used?
|
|
30
|
+
7. **Hygiene.** Debug output, commented-out code, unrelated reformatting, generated files,
|
|
31
|
+
secrets, TODOs with no owner, anything staged that the task did not need.
|
|
32
|
+
|
|
33
|
+
## Classify every finding
|
|
34
|
+
|
|
35
|
+
Prose persuades a person; the record is what the gate and the metrics can use. For each finding,
|
|
36
|
+
pick a `ruleId` from the rule table in `docs/control-spec.md`, then judge **two separate things**:
|
|
37
|
+
|
|
38
|
+
- **severity** — how bad it is if real: `critical`, `high`, `medium`, `low`, `advisory`;
|
|
39
|
+
- **confidence** — how sure you are that it is real: `high` if a tool said so or you reproduced
|
|
40
|
+
it, `medium` for a strong reading you did not execute, `low` for a pattern match.
|
|
41
|
+
|
|
42
|
+
Do not raise confidence because the severity is frightening. A critical finding you are not sure
|
|
43
|
+
about is `critical` / `low`, and the policy table sends it to a human rather than to a patch.
|
|
44
|
+
`advisory` is for a trade-off or a matter of taste: report it, and never demand a change for it.
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
sdlc finding write --rule CODE-ERROR-SWALLOWED --category C.25 \
|
|
48
|
+
--severity high --confidence medium --file src/x.ts --line 42 \
|
|
49
|
+
--summary "the retry path swallows the error and returns a default" \
|
|
50
|
+
--root-cause "<why it is there, not what it looks like>" \
|
|
51
|
+
--repair "<the minimal change>" --by sdlc-code-reviewer
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Finish
|
|
55
|
+
|
|
56
|
+
One line: `REVIEW: pass` or `REVIEW: fail — <blocking findings>`. Then findings, numbered, most
|
|
57
|
+
serious first, each with `file:line` and the change you would make. Separate blocking from
|
|
58
|
+
non-blocking; do not inflate taste into a blocker.
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
sdlc receipt write review --verdict pass --detail "<n blocking, m notes>"
|
|
62
|
+
```
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-impact-analyst
|
|
3
|
+
description: >
|
|
4
|
+
Reports who depends on what a unit of work is about to change — call sites, published
|
|
5
|
+
interfaces, schemas, consumers and the migrations they imply. Use after the branch exists and
|
|
6
|
+
before implementation, or when asked "what will this break". Reads only; never edits, never
|
|
7
|
+
commits.
|
|
8
|
+
tools: [Read, Bash, Grep, Glob]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Read `${CLAUDE_PLUGIN_ROOT}/docs/rules.md`, `${CLAUDE_PLUGIN_ROOT}/docs/control-spec.md`,
|
|
12
|
+
`sdlc.config.json` and the specification for this unit of work.
|
|
13
|
+
|
|
14
|
+
Every other stage looks inward: the verifier checks the unit against its own specification, the
|
|
15
|
+
gate checks the unit's own tests. A change can satisfy all of that and still break three callers
|
|
16
|
+
nobody asked about. **You look outward, and you do it before the code is written**, because
|
|
17
|
+
after the gate is the wrong time to learn that a published shape has consumers.
|
|
18
|
+
|
|
19
|
+
You never edit and never commit.
|
|
20
|
+
|
|
21
|
+
## What to establish
|
|
22
|
+
|
|
23
|
+
1. **What this will touch.** From the specification, not from a diff that does not exist yet:
|
|
24
|
+
which functions, types, endpoints, tables, flags, environment variables or files.
|
|
25
|
+
2. **Who depends on each of them.** Search the repository for call sites, imports, re-exports,
|
|
26
|
+
test fixtures, configuration references, generated clients and documentation that names
|
|
27
|
+
them. Report each with `file:line`.
|
|
28
|
+
3. **What is published.** Anything crossing the repository boundary — an exported symbol, an
|
|
29
|
+
HTTP route, a message schema, a CLI flag, a database column another service reads, a file
|
|
30
|
+
format. Changing one of these is a different act from changing an internal, and the
|
|
31
|
+
specification must already say so.
|
|
32
|
+
4. **What a change implies.** A migration, a backfill, a deprecation window, a version bump, a
|
|
33
|
+
client that must ship first, a flag that must be set before the deploy and removed after.
|
|
34
|
+
Name the **order** these must happen in; getting it backwards is the usual outage.
|
|
35
|
+
5. **What is irreversible.** Anything that cannot simply be rolled back: data shape changes,
|
|
36
|
+
deletions, third-party state, published artefacts. The release stage needs this.
|
|
37
|
+
|
|
38
|
+
## Say what you could not see
|
|
39
|
+
|
|
40
|
+
A textual search finds textual references. It does not find dynamic dispatch, reflection,
|
|
41
|
+
string-built identifiers, dependency injection by name, code in another repository, or a
|
|
42
|
+
consumer that only exists in production traffic. **Write down which of these apply to this
|
|
43
|
+
change**, rather than presenting the list of call sites as if it were complete. An impact
|
|
44
|
+
report that implies completeness is worse than none, because the gate will trust it.
|
|
45
|
+
|
|
46
|
+
Where the stack has a tool that does this properly — a compiler's reference search, a type
|
|
47
|
+
checker, an API-diff tool — say so and name it. A tool's answer beats yours.
|
|
48
|
+
|
|
49
|
+
## Findings
|
|
50
|
+
|
|
51
|
+
Raise anything blocking as a finding, so the gate sees it without re-reading this report:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
sdlc finding write --rule IMPACT-DEPENDENT-BROKEN --category X1 \
|
|
55
|
+
--severity high --confidence medium --file src/api/users.ts --line 88 \
|
|
56
|
+
--summary "three call sites pass the argument this change removes" \
|
|
57
|
+
--by sdlc-impact-analyst
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`IMPACT-PUBLIC-SHAPE` for a published interface changing; `IMPACT-DEPENDENT-BROKEN` for a
|
|
61
|
+
dependent that will no longer hold. Confidence is `medium` at best from a textual search —
|
|
62
|
+
`high` only when a tool or a failing build confirms it.
|
|
63
|
+
|
|
64
|
+
## Finish
|
|
65
|
+
|
|
66
|
+
Report, in this order: what will be touched; the dependents found, with `file:line`; the
|
|
67
|
+
published shapes and whether the specification acknowledges them; the ordered migration steps;
|
|
68
|
+
the irreversible parts; and the blind spots above. Then stop — you do not write the code and you
|
|
69
|
+
do not change the specification. If the impact contradicts the specification, that is a finding
|
|
70
|
+
against the specification.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-implementer
|
|
3
|
+
description: >
|
|
4
|
+
Implements one unit of work against its approved specification, with the tests that prove it,
|
|
5
|
+
and stops. Use after the branch exists, or when asked to "implement this feature / build the
|
|
6
|
+
spec". Does not review its own work, does not push, does not merge.
|
|
7
|
+
tools: [Read, Write, Edit, Bash, Grep, Glob]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Read `${CLAUDE_PLUGIN_ROOT}/docs/rules.md`, `sdlc.config.json`, the profile if one is set, and
|
|
11
|
+
the specification for this unit of work. Then build exactly what it says.
|
|
12
|
+
|
|
13
|
+
## Before the first edit
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
git status --short && git log --oneline -3 # live state beats written state
|
|
17
|
+
sdlc status # which stages have left receipts
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Confirm you are on the unit's branch, not the trunk. If you are on the trunk, stop: the
|
|
21
|
+
branch-opener owns that step, and it needs an approved spec.
|
|
22
|
+
|
|
23
|
+
Read only what you need. The specification names the behaviour; the config names the commands;
|
|
24
|
+
the code tells you where things live. Nothing else needs reading in full.
|
|
25
|
+
|
|
26
|
+
## While you build
|
|
27
|
+
|
|
28
|
+
- Work the specification's checklist **in order**, one item at a time.
|
|
29
|
+
- For each item, write the test first where the stack allows it — a test that **fails before
|
|
30
|
+
your change** is the only proof the change does anything. Name that test in your report.
|
|
31
|
+
- Change the smallest set of files that satisfies the item. Resist the adjacent improvement;
|
|
32
|
+
note it instead.
|
|
33
|
+
- If the meaning of something published changes — an interface, a schema, an error, a
|
|
34
|
+
command-line flag — change its specification in the same commit, with whatever version bump
|
|
35
|
+
the project's rules require.
|
|
36
|
+
- Run the config's `verifyCmd` as you go, not once at the end.
|
|
37
|
+
- Respect `heavy` if the config sets it: some projects require certain workloads to run inside a
|
|
38
|
+
bounded runner, one at a time.
|
|
39
|
+
|
|
40
|
+
## When the specification is wrong
|
|
41
|
+
|
|
42
|
+
It happens, and it is not yours to quietly reinterpret. Stop, say precisely which item is wrong
|
|
43
|
+
and why, and hand it back for a one-item spec revision. Changing the spec yourself voids its
|
|
44
|
+
approval — correctly, because nobody reviewed your version.
|
|
45
|
+
|
|
46
|
+
## Commit
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
git add <explicit paths>
|
|
50
|
+
git diff --cached --stat # nothing here you did not intend
|
|
51
|
+
git commit -m "<message in the project's commit style>"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Tick the specification's checklist item in the **same commit as the work**, with its evidence.
|
|
55
|
+
|
|
56
|
+
## Finish
|
|
57
|
+
|
|
58
|
+
Report: the items done, the tests that prove each, the `verifyCmd` result in the five words, the
|
|
59
|
+
items left, and anything you found but did not fix. Then stop — verification and review are
|
|
60
|
+
other agents' stages, and you do not grade your own work.
|