@kaademos/secure-sdlc 1.0.2 → 1.2.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.
@@ -29,7 +29,9 @@ Maintain awareness of applicable controls from:
29
29
  - **PCI DSS v4.0** (if payment card data is in scope)
30
30
  - **OWASP ASVS** (as the technical requirements anchor)
31
31
  - **GDPR / UK GDPR** (if personal data is processed)
32
- - **DORA** (if applicable to financial services)
32
+ - **HIPAA** (Security & Privacy Rules — if protected health information is in scope)
33
+ - **DORA** (if applicable to EU financial services)
34
+ - **FedRAMP** (NIST SP 800-53 baseline — if selling to US federal agencies)
33
35
 
34
36
  ---
35
37
 
@@ -54,10 +56,14 @@ When invoked at the start of a project or feature:
54
56
  ```markdown
55
57
  ## Control Mapping
56
58
 
57
- | ASVS Ref | Requirement | SOC 2 | ISO 27001 | NIST CSF | PCI DSS |
58
- |----------|-------------|-------|-----------|----------|---------|
59
- | V2.1.1 | Password complexity | CC6.1 | A.8.5 | PR.AC-1 | Req 8.3 |
60
- | V6.1.1 | Encryption at rest | CC6.7 | A.8.24 | PR.DS-1 | Req 3.5 |
59
+ | ASVS Ref | Requirement | SOC 2 | ISO 27001 | NIST CSF | PCI DSS | HIPAA | DORA | FedRAMP |
60
+ |----------|-------------|-------|-----------|----------|---------|-------|------|---------|
61
+ | V6.2.1 | Password complexity | CC6.1 | A.8.5 | PR.AC-1 | Req 8.3 | §164.312(d) | Art. 9 | IA-5 |
62
+ | V14.1.1 | Encryption at rest | CC6.7 | A.8.24 | PR.DS-1 | Req 3.5 | §164.312(a)(2)(iv) | Art. 9 | SC-28 |
63
+
64
+ > Only populate columns for frameworks selected in `secure-sdlc.yaml`. Add HIPAA when
65
+ > protected health information is processed, DORA for EU financial entities, and FedRAMP
66
+ > (NIST SP 800-53 control families: AC, AU, IA, SC, …) when targeting US federal agencies.
61
67
  ```
62
68
 
63
69
  ---
@@ -51,9 +51,9 @@ For each feature, produce a `docs/security-requirements.md` using this structure
51
51
 
52
52
  | ID | Requirement | ASVS Ref | Priority | Acceptance Criteria |
53
53
  |----|-------------|----------|----------|---------------------|
54
- | SR-001 | All API endpoints require authentication | V4.1.1 | MUST | Unauthenticated requests return HTTP 401 |
55
- | SR-002 | Passwords must meet complexity requirements | V2.1.1 | MUST | Passwords < 8 chars or common passwords rejected |
56
- | SR-003 | Sensitive data encrypted at rest | V6.1.1 | MUST | AES-256 or equivalent; key management documented |
54
+ | SR-001 | All API endpoints require authentication | V8.3.1 | MUST | Unauthenticated requests return HTTP 401 |
55
+ | SR-002 | Passwords must meet complexity requirements | V6.2.1 | MUST | Passwords < 8 chars or common passwords rejected |
56
+ | SR-003 | Sensitive data encrypted at rest | V14.1.1 | MUST | AES-256 or equivalent; key management documented |
57
57
 
58
58
  ### Privacy Requirements
