oh-my-codex-cli 0.1.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.
Files changed (292) hide show
  1. package/.agent/skills/agent-kb/HOW_TO_USE.md +428 -0
  2. package/.agent/skills/agent-kb/README.md +46 -0
  3. package/.agent/skills/agent-kb/SKILL.md +128 -0
  4. package/.agent/skills/agent-kb/references/intelligent-analysis-explained.md +333 -0
  5. package/.agent/skills/agent-kb/references/query-optimization.md +225 -0
  6. package/.agent/skills/aireview/SKILL.md +704 -0
  7. package/.agent/skills/analyze/SKILL.md +81 -0
  8. package/.agent/skills/architect-planner/HOW_TO_USE.md +238 -0
  9. package/.agent/skills/architect-planner/README.md +41 -0
  10. package/.agent/skills/architect-planner/SKILL.md +539 -0
  11. package/.agent/skills/auto-mbti/SKILL.md +291 -0
  12. package/.agent/skills/autopilot/SKILL.md +222 -0
  13. package/.agent/skills/backend-patterns/SKILL.md +602 -0
  14. package/.agent/skills/bdd-generator/README.md +78 -0
  15. package/.agent/skills/bdd-generator/SKILL.md +436 -0
  16. package/.agent/skills/brainstorming/HOW_TO_USE.md +289 -0
  17. package/.agent/skills/brainstorming/README.md +41 -0
  18. package/.agent/skills/brainstorming/SKILL.md +165 -0
  19. package/.agent/skills/build-fix/SKILL.md +190 -0
  20. package/.agent/skills/cancel/SKILL.md +658 -0
  21. package/.agent/skills/checkpoint/SKILL.md +94 -0
  22. package/.agent/skills/code-review/SKILL.md +273 -0
  23. package/.agent/skills/coding-standards/SKILL.md +535 -0
  24. package/.agent/skills/conductor/SKILL.md +128 -0
  25. package/.agent/skills/conductor/commands/conductor/implement.toml +358 -0
  26. package/.agent/skills/conductor/commands/conductor/newTrack.toml +142 -0
  27. package/.agent/skills/conductor/commands/conductor/revert.toml +123 -0
  28. package/.agent/skills/conductor/commands/conductor/setup.toml +429 -0
  29. package/.agent/skills/conductor/commands/conductor/status.toml +57 -0
  30. package/.agent/skills/conductor/scripts/install.sh +89 -0
  31. package/.agent/skills/conductor/templates/code_styleguides/csharp.md +115 -0
  32. package/.agent/skills/conductor/templates/code_styleguides/dart.md +238 -0
  33. package/.agent/skills/conductor/templates/code_styleguides/general.md +23 -0
  34. package/.agent/skills/conductor/templates/code_styleguides/go.md +48 -0
  35. package/.agent/skills/conductor/templates/code_styleguides/html-css.md +49 -0
  36. package/.agent/skills/conductor/templates/code_styleguides/javascript.md +51 -0
  37. package/.agent/skills/conductor/templates/code_styleguides/python.md +37 -0
  38. package/.agent/skills/conductor/templates/code_styleguides/typescript.md +43 -0
  39. package/.agent/skills/conductor/templates/rules/README.md +23 -0
  40. package/.agent/skills/conductor/templates/rules/agents.md +49 -0
  41. package/.agent/skills/conductor/templates/rules/coding-style.md +70 -0
  42. package/.agent/skills/conductor/templates/rules/dev.md +20 -0
  43. package/.agent/skills/conductor/templates/rules/git-workflow.md +45 -0
  44. package/.agent/skills/conductor/templates/rules/hooks.md +6 -0
  45. package/.agent/skills/conductor/templates/rules/patterns.md +55 -0
  46. package/.agent/skills/conductor/templates/rules/performance.md +47 -0
  47. package/.agent/skills/conductor/templates/rules/research.md +26 -0
  48. package/.agent/skills/conductor/templates/rules/review.md +22 -0
  49. package/.agent/skills/conductor/templates/rules/security.md +36 -0
  50. package/.agent/skills/conductor/templates/rules/testing.md +30 -0
  51. package/.agent/skills/conductor/templates/workflow.md +333 -0
  52. package/.agent/skills/consensus/HOW_TO_USE.md +191 -0
  53. package/.agent/skills/consensus/README.md +41 -0
  54. package/.agent/skills/consensus/SKILL.md +317 -0
  55. package/.agent/skills/content-research-writer/SKILL.md +537 -0
  56. package/.agent/skills/debug-analysis/SKILL.md +331 -0
  57. package/.agent/skills/deepinit/SKILL.md +347 -0
  58. package/.agent/skills/deepsearch/SKILL.md +56 -0
  59. package/.agent/skills/doctor/SKILL.md +158 -0
  60. package/.agent/skills/drawio/EXAMPLES.md +382 -0
  61. package/.agent/skills/drawio/QUICK_START.md +237 -0
  62. package/.agent/skills/drawio/README.md +315 -0
  63. package/.agent/skills/drawio/SETUP_GUIDE.md +254 -0
  64. package/.agent/skills/drawio/SKILL.md +1176 -0
  65. package/.agent/skills/e2e/SKILL.md +396 -0
  66. package/.agent/skills/ecomode/SKILL.md +160 -0
  67. package/.agent/skills/electron-driver/SKILL.md +144 -0
  68. package/.agent/skills/electron-driver/scripts/driver-template.js +71 -0
  69. package/.agent/skills/eval/SKILL.md +140 -0
  70. package/.agent/skills/eval-harness/SKILL.md +242 -0
  71. package/.agent/skills/evolve/SKILL.md +213 -0
  72. package/.agent/skills/frontend-design/SKILL.md +42 -0
  73. package/.agent/skills/frontend-patterns/SKILL.md +646 -0
  74. package/.agent/skills/frontend-ui-ux/SKILL.md +70 -0
  75. package/.agent/skills/git-master/SKILL.md +75 -0
  76. package/.agent/skills/help/SKILL.md +89 -0
  77. package/.agent/skills/iterative-retrieval/SKILL.md +217 -0
  78. package/.agent/skills/local-skills-setup/SKILL.md +483 -0
  79. package/.agent/skills/log-analyzer/SKILL.md +187 -0
  80. package/.agent/skills/mcp-setup/SKILL.md +226 -0
  81. package/.agent/skills/multi-model-research/HOW_TO_USE.md +614 -0
  82. package/.agent/skills/multi-model-research/README.md +233 -0
  83. package/.agent/skills/multi-model-research/SKILL.md +541 -0
  84. package/.agent/skills/multi-model-research/references/troubleshooting.md +415 -0
  85. package/.agent/skills/note/SKILL.md +80 -0
  86. package/.agent/skills/omc-setup/SKILL.md +219 -0
  87. package/.agent/skills/orchestrate/SKILL.md +620 -0
  88. package/.agent/skills/patent-workflow/IMPLEMENTATION_SUMMARY.md +500 -0
  89. package/.agent/skills/patent-workflow/README.md +455 -0
  90. package/.agent/skills/patent-workflow/SKILL.md +1036 -0
  91. package/.agent/skills/patent-workflow/tools/irr_checker.py +260 -0
  92. package/.agent/skills/patent-workflow/tools/sample_terminology.json +49 -0
  93. package/.agent/skills/patent-workflow/tools/term_checker.py +355 -0
  94. package/.agent/skills/pattern-recognition/SKILL.md +792 -0
  95. package/.agent/skills/pipeline/SKILL.md +448 -0
  96. package/.agent/skills/plan/SKILL.md +309 -0
  97. package/.agent/skills/planning-methodology/SKILL.md +370 -0
  98. package/.agent/skills/planning-with-files/SKILL.md +210 -0
  99. package/.agent/skills/planning-with-files/examples.md +202 -0
  100. package/.agent/skills/planning-with-files/reference.md +218 -0
  101. package/.agent/skills/planning-with-files/scripts/check-complete.ps1 +42 -0
  102. package/.agent/skills/planning-with-files/scripts/check-complete.sh +44 -0
  103. package/.agent/skills/planning-with-files/scripts/init-session.ps1 +120 -0
  104. package/.agent/skills/planning-with-files/scripts/init-session.sh +120 -0
  105. package/.agent/skills/planning-with-files/scripts/session-catchup.py +208 -0
  106. package/.agent/skills/planning-with-files/templates/findings.md +95 -0
  107. package/.agent/skills/planning-with-files/templates/progress.md +114 -0
  108. package/.agent/skills/planning-with-files/templates/task_plan.md +132 -0
  109. package/.agent/skills/project-analyze/CLAUDE.md +18 -0
  110. package/.agent/skills/project-analyze/HOW_TO_USE.md +145 -0
  111. package/.agent/skills/project-analyze/README.md +42 -0
  112. package/.agent/skills/project-analyze/SKILL.md +289 -0
  113. package/.agent/skills/project-analyze/SKILL.md.backup +287 -0
  114. package/.agent/skills/project-analyze/SKILL.md.backup_20260105_093646 +287 -0
  115. package/.agent/skills/project-analyze/assets/analysis-report-template.md +433 -0
  116. package/.agent/skills/project-analyze/references/analysis-patterns.md +422 -0
  117. package/.agent/skills/project-analyze/references/projectmind-explained.md +535 -0
  118. package/.agent/skills/project-session-manager/SKILL.md +428 -0
  119. package/.agent/skills/project-session-manager/lib/config.sh +86 -0
  120. package/.agent/skills/project-session-manager/lib/parse.sh +121 -0
  121. package/.agent/skills/project-session-manager/lib/session.sh +132 -0
  122. package/.agent/skills/project-session-manager/lib/tmux.sh +103 -0
  123. package/.agent/skills/project-session-manager/lib/worktree.sh +171 -0
  124. package/.agent/skills/project-session-manager/psm.sh +629 -0
  125. package/.agent/skills/project-session-manager/templates/feature.md +56 -0
  126. package/.agent/skills/project-session-manager/templates/issue-fix.md +57 -0
  127. package/.agent/skills/project-session-manager/templates/pr-review.md +65 -0
  128. package/.agent/skills/project-session-manager/templates/projects.json +19 -0
  129. package/.agent/skills/quality-check/HOW_TO_USE.md +171 -0
  130. package/.agent/skills/quality-check/README.md +50 -0
  131. package/.agent/skills/quality-check/SKILL.md +240 -0
  132. package/.agent/skills/quality-check/SKILL.md.backup +238 -0
  133. package/.agent/skills/quality-check/SKILL.md.backup_20260105_093646 +238 -0
  134. package/.agent/skills/quality-check/assets/quality-report-template.md +437 -0
  135. package/.agent/skills/quality-check/references/refactoring-patterns.md +550 -0
  136. package/.agent/skills/quality-check/references/scoring-criteria.md +454 -0
  137. package/.agent/skills/quality-validation/SKILL.md +519 -0
  138. package/.agent/skills/quality-validation/SKILL.md.backup +573 -0
  139. package/.agent/skills/quality-validation/SKILL.md.backup_20260105_093646 +573 -0
  140. package/.agent/skills/ralph/SKILL.md +236 -0
  141. package/.agent/skills/ralph-init/SKILL.md +78 -0
  142. package/.agent/skills/ralplan/SKILL.md +58 -0
  143. package/.agent/skills/refactor-clean/SKILL.md +49 -0
  144. package/.agent/skills/release/SKILL.md +84 -0
  145. package/.agent/skills/research/SKILL.md +526 -0
  146. package/.agent/skills/research-methodology/SKILL.md +268 -0
  147. package/.agent/skills/review/SKILL.md +53 -0
  148. package/.agent/skills/security-review/SKILL.md +509 -0
  149. package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
  150. package/.agent/skills/setup-pm/SKILL.md +102 -0
  151. package/.agent/skills/skill/SKILL.md +424 -0
  152. package/.agent/skills/skill-create/SKILL.md +209 -0
  153. package/.agent/skills/skill-debugger/HOW_TO_USE.md +244 -0
  154. package/.agent/skills/skill-debugger/README.md +44 -0
  155. package/.agent/skills/skill-debugger/SKILL.md +326 -0
  156. package/.agent/skills/skill-debugger/diagnostic_checklist.md +115 -0
  157. package/.agent/skills/skill-development/SKILL.md +661 -0
  158. package/.agent/skills/skill-development/references/skill-creator-original.md +209 -0
  159. package/.agent/skills/skill-doc-generator/README.md +37 -0
  160. package/.agent/skills/skill-doc-generator/SKILL.md +331 -0
  161. package/.agent/skills/skill-quality-analyzer/HOW_TO_USE.md +243 -0
  162. package/.agent/skills/skill-quality-analyzer/README.md +61 -0
  163. package/.agent/skills/skill-quality-analyzer/SKILL.md +247 -0
  164. package/.agent/skills/skill-quality-analyzer/analyzer.py +209 -0
  165. package/.agent/skills/skill-quality-analyzer/expected_output.json +81 -0
  166. package/.agent/skills/skill-quality-analyzer/sample_input.json +9 -0
  167. package/.agent/skills/skill-tester/README.md +46 -0
  168. package/.agent/skills/skill-tester/SKILL.md +345 -0
  169. package/.agent/skills/start-dev/SKILL.md +701 -0
  170. package/.agent/skills/swarm/SKILL.md +691 -0
  171. package/.agent/skills/task-kb-lookup/SKILL.md +211 -0
  172. package/.agent/skills/task-kb-record/SKILL.md +417 -0
  173. package/.agent/skills/tdd/SKILL.md +446 -0
  174. package/.agent/skills/tdd-generator/DEMO.md +516 -0
  175. package/.agent/skills/tdd-generator/README.md +89 -0
  176. package/.agent/skills/tdd-generator/SKILL.md +278 -0
  177. package/.agent/skills/tdd-workflow/SKILL.md +424 -0
  178. package/.agent/skills/test-coverage/SKILL.md +48 -0
  179. package/.agent/skills/thinkdeep/HOW_TO_USE.md +183 -0
  180. package/.agent/skills/thinkdeep/README.md +41 -0
  181. package/.agent/skills/thinkdeep/SKILL.md +343 -0
  182. package/.agent/skills/ui-ux-pro-max/SKILL.md +228 -0
  183. package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -0
  184. package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -0
  185. package/.agent/skills/ui-ux-pro-max/data/landing.csv +31 -0
  186. package/.agent/skills/ui-ux-pro-max/data/products.csv +97 -0
  187. package/.agent/skills/ui-ux-pro-max/data/prompts.csv +24 -0
  188. package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  189. package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  190. package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  191. package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  192. package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  193. package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  194. package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  195. package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  196. package/.agent/skills/ui-ux-pro-max/data/styles.csv +59 -0
  197. package/.agent/skills/ui-ux-pro-max/data/typography.csv +58 -0
  198. package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  199. package/.agent/skills/ui-ux-pro-max/scripts/core.py +236 -0
  200. package/.agent/skills/ui-ux-pro-max/scripts/search.py +61 -0
  201. package/.agent/skills/ultrapilot/SKILL.md +647 -0
  202. package/.agent/skills/ultraqa/SKILL.md +152 -0
  203. package/.agent/skills/ultrawork/SKILL.md +123 -0
  204. package/.agent/skills/update-codemaps/SKILL.md +38 -0
  205. package/.agent/skills/update-docs/SKILL.md +52 -0
  206. package/.agent/skills/verification-loop/SKILL.md +140 -0
  207. package/.agent/skills/verify/SKILL.md +80 -0
  208. package/.agent/skills/writer-memory/SKILL.md +459 -0
  209. package/.agent/skills/writer-memory/lib/character-tracker.ts +338 -0
  210. package/.agent/skills/writer-memory/lib/memory-manager.ts +804 -0
  211. package/.agent/skills/writer-memory/lib/relationship-graph.ts +400 -0
  212. package/.agent/skills/writer-memory/lib/scene-organizer.ts +544 -0
  213. package/.agent/skills/writer-memory/lib/synopsis-builder.ts +339 -0
  214. package/.agent/skills/writer-memory/templates/synopsis-template.md +46 -0
  215. package/.governance/skill-lint.allowlist +4 -0
  216. package/.governance/skill-llm.allowlist +4 -0
  217. package/AGENTS.md +59 -0
  218. package/LICENSE +21 -0
  219. package/README.md +169 -0
  220. package/README.zh.md +145 -0
  221. package/bin/omcodex.js +8 -0
  222. package/commands/conductor/implement.toml +358 -0
  223. package/commands/conductor/newTrack.toml +142 -0
  224. package/commands/conductor/revert.toml +123 -0
  225. package/commands/conductor/setup.toml +429 -0
  226. package/commands/conductor/status.toml +57 -0
  227. package/docs/ALIGNMENT.md +40 -0
  228. package/docs/CODEX.md +133 -0
  229. package/docs/NOTIFY.md +81 -0
  230. package/docs/SKILL_GOVERNANCE.md +72 -0
  231. package/docs/SKILL_GOVERNANCE_FRAMEWORK.md +182 -0
  232. package/docs/SKILL_GOVERNANCE_FRAMEWORK.zh.md +170 -0
  233. package/package.json +50 -0
  234. package/prompts/architect.md +105 -0
  235. package/prompts/executor.md +134 -0
  236. package/prompts/planner.md +113 -0
  237. package/scripts/check-skill-governance.sh +84 -0
  238. package/scripts/check-skill-llm-governance.js +302 -0
  239. package/scripts/eval-skills.js +217 -0
  240. package/scripts/generate-catalog-docs.js +95 -0
  241. package/scripts/generate-codex-mcp-config.sh +22 -0
  242. package/scripts/install-codex-force.sh +5 -0
  243. package/scripts/install-codex-incremental.sh +5 -0
  244. package/scripts/install-codex.sh +79 -0
  245. package/scripts/notify-dispatch.js +15 -0
  246. package/scripts/setup-package-manager.js +137 -0
  247. package/src/catalog/generated/public-catalog.json +547 -0
  248. package/src/catalog/manifest.json +542 -0
  249. package/src/catalog/reader.js +43 -0
  250. package/src/catalog/schema.js +79 -0
  251. package/src/cli/doctor.js +62 -0
  252. package/src/cli/index.js +85 -0
  253. package/src/cli/notify.js +127 -0
  254. package/src/cli/route.js +43 -0
  255. package/src/cli/setup.js +155 -0
  256. package/src/cli/team.js +125 -0
  257. package/src/config/generator.js +119 -0
  258. package/src/mcp/memory-server.js +241 -0
  259. package/src/mcp/state-server.js +112 -0
  260. package/src/mcp/trace-server.js +168 -0
  261. package/src/notify/dispatch.js +74 -0
  262. package/src/notify/extensibility/dispatcher.js +113 -0
  263. package/src/notify/extensibility/events.js +15 -0
  264. package/src/notify/extensibility/loader.js +54 -0
  265. package/src/router/skill-router.js +90 -0
  266. package/src/team/auto-advance.js +72 -0
  267. package/src/team/orchestrator.js +82 -0
  268. package/src/team/state-store.js +33 -0
  269. package/src/utils/paths.js +33 -0
  270. package/templates/AGENTS.md +15 -0
  271. package/templates/catalog-manifest.json +542 -0
  272. package/templates/code_styleguides/csharp.md +115 -0
  273. package/templates/code_styleguides/dart.md +238 -0
  274. package/templates/code_styleguides/general.md +23 -0
  275. package/templates/code_styleguides/go.md +48 -0
  276. package/templates/code_styleguides/html-css.md +49 -0
  277. package/templates/code_styleguides/javascript.md +51 -0
  278. package/templates/code_styleguides/python.md +37 -0
  279. package/templates/code_styleguides/typescript.md +43 -0
  280. package/templates/rules/README.md +23 -0
  281. package/templates/rules/agents.md +49 -0
  282. package/templates/rules/coding-style.md +70 -0
  283. package/templates/rules/dev.md +20 -0
  284. package/templates/rules/git-workflow.md +45 -0
  285. package/templates/rules/notify.md +6 -0
  286. package/templates/rules/patterns.md +55 -0
  287. package/templates/rules/performance.md +47 -0
  288. package/templates/rules/research.md +26 -0
  289. package/templates/rules/review.md +22 -0
  290. package/templates/rules/security.md +36 -0
  291. package/templates/rules/testing.md +30 -0
  292. package/templates/workflow.md +333 -0
