@bgicli/bgicli 2.2.8 → 2.2.10
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/data/skills/anthropic-algorithmic-art/SKILL.md +405 -0
- package/data/skills/anthropic-canvas-design/SKILL.md +130 -0
- package/data/skills/anthropic-claude-api/SKILL.md +243 -0
- package/data/skills/anthropic-doc-coauthoring/SKILL.md +375 -0
- package/data/skills/anthropic-docx/SKILL.md +590 -0
- package/data/skills/anthropic-frontend-design/SKILL.md +42 -0
- package/data/skills/anthropic-internal-comms/SKILL.md +32 -0
- package/data/skills/anthropic-mcp-builder/SKILL.md +236 -0
- package/data/skills/anthropic-pdf/SKILL.md +314 -0
- package/data/skills/anthropic-pptx/SKILL.md +232 -0
- package/data/skills/anthropic-skill-creator/SKILL.md +485 -0
- package/data/skills/anthropic-webapp-testing/SKILL.md +96 -0
- package/data/skills/anthropic-xlsx/SKILL.md +292 -0
- package/data/skills/arxiv-database/SKILL.md +362 -0
- package/data/skills/astropy/SKILL.md +329 -0
- package/data/skills/ctx-advanced-evaluation/SKILL.md +402 -0
- package/data/skills/ctx-bdi-mental-states/SKILL.md +311 -0
- package/data/skills/ctx-context-compression/SKILL.md +272 -0
- package/data/skills/ctx-context-degradation/SKILL.md +206 -0
- package/data/skills/ctx-context-fundamentals/SKILL.md +201 -0
- package/data/skills/ctx-context-optimization/SKILL.md +195 -0
- package/data/skills/ctx-evaluation/SKILL.md +251 -0
- package/data/skills/ctx-filesystem-context/SKILL.md +287 -0
- package/data/skills/ctx-hosted-agents/SKILL.md +260 -0
- package/data/skills/ctx-memory-systems/SKILL.md +225 -0
- package/data/skills/ctx-multi-agent-patterns/SKILL.md +257 -0
- package/data/skills/ctx-project-development/SKILL.md +291 -0
- package/data/skills/ctx-tool-design/SKILL.md +271 -0
- package/data/skills/dhdna-profiler/SKILL.md +162 -0
- package/data/skills/generate-image/SKILL.md +183 -0
- package/data/skills/geomaster/SKILL.md +365 -0
- package/data/skills/get-available-resources/SKILL.md +275 -0
- package/data/skills/hamelsmu-build-review-interface/SKILL.md +96 -0
- package/data/skills/hamelsmu-error-analysis/SKILL.md +164 -0
- package/data/skills/hamelsmu-eval-audit/SKILL.md +183 -0
- package/data/skills/hamelsmu-evaluate-rag/SKILL.md +177 -0
- package/data/skills/hamelsmu-generate-synthetic-data/SKILL.md +131 -0
- package/data/skills/hamelsmu-validate-evaluator/SKILL.md +212 -0
- package/data/skills/hamelsmu-write-judge-prompt/SKILL.md +144 -0
- package/data/skills/hf-cli/SKILL.md +174 -0
- package/data/skills/hf-mcp/SKILL.md +178 -0
- package/data/skills/hugging-face-dataset-viewer/SKILL.md +121 -0
- package/data/skills/hugging-face-datasets/SKILL.md +542 -0
- package/data/skills/hugging-face-evaluation/SKILL.md +651 -0
- package/data/skills/hugging-face-jobs/SKILL.md +1042 -0
- package/data/skills/hugging-face-model-trainer/SKILL.md +717 -0
- package/data/skills/hugging-face-paper-pages/SKILL.md +239 -0
- package/data/skills/hugging-face-paper-publisher/SKILL.md +624 -0
- package/data/skills/hugging-face-tool-builder/SKILL.md +110 -0
- package/data/skills/hugging-face-trackio/SKILL.md +115 -0
- package/data/skills/hugging-face-vision-trainer/SKILL.md +593 -0
- package/data/skills/huggingface-gradio/SKILL.md +245 -0
- package/data/skills/matlab/SKILL.md +376 -0
- package/data/skills/modal/SKILL.md +381 -0
- package/data/skills/openai-cloudflare-deploy/SKILL.md +224 -0
- package/data/skills/openai-develop-web-game/SKILL.md +149 -0
- package/data/skills/openai-doc/SKILL.md +80 -0
- package/data/skills/openai-figma/SKILL.md +42 -0
- package/data/skills/openai-figma-implement-design/SKILL.md +264 -0
- package/data/skills/openai-gh-address-comments/SKILL.md +25 -0
- package/data/skills/openai-gh-fix-ci/SKILL.md +69 -0
- package/data/skills/openai-imagegen/SKILL.md +174 -0
- package/data/skills/openai-jupyter-notebook/SKILL.md +107 -0
- package/data/skills/openai-linear/SKILL.md +87 -0
- package/data/skills/openai-netlify-deploy/SKILL.md +247 -0
- package/data/skills/openai-notion-knowledge-capture/SKILL.md +56 -0
- package/data/skills/openai-notion-meeting-intelligence/SKILL.md +60 -0
- package/data/skills/openai-notion-research-documentation/SKILL.md +59 -0
- package/data/skills/openai-notion-spec-to-implementation/SKILL.md +58 -0
- package/data/skills/openai-openai-docs/SKILL.md +69 -0
- package/data/skills/openai-pdf/SKILL.md +67 -0
- package/data/skills/openai-playwright/SKILL.md +147 -0
- package/data/skills/openai-render-deploy/SKILL.md +479 -0
- package/data/skills/openai-screenshot/SKILL.md +267 -0
- package/data/skills/openai-security-best-practices/SKILL.md +86 -0
- package/data/skills/openai-security-ownership-map/SKILL.md +206 -0
- package/data/skills/openai-security-threat-model/SKILL.md +81 -0
- package/data/skills/openai-sentry/SKILL.md +123 -0
- package/data/skills/openai-sora/SKILL.md +178 -0
- package/data/skills/openai-speech/SKILL.md +144 -0
- package/data/skills/openai-spreadsheet/SKILL.md +145 -0
- package/data/skills/openai-transcribe/SKILL.md +81 -0
- package/data/skills/openai-vercel-deploy/SKILL.md +77 -0
- package/data/skills/openai-yeet/SKILL.md +28 -0
- package/data/skills/pennylane/SKILL.md +224 -0
- package/data/skills/polars-bio/SKILL.md +374 -0
- package/data/skills/primekg/SKILL.md +97 -0
- package/data/skills/pymatgen/SKILL.md +689 -0
- package/data/skills/qiskit/SKILL.md +273 -0
- package/data/skills/qutip/SKILL.md +316 -0
- package/data/skills/recursive-decomposition/SKILL.md +185 -0
- package/data/skills/rowan/SKILL.md +427 -0
- package/data/skills/scholar-evaluation/SKILL.md +298 -0
- package/data/skills/sentry-create-alert/SKILL.md +210 -0
- package/data/skills/sentry-fix-issues/SKILL.md +126 -0
- package/data/skills/sentry-pr-code-review/SKILL.md +105 -0
- package/data/skills/sentry-python-sdk/SKILL.md +317 -0
- package/data/skills/sentry-setup-ai-monitoring/SKILL.md +217 -0
- package/data/skills/stable-baselines3/SKILL.md +297 -0
- package/data/skills/sympy/SKILL.md +498 -0
- package/data/skills/trailofbits-ask-questions-if-underspecified/SKILL.md +85 -0
- package/data/skills/trailofbits-audit-context-building/SKILL.md +302 -0
- package/data/skills/trailofbits-differential-review/SKILL.md +220 -0
- package/data/skills/trailofbits-insecure-defaults/SKILL.md +117 -0
- package/data/skills/trailofbits-modern-python/SKILL.md +333 -0
- package/data/skills/trailofbits-property-based-testing/SKILL.md +123 -0
- package/data/skills/trailofbits-semgrep-rule-creator/SKILL.md +172 -0
- package/data/skills/trailofbits-sharp-edges/SKILL.md +292 -0
- package/data/skills/trailofbits-variant-analysis/SKILL.md +142 -0
- package/data/skills/transformers.js/SKILL.md +637 -0
- package/data/skills/writing/SKILL.md +419 -0
- package/dist/bgi.js +66 -2
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "screenshot"
|
|
3
|
+
description: "Use when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are unavailable and an OS-level capture is needed."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Screenshot Capture
|
|
8
|
+
|
|
9
|
+
Follow these save-location rules every time:
|
|
10
|
+
|
|
11
|
+
1) If the user specifies a path, save there.
|
|
12
|
+
2) If the user asks for a screenshot without a path, save to the OS default screenshot location.
|
|
13
|
+
3) If Codex needs a screenshot for its own inspection, save to the temp directory.
|
|
14
|
+
|
|
15
|
+
## Tool priority
|
|
16
|
+
|
|
17
|
+
- Prefer tool-specific screenshot capabilities when available (for example: a Figma MCP/skill for Figma files, or Playwright/agent-browser tools for browsers and Electron apps).
|
|
18
|
+
- Use this skill when explicitly asked, for whole-system desktop captures, or when a tool-specific capture cannot get what you need.
|
|
19
|
+
- Otherwise, treat this skill as the default for desktop apps without a better-integrated capture tool.
|
|
20
|
+
|
|
21
|
+
## macOS permission preflight (reduce repeated prompts)
|
|
22
|
+
|
|
23
|
+
On macOS, run the preflight helper once before window/app capture. It checks
|
|
24
|
+
Screen Recording permission, explains why it is needed, and requests it in one
|
|
25
|
+
place.
|
|
26
|
+
|
|
27
|
+
The helpers route Swift's module cache to `$TMPDIR/codex-swift-module-cache`
|
|
28
|
+
to avoid extra sandbox module-cache prompts.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bash <path-to-skill>/scripts/ensure_macos_permissions.sh
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
To avoid multiple sandbox approval prompts, combine preflight + capture in one
|
|
35
|
+
command when possible:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
bash <path-to-skill>/scripts/ensure_macos_permissions.sh && \
|
|
39
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --app "Codex"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For Codex inspection runs, keep the output in temp:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
bash <path-to-skill>/scripts/ensure_macos_permissions.sh && \
|
|
46
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --app "<App>" --mode temp
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Use the bundled scripts to avoid re-deriving OS-specific commands.
|
|
50
|
+
|
|
51
|
+
## macOS and Linux (Python helper)
|
|
52
|
+
|
|
53
|
+
Run the helper from the repo root:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
python3 <path-to-skill>/scripts/take_screenshot.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Common patterns:
|
|
60
|
+
|
|
61
|
+
- Default location (user asked for "a screenshot"):
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
python3 <path-to-skill>/scripts/take_screenshot.py
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- Temp location (Codex visual check):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --mode temp
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Explicit location (user provided a path or filename):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --path output/screen.png
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- App/window capture by app name (macOS only; substring match is OK; captures all matching windows):
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --app "Codex"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- Specific window title within an app (macOS only):
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --app "Codex" --window-name "Settings"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- List matching window ids before capturing (macOS only):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --list-windows --app "Codex"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- Pixel region (x,y,w,h):
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --mode temp --region 100,200,800,600
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- Focused/active window (captures only the frontmost window; use `--app` to capture all windows):
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --mode temp --active-window
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- Specific window id (use --list-windows on macOS to discover ids):
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --window-id 12345
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The script prints one path per capture. When multiple windows or displays match, it prints multiple paths (one per line) and adds suffixes like `-w<windowId>` or `-d<display>`. View each path sequentially with the image viewer tool, and only manipulate images if needed or requested.
|
|
116
|
+
|
|
117
|
+
### Workflow examples
|
|
118
|
+
|
|
119
|
+
- "Take a look at <App> and tell me what you see": capture to temp, then view each printed path in order.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
bash <path-to-skill>/scripts/ensure_macos_permissions.sh && \
|
|
123
|
+
python3 <path-to-skill>/scripts/take_screenshot.py --app "<App>" --mode temp
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- "The design from Figma is not matching what is implemented": use a Figma MCP/skill to capture the design first, then capture the running app with this skill (typically to temp) and compare the raw screenshots before any manipulation.
|
|
127
|
+
|
|
128
|
+
### Multi-display behavior
|
|
129
|
+
|
|
130
|
+
- On macOS, full-screen captures save one file per display when multiple monitors are connected.
|
|
131
|
+
- On Linux and Windows, full-screen captures use the virtual desktop (all monitors in one image); use `--region` to isolate a single display when needed.
|
|
132
|
+
|
|
133
|
+
### Linux prerequisites and selection logic
|
|
134
|
+
|
|
135
|
+
The helper automatically selects the first available tool:
|
|
136
|
+
|
|
137
|
+
1) `scrot`
|
|
138
|
+
2) `gnome-screenshot`
|
|
139
|
+
3) ImageMagick `import`
|
|
140
|
+
|
|
141
|
+
If none are available, ask the user to install one of them and retry.
|
|
142
|
+
|
|
143
|
+
Coordinate regions require `scrot` or ImageMagick `import`.
|
|
144
|
+
|
|
145
|
+
`--app`, `--window-name`, and `--list-windows` are macOS-only. On Linux, use
|
|
146
|
+
`--active-window` or provide `--window-id` when available.
|
|
147
|
+
|
|
148
|
+
## Windows (PowerShell helper)
|
|
149
|
+
|
|
150
|
+
Run the PowerShell helper:
|
|
151
|
+
|
|
152
|
+
```powershell
|
|
153
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Common patterns:
|
|
157
|
+
|
|
158
|
+
- Default location:
|
|
159
|
+
|
|
160
|
+
```powershell
|
|
161
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
- Temp location (Codex visual check):
|
|
165
|
+
|
|
166
|
+
```powershell
|
|
167
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1 -Mode temp
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- Explicit path:
|
|
171
|
+
|
|
172
|
+
```powershell
|
|
173
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1 -Path "C:\Temp\screen.png"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- Pixel region (x,y,w,h):
|
|
177
|
+
|
|
178
|
+
```powershell
|
|
179
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1 -Mode temp -Region 100,200,800,600
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- Active window (ask the user to focus it first):
|
|
183
|
+
|
|
184
|
+
```powershell
|
|
185
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1 -Mode temp -ActiveWindow
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
- Specific window handle (only when provided):
|
|
189
|
+
|
|
190
|
+
```powershell
|
|
191
|
+
powershell -ExecutionPolicy Bypass -File <path-to-skill>/scripts/take_screenshot.ps1 -WindowHandle 123456
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Direct OS commands (fallbacks)
|
|
195
|
+
|
|
196
|
+
Use these when you cannot run the helpers.
|
|
197
|
+
|
|
198
|
+
### macOS
|
|
199
|
+
|
|
200
|
+
- Full screen to a specific path:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
screencapture -x output/screen.png
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
- Pixel region:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
screencapture -x -R100,200,800,600 output/region.png
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
- Specific window id:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
screencapture -x -l12345 output/window.png
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
- Interactive selection or window pick:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
screencapture -x -i output/interactive.png
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Linux
|
|
225
|
+
|
|
226
|
+
- Full screen:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
scrot output/screen.png
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
gnome-screenshot -f output/screen.png
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
import -window root output/screen.png
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- Pixel region:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
scrot -a 100,200,800,600 output/region.png
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
import -window root -crop 800x600+100+200 output/region.png
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
- Active window:
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
scrot -u output/window.png
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
gnome-screenshot -w -f output/window.png
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Error handling
|
|
261
|
+
|
|
262
|
+
- On macOS, run `bash <path-to-skill>/scripts/ensure_macos_permissions.sh` first to request Screen Recording in one place.
|
|
263
|
+
- If you see "screen capture checks are blocked in the sandbox", "could not create image from display", or Swift `ModuleCache` permission errors in a sandboxed run, rerun the command with escalated permissions.
|
|
264
|
+
- If macOS app/window capture returns no matches, run `--list-windows --app "AppName"` and retry with `--window-id`, and make sure the app is visible on screen.
|
|
265
|
+
- If Linux region/window capture fails, check tool availability with `command -v scrot`, `command -v gnome-screenshot`, and `command -v import`.
|
|
266
|
+
- If saving to the OS default location fails with permission errors in a sandbox, rerun the command with escalated permissions.
|
|
267
|
+
- Always report the saved file path in the response.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "security-best-practices"
|
|
3
|
+
description: "Perform language and framework specific security best-practice reviews and suggest improvements. Trigger only when the user explicitly requests security best practices guidance, a security review/report, or secure-by-default coding help. Trigger only for supported languages (python, javascript/typescript, go). Do not trigger for general code review, debugging, or non-security tasks."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Security Best Practices
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill provides a description of how to identify the language and frameworks used by the current context, and then to load information from this skill's references directory about the security best practices for this language and or frameworks.
|
|
11
|
+
|
|
12
|
+
This information, if present, can be used to write new secure by default code, or to passively detect major issues within existing code, or (if requested by the user) provide a vulnerability report and suggest fixes.
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
The initial step for this skill is to identify ALL languages and ALL frameworks which you are being asked to use or already exist in the scope of the project you are working in. Focus on the primary core frameworks. Often you will want to identify both frontend and backend languages and frameworks.
|
|
17
|
+
|
|
18
|
+
Then check this skill's references directory to see if there are any relevant documentation for the language and or frameworks. Make sure you read ALL reference files which relate to the specific framework or language. The format of the filenames is `<language>-<framework>-<stack>-security.md`. You should also check if there is a `<language>-general-<stack>-security.md` which is agnostic to the framework you may be using.
|
|
19
|
+
|
|
20
|
+
If working on a web application which includes a frontend and a backend, make sure you have checked for reference documents for BOTH the frontend and backend!
|
|
21
|
+
|
|
22
|
+
If you are asked to make a web app which will include both a frontend and backend, but the frontend framework is not specified, also check out `javascript-general-web-frontend-security.md`. It is important that you understand how to secure both the frontend and backend.
|
|
23
|
+
|
|
24
|
+
If no relevant information is available in the skill's references directory, think a little bit about what you know about the language, the framework, and all well known security best practices for it. If you are unsure you can try to search online for documentation on security best practices.
|
|
25
|
+
|
|
26
|
+
From there it can operate in a few ways.
|
|
27
|
+
|
|
28
|
+
1. The primary mode is to just use the information to write secure by default code from this point forward. This is useful for starting a new project or when writing new code.
|
|
29
|
+
|
|
30
|
+
2. The secondary mode is to passively detect vulnerabilities while working in the project and writing code for the user. Critical or very important vulnerabilities or major issues going against security guidance can be flagged and the user can be told about them. This passive mode should focus on the largest impact vulnerabilities and secure defaults.
|
|
31
|
+
|
|
32
|
+
3. The user can ask for a security report or to improve the security of the codebase. In this case a full report should be produced describe anyways the project fails to follow security best practices guidance. The report should be prioritized and have clear sections of severity and urgency. Then offer to start working on fixes for these issues. See #fixes below.
|
|
33
|
+
|
|
34
|
+
## Workflow Decision Tree
|
|
35
|
+
|
|
36
|
+
- If the language/framework is unclear, inspect the repo to determine it and list your evidence.
|
|
37
|
+
- If matching guidance exists in `references/`, load only the relevant files and follow their instructions.
|
|
38
|
+
- If no matching guidance exists, consider if you know any well known security best practices for the chosen language and or frameworks, but if asked to generate a report, let the user know that concrete guidance is not available (you can still generate the report or detect for sure critical vulnerabilities)
|
|
39
|
+
|
|
40
|
+
# Overrides
|
|
41
|
+
|
|
42
|
+
While these references contain the security best practices for languages and frameworks, customers may have cases where they need to bypass or override these practices. Pay attention to specific rules and instructions in the project's documentation and prompt files which may require you to override certain best practices. When overriding a best practice, you MAY report it to the user, but do not fight with them. If a security best practice needs to be bypassed / ignored for some project specific reason, you can also suggest to add documentation about this to the project so it is clear why the best practice is not being followed and to follow that bypass in the future.
|
|
43
|
+
|
|
44
|
+
# Report Format
|
|
45
|
+
|
|
46
|
+
When producing a report, you should write the report as a markdown file in `security_best_practices_report.md` or some other location if provided by the user. You can ask the user where they would like the report to be written to.
|
|
47
|
+
|
|
48
|
+
The report should have a short executive summary at the top.
|
|
49
|
+
|
|
50
|
+
The report should be clearly delineated into multiple sections based on severity of the vulnerability. The report should focus on the most critical findings as these have the highest impact for the user. All findings should be noted with an numeric ID to make them easier to reference.
|
|
51
|
+
|
|
52
|
+
For critical findings include a one sentence impact statement.
|
|
53
|
+
|
|
54
|
+
Once the report is written, also report it to the user directly, although you may be less verbose. You can offer to explain any of the findings or the reasons behind the security best practices guidance if the user wants more info on any findings.
|
|
55
|
+
|
|
56
|
+
Important: When referencing code in the report, make sure to find and include line numbers for the code you are referencing.
|
|
57
|
+
|
|
58
|
+
After you write the report file, summarize the findings to the user.
|
|
59
|
+
|
|
60
|
+
Also tell the user where the final report was written to
|
|
61
|
+
|
|
62
|
+
# Fixes
|
|
63
|
+
|
|
64
|
+
If you produced a report, let the user read the report and ask to begin performing fixes.
|
|
65
|
+
|
|
66
|
+
If you passively found a critical finding, notify the user and ask if they would like you to fix this finding.
|
|
67
|
+
|
|
68
|
+
When producing fixes, focus on fixing a single finding at a time. The fixes should have concise clear comments explaining that the new code is based on the specific security best practice, and perhaps a very short reason why it would be dangerous to not do it in this way.
|
|
69
|
+
|
|
70
|
+
Always consider if the changes you want to make will impact the functionality of the user's code. Consider if the changes may cause regressions with how the project works currently. It is often the case that insecure code is relied on for other reasons (and this is why insecure code lives on for so long). Avoid breaking the user's project as this may make them not want to apply security fixes in the future. It is better to write a well thought out, well informed by the rest of the project, fix, then a quick slapdash change.
|
|
71
|
+
|
|
72
|
+
Always follow any normal change or commit flow the user has configured. If making git commits, provide clear commit messages explaining this is to align with security best practices. Try to avoid bunching a number of unrelated findings into a single commit.
|
|
73
|
+
|
|
74
|
+
Always follow any normal testing flows the user has configured (if any) to confirm that your changes are not introducing regressions. Consider the second order impacts the changes may have and inform the user before making them if there are any.
|
|
75
|
+
|
|
76
|
+
# General Security Advice
|
|
77
|
+
|
|
78
|
+
Below is a few bits of secure coding advice that applies to almost any language or framework.
|
|
79
|
+
|
|
80
|
+
### Avoid Using Incrementing IDs for Public IDs of Resources
|
|
81
|
+
|
|
82
|
+
When assigning an ID for some resource, which will then be used by exposed to the internet, avoid using small auto-incrementing IDs. Use longer, random UUID4 or random hex string instead. This will prevent users from learning the quantity of a resource and being able to guess resource IDs.
|
|
83
|
+
|
|
84
|
+
### A note on TLS
|
|
85
|
+
|
|
86
|
+
While TLS is important for production deployments, most development work will be with TLS disabled or provided by some out-of-scope TLS proxy. Due to this, be very careful about not reporting lack of TLS as a security issue. Also be very careful around use of "secure" cookies. They should only be set if the application will actually be over TLS. If they are set on non-TLS applications (such as when deployed for local dev or testing), it will break the application. You can provide a env or other flag to override setting secure as a way to keep it off until on a TLS production deployment. Additionally avoid recommending HSTS. It is dangerous to use without full understanding of the lasting impacts (can cause major outages and user lockout) and it is not generally recommended for the scope of projects being reviewed by codex.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "security-ownership-map"
|
|
3
|
+
description: "Analyze git repositories to build a security ownership topology (people-to-file), compute bus factor and sensitive-code ownership, and export CSV/JSON for graph databases and visualization. Trigger only when the user explicitly wants a security-oriented ownership or bus-factor analysis grounded in git history (for example: orphaned sensitive code, security maintainers, CODEOWNERS reality checks for risk, sensitive hotspots, or ownership clusters). Do not trigger for general maintainer lists or non-security ownership questions."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Security Ownership Map
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Build a bipartite graph of people and files from git history, then compute ownership risk and export graph artifacts for Neo4j/Gephi. Also build a file co-change graph (Jaccard similarity on shared commits) to cluster files by how they move together while ignoring large, noisy commits.
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- Python 3
|
|
15
|
+
- `networkx` (required; community detection is enabled by default)
|
|
16
|
+
|
|
17
|
+
Install with:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install networkx
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
1. Scope the repo and time window (optional `--since/--until`).
|
|
26
|
+
2. Decide sensitivity rules (use defaults or provide a CSV config).
|
|
27
|
+
3. Build the ownership map with `scripts/run_ownership_map.py` (co-change graph is on by default; use `--cochange-max-files` to ignore supernode commits).
|
|
28
|
+
4. Communities are computed by default; graphml output is optional (`--graphml`).
|
|
29
|
+
5. Query the outputs with `scripts/query_ownership.py` for bounded JSON slices.
|
|
30
|
+
6. Persist and visualize (see `references/neo4j-import.md`).
|
|
31
|
+
|
|
32
|
+
By default, the co-change graph ignores common “glue” files (lockfiles, `.github/*`, editor config) so clusters reflect actual code movement instead of shared infra edits. Override with `--cochange-exclude` or `--no-default-cochange-excludes`. Dependabot commits are excluded by default; override with `--no-default-author-excludes` or add patterns via `--author-exclude-regex`.
|
|
33
|
+
|
|
34
|
+
If you want to exclude Linux build glue like `Kbuild` from co-change clustering, pass:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
|
|
38
|
+
--repo /path/to/linux \
|
|
39
|
+
--out ownership-map-out \
|
|
40
|
+
--cochange-exclude "**/Kbuild"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Quick start
|
|
44
|
+
|
|
45
|
+
Run from the repo root:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
|
|
49
|
+
--repo . \
|
|
50
|
+
--out ownership-map-out \
|
|
51
|
+
--since "12 months ago" \
|
|
52
|
+
--emit-commits
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Defaults: author identity, author date, and merge commits excluded. Use `--identity committer`, `--date-field committer`, or `--include-merges` if needed.
|
|
56
|
+
|
|
57
|
+
Example (override co-change excludes):
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
|
|
61
|
+
--repo . \
|
|
62
|
+
--out ownership-map-out \
|
|
63
|
+
--cochange-exclude "**/Cargo.lock" \
|
|
64
|
+
--cochange-exclude "**/.github/**" \
|
|
65
|
+
--no-default-cochange-excludes
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Communities are computed by default. To disable:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
python skills/skills/security-ownership-map/scripts/run_ownership_map.py \
|
|
72
|
+
--repo . \
|
|
73
|
+
--out ownership-map-out \
|
|
74
|
+
--no-communities
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Sensitivity rules
|
|
78
|
+
|
|
79
|
+
By default, the script flags common auth/crypto/secret paths. Override by providing a CSV file:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
# pattern,tag,weight
|
|
83
|
+
**/auth/**,auth,1.0
|
|
84
|
+
**/crypto/**,crypto,1.0
|
|
85
|
+
**/*.pem,secrets,1.0
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Use it with `--sensitive-config path/to/sensitive.csv`.
|
|
89
|
+
|
|
90
|
+
## Output artifacts
|
|
91
|
+
|
|
92
|
+
`ownership-map-out/` contains:
|
|
93
|
+
|
|
94
|
+
- `people.csv` (nodes: people)
|
|
95
|
+
- `files.csv` (nodes: files)
|
|
96
|
+
- `edges.csv` (edges: touches)
|
|
97
|
+
- `cochange_edges.csv` (file-to-file co-change edges with Jaccard weight; omitted with `--no-cochange`)
|
|
98
|
+
- `summary.json` (security ownership findings)
|
|
99
|
+
- `commits.jsonl` (optional, if `--emit-commits`)
|
|
100
|
+
- `communities.json` (computed by default from co-change edges when available; includes `maintainers` per community; disable with `--no-communities`)
|
|
101
|
+
- `cochange.graph.json` (NetworkX node-link JSON with `community_id` + `community_maintainers`; falls back to `ownership.graph.json` if no co-change edges)
|
|
102
|
+
- `ownership.graphml` / `cochange.graphml` (optional, if `--graphml`)
|
|
103
|
+
|
|
104
|
+
`people.csv` includes timezone detection based on author commit offsets: `primary_tz_offset`, `primary_tz_minutes`, and `timezone_offsets`.
|
|
105
|
+
|
|
106
|
+
## LLM query helper
|
|
107
|
+
|
|
108
|
+
Use `scripts/query_ownership.py` to return small, JSON-bounded slices without loading the full graph into context.
|
|
109
|
+
|
|
110
|
+
Examples:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out people --limit 10
|
|
114
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag auth --bus-factor-max 1
|
|
115
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out person --person alice@corp --limit 10
|
|
116
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out file --file crypto/tls
|
|
117
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out cochange --file crypto/tls --limit 10
|
|
118
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section orphaned_sensitive_code
|
|
119
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out community --id 3
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Use `--community-top-owners 5` (default) to control how many maintainers are stored per community.
|
|
123
|
+
|
|
124
|
+
## Basic security queries
|
|
125
|
+
|
|
126
|
+
Run these to answer common security ownership questions with bounded output:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Orphaned sensitive code (stale + low bus factor)
|
|
130
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section orphaned_sensitive_code
|
|
131
|
+
|
|
132
|
+
# Hidden owners for sensitive tags
|
|
133
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section hidden_owners
|
|
134
|
+
|
|
135
|
+
# Sensitive hotspots with low bus factor
|
|
136
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out summary --section bus_factor_hotspots
|
|
137
|
+
|
|
138
|
+
# Auth/crypto files with bus factor <= 1
|
|
139
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag auth --bus-factor-max 1
|
|
140
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out files --tag crypto --bus-factor-max 1
|
|
141
|
+
|
|
142
|
+
# Who is touching sensitive code the most
|
|
143
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out people --sort sensitive_touches --limit 10
|
|
144
|
+
|
|
145
|
+
# Co-change neighbors (cluster hints for ownership drift)
|
|
146
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out cochange --file path/to/file --min-jaccard 0.05 --limit 20
|
|
147
|
+
|
|
148
|
+
# Community maintainers (for a cluster)
|
|
149
|
+
python skills/skills/security-ownership-map/scripts/query_ownership.py --data-dir ownership-map-out community --id 3
|
|
150
|
+
|
|
151
|
+
# Monthly maintainers for the community containing a file
|
|
152
|
+
python skills/skills/security-ownership-map/scripts/community_maintainers.py \
|
|
153
|
+
--data-dir ownership-map-out \
|
|
154
|
+
--file network/card.c \
|
|
155
|
+
--since 2025-01-01 \
|
|
156
|
+
--top 5
|
|
157
|
+
|
|
158
|
+
# Quarterly buckets instead of monthly
|
|
159
|
+
python skills/skills/security-ownership-map/scripts/community_maintainers.py \
|
|
160
|
+
--data-dir ownership-map-out \
|
|
161
|
+
--file network/card.c \
|
|
162
|
+
--since 2025-01-01 \
|
|
163
|
+
--bucket quarter \
|
|
164
|
+
--top 5
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Notes:
|
|
168
|
+
- Touches default to one authored commit (not per-file). Use `--touch-mode file` to count per-file touches.
|
|
169
|
+
- Use `--window-days 90` or `--weight recency --half-life-days 180` to smooth churn.
|
|
170
|
+
- Filter bots with `--ignore-author-regex '(bot|dependabot)'`.
|
|
171
|
+
- Use `--min-share 0.1` to show stable maintainers only.
|
|
172
|
+
- Use `--bucket quarter` for calendar quarter groupings.
|
|
173
|
+
- Use `--identity committer` or `--date-field committer` to switch from author attribution.
|
|
174
|
+
- Use `--include-merges` to include merge commits (excluded by default).
|
|
175
|
+
|
|
176
|
+
### Summary format (default)
|
|
177
|
+
|
|
178
|
+
Use this structure, add fields if needed:
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"orphaned_sensitive_code": [
|
|
183
|
+
{
|
|
184
|
+
"path": "crypto/tls/handshake.rs",
|
|
185
|
+
"last_security_touch": "2023-03-12T18:10:04+00:00",
|
|
186
|
+
"bus_factor": 1
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"hidden_owners": [
|
|
190
|
+
{
|
|
191
|
+
"person": "alice@corp",
|
|
192
|
+
"controls": "63% of auth code"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Graph persistence
|
|
199
|
+
|
|
200
|
+
Use `references/neo4j-import.md` when you need to load the CSVs into Neo4j. It includes constraints, import Cypher, and visualization tips.
|
|
201
|
+
|
|
202
|
+
## Notes
|
|
203
|
+
|
|
204
|
+
- `bus_factor_hotspots` in `summary.json` lists sensitive files with low bus factor; `orphaned_sensitive_code` is the stale subset.
|
|
205
|
+
- If `git log` is too large, narrow with `--since` or `--until`.
|
|
206
|
+
- Compare `summary.json` against CODEOWNERS to highlight ownership drift.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "security-threat-model"
|
|
3
|
+
description: "Repository-grounded threat modeling that enumerates trust boundaries, assets, attacker capabilities, abuse paths, and mitigations, and writes a concise Markdown threat model. Trigger only when the user explicitly asks to threat model a codebase or path, enumerate threats/abuse paths, or perform AppSec threat modeling. Do not trigger for general architecture summaries, code review, or non-security design work."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Threat Model Source Code Repo
|
|
7
|
+
|
|
8
|
+
Deliver an actionable AppSec-grade threat model that is specific to the repository or a project path, not a generic checklist. Anchor every architectural claim to evidence in the repo and keep assumptions explicit. Prioritizing realistic attacker goals and concrete impacts over generic checklists.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
1) Collect (or infer) inputs:
|
|
13
|
+
- Repo root path and any in-scope paths.
|
|
14
|
+
- Intended usage, deployment model, internet exposure, and auth expectations (if known).
|
|
15
|
+
- Any existing repository summary or architecture spec.
|
|
16
|
+
- Use prompts in `references/prompt-template.md` to generate a repository summary.
|
|
17
|
+
- Follow the required output contract in `references/prompt-template.md`. Use it verbatim when possible.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
### 1) Scope and extract the system model
|
|
22
|
+
- Identify primary components, data stores, and external integrations from the repo summary.
|
|
23
|
+
- Identify how the system runs (server, CLI, library, worker) and its entrypoints.
|
|
24
|
+
- Separate runtime behavior from CI/build/dev tooling and from tests/examples.
|
|
25
|
+
- Map the in-scope locations to those components and exclude out-of-scope items explicitly.
|
|
26
|
+
- Do not claim components, flows, or controls without evidence.
|
|
27
|
+
|
|
28
|
+
### 2) Derive boundaries, assets, and entry points
|
|
29
|
+
- Enumerate trust boundaries as concrete edges between components, noting protocol, auth, encryption, validation, and rate limiting.
|
|
30
|
+
- List assets that drive risk (data, credentials, models, config, compute resources, audit logs).
|
|
31
|
+
- Identify entry points (endpoints, upload surfaces, parsers/decoders, job triggers, admin tooling, logging/error sinks).
|
|
32
|
+
|
|
33
|
+
### 3) Calibrate assets and attacker capabilities
|
|
34
|
+
- List the assets that drive risk (credentials, PII, integrity-critical state, availability-critical components, build artifacts).
|
|
35
|
+
- Describe realistic attacker capabilities based on exposure and intended usage.
|
|
36
|
+
- Explicitly note non-capabilities to avoid inflated severity.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### 4) Enumerate threats as abuse paths
|
|
40
|
+
- Prefer attacker goals that map to assets and boundaries (exfiltration, privilege escalation, integrity compromise, denial of service).
|
|
41
|
+
- Classify each threat and tie it to impacted assets.
|
|
42
|
+
- Keep the number of threats small but high quality.
|
|
43
|
+
|
|
44
|
+
### 5) Prioritize with explicit likelihood and impact reasoning
|
|
45
|
+
- Use qualitative likelihood and impact (low/medium/high) with short justifications.
|
|
46
|
+
- Set overall priority (critical/high/medium/low) using likelihood x impact, adjusted for existing controls.
|
|
47
|
+
- State which assumptions most influence the ranking.
|
|
48
|
+
|
|
49
|
+
### 6) Validate service context and assumptions with the user
|
|
50
|
+
- Summarize key assumptions that materially affect threat ranking or scope, then ask the user to confirm or correct them.
|
|
51
|
+
- Ask 1–3 targeted questions to resolve missing context (service owner and environment, scale/users, deployment model, authn/authz, internet exposure, data sensitivity, multi-tenancy).
|
|
52
|
+
- Pause and wait for user feedback before producing the final report.
|
|
53
|
+
- If the user declines or can’t answer, state which assumptions remain and how they influence priority.
|
|
54
|
+
|
|
55
|
+
### 7) Recommend mitigations and focus paths
|
|
56
|
+
- Distinguish existing mitigations (with evidence) from recommended mitigations.
|
|
57
|
+
- Tie mitigations to concrete locations (component, boundary, or entry point) and control types (authZ checks, input validation, schema enforcement, sandboxing, rate limits, secrets isolation, audit logging).
|
|
58
|
+
- Prefer specific implementation hints over generic advice (e.g., "enforce schema at gateway for upload payloads" vs "validate inputs").
|
|
59
|
+
- Base recommendations on validated user context; if assumptions remain unresolved, mark recommendations as conditional.
|
|
60
|
+
|
|
61
|
+
### 8) Run a quality check before finalizing
|
|
62
|
+
- Confirm all discovered entrypoints are covered.
|
|
63
|
+
- Confirm each trust boundary is represented in threats.
|
|
64
|
+
- Confirm runtime vs CI/dev separation.
|
|
65
|
+
- Confirm user clarifications (or explicit non-responses) are reflected.
|
|
66
|
+
- Confirm assumptions and open questions are explicit.
|
|
67
|
+
- Confirm that the format of the report matches closely the required output format defined in prompt template: `references/prompt-template.md`
|
|
68
|
+
- Write the final Markdown to a file named `<repo-or-dir-name>-threat-model.md` (use the basename of the repo root, or the in-scope directory if you were asked to model a subpath).
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## Risk prioritization guidance (illustrative, not exhaustive)
|
|
72
|
+
- High: pre-auth RCE, auth bypass, cross-tenant access, sensitive data exfiltration, key or token theft, model or config integrity compromise, sandbox escape.
|
|
73
|
+
- Medium: targeted DoS of critical components, partial data exposure, rate-limit bypass with measurable impact, log/metrics poisoning that affects detection.
|
|
74
|
+
- Low: low-sensitivity info leaks, noisy DoS with easy mitigation, issues requiring unlikely preconditions.
|
|
75
|
+
|
|
76
|
+
## References
|
|
77
|
+
|
|
78
|
+
- Output contract and full prompt template: `references/prompt-template.md`
|
|
79
|
+
- Optional controls/asset list: `references/security-controls-and-assets.md`
|
|
80
|
+
|
|
81
|
+
Only load the reference files you need. Keep the final result concise, grounded, and reviewable.
|