59
59
  - [ ] Data minimisation: only collect fields required for this feature
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "secure-sdlc-agents",
3
+ "owner": {
4
+ "name": "Kaademos",
5
+ "email": "kaademos@github.com"
6
+ },
7
+ "metadata": {
8
+ "description": "A team of 8 AI security specialists embedded in your coding workflow — covering every phase of the Secure SDLC from requirements to release gating.",
9
+ "version": "1.2.0"
10
+ },
11
+ "plugins": [
12
+ {
13
+ "name": "secure-sdlc-agents",
14
+ "source": {
15
+ "source": "github",
16
+ "repo": "Kaademos/secure-sdlc-agents"
17
+ },
18
+ "description": "8 AI security specialist agents for the full Secure SDLC: threat modelling, AppSec, GRC, IaC review, AI/LLM security, and release gating. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible tool.",
19
+ "version": "1.2.0",
20
+ "author": {
21
+ "name": "Kaademos"
22
+ },
23
+ "homepage": "https://github.com/Kaademos/secure-sdlc-agents",
24
+ "repository": "https://github.com/Kaademos/secure-sdlc-agents",
25
+ "license": "MIT",
26
+ "keywords": [
27
+ "security",
28
+ "appsec",
29
+ "sdlc",
30
+ "owasp",
31
+ "asvs",
32
+ "compliance",
33
+ "threat-modeling",
34
+ "secure-coding",
35
+ "devsecops",
36
+ "grc"
37
+ ],
38
+ "category": "security",
39
+ "tags": [
40
+ "security",
41
+ "appsec",
42
+ "devsecops",
43
+ "owasp",
44
+ "compliance",
45
+ "threat-modeling",
46
+ "agent-skills"
47
+ ],
48
+ "strict": true
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "secure-sdlc-agents",
3
+ "version": "1.2.0",
4
+ "description": "A team of AI security specialists embedded in your coding workflow. 8 agents covering every phase of the Secure SDLC: requirements, threat modelling, code review, IaC security, compliance, and release gating. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible tool.",
5
+ "author": {
6
+ "name": "Kaademos",
7
+ "url": "https://github.com/Kaademos"
8
+ },
9
+ "repository": "https://github.com/Kaademos/secure-sdlc-agents",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "security",
13
+ "appsec",
14
+ "sdlc",
15
+ "owasp",
16
+ "asvs",
17
+ "compliance",
18
+ "threat-modeling",
19
+ "secure-coding"
20
+ ],
21
+ "agents": [
22
+ ".claude/agents/product-manager.md",
23
+ ".claude/agents/appsec-engineer.md",
24
+ ".claude/agents/grc-analyst.md",
25
+ ".claude/agents/cloud-platform-engineer.md",
26
+ ".claude/agents/dev-lead.md",
27
+ ".claude/agents/release-manager.md",
28
+ ".claude/agents/security-champion.md",
29
+ ".claude/agents/ai-security-engineer.md"
30
+ ]
31
+ }
@@ -241,7 +241,7 @@ jobs:
241
241
  strategy:
242
242
  fail-fast: false
243
243
  matrix:
244
- language: ['javascript-typescript', 'python']
244
+ language: ['javascript-typescript', 'python', 'ruby', 'go', 'java-kotlin']
245
245
  steps:
246
246
  - name: Checkout
247
247
  uses: actions/checkout@v4
@@ -250,25 +250,64 @@ jobs:
250
250
  id: check-lang
251
251
  run: |
252
252
  LANG="${{ matrix.language }}"
253
+ # EXISTS gates every downstream step so absent languages skip cleanly.
254
+ # BUILD_MODE tells CodeQL how to build: interpreted languages need no
255
+ # build ("none"); Go must be built ("autobuild"); java-kotlin can use
256
+ # "none" for pure-Java repos but MUST build when Kotlin is present
257
+ # (Kotlin analysis has no build-mode: none support).
258
+ EXISTS=false
259
+ BUILD_MODE=none
253
260
  if [ "$LANG" = "javascript-typescript" ]; then
254
- find . -name "*.js" -o -name "*.ts" | grep -v node_modules | grep -q . && echo "EXISTS=true" >> $GITHUB_OUTPUT || echo "EXISTS=false" >> $GITHUB_OUTPUT
261
+ find . -name "*.js" -o -name "*.ts" | grep -v node_modules | grep -q . && EXISTS=true
255
262
  elif [ "$LANG" = "python" ]; then