@@ -0,0 +1,509 @@
1
+ ---
2
+ name: security-review
3
+ description: Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment/sensitive features. Provides comprehensive security checklist and patterns.
4
+ ---
5
+
6
+ # Security Review Skill
7
+
8
+
9
+ ## Native Subagent Protocol (Codex)
10
+
11
+ Codex supports native subagents. Delegate with `spawn_agent`, coordinate with `send_input`, collect via `wait`, and clean up with `close_agent`.
12
+
13
+ Execution preference:
14
+ 1. Use native subagents first for independent workstreams (parallel when possible).
15
+ 2. Merge results in main thread and run final verification.
16
+ 3. Fallback only when delegation is blocked: use the `[ANALYST]`/`[ARCHITECT]`/`[EXECUTOR]`/`[REVIEWER]` structure in a single response.
17
+
18
+ Minimal orchestration pattern:
19
+ ```text
20
+ spawn_agent -> send_input (optional) -> wait -> close_agent
21
+ ```
22
+
23
+ This skill ensures all code follows security best practices and identifies potential vulnerabilities.
24
+
25
+ ## When to Activate
26
+
27
+ - Implementing authentication or authorization
28
+ - Handling user input or file uploads
29
+ - Creating new API endpoints
30
+ - Working with secrets or credentials
31
+ - Implementing payment features
32
+ - Storing or transmitting sensitive data
33
+ - Integrating third-party APIs
34
+
35
+ ## Security Checklist
36
+
37
+ ### 1. Secrets Management
38
+
39
+ #### ❌ NEVER Do This
40
+ ```typescript
41
+ const apiKey = "sk-proj-xxxxx" // Hardcoded secret
42
+ const dbPassword = "password123" // In source code
43
+ ```
44
+
45
+ #### ✅ ALWAYS Do This
46
+ ```typescript
47
+ const apiKey = process.env.OPENAI_API_KEY
48
+ const dbUrl = process.env.DATABASE_URL
49
+
50
+ // Verify secrets exist
51
+ if (!apiKey) {
52
+ throw new Error('OPENAI_API_KEY not configured')
53
+ }
54
+ ```
55
+
56
+ #### Verification Steps
57
+ - [ ] No hardcoded API keys, tokens, or passwords
58
+ - [ ] All secrets in environment variables
59
+ - [ ] `.env.local` in .gitignore
60
+ - [ ] No secrets in git history
61
+ - [ ] Production secrets in hosting platform (Vercel, Railway)
62
+
63
+ ### 2. Input Validation
64
+
65
+ #### Always Validate User Input
66
+ ```typescript
67
+ import { z } from 'zod'
68
+
69
+ // Define validation schema
70
+ const CreateUserSchema = z.object({
71
+ email: z.string().email(),
72
+ name: z.string().min(1).max(100),
73
+ age: z.number().int().min(0).max(150)
74
+ })
75
+
76
+ // Validate before processing
77
+ export async function createUser(input: unknown) {
78
+ try {
79
+ const validated = CreateUserSchema.parse(input)
80
+ return await db.users.create(validated)
81
+ } catch (error) {
82
+ if (error instanceof z.ZodError) {
83
+ return { success: false, errors: error.errors }
84
+ }
85
+ throw error
86
+ }
87
+ }
88
+ ```
89
+
90
+ #### File Upload Validation
91
+ ```typescript
92
+ function validateFileUpload(file: File) {
93
+ // Size check (5MB max)
94
+ const maxSize = 5 * 1024 * 1024
95
+ if (file.size > maxSize) {
96
+ throw new Error('File too large (max 5MB)')
97
+ }
98
+
99
+ // Type check
100
+ const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
101
+ if (!allowedTypes.includes(file.type)) {
102
+ throw new Error('Invalid file type')
103
+ }
104
+
105
+ // Extension check
106
+ const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
107
+ const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
108
+ if (!extension || !allowedExtensions.includes(extension)) {
109
+ throw new Error('Invalid file extension')
110
+ }
111
+
112
+ return true
113
+ }
114
+ ```
115
+
116
+ #### Verification Steps
117
+ - [ ] All user inputs validated with schemas
118
+ - [ ] File uploads restricted (size, type, extension)
119
+ - [ ] No direct use of user input in queries
120
+ - [ ] Whitelist validation (not blacklist)
121
+ - [ ] Error messages don't leak sensitive info
122
+
123
+ ### 3. SQL Injection Prevention
124
+
125
+ #### ❌ NEVER Concatenate SQL
126
+ ```typescript
127
+ // DANGEROUS - SQL Injection vulnerability
128
+ const query = `SELECT * FROM users WHERE email = '${userEmail}'`
129
+ await db.query(query)
130
+ ```
131
+
132
+ #### ✅ ALWAYS Use Parameterized Queries
133
+ ```typescript
134
+ // Safe - parameterized query
135
+ const { data } = await supabase
136
+ .from('users')
137
+ .select('*')
138
+ .eq('email', userEmail)
139
+
140
+ // Or with raw SQL
141
+ await db.query(
142
+ 'SELECT * FROM users WHERE email = $1',
143
+ [userEmail]
144
+ )
145
+ ```
146
+
147
+ #### Verification Steps
148
+ - [ ] All database queries use parameterized queries
149
+ - [ ] No string concatenation in SQL
150
+ - [ ] ORM/query builder used correctly
151
+ - [ ] Supabase queries properly sanitized
152
+
153
+ ### 4. Authentication & Authorization
154
+
155
+ #### JWT Token Handling
156
+ ```typescript
157
+ // ❌ WRONG: localStorage (vulnerable to XSS)
158
+ localStorage.setItem('token', token)
159
+
160
+ // ✅ CORRECT: httpOnly cookies
161
+ res.setHeader('Set-Cookie',
162
+ `token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
163
+ ```
164
+
165
+ #### Authorization Checks
166
+ ```typescript
167
+ export async function deleteUser(userId: string, requesterId: string) {
168
+ // ALWAYS verify authorization first
169
+ const requester = await db.users.findUnique({
170
+ where: { id: requesterId }
171
+ })
172
+
173
+ if (requester.role !== 'admin') {
174
+ return NextResponse.json(
175
+ { error: 'Unauthorized' },
176
+ { status: 403 }
177
+ )
178
+ }
179
+
180
+ // Proceed with deletion
181
+ await db.users.delete({ where: { id: userId } })
182
+ }
183
+ ```
184
+
185
+ #### Row Level Security (Supabase)
186
+ ```sql
187
+ -- Enable RLS on all tables
188
+ ALTER TABLE users ENABLE ROW LEVEL SECURITY;
189
+
190
+ -- Users can only view their own data
191
+ CREATE POLICY "Users view own data"
192
+ ON users FOR SELECT
193
+ USING (auth.uid() = id);
194
+
195
+ -- Users can only update their own data
196
+ CREATE POLICY "Users update own data"
197
+ ON users FOR UPDATE
198
+ USING (auth.uid() = id);
199
+ ```
200
+
201
+ #### Verification Steps
202
+ - [ ] Tokens stored in httpOnly cookies (not localStorage)
203
+ - [ ] Authorization checks before sensitive operations
204
+ - [ ] Row Level Security enabled in Supabase
205
+ - [ ] Role-based access control implemented
206
+ - [ ] Session management secure
207
+
208
+ ### 5. XSS Prevention
209
+
210
+ #### Sanitize HTML
211
+ ```typescript
212
+ import DOMPurify from 'isomorphic-dompurify'
213
+
214
+ // ALWAYS sanitize user-provided HTML
215
+ function renderUserContent(html: string) {
216
+ const clean = DOMPurify.sanitize(html, {
217
+ ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
218
+ ALLOWED_ATTR: []
219
+ })
220
+ return <div dangerouslySetInnerHTML={{ __html: clean }} />
221
+ }
222
+ ```
223
+
224
+ #### Content Security Policy
225
+ ```typescript
226
+ // next.config.js
227
+ const securityHeaders = [
228
+ {
229
+ key: 'Content-Security-Policy',
230
+ value: `
231
+ default-src 'self';
232
+ script-src 'self' 'unsafe-eval' 'unsafe-inline';
233
+ style-src 'self' 'unsafe-inline';
234
+ img-src 'self' data: https:;
235
+ font-src 'self';
236
+ connect-src 'self' https://api.example.com;
237
+ `.replace(/\s{2,}/g, ' ').trim()
238
+ }
239
+ ]
240
+ ```
241
+
242
+ #### Verification Steps
243
+ - [ ] User-provided HTML sanitized
244
+ - [ ] CSP headers configured
245
+ - [ ] No unvalidated dynamic content rendering
246
+ - [ ] React's built-in XSS protection used
247
+
248
+ ### 6. CSRF Protection
249
+
250
+ #### CSRF Tokens
251
+ ```typescript
252
+ import { csrf } from '@/lib/csrf'
253
+
254
+ export async function POST(request: Request) {
255
+ const token = request.headers.get('X-CSRF-Token')
256
+
257
+ if (!csrf.verify(token)) {
258
+ return NextResponse.json(
259
+ { error: 'Invalid CSRF token' },
260
+ { status: 403 }
261
+ )
262
+ }
263
+
264
+ // Process request
265
+ }
266
+ ```
267
+
268
+ #### SameSite Cookies
269
+ ```typescript
270
+ res.setHeader('Set-Cookie',
271
+ `session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)
272
+ ```
273
+
274
+ #### Verification Steps
275
+ - [ ] CSRF tokens on state-changing operations
276
+ - [ ] SameSite=Strict on all cookies
277
+ - [ ] Double-submit cookie pattern implemented
278
+
279
+ ### 7. Rate Limiting
280
+
281
+ #### API Rate Limiting
282
+ ```typescript
283
+ import rateLimit from 'express-rate-limit'
284
+
285
+ const limiter = rateLimit({
286
+ windowMs: 15 * 60 * 1000, // 15 minutes
287
+ max: 100, // 100 requests per window
288
+ message: 'Too many requests'
289
+ })
290
+
291
+ // Apply to routes
292
+ app.use('/api/', limiter)
293
+ ```
294
+
295
+ #### Expensive Operations
296
+ ```typescript
297
+ // Aggressive rate limiting for searches
298
+ const searchLimiter = rateLimit({
299
+ windowMs: 60 * 1000, // 1 minute
300
+ max: 10, // 10 requests per minute
301
+ message: 'Too many search requests'
302
+ })
303
+
304
+ app.use('/api/search', searchLimiter)
305
+ ```
306
+
307
+ #### Verification Steps
308
+ - [ ] Rate limiting on all API endpoints
309
+ - [ ] Stricter limits on expensive operations
310
+ - [ ] IP-based rate limiting
311
+ - [ ] User-based rate limiting (authenticated)
312
+
313
+ ### 8. Sensitive Data Exposure
314
+
315
+ #### Logging
316
+ ```typescript
317
+ // ❌ WRONG: Logging sensitive data
318
+ console.log('User login:', { email, password })
319
+ console.log('Payment:', { cardNumber, cvv })
320
+
321
+ // ✅ CORRECT: Redact sensitive data
322
+ console.log('User login:', { email, userId })
323
+ console.log('Payment:', { last4: card.last4, userId })
324
+ ```
325
+
326
+ #### Error Messages
327
+ ```typescript
328
+ // ❌ WRONG: Exposing internal details
329
+ catch (error) {
330
+ return NextResponse.json(
331
+ { error: error.message, stack: error.stack },
332
+ { status: 500 }
333
+ )
334
+ }
335
+
336
+ // ✅ CORRECT: Generic error messages
337
+ catch (error) {
338
+ console.error('Internal error:', error)
339
+ return NextResponse.json(
340
+ { error: 'An error occurred. Please try again.' },
341
+ { status: 500 }
342
+ )
343
+ }
344
+ ```
345
+
346
+ #### Verification Steps
347
+ - [ ] No passwords, tokens, or secrets in logs
348
+ - [ ] Error messages generic for users
349
+ - [ ] Detailed errors only in server logs
350
+ - [ ] No stack traces exposed to users
351
+
352
+ ### 9. Blockchain Security (Solana)
353
+
354
+ #### Wallet Verification
355
+ ```typescript
356
+ import { verify } from '@solana/web3.js'
357
+
358
+ async function verifyWalletOwnership(
359
+ publicKey: string,
360
+ signature: string,
361
+ message: string
362
+ ) {
363
+ try {
364
+ const isValid = verify(
365
+ Buffer.from(message),
366
+ Buffer.from(signature, 'base64'),
367
+ Buffer.from(publicKey, 'base64')
368
+ )
369
+ return isValid
370
+ } catch (error) {
371
+ return false
372
+ }
373
+ }
374
+ ```
375
+
376
+ #### Transaction Verification
377
+ ```typescript
378
+ async function verifyTransaction(transaction: Transaction) {
379
+ // Verify recipient
380
+ if (transaction.to !== expectedRecipient) {
381
+ throw new Error('Invalid recipient')
382
+ }
383
+
384
+ // Verify amount
385
+ if (transaction.amount > maxAmount) {
386
+ throw new Error('Amount exceeds limit')
387
+ }
388
+
389
+ // Verify user has sufficient balance
390
+ const balance = await getBalance(transaction.from)
391
+ if (balance < transaction.amount) {
392
+ throw new Error('Insufficient balance')
393
+ }
394
+
395
+ return true
396
+ }
397
+ ```
398
+
399
+ #### Verification Steps
400
+ - [ ] Wallet signatures verified
401
+ - [ ] Transaction details validated
402
+ - [ ] Balance checks before transactions
403
+ - [ ] No blind transaction signing
404
+
405
+ ### 10. Dependency Security
406
+
407
+ #### Regular Updates
408
+ ```bash
409
+ # Check for vulnerabilities
410
+ npm audit
411
+
412
+ # Fix automatically fixable issues
413
+ npm audit fix
414
+
415
+ # Update dependencies
416
+ npm update
417
+
418
+ # Check for outdated packages
419
+ npm outdated
420
+ ```
421
+
422
+ #### Lock Files
423
+ ```bash
424
+ # ALWAYS commit lock files
425
+ git add package-lock.json
426
+
427
+ # Use in CI/CD for reproducible builds
428
+ npm ci # Instead of npm install
429
+ ```
430
+
431
+ #### Verification Steps
432
+ - [ ] Dependencies up to date
433
+ - [ ] No known vulnerabilities (npm audit clean)
434
+ - [ ] Lock files committed
435
+ - [ ] Dependabot enabled on GitHub
436
+ - [ ] Regular security updates
437
+
438
+ ## Security Testing
439
+
440
+ ### Automated Security Tests
441
+ ```typescript
442
+ // Test authentication
443
+ test('requires authentication', async () => {
444
+ const response = await fetch('/api/protected')
445
+ expect(response.status).toBe(401)
446
+ })
447
+
448
+ // Test authorization
449
+ test('requires admin role', async () => {
450
+ const response = await fetch('/api/admin', {
451
+ headers: { Authorization: `Bearer ${userToken}` }
452
+ })
453
+ expect(response.status).toBe(403)
454
+ })
455
+
456
+ // Test input validation
457
+ test('rejects invalid input', async () => {
458
+ const response = await fetch('/api/users', {
459
+ method: 'POST',
460
+ body: JSON.stringify({ email: 'not-an-email' })
461
+ })
462
+ expect(response.status).toBe(400)
463
+ })
464
+
465
+ // Test rate limiting
466
+ test('enforces rate limits', async () => {
467
+ const requests = Array(101).fill(null).map(() =>
468
+ fetch('/api/endpoint')
469
+ )
470
+
471
+ const responses = await Promise.all(requests)
472
+ const tooManyRequests = responses.filter(r => r.status === 429)
473
+
474
+ expect(tooManyRequests.length).toBeGreaterThan(0)
475
+ })
476
+ ```
477
+
478
+ ## Pre-Deployment Security Checklist
479
+
480
+ Before ANY production deployment:
481
+
482
+ - [ ] **Secrets**: No hardcoded secrets, all in env vars
483
+ - [ ] **Input Validation**: All user inputs validated
484
+ - [ ] **SQL Injection**: All queries parameterized
485
+ - [ ] **XSS**: User content sanitized
486
+ - [ ] **CSRF**: Protection enabled
487
+ - [ ] **Authentication**: Proper token handling
488
+ - [ ] **Authorization**: Role checks in place
489
+ - [ ] **Rate Limiting**: Enabled on all endpoints
490
+ - [ ] **HTTPS**: Enforced in production
491
+ - [ ] **Security Headers**: CSP, X-Frame-Options configured
492
+ - [ ] **Error Handling**: No sensitive data in errors
493
+ - [ ] **Logging**: No sensitive data logged
494
+ - [ ] **Dependencies**: Up to date, no vulnerabilities
495
+ - [ ] **Row Level Security**: Enabled in Supabase
496
+ - [ ] **CORS**: Properly configured
497
+ - [ ] **File Uploads**: Validated (size, type)
498
+ - [ ] **Wallet Signatures**: Verified (if blockchain)
499
+
500
+ ## Resources
501
+
502
+ - [OWASP Top 10](https://owasp.org/www-project-top-ten/)
503
+ - [Next.js Security](https://nextjs.org/docs/security)
504
+ - [Supabase Security](https://supabase.com/docs/guides/auth)
505
+ - [Web Security Academy](https://portswigger.net/web-security)
506
+
507
+ ---
508
+
509
+ **Remember**: Security is not optional. One vulnerability can compromise the entire platform. When in doubt, err on the side of caution.