bms-speckit-plugin 6.1.0 → 6.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.
@@ -113,9 +113,40 @@ Grep source files for patterns where a value of one type is used where another t
113
113
  - Check `.env` files are in `.gitignore`
114
114
  - Check no credentials in committed code
115
115
  3. Check for injection vulnerabilities:
116
- - SQL injection: look for string concatenation in queries
117
- - XSS: look for unescaped user input in HTML/JSX
118
- - Command injection: look for unvalidated input in shell commands
116
+
117
+ **SQL Injection enforce parameterized queries:**
118
+ All SQL queries that include dynamic values MUST use parameterized queries (placeholders), never string concatenation or interpolation. Grep for these dangerous patterns and fix every match:
119
+
120
+ - **String concatenation in SQL:**
121
+ - JS/TS: `"SELECT..." + variable`, template literals with variables in SQL strings
122
+ - Python: `"SELECT..." + variable`, `"SELECT...%s" % variable`, f-strings in SQL, `.format()` in SQL
123
+ - Go: `fmt.Sprintf("SELECT...%s", variable)`
124
+ - Java: `"SELECT..." + variable`
125
+ - PHP: `"SELECT...$variable"`, `"SELECT..." . $variable`
126
+
127
+ - **Safe parameterized alternatives (what to replace with):**
128
+ - JS/TS (mysql2/pg): `db.query("SELECT * FROM t WHERE id = ?", [userId])`
129
+ - Python (DB-API): `cursor.execute("SELECT * FROM t WHERE id = %s", (userId,))`
130
+ - Python (SQLAlchemy): `session.execute(text("...WHERE id = :id"), {"id": userId})`
131
+ - Go: `db.Query("SELECT * FROM t WHERE id = $1", userId)`
132
+ - Java (JDBC): `PreparedStatement` with `?` placeholders
133
+ - PHP (PDO): `$stmt = $pdo->prepare("SELECT * FROM t WHERE id = ?");`
134
+
135
+ - **ORM/query builder misuse** — Even with ORMs, raw query methods can be vulnerable:
136
+ - Sequelize: `sequelize.query("SELECT..." + input)` — must use `replacements` or `bind`
137
+ - Prisma: `prisma.$queryRawUnsafe(...)` — flag all usages, prefer `$queryRaw` with tagged template
138
+ - TypeORM: `.query("SELECT..." + input)` — must use parameterized version
139
+ - Django: raw SQL with string concat — must use params tuple
140
+ - SQLAlchemy: raw SQL with string concat — must use `text()` with bind params
141
+
142
+ - **Exceptions (do NOT flag these):**
143
+ - Static SQL with no dynamic values: `"SELECT * FROM users WHERE active = 1"`
144
+ - Parameterized queries using placeholders: `?`, `$1`, `%s`, `:name`
145
+ - Table/column names from internal constants (not user input) — but add a comment explaining why it's safe
146
+
147
+ **XSS:** look for unescaped user input rendered as raw HTML — unsafe inner HTML setters, raw output directives in template engines, disabled auto-escaping
148
+
149
+ **Command injection:** look for shell invocations that pass unsanitized user input as arguments. Prefer array-based APIs over shell string execution.
119
150
  4. Check authentication & authorization:
120
151
  - API endpoints have proper auth guards
121
152
  - Session handling is secure
@@ -213,7 +244,9 @@ After completing all phases, provide a summary report:
213
244
 
214
245
  ### Security
215
246
  - [ ] No hardcoded secrets
216
- - [ ] No injection vulnerabilities
247
+ - [ ] SQL: all queries use parameterized placeholders (no string concat/interpolation)
248
+ - [ ] XSS: no raw HTML rendering of user input
249
+ - [ ] Command injection: no unsanitized input in shell calls
217
250
  - [ ] Dependencies have no known CVEs
218
251
  - [ ] Auth properly implemented
219
252
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bms-speckit-plugin",
3
- "version": "6.1.0",
3
+ "version": "6.2.0",
4
4
  "description": "Chain-orchestrated development pipeline: /bms-speckit takes requirements and runs brainstorm → constitution → specify → plan → tasks → analyze → implement → verify with per-step error handling",
5
5
  "files": [
6
6
  ".claude-plugin/",