256
- find . -name "*.py" | grep -q . && echo "EXISTS=true" >> $GITHUB_OUTPUT || echo "EXISTS=false" >> $GITHUB_OUTPUT
263
+ find . -name "*.py" | grep -q . && EXISTS=true
264
+ elif [ "$LANG" = "ruby" ]; then
265
+ find . -name "*.rb" | grep -q . && EXISTS=true
266
+ elif [ "$LANG" = "go" ]; then
267
+ find . -name "*.go" | grep -q . && EXISTS=true
268
+ BUILD_MODE=autobuild
269
+ elif [ "$LANG" = "java-kotlin" ]; then
270
+ find . -name "*.java" -o -name "*.kt" | grep -q . && EXISTS=true
271
+ # Kotlin requires a build; pure-Java repos skip it for reliability.
272
+ if find . -name "*.kt" | grep -q .; then
273
+ BUILD_MODE=autobuild
274
+ fi
257
275
  else
258
- echo "EXISTS=true" >> $GITHUB_OUTPUT
276
+ EXISTS=true
259
277
  fi
278
+ echo "EXISTS=$EXISTS" >> $GITHUB_OUTPUT
279
+ echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_OUTPUT
280
+ echo "Language=$LANG Exists=$EXISTS BuildMode=$BUILD_MODE"
281
+
282
+ # Set up the toolchain BEFORE CodeQL so autobuild can resolve the build.
283
+ # Without a matching toolchain, autobuild is the #1 cause of CodeQL CI
284
+ # failures on enterprise Go/Maven/Gradle projects.
285
+ - name: Set up Go
286
+ if: steps.check-lang.outputs.EXISTS == 'true' && matrix.language == 'go'
287
+ uses: actions/setup-go@v5
288
+ with:
289
+ go-version: stable
290
+ cache: false # no go.sum path assumptions; CodeQL only needs a build
291
+
292
+ - name: Set up JDK
293
+ if: steps.check-lang.outputs.EXISTS == 'true' && matrix.language == 'java-kotlin' && steps.check-lang.outputs.BUILD_MODE == 'autobuild'
294
+ uses: actions/setup-java@v4
295
+ with:
296
+ distribution: temurin
297
+ # Latest LTS. If your project targets an older JDK (11/17) and the
298
+ # build fails, change this to match — that's the one knob to turn.
299
+ java-version: '21'
260
300
 
261
301
  - name: Initialize CodeQL
262
302
  if: steps.check-lang.outputs.EXISTS == 'true'
263
303
  uses: github/codeql-action/init@v3
264
304
  with:
265
305
  languages: ${{ matrix.language }}
306
+ build-mode: ${{ steps.check-lang.outputs.BUILD_MODE }}
266
307
  queries: security-and-quality
267
308
 
268
- - name: Autobuild
269
- if: steps.check-lang.outputs.EXISTS == 'true'
270
- uses: github/codeql-action/autobuild@v3
271
-
309
+ # No standalone Autobuild step: build-mode "autobuild" runs the autobuilder
310
+ # during analysis, and build-mode "none" needs no build at all.
272
311
  - name: Perform CodeQL Analysis
273
312
  if: steps.check-lang.outputs.EXISTS == 'true'
274
313
  uses: github/codeql-action/analyze@v3
package/CHANGELOG.md CHANGED
@@ -6,8 +6,52 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
 
7
7
  ---
8
8
 
9
+ ## [1.2.0] — 2026-06-26
10
+
11
+ ### Added
12
+ - **Go stack profile** (`stacks/golang.md`) — dense, code-driven security guidance for Go (net/http, Gin, Echo, Fiber): `html/template` XSS, `database/sql`/GORM parameterisation, CORS, security headers, `gosec`/`govulncheck`
13
+ - **Go security notes** in `getStackSecurityNotes()` plus a `getStackProfile()` resolver so detected `gin`/`echo`/`fiber` projects map to the `golang` profile and notes
14
+ - **Worked example `04-oauth-flow`** — OAuth 2.0 / OIDC social login (authorization-code + PKCE); `redirect_uri` exact matching, `state` vs `nonce`, ID-token validation, anchored to ASVS 5.0 V10 and RFC 9700
15
+ - **Worked example `05-payment-processing`** — redirect-based hosted checkout (PCI DSS SAQ A); webhook signature verification, idempotency, server-side amount, reflecting the Jan 2025 SAQ A changes
16
+ - **HIPAA, DORA, and FedRAMP** control tables in `compliance-attestation.md` and the GRC agent's control-mapping example
17
+ - **Automated test suite** (`test/`, Node built-in runner, zero new dependencies) — guards version sync across manifests, agent frontmatter, and the stack-detection ↔ `stacks/*.md` mapping
18
+ - **CI workflow** (`.github/workflows/ci.yml`) — runs the suite on Node 18, 20, and 22 plus an `npm pack` content check
19
+ - **Release workflow** (`.github/workflows/release.yml`) — publishes to npm with provenance and creates a GitHub Release on `v*` tags
20
+ - **`CODE_OF_CONDUCT.md`** (Contributor Covenant 2.1), **`.editorconfig`**, npm/CI/Node README badges, and a committed `package-lock.json`
21
+
22
+ ### Changed
23
+ - **CodeQL SAST** (`secure-sdlc-gate.yml`) — matrix expanded to `ruby`, `go`, and `java-kotlin`; per-language `build-mode` with toolchain setup so compiled-language scans are reliable on enterprise repos (pure-Java uses `build-mode: none`)
24
+ - **ASVS references migrated from 4.0 to 5.0** repo-wide using the official OWASP `mapping_v4.0.3_to_v5.0.0` mapping (stack profiles, examples, agents, templates, skill, PR template)
25
+ - **`secure-sdlc init`** only prints a `stacks/<name>.md` pointer when that profile actually ships
26
+
27
+ ### Fixed
28
+ - Pre-existing CSRF control mislabel in the Django, Express, Rails, and Go stack profiles (`V14.4.5`/HSTS → real CSRF control `V3.5.1`)
29
+ - Broken `stacks/<gin|echo|fiber>.md` reference — Go framework projects now resolve to `stacks/golang.md`
30
+
31
+ ---
32
+
9
33
  ## [1.0.2]
10
34
 
35
+ ---
36
+
37
+ ## [1.1.0] — 2026-04-06
38
+
39
+ ### Added
40
+ - **`.claude-plugin/plugin.json`** — Claude Code plugin marketplace manifest; agents now installable with a single `/plugin marketplace add Kaademos/secure-sdlc-agents` command (zero-dependency, no npm, no cloning)
41
+ - **`skills/` directory** — 4 SKILL.md files in the agent-skills–compatible format for cross-ecosystem discoverability:
42
+ - `skills/security-and-hardening/` — secure coding, PR review, OWASP Top 10 prevention, severity gating
43
+ - `skills/threat-modeling/` — STRIDE + LINDDUN structured threat model workflow
44
+ - `skills/ai-security/` — OWASP LLM Top 10 2025, prompt injection, excessive agency, output validation
45
+ - `skills/compliance-and-audit/` — risk register, framework mapping (SOC 2, ISO 27001, GDPR, PCI DSS), audit evidence
46
+ - **README — "Option 0"** plugin marketplace as the first and fastest install path (before git clone and npm)
47
+ - **README — "The 4-Minute Problem"** concrete breach table replacing the generic problem statement — 5 real vulnerabilities a vibe-coded file upload misses, each mapped to the catching agent
48
+ - **README — "Who Do You Call?"** ASCII decision tree covering every SDLC moment → correct agent → exact command
49
+
50
+ ### Changed
51
+ - **README.md** — title tagline tightened to be specific and direct ("8 AI security specialists. Invoked at the exact phase where each vulnerability would have been caught.")
52
+ - **`package.json` `files`** — added `skills/` and `.claude-plugin/` to the npm publish manifest
53
+
54
+
11
55
  ### Added
12
56
  - **npm package** `@kaademos/secure-sdlc` (root `package.json`) — global install via `npm install -g @kaademos/secure-sdlc`, `npx @kaademos/secure-sdlc`, semver releases;
13
57
  - **`secure-sdlc paths`** — prints `PACKAGE_ROOT` and MCP server path after install
package/CLAUDE.md CHANGED
@@ -175,6 +175,7 @@ If the project uses one of these stacks, reference the relevant profile in `stac
175
175
  | Django | `stacks/django.md` |
176
176
  | Express.js | `stacks/express.md` |
177
177
  | Ruby on Rails | `stacks/rails.md` |
178
+ | Go (net/http, Gin, Echo, Fiber) | `stacks/golang.md` |
178
179
 
179
180
  Stack profiles contain framework-specific vulnerability patterns, secure coding examples,
180
181
  and recommended libraries. Reference them when the dev-lead or appsec-engineer agents
package/README.md CHANGED
@@ -1,27 +1,35 @@
1
- ![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
2
- ![Claude Code](https://img.shields.io/badge/Claude_Code-Sub--Agents-blueviolet)
3
- ![Cursor MCP](https://img.shields.io/badge/Cursor-MCP%20Ready-blue)
4
- ![OWASP ASVS](https://img.shields.io/badge/OWASP-ASVS%20L2-orange)
1
+ [![CI](https://github.com/Kaademos/secure-sdlc-agents/actions/workflows/ci.yml/badge.svg)](https://github.com/Kaademos/secure-sdlc-agents/actions/workflows/ci.yml)
2
+ [![npm version](https://img.shields.io/npm/v/@kaademos/secure-sdlc?logo=npm)](https://www.npmjs.com/package/@kaademos/secure-sdlc)
3
+ [![node](https://img.shields.io/node/v/@kaademos/secure-sdlc)](https://nodejs.org)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
5
+ ![OWASP ASVS](https://img.shields.io/badge/OWASP-ASVS%205.0-orange)
5
6
  ![Works With](https://img.shields.io/badge/Works%20With-Claude%20%7C%20Cursor%20%7C%20Windsurf%20%7C%20Warp-brightgreen)
6
7
 
7
8
  # Secure SDLC Agents
8
9
 
9
- A team of AI security specialists embedded directly in your vibe coding workflow.
10
+ **8 AI security specialists. Invoked at the exact phase where each vulnerability would have been caught.**
10
11
 
11
- They cover every phase of the Software Development Lifecycle: requirements, architecture,
12
- code review, infrastructure, compliance, and release gating. They work wherever you work:
13
- Claude Code, Cursor, Windsurf, Warp, and any tool that supports MCP.
12
+ Requirements threat modelling code review IaC compliance → release gate.
13
+
14
+ Works in Claude Code, Cursor, Windsurf, Warp, and any MCP-compatible tool.
14
15
 
15
16
  ---
16
17
 
17
- ## The problem this solves
18
+ ## The 4-Minute Problem
19
+
20
+ You asked Claude Code to build a file upload feature. It wrote working code in 4 minutes.
18
21
 
19
- When developers use AI tools to build fast, security becomes the thing that gets bolted on
20
- at the end — or skipped entirely. Threat models don't happen. ASVS requirements are never
21
- written. Compliance evidence is scrambled together the night before an audit.
22
+ It missed:
22
23
 
23
- This project makes the security team part of the build process from day one. Not a gate
24
- at the end, but a set of specialists you summon at the exact moment their expertise is needed.
24
+ | Vulnerability | Severity | Which agent catches it |
25
+ |---|---|---|
26
+ | SVG file with embedded `<script>` stored and served without sanitisation | **CRITICAL** | `appsec-engineer` — MIME type validation, output encoding |
27
+ | No file size limit or type allowlist | **HIGH** | `appsec-engineer` — input validation, magic byte checks |
28
+ | S3 bucket provisioned with `public-read` ACL | **CRITICAL** | `cloud-platform-engineer` — IaC security review |
29
+ | No rate limiting on the upload endpoint | **HIGH** | `appsec-engineer` — anti-automation controls |
30
+ | Upload URL in API response leaks internal bucket path | **MEDIUM** | `dev-lead` — information disclosure review |
31
+
32
+ Every one of these has appeared in real breach post-mortems. AI agents optimise for *working code*, not *secure code*. This project embeds the specialists that close that gap — at the exact phase where each issue would have been caught.
25
33
 
26
34
  ---
27
35
 
@@ -57,9 +65,48 @@ at the end, but a set of specialists you summon at the exact moment their expert
57
65
 
58
66
  ---
59
67
 
68
+ ## Who Do You Call?
69
+
70
+ ```
71
+ What are you working on?
72
+
73
+ ├── Starting a new feature?
74
+ │ ├── product-manager → "Define security requirements for X using ASVS L2"
75
+ │ └── grc-analyst → "Initialise risk register, map to SOC2 / GDPR / PCI-DSS"
76
+
77
+ ├── Designing the architecture?
78
+ │ ├── appsec-engineer → "Threat model this design using STRIDE"
79
+ │ ├── cloud-platform-engineer → "Review IaC for this feature"
80
+ │ └── ai-security-engineer → "Security review — feature calls an LLM" ← always include this
81
+
82
+ ├── Writing or merging code?
83
+ │ ├── dev-lead → "Review PR #N for secure coding issues and dependency risks"
84
+ │ └── appsec-engineer → "Triage SAST findings for PR #N"
85
+
86
+ ├── Quick security question (any phase)?
87
+ │ └── security-champion → "Is this pattern / library safe? Context: ..."
88
+
89
+ └── Ready to ship?
90
+ └── release-manager → "Run pre-release security checklist for vX.Y.Z"
91
+ ```
92
+
93
+ ---
94
+
60
95
  ## Quick start
61
96
 
62
- ### Option A — Claude Code (zero dependencies)
97
+ ### Option 0 — Claude Code Plugin Marketplace
98
+
99
+ ```bash
100
+ /plugin marketplace add Kaademos/secure-sdlc-agents
101
+
102
+ /plugin install secure-sdlc-agents@secure-sdlc-agents
103
+ ```
104
+
105
+ All 8 agents are immediately available in your session. No cloning, no npm, no file copying.
106
+
107
+ ---
108
+
109
+ ### Option A — Git clone (zero dependencies)
63
110
 
64
111
  ```bash
65
112
  git clone https://github.com/Kaademos/secure-sdlc-agents.git
@@ -288,6 +335,7 @@ Deep, framework-specific security guidance in `stacks/`:
288
335
  | Django | [`stacks/django.md`](stacks/django.md) — CSRF, strong params, ORM injection, production settings |
289
336
  | Express.js | [`stacks/express.md`](stacks/express.md) — helmet, rate limiting, CSRF, Zod validation |
290
337
  | Ruby on Rails | [`stacks/rails.md`](stacks/rails.md) — Brakeman, Pundit, strong parameters, credentials |
338
+ | Go (net/http, Gin, Echo, Fiber) | [`stacks/golang.md`](stacks/golang.md) — html/template XSS, database/sql & GORM injection, CORS, gosec/govulncheck |
291
339
 
292
340
  ---
293
341
 
@@ -329,6 +377,8 @@ In `warp-workflows/` — import into Warp for one-click SDLC automation:
329
377
  | [`01-login-feature/`](examples/01-login-feature/) | Auth flow (bcrypt, MFA, sessions) | JWT alg:none, hardcoded secrets, cost factor |
330
378
  | [`02-api-endpoint/`](examples/02-api-endpoint/) | Public REST API | IDOR via UUID path param, IAM over-privilege |
331
379
  | [`03-file-upload/`](examples/03-file-upload/) | File upload to S3 | SVG XSS, magic byte validation, public bucket |
380
+ | [`04-oauth-flow/`](examples/04-oauth-flow/) | OAuth 2.0 / OIDC social login | redirect_uri exact match, PKCE, state vs nonce, ID-token validation |
381
+ | [`05-payment-processing/`](examples/05-payment-processing/) | Card checkout (hosted page) | PCI DSS SAQ A scoping, webhook signature, idempotency, amount tampering |
332
382
 
333
383
  ---
334
384
 
@@ -163,12 +163,17 @@ export default async function init(options) {
163
163
  console.log(chalk.dim(` secure-sdlc kickoff\n`));
164
164
 
165
165
  if (stack.name !== "unknown") {
166
- const { getStackSecurityNotes } = await import("../utils/stack-detect.js");
166
+ const { getStackSecurityNotes, getStackProfile } = await import("../utils/stack-detect.js");
167
167
  const notes = getStackSecurityNotes(stack.name);
168
168
  if (notes.length) {
169
169
  console.log(chalk.bold(`\n${stack.display} security notes for your team:\n`));
170
170
  notes.slice(0, 3).forEach((n) => console.log(chalk.dim(` • ${n}`)));
171
- console.log(chalk.dim(` (see stacks/${stack.name}.md for full guidance)\n`));
171
+ // Only point to a profile that actually ships — avoids a broken reference
172
+ // for stacks that have notes but no dedicated stacks/<name>.md (e.g. terraform).
173
+ const profile = getStackProfile(stack.name);
174
+ if (existsSync(join(REPO_ROOT, "stacks", `${profile}.md`))) {
175
+ console.log(chalk.dim(` (see stacks/${profile}.md for full guidance)\n`));
176
+ }
172
177
  }
173
178
  }
174
179
  }
@@ -79,10 +79,29 @@ export function detectStack(projectRoot) {
79
79
  return { name: "unknown", display: "Unknown", language: "Unknown" };
80
80
  }
81
81
 
82
+ /**
83
+ * Maps a detected stack name to the stack that owns its security guidance.
84
+ * Framework variants (e.g. Gin/Echo/Fiber) share their language's profile and notes.
85
+ */
86
+ const STACK_ALIASES = {
87
+ gin: "golang",
88
+ echo: "golang",
89
+ fiber: "golang",
90
+ };
91
+
92
+ /**
93
+ * Resolves the stack profile (notes key + stacks/<name>.md) for a detected stack.
94
+ * Falls back to the stack name itself when no alias applies.
95
+ */
96
+ export function getStackProfile(stackName) {
97
+ return STACK_ALIASES[stackName] || stackName;
98
+ }
99
+
82
100
  /**
83
101
  * Returns the top security considerations for a given stack.
84
102
  */
85
103
  export function getStackSecurityNotes(stackName) {
104
+ stackName = getStackProfile(stackName);
86
105
  const notes = {
87
106
  nextjs: [
88
107
  "Review Server Actions for CSRF and authorisation — they're POST endpoints by default",
@@ -120,6 +139,13 @@ export function getStackSecurityNotes(stackName) {
120
139
  "Audit before_action filters for auth — ensure every controller action is covered",
121
140
  "Brakeman is the standard Rails SAST tool — run on every PR",
122
141
  ],
142
+ golang: [
143
+ "Render HTML with html/template (context-aware escaping) — never text/template, and avoid template.HTML on user input",
144
+ "Use database/sql placeholders ($1/?) or GORM's ? conditions — never fmt.Sprintf user input into queries",
145
+ "CORS: set an explicit AllowedOrigins list — never combine wildcard/AllowAllOrigins with AllowCredentials:true",
146
+ "net/http ships no security headers — add CSP, HSTS, X-Content-Type-Options via middleware (e.g. unrolled/secure)",
147
+ "Run gosec (SAST) and govulncheck (vulnerable deps) in CI; hash passwords with bcrypt (cost ≥ 12) or argon2id",
148
+ ],
123
149
  terraform: [
124
150
  "Pin provider versions with ~> constraints, not latest",
125
151
  "Use terraform-aws-modules/terraform-google-modules — don't write IAM from scratch",
@@ -3,7 +3,7 @@
3
3
  **Release version:** v[X.Y.Z]
4
4
  **Date:** [YYYY-MM-DD]
5
5
  **Author:** GRC Analyst Agent + [Human GRC lead]
6
- **Frameworks in scope:** [SOC 2 / ISO 27001 / NIST CSF / PCI DSS / GDPR — delete inapplicable]
6
+ **Frameworks in scope:** [SOC 2 / ISO 27001 / NIST CSF / PCI DSS / GDPR / HIPAA / DORA / FedRAMP — delete inapplicable]
7
7
  **Status:** Draft / Review / Approved
8
8
 
9
9
  ---
@@ -110,6 +110,45 @@ ISO/IEC 27001:2022 Annex A, NIST CSF 2.0]
110
110
 
111
111
  ---
112
112
 
113
+ ### HIPAA *(complete only if protected health information (PHI) is in scope)*
114
+
115
+ | Standard / Rule | Safeguard | Status | Evidence Reference | Notes |
116
+ |-----------------|-----------|--------|--------------------|-------|
117
+ | §164.308(a)(1) | Security Rule — Security management process (risk analysis) | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
118
+ | §164.312(a)(1) | Security Rule — Access control (technical safeguards) | | | |
119
+ | §164.312(b) | Security Rule — Audit controls | | | |
120
+ | §164.312(e)(1) | Security Rule — Transmission security (encryption in transit) | | | |
121
+ | §164.502(b) | Privacy Rule — Minimum necessary use and disclosure | | | |
122
+
123
+ *Extend with additional Security/Privacy Rule standards (e.g. §164.308 administrative, §164.310 physical) relevant to the systems in scope.*
124
+
125
+ ---
126
+
127
+ ### DORA *(complete only if an EU financial entity or critical ICT third-party provider)*
128
+
129
+ | Article / Pillar | Requirement | Status | Evidence Reference | Notes |
130
+ |------------------|-------------|--------|--------------------|-------|
131
+ | Art. 5–15 | ICT risk management framework | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
132
+ | Art. 17–23 | ICT-related incident management, classification & reporting | | | |
133
+ | Art. 24–27 | Digital operational resilience testing (incl. TLPT) | | | |
134
+ | Art. 28–30 | ICT third-party risk management | | | |
135
+
136
+ ---
137
+
138
+ ### FedRAMP *(complete only if selling to US federal agencies — NIST SP 800-53 baseline)*
139
+
140
+ | Control Family | Control | Status | Evidence Reference | Notes |
141
+ |----------------|---------|--------|--------------------|-------|
142
+ | AC — Access Control | AC-2 Account management | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
143
+ | AU — Audit & Accountability | AU-2 Event logging | | | |
144
+ | IA — Identification & Authentication | IA-2 Identification and authentication (organisational users) | | | |
145
+ | SC — System & Communications Protection | SC-7 Boundary protection | | | |
146
+ | SC — System & Communications Protection | SC-28 Protection of information at rest | | | |
147
+
148
+ *Select the impact baseline (Low / Moderate / High) and extend with the corresponding 800-53 control families (CM, CP, IR, RA, SI, …).*
149
+
150
+ ---
151
+
113
152
  ## Gaps
114
153
 
115
154
  Controls that are not fully met at the time of this attestation:
@@ -116,7 +116,7 @@ Priority list of mitigations to carry into the build phase:
116
116
 
117
117
  | Priority | Threat ID(s) | Mitigation | Owner | ASVS Ref |
118
118
  |----------|-------------|------------|-------|----------|
119
- | 1 | T-001, T-004 | Implement account lockout and generic error responses | Dev Lead | V2.2.1, V8.3.4 |
119
+ | 1 | T-001, T-004 | Implement account lockout and generic error responses | Dev Lead | V6.3.1, V14.1.1 |
120
120
  | 2 | | | | |
121
121
 
122
122
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaademos/secure-sdlc",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "Secure SDLC agent team — CLI to scaffold docs, hooks, CI, and MCP-ready security workflows",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,6 +15,8 @@
15
15
  "docs/templates",
16
16
  "hooks",
17
17
  "stacks",
18
+ "skills",
19
+ ".claude-plugin",
18
20
  "warp-workflows",
19
21
  ".github/workflows/secure-sdlc-gate.yml",
20
22
  ".cursor/rules",
@@ -27,6 +29,7 @@
27
29
  "scripts": {
28
30
  "prepack": "node cli/bin/secure-sdlc.js --version",
29
31
  "sdlc": "node cli/bin/secure-sdlc.js",
32
+ "test": "node --test test/*.test.js",
30
33
  "test:pack": "npm pack --dry-run --ignore-scripts 2>&1"
31
34
  },
32
35
  "keywords": [