@m2-ai/lattice-cli 0.0.0-stage → 0.8.7

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 (743) hide show
  1. package/DISCLOSURE +1 -0
  2. package/README.md +118 -2
  3. package/bundles/expo-mobile/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
  4. package/bundles/expo-mobile/.agents/skills/lattice-release-manager/SKILL.md +29 -0
  5. package/bundles/expo-mobile/.agents/skills/lattice-verify/SKILL.md +27 -0
  6. package/bundles/expo-mobile/.claude/agents/lattice-feature-agent.md +10 -0
  7. package/bundles/expo-mobile/.claude/agents/lattice-release-manager.md +9 -0
  8. package/bundles/expo-mobile/.claude/hooks/README.md +9 -0
  9. package/bundles/expo-mobile/.claude/hooks/pre-commit-verify.mjs +10 -0
  10. package/bundles/expo-mobile/.claude/hooks/pre-tool-use.mjs +51 -0
  11. package/bundles/expo-mobile/.claude/rules/lattice-core.md +20 -0
  12. package/bundles/expo-mobile/.claude/settings.json +38 -0
  13. package/bundles/expo-mobile/.claude/skills/lattice-verify/SKILL.md +27 -0
  14. package/bundles/expo-mobile/.codex/agents/lattice-feature-agent.toml +9 -0
  15. package/bundles/expo-mobile/.codex/agents/lattice-release-manager.toml +9 -0
  16. package/bundles/expo-mobile/.cursor/mcp.json +34 -0
  17. package/bundles/expo-mobile/.cursor/rules/lattice-core.mdc +35 -0
  18. package/bundles/expo-mobile/.cursor/rules.md +94 -0
  19. package/bundles/expo-mobile/.env.example +19 -0
  20. package/bundles/expo-mobile/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  21. package/bundles/expo-mobile/.github/agents/lattice-feature-agent.agent.md +7 -0
  22. package/bundles/expo-mobile/.github/agents/lattice-release-manager.agent.md +7 -0
  23. package/bundles/expo-mobile/.github/copilot-instructions.md +37 -0
  24. package/bundles/expo-mobile/.github/instructions/lattice-core.instructions.md +11 -0
  25. package/bundles/expo-mobile/.github/workflows/ci.yml +26 -0
  26. package/bundles/expo-mobile/.gitmessage +24 -0
  27. package/bundles/expo-mobile/.lattice/config.json +9 -0
  28. package/bundles/expo-mobile/.lattice/dependency-security.json +91 -0
  29. package/bundles/expo-mobile/.lattice/prompts/01-feature.md +36 -0
  30. package/bundles/expo-mobile/.lattice/prompts/02-bugfix.md +32 -0
  31. package/bundles/expo-mobile/.lattice/prompts/03-refactor.md +30 -0
  32. package/bundles/expo-mobile/.lattice/prompts/04-test.md +31 -0
  33. package/bundles/expo-mobile/.lattice/prompts/05-polish.md +38 -0
  34. package/bundles/expo-mobile/.lattice/prompts/06-security.md +32 -0
  35. package/bundles/expo-mobile/.lattice/release-workflow.json +55 -0
  36. package/bundles/expo-mobile/.lattice/schemas/feature-handoff.schema.json +264 -0
  37. package/bundles/expo-mobile/.lattice/templates/feature-handoff.json +52 -0
  38. package/bundles/expo-mobile/.mcp.json +35 -0
  39. package/bundles/expo-mobile/AGENTS.md +58 -0
  40. package/bundles/expo-mobile/CLAUDE.md +75 -0
  41. package/bundles/expo-mobile/PROJECT_GUIDE.md +299 -0
  42. package/bundles/expo-mobile/README.md +39 -0
  43. package/bundles/expo-mobile/__tests__/home.test.tsx +22 -0
  44. package/bundles/expo-mobile/app/_layout.tsx +20 -0
  45. package/bundles/expo-mobile/app/index.tsx +72 -0
  46. package/bundles/expo-mobile/app.json +33 -0
  47. package/bundles/expo-mobile/components/ui/Button.tsx +75 -0
  48. package/bundles/expo-mobile/components/ui/Input.tsx +50 -0
  49. package/bundles/expo-mobile/components/ui/index.ts +2 -0
  50. package/bundles/expo-mobile/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
  51. package/bundles/expo-mobile/docs/rules/codex.md +62 -0
  52. package/bundles/expo-mobile/eslint.config.js +7 -0
  53. package/bundles/expo-mobile/lib/supabase/client.ts +22 -0
  54. package/bundles/expo-mobile/lib/supabase/realtime.ts +10 -0
  55. package/bundles/expo-mobile/lib/supabase/storage.ts +6 -0
  56. package/bundles/expo-mobile/package.json +65 -0
  57. package/bundles/expo-mobile/plugins/with-lattice-commons-io.cjs +42 -0
  58. package/bundles/expo-mobile/prompts/01-feature-implementation.md +48 -0
  59. package/bundles/expo-mobile/prompts/02-bug-fix.md +43 -0
  60. package/bundles/expo-mobile/prompts/03-safe-refactor.md +38 -0
  61. package/bundles/expo-mobile/prompts/04-test-first.md +41 -0
  62. package/bundles/expo-mobile/prompts/05-ui-polish.md +44 -0
  63. package/bundles/expo-mobile/prompts/06-security-review.md +39 -0
  64. package/bundles/expo-mobile/prompts/quality.md +143 -0
  65. package/bundles/expo-mobile/supabase/migrations/001_initial_schema.sql +66 -0
  66. package/bundles/expo-mobile/tsconfig.json +21 -0
  67. package/bundles/expo-mobile/types/database.types.ts +76 -0
  68. package/bundles/expo-mobile/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
  69. package/bundles/expo-supabase/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
  70. package/bundles/expo-supabase/.agents/skills/lattice-release-manager/SKILL.md +29 -0
  71. package/bundles/expo-supabase/.agents/skills/lattice-verify/SKILL.md +27 -0
  72. package/bundles/expo-supabase/.claude/agents/lattice-feature-agent.md +10 -0
  73. package/bundles/expo-supabase/.claude/agents/lattice-release-manager.md +9 -0
  74. package/bundles/expo-supabase/.claude/hooks/README.md +9 -0
  75. package/bundles/expo-supabase/.claude/hooks/pre-commit-verify.mjs +10 -0
  76. package/bundles/expo-supabase/.claude/hooks/pre-tool-use.mjs +51 -0
  77. package/bundles/expo-supabase/.claude/rules/lattice-core.md +20 -0
  78. package/bundles/expo-supabase/.claude/settings.json +38 -0
  79. package/bundles/expo-supabase/.claude/skills/lattice-verify/SKILL.md +27 -0
  80. package/bundles/expo-supabase/.codex/agents/lattice-feature-agent.toml +9 -0
  81. package/bundles/expo-supabase/.codex/agents/lattice-release-manager.toml +9 -0
  82. package/bundles/expo-supabase/.cursor/mcp.json +34 -0
  83. package/bundles/expo-supabase/.cursor/rules/lattice-core.mdc +35 -0
  84. package/bundles/expo-supabase/.cursor/rules.md +94 -0
  85. package/bundles/expo-supabase/.env.example +12 -0
  86. package/bundles/expo-supabase/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  87. package/bundles/expo-supabase/.github/agents/lattice-feature-agent.agent.md +7 -0
  88. package/bundles/expo-supabase/.github/agents/lattice-release-manager.agent.md +7 -0
  89. package/bundles/expo-supabase/.github/copilot-instructions.md +37 -0
  90. package/bundles/expo-supabase/.github/instructions/lattice-core.instructions.md +11 -0
  91. package/bundles/expo-supabase/.github/workflows/ci.yml +26 -0
  92. package/bundles/expo-supabase/.gitmessage +24 -0
  93. package/bundles/expo-supabase/.lattice/config.json +9 -0
  94. package/bundles/expo-supabase/.lattice/dependency-security.json +91 -0
  95. package/bundles/expo-supabase/.lattice/prompts/01-feature.md +36 -0
  96. package/bundles/expo-supabase/.lattice/prompts/02-bugfix.md +32 -0
  97. package/bundles/expo-supabase/.lattice/prompts/03-refactor.md +30 -0
  98. package/bundles/expo-supabase/.lattice/prompts/04-test.md +31 -0
  99. package/bundles/expo-supabase/.lattice/prompts/05-polish.md +38 -0
  100. package/bundles/expo-supabase/.lattice/prompts/06-security.md +32 -0
  101. package/bundles/expo-supabase/.lattice/release-workflow.json +55 -0
  102. package/bundles/expo-supabase/.lattice/schemas/feature-handoff.schema.json +264 -0
  103. package/bundles/expo-supabase/.lattice/templates/feature-handoff.json +52 -0
  104. package/bundles/expo-supabase/.mcp.json +35 -0
  105. package/bundles/expo-supabase/AGENTS.md +58 -0
  106. package/bundles/expo-supabase/CLAUDE.md +75 -0
  107. package/bundles/expo-supabase/PROJECT_GUIDE.md +201 -0
  108. package/bundles/expo-supabase/README.md +38 -0
  109. package/bundles/expo-supabase/__tests__/home.test.tsx +22 -0
  110. package/bundles/expo-supabase/app/_layout.tsx +14 -0
  111. package/bundles/expo-supabase/app/index.tsx +72 -0
  112. package/bundles/expo-supabase/app.json +33 -0
  113. package/bundles/expo-supabase/components/ui/Button.tsx +75 -0
  114. package/bundles/expo-supabase/components/ui/Input.tsx +50 -0
  115. package/bundles/expo-supabase/components/ui/index.ts +2 -0
  116. package/bundles/expo-supabase/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
  117. package/bundles/expo-supabase/docs/rules/codex.md +62 -0
  118. package/bundles/expo-supabase/eslint.config.js +7 -0
  119. package/bundles/expo-supabase/lib/supabase/client.ts +22 -0
  120. package/bundles/expo-supabase/lib/supabase/realtime.ts +10 -0
  121. package/bundles/expo-supabase/lib/supabase/storage.ts +6 -0
  122. package/bundles/expo-supabase/package.json +60 -0
  123. package/bundles/expo-supabase/plugins/with-lattice-commons-io.cjs +42 -0
  124. package/bundles/expo-supabase/prompts/01-feature-implementation.md +8 -0
  125. package/bundles/expo-supabase/prompts/02-bug-fix.md +9 -0
  126. package/bundles/expo-supabase/prompts/03-safe-refactor.md +8 -0
  127. package/bundles/expo-supabase/prompts/04-test-first.md +7 -0
  128. package/bundles/expo-supabase/prompts/05-ui-polish.md +7 -0
  129. package/bundles/expo-supabase/prompts/06-security-review.md +7 -0
  130. package/bundles/expo-supabase/prompts/quality.md +143 -0
  131. package/bundles/expo-supabase/supabase/migrations/001_initial_schema.sql +66 -0
  132. package/bundles/expo-supabase/tsconfig.json +21 -0
  133. package/bundles/expo-supabase/types/database.types.ts +76 -0
  134. package/bundles/expo-supabase/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
  135. package/bundles/nextjs-landing/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
  136. package/bundles/nextjs-landing/.agents/skills/lattice-release-manager/SKILL.md +29 -0
  137. package/bundles/nextjs-landing/.agents/skills/lattice-verify/SKILL.md +27 -0
  138. package/bundles/nextjs-landing/.claude/agents/lattice-feature-agent.md +10 -0
  139. package/bundles/nextjs-landing/.claude/agents/lattice-release-manager.md +9 -0
  140. package/bundles/nextjs-landing/.claude/hooks/README.md +9 -0
  141. package/bundles/nextjs-landing/.claude/hooks/pre-commit-verify.mjs +10 -0
  142. package/bundles/nextjs-landing/.claude/hooks/pre-tool-use.mjs +51 -0
  143. package/bundles/nextjs-landing/.claude/rules/lattice-core.md +20 -0
  144. package/bundles/nextjs-landing/.claude/settings.json +38 -0
  145. package/bundles/nextjs-landing/.claude/skills/lattice-verify/SKILL.md +27 -0
  146. package/bundles/nextjs-landing/.codex/agents/lattice-feature-agent.toml +9 -0
  147. package/bundles/nextjs-landing/.codex/agents/lattice-release-manager.toml +9 -0
  148. package/bundles/nextjs-landing/.cursor/mcp.json +34 -0
  149. package/bundles/nextjs-landing/.cursor/rules/lattice-core.mdc +35 -0
  150. package/bundles/nextjs-landing/.cursor/rules.md +95 -0
  151. package/bundles/nextjs-landing/.env.example +24 -0
  152. package/bundles/nextjs-landing/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  153. package/bundles/nextjs-landing/.github/agents/lattice-feature-agent.agent.md +7 -0
  154. package/bundles/nextjs-landing/.github/agents/lattice-release-manager.agent.md +7 -0
  155. package/bundles/nextjs-landing/.github/copilot-instructions.md +37 -0
  156. package/bundles/nextjs-landing/.github/instructions/lattice-core.instructions.md +11 -0
  157. package/bundles/nextjs-landing/.github/workflows/ci.yml +26 -0
  158. package/bundles/nextjs-landing/.gitmessage +24 -0
  159. package/bundles/nextjs-landing/.lattice/config.json +9 -0
  160. package/bundles/nextjs-landing/.lattice/dependency-security.json +46 -0
  161. package/bundles/nextjs-landing/.lattice/prompts/01-feature.md +36 -0
  162. package/bundles/nextjs-landing/.lattice/prompts/02-bugfix.md +32 -0
  163. package/bundles/nextjs-landing/.lattice/prompts/03-refactor.md +30 -0
  164. package/bundles/nextjs-landing/.lattice/prompts/04-test.md +31 -0
  165. package/bundles/nextjs-landing/.lattice/prompts/05-polish.md +38 -0
  166. package/bundles/nextjs-landing/.lattice/prompts/06-security.md +32 -0
  167. package/bundles/nextjs-landing/.lattice/release-workflow.json +55 -0
  168. package/bundles/nextjs-landing/.lattice/schemas/feature-handoff.schema.json +264 -0
  169. package/bundles/nextjs-landing/.lattice/templates/feature-handoff.json +52 -0
  170. package/bundles/nextjs-landing/.mcp.json +35 -0
  171. package/bundles/nextjs-landing/AGENTS.md +58 -0
  172. package/bundles/nextjs-landing/CLAUDE.md +76 -0
  173. package/bundles/nextjs-landing/PROJECT_GUIDE.md +216 -0
  174. package/bundles/nextjs-landing/README.md +39 -0
  175. package/bundles/nextjs-landing/app/api/example/[id]/route.ts +34 -0
  176. package/bundles/nextjs-landing/app/api/example/route.ts +24 -0
  177. package/bundles/nextjs-landing/app/api/health/route.ts +8 -0
  178. package/bundles/nextjs-landing/app/global-error.tsx +17 -0
  179. package/bundles/nextjs-landing/app/globals.css +55 -0
  180. package/bundles/nextjs-landing/app/layout.tsx +22 -0
  181. package/bundles/nextjs-landing/app/page.tsx +42 -0
  182. package/bundles/nextjs-landing/components/ui/button.tsx +39 -0
  183. package/bundles/nextjs-landing/components/ui/card.tsx +53 -0
  184. package/bundles/nextjs-landing/components/ui/index.ts +4 -0
  185. package/bundles/nextjs-landing/components/ui/input.tsx +23 -0
  186. package/bundles/nextjs-landing/components/ui/spinner.tsx +22 -0
  187. package/bundles/nextjs-landing/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
  188. package/bundles/nextjs-landing/docs/rules/codex.md +62 -0
  189. package/bundles/nextjs-landing/eslint.config.mjs +16 -0
  190. package/bundles/nextjs-landing/instrumentation-client.ts +30 -0
  191. package/bundles/nextjs-landing/instrumentation.ts +12 -0
  192. package/bundles/nextjs-landing/jest.config.mjs +16 -0
  193. package/bundles/nextjs-landing/jest.setup.js +1 -0
  194. package/bundles/nextjs-landing/lib/utils.ts +6 -0
  195. package/bundles/nextjs-landing/next-env.d.ts +5 -0
  196. package/bundles/nextjs-landing/next.config.ts +15 -0
  197. package/bundles/nextjs-landing/package.json +48 -0
  198. package/bundles/nextjs-landing/postcss.config.mjs +7 -0
  199. package/bundles/nextjs-landing/prompts/01-feature-implementation.md +9 -0
  200. package/bundles/nextjs-landing/prompts/02-bug-fix.md +10 -0
  201. package/bundles/nextjs-landing/prompts/03-safe-refactor.md +8 -0
  202. package/bundles/nextjs-landing/prompts/04-test-first.md +8 -0
  203. package/bundles/nextjs-landing/prompts/05-ui-polish.md +8 -0
  204. package/bundles/nextjs-landing/prompts/06-security-review.md +7 -0
  205. package/bundles/nextjs-landing/prompts/quality.md +269 -0
  206. package/bundles/nextjs-landing/sentry.edge.config.ts +15 -0
  207. package/bundles/nextjs-landing/sentry.server.config.ts +15 -0
  208. package/bundles/nextjs-landing/tsconfig.json +42 -0
  209. package/bundles/nextjs-landing/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
  210. package/bundles/nextjs-saas/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
  211. package/bundles/nextjs-saas/.agents/skills/lattice-release-manager/SKILL.md +29 -0
  212. package/bundles/nextjs-saas/.agents/skills/lattice-verify/SKILL.md +27 -0
  213. package/bundles/nextjs-saas/.claude/agents/lattice-feature-agent.md +10 -0
  214. package/bundles/nextjs-saas/.claude/agents/lattice-release-manager.md +9 -0
  215. package/bundles/nextjs-saas/.claude/hooks/README.md +9 -0
  216. package/bundles/nextjs-saas/.claude/hooks/pre-commit-verify.mjs +10 -0
  217. package/bundles/nextjs-saas/.claude/hooks/pre-tool-use.mjs +51 -0
  218. package/bundles/nextjs-saas/.claude/rules/lattice-core.md +20 -0
  219. package/bundles/nextjs-saas/.claude/settings.json +38 -0
  220. package/bundles/nextjs-saas/.claude/skills/lattice-verify/SKILL.md +27 -0
  221. package/bundles/nextjs-saas/.codex/agents/lattice-feature-agent.toml +9 -0
  222. package/bundles/nextjs-saas/.codex/agents/lattice-release-manager.toml +9 -0
  223. package/bundles/nextjs-saas/.cursor/mcp.json +34 -0
  224. package/bundles/nextjs-saas/.cursor/rules/lattice-core.mdc +35 -0
  225. package/bundles/nextjs-saas/.cursor/rules.md +95 -0
  226. package/bundles/nextjs-saas/.env.example +48 -0
  227. package/bundles/nextjs-saas/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  228. package/bundles/nextjs-saas/.github/agents/lattice-feature-agent.agent.md +7 -0
  229. package/bundles/nextjs-saas/.github/agents/lattice-release-manager.agent.md +7 -0
  230. package/bundles/nextjs-saas/.github/copilot-instructions.md +37 -0
  231. package/bundles/nextjs-saas/.github/instructions/lattice-core.instructions.md +11 -0
  232. package/bundles/nextjs-saas/.github/workflows/ci.yml +26 -0
  233. package/bundles/nextjs-saas/.gitmessage +24 -0
  234. package/bundles/nextjs-saas/.lattice/config.json +9 -0
  235. package/bundles/nextjs-saas/.lattice/dependency-security.json +46 -0
  236. package/bundles/nextjs-saas/.lattice/prompts/01-feature.md +36 -0
  237. package/bundles/nextjs-saas/.lattice/prompts/02-bugfix.md +32 -0
  238. package/bundles/nextjs-saas/.lattice/prompts/03-refactor.md +30 -0
  239. package/bundles/nextjs-saas/.lattice/prompts/04-test.md +31 -0
  240. package/bundles/nextjs-saas/.lattice/prompts/05-polish.md +38 -0
  241. package/bundles/nextjs-saas/.lattice/prompts/06-security.md +32 -0
  242. package/bundles/nextjs-saas/.lattice/prompts/quality.md +269 -0
  243. package/bundles/nextjs-saas/.lattice/release-workflow.json +55 -0
  244. package/bundles/nextjs-saas/.lattice/schemas/feature-handoff.schema.json +264 -0
  245. package/bundles/nextjs-saas/.lattice/templates/feature-handoff.json +52 -0
  246. package/bundles/nextjs-saas/.mcp.json +35 -0
  247. package/bundles/nextjs-saas/AGENTS.md +58 -0
  248. package/bundles/nextjs-saas/CLAUDE.md +76 -0
  249. package/bundles/nextjs-saas/PROJECT_GUIDE.md +279 -0
  250. package/bundles/nextjs-saas/README.md +42 -0
  251. package/bundles/nextjs-saas/app/(auth)/forgot-password/page.tsx +101 -0
  252. package/bundles/nextjs-saas/app/(auth)/layout.tsx +7 -0
  253. package/bundles/nextjs-saas/app/(auth)/login/page.tsx +108 -0
  254. package/bundles/nextjs-saas/app/(auth)/reset-password/page.tsx +135 -0
  255. package/bundles/nextjs-saas/app/(auth)/signup/page.tsx +144 -0
  256. package/bundles/nextjs-saas/app/(dashboard)/dashboard/page.tsx +80 -0
  257. package/bundles/nextjs-saas/app/(dashboard)/layout.tsx +49 -0
  258. package/bundles/nextjs-saas/app/api/billing/checkout/route.ts +47 -0
  259. package/bundles/nextjs-saas/app/api/billing/portal/route.ts +29 -0
  260. package/bundles/nextjs-saas/app/api/example/[id]/route.ts +93 -0
  261. package/bundles/nextjs-saas/app/api/example/route.ts +61 -0
  262. package/bundles/nextjs-saas/app/api/health/route.ts +8 -0
  263. package/bundles/nextjs-saas/app/api/stripe/webhook/route.ts +57 -0
  264. package/bundles/nextjs-saas/app/api/user/route.ts +49 -0
  265. package/bundles/nextjs-saas/app/auth/callback/route.ts +16 -0
  266. package/bundles/nextjs-saas/app/auth/signout/route.ts +10 -0
  267. package/bundles/nextjs-saas/app/global-error.tsx +17 -0
  268. package/bundles/nextjs-saas/app/globals.css +55 -0
  269. package/bundles/nextjs-saas/app/layout.tsx +22 -0
  270. package/bundles/nextjs-saas/app/page.tsx +84 -0
  271. package/bundles/nextjs-saas/components/ui/button.tsx +39 -0
  272. package/bundles/nextjs-saas/components/ui/card.tsx +53 -0
  273. package/bundles/nextjs-saas/components/ui/index.ts +4 -0
  274. package/bundles/nextjs-saas/components/ui/input.tsx +23 -0
  275. package/bundles/nextjs-saas/components/ui/spinner.tsx +22 -0
  276. package/bundles/nextjs-saas/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
  277. package/bundles/nextjs-saas/docs/rules/codex.md +62 -0
  278. package/bundles/nextjs-saas/eslint.config.mjs +16 -0
  279. package/bundles/nextjs-saas/instrumentation-client.ts +30 -0
  280. package/bundles/nextjs-saas/instrumentation.ts +12 -0
  281. package/bundles/nextjs-saas/jest.config.mjs +16 -0
  282. package/bundles/nextjs-saas/jest.setup.js +1 -0
  283. package/bundles/nextjs-saas/lib/auth/password-recovery.ts +94 -0
  284. package/bundles/nextjs-saas/lib/stripe.ts +10 -0
  285. package/bundles/nextjs-saas/lib/supabase/admin.ts +14 -0
  286. package/bundles/nextjs-saas/lib/supabase/client.ts +8 -0
  287. package/bundles/nextjs-saas/lib/supabase/server.ts +27 -0
  288. package/bundles/nextjs-saas/lib/utils.ts +6 -0
  289. package/bundles/nextjs-saas/next-env.d.ts +5 -0
  290. package/bundles/nextjs-saas/next.config.ts +15 -0
  291. package/bundles/nextjs-saas/package.json +50 -0
  292. package/bundles/nextjs-saas/postcss.config.mjs +7 -0
  293. package/bundles/nextjs-saas/prompts/01-feature-implementation.md +92 -0
  294. package/bundles/nextjs-saas/prompts/02-bug-fix.md +78 -0
  295. package/bundles/nextjs-saas/prompts/03-safe-refactor.md +82 -0
  296. package/bundles/nextjs-saas/prompts/04-test-first.md +80 -0
  297. package/bundles/nextjs-saas/prompts/05-ui-polish.md +82 -0
  298. package/bundles/nextjs-saas/prompts/06-security-review.md +74 -0
  299. package/bundles/nextjs-saas/proxy.ts +61 -0
  300. package/bundles/nextjs-saas/sentry.edge.config.ts +15 -0
  301. package/bundles/nextjs-saas/sentry.server.config.ts +15 -0
  302. package/bundles/nextjs-saas/supabase/migrations/001_initial_schema.sql +66 -0
  303. package/bundles/nextjs-saas/supabase/migrations/002_billing.sql +17 -0
  304. package/bundles/nextjs-saas/tsconfig.json +42 -0
  305. package/bundles/nextjs-saas/types/database.types.ts +76 -0
  306. package/bundles/nextjs-saas/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
  307. package/bundles/nextjs-trpc/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
  308. package/bundles/nextjs-trpc/.agents/skills/lattice-release-manager/SKILL.md +29 -0
  309. package/bundles/nextjs-trpc/.agents/skills/lattice-verify/SKILL.md +27 -0
  310. package/bundles/nextjs-trpc/.claude/agents/lattice-feature-agent.md +10 -0
  311. package/bundles/nextjs-trpc/.claude/agents/lattice-release-manager.md +9 -0
  312. package/bundles/nextjs-trpc/.claude/hooks/README.md +9 -0
  313. package/bundles/nextjs-trpc/.claude/hooks/pre-commit-verify.mjs +10 -0
  314. package/bundles/nextjs-trpc/.claude/hooks/pre-tool-use.mjs +51 -0
  315. package/bundles/nextjs-trpc/.claude/rules/lattice-core.md +20 -0
  316. package/bundles/nextjs-trpc/.claude/settings.json +38 -0
  317. package/bundles/nextjs-trpc/.claude/skills/lattice-verify/SKILL.md +27 -0
  318. package/bundles/nextjs-trpc/.codex/agents/lattice-feature-agent.toml +9 -0
  319. package/bundles/nextjs-trpc/.codex/agents/lattice-release-manager.toml +9 -0
  320. package/bundles/nextjs-trpc/.cursor/mcp.json +34 -0
  321. package/bundles/nextjs-trpc/.cursor/rules/lattice-core.mdc +35 -0
  322. package/bundles/nextjs-trpc/.cursor/rules.md +95 -0
  323. package/bundles/nextjs-trpc/.env.example +21 -0
  324. package/bundles/nextjs-trpc/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  325. package/bundles/nextjs-trpc/.github/agents/lattice-feature-agent.agent.md +7 -0
  326. package/bundles/nextjs-trpc/.github/agents/lattice-release-manager.agent.md +7 -0
  327. package/bundles/nextjs-trpc/.github/copilot-instructions.md +37 -0
  328. package/bundles/nextjs-trpc/.github/instructions/lattice-core.instructions.md +11 -0
  329. package/bundles/nextjs-trpc/.github/workflows/ci.yml +26 -0
  330. package/bundles/nextjs-trpc/.gitmessage +24 -0
  331. package/bundles/nextjs-trpc/.lattice/config.json +9 -0
  332. package/bundles/nextjs-trpc/.lattice/dependency-security.json +46 -0
  333. package/bundles/nextjs-trpc/.lattice/prompts/01-feature.md +36 -0
  334. package/bundles/nextjs-trpc/.lattice/prompts/02-bugfix.md +32 -0
  335. package/bundles/nextjs-trpc/.lattice/prompts/03-refactor.md +30 -0
  336. package/bundles/nextjs-trpc/.lattice/prompts/04-test.md +31 -0
  337. package/bundles/nextjs-trpc/.lattice/prompts/05-polish.md +38 -0
  338. package/bundles/nextjs-trpc/.lattice/prompts/06-security.md +32 -0
  339. package/bundles/nextjs-trpc/.lattice/release-workflow.json +55 -0
  340. package/bundles/nextjs-trpc/.lattice/schemas/feature-handoff.schema.json +264 -0
  341. package/bundles/nextjs-trpc/.lattice/templates/feature-handoff.json +52 -0
  342. package/bundles/nextjs-trpc/.mcp.json +35 -0
  343. package/bundles/nextjs-trpc/AGENTS.md +58 -0
  344. package/bundles/nextjs-trpc/CLAUDE.md +76 -0
  345. package/bundles/nextjs-trpc/PROJECT_GUIDE.md +187 -0
  346. package/bundles/nextjs-trpc/README.md +49 -0
  347. package/bundles/nextjs-trpc/app/api/trpc/[trpc]/route.ts +12 -0
  348. package/bundles/nextjs-trpc/app/global-error.tsx +17 -0
  349. package/bundles/nextjs-trpc/app/globals.css +55 -0
  350. package/bundles/nextjs-trpc/app/layout.tsx +19 -0
  351. package/bundles/nextjs-trpc/app/page.tsx +16 -0
  352. package/bundles/nextjs-trpc/app/providers.tsx +24 -0
  353. package/bundles/nextjs-trpc/components/ui/button.tsx +39 -0
  354. package/bundles/nextjs-trpc/components/ui/card.tsx +53 -0
  355. package/bundles/nextjs-trpc/components/ui/index.ts +4 -0
  356. package/bundles/nextjs-trpc/components/ui/input.tsx +23 -0
  357. package/bundles/nextjs-trpc/components/ui/spinner.tsx +22 -0
  358. package/bundles/nextjs-trpc/components/user-list.tsx +17 -0
  359. package/bundles/nextjs-trpc/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
  360. package/bundles/nextjs-trpc/docs/rules/codex.md +62 -0
  361. package/bundles/nextjs-trpc/eslint.config.mjs +16 -0
  362. package/bundles/nextjs-trpc/instrumentation-client.ts +20 -0
  363. package/bundles/nextjs-trpc/instrumentation.ts +12 -0
  364. package/bundles/nextjs-trpc/jest.config.mjs +16 -0
  365. package/bundles/nextjs-trpc/jest.setup.js +1 -0
  366. package/bundles/nextjs-trpc/lib/db.ts +17 -0
  367. package/bundles/nextjs-trpc/lib/trpc/react.tsx +7 -0
  368. package/bundles/nextjs-trpc/lib/utils.ts +6 -0
  369. package/bundles/nextjs-trpc/next-env.d.ts +5 -0
  370. package/bundles/nextjs-trpc/next.config.ts +15 -0
  371. package/bundles/nextjs-trpc/package.json +62 -0
  372. package/bundles/nextjs-trpc/postcss.config.mjs +7 -0
  373. package/bundles/nextjs-trpc/prisma/schema.prisma +41 -0
  374. package/bundles/nextjs-trpc/prisma.config.ts +10 -0
  375. package/bundles/nextjs-trpc/prompts/01-feature-implementation.md +9 -0
  376. package/bundles/nextjs-trpc/prompts/02-bug-fix.md +9 -0
  377. package/bundles/nextjs-trpc/prompts/03-safe-refactor.md +8 -0
  378. package/bundles/nextjs-trpc/prompts/04-test-first.md +8 -0
  379. package/bundles/nextjs-trpc/prompts/05-ui-polish.md +7 -0
  380. package/bundles/nextjs-trpc/prompts/06-security-review.md +7 -0
  381. package/bundles/nextjs-trpc/prompts/quality.md +269 -0
  382. package/bundles/nextjs-trpc/sentry.edge.config.ts +15 -0
  383. package/bundles/nextjs-trpc/sentry.server.config.ts +15 -0
  384. package/bundles/nextjs-trpc/server/routers/_app.test.ts +60 -0
  385. package/bundles/nextjs-trpc/server/routers/_app.ts +25 -0
  386. package/bundles/nextjs-trpc/server/trpc.ts +12 -0
  387. package/bundles/nextjs-trpc/tsconfig.json +42 -0
  388. package/bundles/nextjs-trpc/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
  389. package/dist/agent-install-session.d.ts +17 -0
  390. package/dist/agent-install-session.d.ts.map +1 -0
  391. package/dist/agent-install-session.js +106 -0
  392. package/dist/agent-install-session.js.map +1 -0
  393. package/dist/agent-install-session.test.d.ts +2 -0
  394. package/dist/agent-install-session.test.d.ts.map +1 -0
  395. package/dist/agent-install-session.test.js +62 -0
  396. package/dist/agent-install-session.test.js.map +1 -0
  397. package/dist/agent-install.d.ts +41 -0
  398. package/dist/agent-install.d.ts.map +1 -0
  399. package/dist/agent-install.js +42 -0
  400. package/dist/agent-install.js.map +1 -0
  401. package/dist/agent-install.test.d.ts +2 -0
  402. package/dist/agent-install.test.d.ts.map +1 -0
  403. package/dist/agent-install.test.js +58 -0
  404. package/dist/agent-install.test.js.map +1 -0
  405. package/dist/apply-merge.test.d.ts +2 -0
  406. package/dist/apply-merge.test.d.ts.map +1 -0
  407. package/dist/apply-merge.test.js +123 -0
  408. package/dist/apply-merge.test.js.map +1 -0
  409. package/dist/bundle-download.d.ts +23 -0
  410. package/dist/bundle-download.d.ts.map +1 -0
  411. package/dist/bundle-download.js +180 -0
  412. package/dist/bundle-download.js.map +1 -0
  413. package/dist/bundle-download.test.d.ts +2 -0
  414. package/dist/bundle-download.test.d.ts.map +1 -0
  415. package/dist/bundle-download.test.js +200 -0
  416. package/dist/bundle-download.test.js.map +1 -0
  417. package/dist/bundle-rollback.test.d.ts +2 -0
  418. package/dist/bundle-rollback.test.d.ts.map +1 -0
  419. package/dist/bundle-rollback.test.js +127 -0
  420. package/dist/bundle-rollback.test.js.map +1 -0
  421. package/dist/bundle-scaffold.test.d.ts +2 -0
  422. package/dist/bundle-scaffold.test.d.ts.map +1 -0
  423. package/dist/bundle-scaffold.test.js +105 -0
  424. package/dist/bundle-scaffold.test.js.map +1 -0
  425. package/dist/commands.d.ts +132 -0
  426. package/dist/commands.d.ts.map +1 -0
  427. package/dist/commands.js +2012 -0
  428. package/dist/commands.js.map +1 -0
  429. package/dist/credential-store.d.ts +27 -0
  430. package/dist/credential-store.d.ts.map +1 -0
  431. package/dist/credential-store.js +48 -0
  432. package/dist/credential-store.js.map +1 -0
  433. package/dist/credential-store.test.d.ts +2 -0
  434. package/dist/credential-store.test.d.ts.map +1 -0
  435. package/dist/credential-store.test.js +80 -0
  436. package/dist/credential-store.test.js.map +1 -0
  437. package/dist/delivered-project-files.d.ts +31 -0
  438. package/dist/delivered-project-files.d.ts.map +1 -0
  439. package/dist/delivered-project-files.js +158 -0
  440. package/dist/delivered-project-files.js.map +1 -0
  441. package/dist/delivered-project-files.test.d.ts +2 -0
  442. package/dist/delivered-project-files.test.d.ts.map +1 -0
  443. package/dist/delivered-project-files.test.js +107 -0
  444. package/dist/delivered-project-files.test.js.map +1 -0
  445. package/dist/doctor-agents.test.d.ts +2 -0
  446. package/dist/doctor-agents.test.d.ts.map +1 -0
  447. package/dist/doctor-agents.test.js +65 -0
  448. package/dist/doctor-agents.test.js.map +1 -0
  449. package/dist/hermes-install.d.ts +102 -0
  450. package/dist/hermes-install.d.ts.map +1 -0
  451. package/dist/hermes-install.js +641 -0
  452. package/dist/hermes-install.js.map +1 -0
  453. package/dist/hermes-install.test.d.ts +2 -0
  454. package/dist/hermes-install.test.d.ts.map +1 -0
  455. package/dist/hermes-install.test.js +866 -0
  456. package/dist/hermes-install.test.js.map +1 -0
  457. package/dist/index.d.ts +115 -0
  458. package/dist/index.d.ts.map +1 -0
  459. package/dist/index.js +5311 -0
  460. package/dist/index.js.map +1 -0
  461. package/dist/openclaw-install.d.ts +67 -0
  462. package/dist/openclaw-install.d.ts.map +1 -0
  463. package/dist/openclaw-install.js +358 -0
  464. package/dist/openclaw-install.js.map +1 -0
  465. package/dist/openclaw-install.test.d.ts +2 -0
  466. package/dist/openclaw-install.test.d.ts.map +1 -0
  467. package/dist/openclaw-install.test.js +296 -0
  468. package/dist/openclaw-install.test.js.map +1 -0
  469. package/dist/password-recovery-bundle.test.d.ts +2 -0
  470. package/dist/password-recovery-bundle.test.d.ts.map +1 -0
  471. package/dist/password-recovery-bundle.test.js +132 -0
  472. package/dist/password-recovery-bundle.test.js.map +1 -0
  473. package/dist/project-bundle-env.d.ts +19 -0
  474. package/dist/project-bundle-env.d.ts.map +1 -0
  475. package/dist/project-bundle-env.js +111 -0
  476. package/dist/project-bundle-env.js.map +1 -0
  477. package/dist/project-bundle-env.test.d.ts +2 -0
  478. package/dist/project-bundle-env.test.d.ts.map +1 -0
  479. package/dist/project-bundle-env.test.js +93 -0
  480. package/dist/project-bundle-env.test.js.map +1 -0
  481. package/dist/project-path-confinement.test.d.ts +2 -0
  482. package/dist/project-path-confinement.test.d.ts.map +1 -0
  483. package/dist/project-path-confinement.test.js +222 -0
  484. package/dist/project-path-confinement.test.js.map +1 -0
  485. package/dist/security/api.d.ts +18 -0
  486. package/dist/security/api.d.ts.map +1 -0
  487. package/dist/security/api.js +238 -0
  488. package/dist/security/api.js.map +1 -0
  489. package/dist/security/api.test.d.ts +2 -0
  490. package/dist/security/api.test.d.ts.map +1 -0
  491. package/dist/security/api.test.js +220 -0
  492. package/dist/security/api.test.js.map +1 -0
  493. package/dist/security/artifact.d.ts +10 -0
  494. package/dist/security/artifact.d.ts.map +1 -0
  495. package/dist/security/artifact.js +283 -0
  496. package/dist/security/artifact.js.map +1 -0
  497. package/dist/security/artifact.test.d.ts +2 -0
  498. package/dist/security/artifact.test.d.ts.map +1 -0
  499. package/dist/security/artifact.test.js +229 -0
  500. package/dist/security/artifact.test.js.map +1 -0
  501. package/dist/security/commands.d.ts +42 -0
  502. package/dist/security/commands.d.ts.map +1 -0
  503. package/dist/security/commands.js +825 -0
  504. package/dist/security/commands.js.map +1 -0
  505. package/dist/security/commands.test.d.ts +2 -0
  506. package/dist/security/commands.test.d.ts.map +1 -0
  507. package/dist/security/commands.test.js +1051 -0
  508. package/dist/security/commands.test.js.map +1 -0
  509. package/dist/security/connection.d.ts +19 -0
  510. package/dist/security/connection.d.ts.map +1 -0
  511. package/dist/security/connection.js +145 -0
  512. package/dist/security/connection.js.map +1 -0
  513. package/dist/security/connection.test.d.ts +2 -0
  514. package/dist/security/connection.test.d.ts.map +1 -0
  515. package/dist/security/connection.test.js +62 -0
  516. package/dist/security/connection.test.js.map +1 -0
  517. package/dist/security/index-routing.test.d.ts +2 -0
  518. package/dist/security/index-routing.test.d.ts.map +1 -0
  519. package/dist/security/index-routing.test.js +169 -0
  520. package/dist/security/index-routing.test.js.map +1 -0
  521. package/dist/security/journal.d.ts +26 -0
  522. package/dist/security/journal.d.ts.map +1 -0
  523. package/dist/security/journal.js +441 -0
  524. package/dist/security/journal.js.map +1 -0
  525. package/dist/security/journal.test.d.ts +2 -0
  526. package/dist/security/journal.test.d.ts.map +1 -0
  527. package/dist/security/journal.test.js +226 -0
  528. package/dist/security/journal.test.js.map +1 -0
  529. package/dist/security/package-verifier.d.ts +15 -0
  530. package/dist/security/package-verifier.d.ts.map +1 -0
  531. package/dist/security/package-verifier.js +65 -0
  532. package/dist/security/package-verifier.js.map +1 -0
  533. package/dist/security/package-verifier.test.d.ts +2 -0
  534. package/dist/security/package-verifier.test.d.ts.map +1 -0
  535. package/dist/security/package-verifier.test.js +57 -0
  536. package/dist/security/package-verifier.test.js.map +1 -0
  537. package/dist/security/runtime.d.ts +43 -0
  538. package/dist/security/runtime.d.ts.map +1 -0
  539. package/dist/security/runtime.js +81 -0
  540. package/dist/security/runtime.js.map +1 -0
  541. package/dist/security/runtime.test.d.ts +2 -0
  542. package/dist/security/runtime.test.d.ts.map +1 -0
  543. package/dist/security/runtime.test.js +88 -0
  544. package/dist/security/runtime.test.js.map +1 -0
  545. package/dist/security/types.d.ts +169 -0
  546. package/dist/security/types.d.ts.map +1 -0
  547. package/dist/security/types.js +3 -0
  548. package/dist/security/types.js.map +1 -0
  549. package/dist/security-runtime/LICENSE +202 -0
  550. package/dist/security-runtime/NOTICE +16 -0
  551. package/dist/security-runtime/artifact-manifest.json +960 -0
  552. package/dist/security-runtime/bin/vsg.mjs +5 -0
  553. package/dist/security-runtime/lattice-catalog.json +176585 -0
  554. package/dist/security-runtime/lattice-runtime.mjs +90 -0
  555. package/dist/security-runtime/licensing/candidates/apache-source-license-evidence.json +478 -0
  556. package/dist/security-runtime/licensing/candidates/betterleaks-generic-api-key.json +76 -0
  557. package/dist/security-runtime/licensing/candidates/betterleaks-jwt.json +74 -0
  558. package/dist/security-runtime/licensing/candidates/blackberry-additional-source-declaration-evidence.json +276 -0
  559. package/dist/security-runtime/licensing/candidates/blackberry-source-declaration-evidence.json +369 -0
  560. package/dist/security-runtime/licensing/candidates/cado-source-declaration-evidence.json +283 -0
  561. package/dist/security-runtime/licensing/candidates/commercial-rule-candidate.json +280 -0
  562. package/dist/security-runtime/licensing/candidates/commercial-runtime-release.json +389 -0
  563. package/dist/security-runtime/licensing/candidates/data-feed-evidence.json +259 -0
  564. package/dist/security-runtime/licensing/candidates/gitlab-sast-rule-identities.json +178 -0
  565. package/dist/security-runtime/licensing/candidates/gitlab-sast-source-evidence.json +1824 -0
  566. package/dist/security-runtime/licensing/candidates/gitlab-sast-source-notice-bundle.json +45 -0
  567. package/dist/security-runtime/licensing/candidates/malpedia-source-license-evidence.json +41 -0
  568. package/dist/security-runtime/licensing/candidates/rule-license-evidence.json +376 -0
  569. package/dist/security-runtime/licensing/candidates/runner-image-composition.json +1500 -0
  570. package/dist/security-runtime/licensing/candidates/selected-runtime-coverage.json +91 -0
  571. package/dist/security-runtime/licensing/candidates/yara-forge-20260927.json +58502 -0
  572. package/dist/security-runtime/licensing/commercial-components.json +379 -0
  573. package/dist/security-runtime/licensing/notices/betterleaks-1.9.0-MIT.txt +21 -0
  574. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/28a9529c7d0bb4dc51f4bf5c116a3d16ef247a052f7591466768ddf563fd1cf5.txt +428 -0
  575. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/33acf42afdd03163d75fe856cb431e70710e0b5deede3362e6d1c4697cfe1c6a.txt +28 -0
  576. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986.txt +674 -0
  577. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/4fecb8fcaf80fd9a6315bca5225ee43377015b46a0459c2925495be885cab19a.txt +21 -0
  578. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/811515f8723aa4007de2fbb75a364127fdec51cda534b87a7ea8f2fef2f96dd7.txt +24 -0
  579. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/814442c3987a2c0411171ad8ad43118e8c08f85c9c5d1dcdecc9787c7ca8689b.txt +664 -0
  580. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/8a959b2413d0c83ca1b3ce9153076c649abf2e4bbfebbb493fb24c2074a1eb8a.txt +38 -0
  581. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/995182e185856186fbbe49f150409ae026aa4cda7e94f83c6ed737cbb77fa9c7.txt +23 -0
  582. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/9b8e1305e46d1dd4011b6ed933c9f6223e08c9c4625001c5fd75a34fa930f616.txt +202 -0
  583. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a01f1a28424bfe7f49a23d339a01847cfa9ace3864d5e7295051772a4bae2271.txt +38 -0
  584. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a5681bf9b05db14d86776930017c647ad9e6e56ff6bbcfdf21e5848288dfaf1b.txt +165 -0
  585. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a5b8bd9ae96c630bbf229d61c5c5def20274e00be39abfd2fab4d7879ceab462.txt +24 -0
  586. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/ada32b3747ce108d5e8bab7918af94abbd03f2fe2a46304f74c6333bbfd914ed.txt +8 -0
  587. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4.txt +201 -0
  588. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/c738ae413cf561f174e34f6961f8ca458aae2369a73640dda6234c629b98bcc4.txt +2732 -0
  589. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/ce41c9a2c986277f7f9ab146a2195c1888a5d8da062e22d7c9c88666bb7c38cd.txt +17 -0
  590. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/d5f4c36a0528e01cfdd9e4fc60879201d3af49b41c520200643d321fe53da5f9.txt +17 -0
  591. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/e08c368ccd455f85c7fb9e04830e730f26e9dbb5c0f77bc88e09a5b0cb37df5b.txt +38 -0
  592. package/dist/security-runtime/licensing/notices/candidate-sources/sha256/e9efb2f7daf11bb6379c06c16b870dddcecc4a10f8704bb8aad807529c8b3c97.txt +8 -0
  593. package/dist/security-runtime/licensing/notices/gitleaks-generic-origin-782f3104-MIT.txt +21 -0
  594. package/dist/security-runtime/package.json +17 -0
  595. package/dist/security-runtime/playbook/README.md +76 -0
  596. package/dist/security-runtime/playbook/access-control.md +56 -0
  597. package/dist/security-runtime/playbook/ai-features.md +53 -0
  598. package/dist/security-runtime/playbook/desktop-python.md +59 -0
  599. package/dist/security-runtime/playbook/input-handling.md +59 -0
  600. package/dist/security-runtime/playbook/mobile-expo.md +59 -0
  601. package/dist/security-runtime/playbook/payments.md +53 -0
  602. package/dist/security-runtime/playbook/privacy-account-recovery.md +59 -0
  603. package/dist/security-runtime/playbook/secrets-config.md +47 -0
  604. package/dist/security-runtime/playbook/supabase.md +48 -0
  605. package/dist/security-runtime/playbook/supply-chain.md +62 -0
  606. package/dist/security-runtime/playbook/webhooks-integrations.md +52 -0
  607. package/dist/security-runtime/rules/vsg-ai-key-in-client.yaml +41 -0
  608. package/dist/security-runtime/rules/vsg-ai-output-raw-html.yaml +35 -0
  609. package/dist/security-runtime/rules/vsg-angular-sanitizer-bypass.yaml +23 -0
  610. package/dist/security-runtime/rules/vsg-expo-token-in-asyncstorage.yaml +22 -0
  611. package/dist/security-runtime/rules/vsg-flask-public-bind.yaml +32 -0
  612. package/dist/security-runtime/rules/vsg-nextjs-action-write-no-auth.yaml +144 -0
  613. package/dist/security-runtime/rules/vsg-nextjs-inline-action-write-no-auth.yaml +161 -0
  614. package/dist/security-runtime/rules/vsg-nextjs-route-write-no-auth.yaml +193 -0
  615. package/dist/security-runtime/rules/vsg-nosql-where-injection.yaml +36 -0
  616. package/dist/security-runtime/rules/vsg-python-pickle-load.yaml +26 -0
  617. package/dist/security-runtime/rules/vsg-python-requests-verify-false.yaml +34 -0
  618. package/dist/security-runtime/rules/vsg-python-subprocess-shell.yaml +23 -0
  619. package/dist/security-runtime/rules/vsg-stripe-client-price.yaml +51 -0
  620. package/dist/security-runtime/rules/vsg-stripe-webhook-no-signature.yaml +31 -0
  621. package/dist/security-runtime/rules/vsg-stripe-webhook-pages-no-signature.yaml +51 -0
  622. package/dist/security-runtime/rules/vsg-supabase-service-role-in-client.yaml +27 -0
  623. package/dist/security-runtime/rules/vsg-supabase-service-role-public-env.yaml +24 -0
  624. package/dist/security-runtime/rules/vsg-xml-external-entities.yaml +19 -0
  625. package/dist/security-runtime/src/agent/brief.mjs +95 -0
  626. package/dist/security-runtime/src/agent/discover.mjs +108 -0
  627. package/dist/security-runtime/src/agent/exec.mjs +64 -0
  628. package/dist/security-runtime/src/agent/ingest.mjs +213 -0
  629. package/dist/security-runtime/src/agent/report.mjs +94 -0
  630. package/dist/security-runtime/src/agent/schema.mjs +62 -0
  631. package/dist/security-runtime/src/agent/tokenize.mjs +38 -0
  632. package/dist/security-runtime/src/checks/README.md +8 -0
  633. package/dist/security-runtime/src/checks/_lib/gitfiles.mjs +35 -0
  634. package/dist/security-runtime/src/checks/_lib/lockfiles.mjs +135 -0
  635. package/dist/security-runtime/src/checks/_lib/osv.mjs +6 -0
  636. package/dist/security-runtime/src/checks/_lib/secrets.mjs +381 -0
  637. package/dist/security-runtime/src/checks/_lib/targets.mjs +79 -0
  638. package/dist/security-runtime/src/checks/agent-review/index.mjs +52 -0
  639. package/dist/security-runtime/src/checks/agent-surface/config.mjs +223 -0
  640. package/dist/security-runtime/src/checks/agent-surface/index.mjs +113 -0
  641. package/dist/security-runtime/src/checks/agent-surface/instructions.mjs +87 -0
  642. package/dist/security-runtime/src/checks/agent-surface/patterns.mjs +68 -0
  643. package/dist/security-runtime/src/checks/agent-surface/unicode.mjs +88 -0
  644. package/dist/security-runtime/src/checks/code/auth-helpers.mjs +659 -0
  645. package/dist/security-runtime/src/checks/code/index.mjs +617 -0
  646. package/dist/security-runtime/src/checks/code/opengrep-container.mjs +85 -0
  647. package/dist/security-runtime/src/checks/code/opengrep-runner.mjs +86 -0
  648. package/dist/security-runtime/src/checks/code/selected-opengrep-runner.mjs +112 -0
  649. package/dist/security-runtime/src/checks/dep-change/guarddog.mjs +142 -0
  650. package/dist/security-runtime/src/checks/dep-change/index.mjs +316 -0
  651. package/dist/security-runtime/src/checks/dep-change/registries.mjs +199 -0
  652. package/dist/security-runtime/src/checks/deps-vuln/index.mjs +305 -0
  653. package/dist/security-runtime/src/checks/desktop-config/index.mjs +112 -0
  654. package/dist/security-runtime/src/checks/dns-mail/index.mjs +71 -0
  655. package/dist/security-runtime/src/checks/iac/index.mjs +83 -0
  656. package/dist/security-runtime/src/checks/install-posture/index.mjs +123 -0
  657. package/dist/security-runtime/src/checks/licenses/index.mjs +143 -0
  658. package/dist/security-runtime/src/checks/live-basic/index.mjs +77 -0
  659. package/dist/security-runtime/src/checks/live-js-secrets/index.mjs +100 -0
  660. package/dist/security-runtime/src/checks/malware/clamav.mjs +17 -0
  661. package/dist/security-runtime/src/checks/malware/defender.mjs +43 -0
  662. package/dist/security-runtime/src/checks/malware/index.mjs +186 -0
  663. package/dist/security-runtime/src/checks/malware/targets.mjs +147 -0
  664. package/dist/security-runtime/src/checks/malware/yara-runner.mjs +201 -0
  665. package/dist/security-runtime/src/checks/malware/yara.mjs +124 -0
  666. package/dist/security-runtime/src/checks/mobile-config/index.mjs +173 -0
  667. package/dist/security-runtime/src/checks/mobile-config/mobsf.mjs +105 -0
  668. package/dist/security-runtime/src/checks/posture/index.mjs +133 -0
  669. package/dist/security-runtime/src/checks/project-scripts/index.mjs +187 -0
  670. package/dist/security-runtime/src/checks/sbom/index.mjs +98 -0
  671. package/dist/security-runtime/src/checks/secrets-build/index.mjs +63 -0
  672. package/dist/security-runtime/src/checks/secrets-history/index.mjs +112 -0
  673. package/dist/security-runtime/src/checks/secrets-tree/env.mjs +120 -0
  674. package/dist/security-runtime/src/checks/secrets-tree/index.mjs +73 -0
  675. package/dist/security-runtime/src/checks/supabase-static/index.mjs +240 -0
  676. package/dist/security-runtime/src/checks/supabase-static/sql.mjs +557 -0
  677. package/dist/security-runtime/src/checks/workflows/index.mjs +93 -0
  678. package/dist/security-runtime/src/cli/deep.mjs +13 -0
  679. package/dist/security-runtime/src/cli/doctor.mjs +82 -0
  680. package/dist/security-runtime/src/cli/index.mjs +60 -0
  681. package/dist/security-runtime/src/cli/live-common.mjs +27 -0
  682. package/dist/security-runtime/src/cli/parse.mjs +56 -0
  683. package/dist/security-runtime/src/cli/portfolio.mjs +34 -0
  684. package/dist/security-runtime/src/cli/release.mjs +28 -0
  685. package/dist/security-runtime/src/cli/report.mjs +18 -0
  686. package/dist/security-runtime/src/cli/run-common.mjs +54 -0
  687. package/dist/security-runtime/src/cli/scan.mjs +12 -0
  688. package/dist/security-runtime/src/cli/setup.mjs +59 -0
  689. package/dist/security-runtime/src/cli/url.mjs +38 -0
  690. package/dist/security-runtime/src/core/accept.mjs +141 -0
  691. package/dist/security-runtime/src/core/archive.mjs +114 -0
  692. package/dist/security-runtime/src/core/base-ref.mjs +43 -0
  693. package/dist/security-runtime/src/core/checks.mjs +39 -0
  694. package/dist/security-runtime/src/core/detect.mjs +90 -0
  695. package/dist/security-runtime/src/core/errors.mjs +5 -0
  696. package/dist/security-runtime/src/core/fetch.mjs +139 -0
  697. package/dist/security-runtime/src/core/findings.mjs +177 -0
  698. package/dist/security-runtime/src/core/gate.mjs +131 -0
  699. package/dist/security-runtime/src/core/installer.mjs +255 -0
  700. package/dist/security-runtime/src/core/lock.mjs +38 -0
  701. package/dist/security-runtime/src/core/nested.mjs +107 -0
  702. package/dist/security-runtime/src/core/paths.mjs +20 -0
  703. package/dist/security-runtime/src/core/pipeline.mjs +196 -0
  704. package/dist/security-runtime/src/core/registry.mjs +81 -0
  705. package/dist/security-runtime/src/core/report.mjs +128 -0
  706. package/dist/security-runtime/src/core/runner.mjs +86 -0
  707. package/dist/security-runtime/src/core/sarif.mjs +141 -0
  708. package/dist/security-runtime/src/lattice/artifact.mjs +1201 -0
  709. package/dist/security-runtime/src/lattice/execution.mjs +45 -0
  710. package/dist/security-runtime/src/lattice/export.mjs +215 -0
  711. package/dist/security-runtime/src/lattice/provenance.mjs +70 -0
  712. package/dist/security-runtime/src/lattice/runtime.mjs +158 -0
  713. package/dist/security-runtime/src/lattice/selected-runtime.mjs +189 -0
  714. package/dist/security-runtime/src/lattice/source-acquirer.mjs +51 -0
  715. package/dist/security-runtime/src/lattice/source-fetcher.mjs +88 -0
  716. package/dist/security-runtime/src/lattice/transport.mjs +232 -0
  717. package/dist/security-runtime/src/live/analyze.mjs +101 -0
  718. package/dist/security-runtime/src/live/exposure.mjs +79 -0
  719. package/dist/security-runtime/src/live/secrets.mjs +31 -0
  720. package/dist/security-runtime/src/live/session.mjs +98 -0
  721. package/dist/security-runtime/src/live/targets.mjs +81 -0
  722. package/dist/security-runtime/src/portfolio/index.mjs +116 -0
  723. package/dist/security-runtime/tools/registry/betterleaks.json +29 -0
  724. package/dist/security-runtime/tools/registry/guarddog.json +9 -0
  725. package/dist/security-runtime/tools/registry/mobsf.json +10 -0
  726. package/dist/security-runtime/tools/registry/opengrep.json +28 -0
  727. package/dist/security-runtime/tools/registry/osv-scanner.json +14 -0
  728. package/dist/security-runtime/tools/registry/semgrep-rules.json +21 -0
  729. package/dist/security-runtime/tools/registry/trivy.json +30 -0
  730. package/dist/security-runtime/tools/registry/yara-forge-exclusions.json +14 -0
  731. package/dist/security-runtime/tools/registry/yara-forge.json +22 -0
  732. package/dist/security-runtime/tools/registry/yara-runner.json +10 -0
  733. package/dist/security-runtime/tools/registry/yara-x.json +24 -0
  734. package/dist/security-runtime/tools/registry/zizmor.json +30 -0
  735. package/dist/spinner.d.ts +16 -0
  736. package/dist/spinner.d.ts.map +1 -0
  737. package/dist/spinner.js +72 -0
  738. package/dist/spinner.js.map +1 -0
  739. package/dist/verify.test.d.ts +2 -0
  740. package/dist/verify.test.d.ts.map +1 -0
  741. package/dist/verify.test.js +98 -0
  742. package/dist/verify.test.js.map +1 -0
  743. package/package.json +73 -4
@@ -0,0 +1,161 @@
1
+ rules:
2
+ - id: vsg-nextjs-inline-action-write-no-auth
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ message: >-
6
+ This inline "use server" action writes data (Supabase or Prisma) but never checks who is calling it. Server actions are public POST endpoints, so anyone can call them with any arguments.
7
+ Check the session inside the action before the write (for example supabase.auth.getUser(), auth(), getServerSession() or currentUser()) and reject the call when there is no user.
8
+ metadata:
9
+ vsg-blocking: true
10
+ vsg-title: Inline server action writes data without checking the caller
11
+ vsg-fix: Call your auth check (supabase.auth.getUser(), auth(), getServerSession() or currentUser()) at the top of the action, throw or return an error when there is no user, and scope the write to that user.
12
+ cwe: "CWE-862: Missing Authorization"
13
+ owasp: "A01:2025 - Broken Access Control"
14
+ category: security
15
+ confidence: HIGH
16
+ technology: [nextjs, supabase, prisma]
17
+ patterns:
18
+ - pattern-either:
19
+ - pattern: $SB.from(...).insert(...)
20
+ - pattern: $SB.from(...).update(...)
21
+ - pattern: $SB.from(...).upsert(...)
22
+ - pattern: $SB.from(...).delete(...)
23
+ - pattern: prisma.$M.create(...)
24
+ - pattern: prisma.$M.createMany(...)
25
+ - pattern: prisma.$M.update(...)
26
+ - pattern: prisma.$M.updateMany(...)
27
+ - pattern: prisma.$M.upsert(...)
28
+ - pattern: prisma.$M.delete(...)
29
+ - pattern: prisma.$M.deleteMany(...)
30
+ - pattern-inside:
31
+ pattern-either:
32
+ - pattern: |
33
+ async function $F(...) {
34
+ "use server"
35
+ ...
36
+ }
37
+ - pattern: |
38
+ const $F = async (...) => {
39
+ "use server"
40
+ ...
41
+ }
42
+ - pattern-not-inside:
43
+ patterns:
44
+ - pattern-either:
45
+ - pattern: |
46
+ async function $F(...) {
47
+ "use server"
48
+ ...
49
+ <... $FN(...) ...>
50
+ ...
51
+ }
52
+ - pattern: |
53
+ const $F = async (...) => {
54
+ "use server"
55
+ ...
56
+ <... $FN(...) ...>
57
+ ...
58
+ }
59
+ - metavariable-regex:
60
+ metavariable: $FN
61
+ regex: ^(.*\.)?(auth|getAuth|getUser|getSession|getClaims|getServerSession|currentUser|get(?!\w*By(Id|Email))\w*User\w*|getCurrentUser\w*|(require|assert|ensure)\w*(User|Auth|Session|Context|Admin|Member|Role|Permission|Owner|Access)\w*|verify\w*(Signature|Webhook|Token|Jwt)\w*|constructEvent|constructEventAsync|validateRequest|jwtVerify|timingSafeEqual\w*|__vsg_discovered__)$
62
+ # Shared-secret checks (cron and webhook routes): the Authorization header compared with a secret, usually "Bearer <secret>".
63
+ - pattern-not-inside:
64
+ pattern-either:
65
+ - pattern: |
66
+ async function $F(...) {
67
+ "use server"
68
+ ...
69
+ <... $A === `Bearer ${...}` ...>
70
+ ...
71
+ }
72
+ - pattern: |
73
+ async function $F(...) {
74
+ "use server"
75
+ ...
76
+ <... $A !== `Bearer ${...}` ...>
77
+ ...
78
+ }
79
+ - pattern: |
80
+ const $F = async (...) => {
81
+ "use server"
82
+ ...
83
+ <... $A === `Bearer ${...}` ...>
84
+ ...
85
+ }
86
+ - pattern: |
87
+ const $F = async (...) => {
88
+ "use server"
89
+ ...
90
+ <... $A !== `Bearer ${...}` ...>
91
+ ...
92
+ }
93
+ - patterns:
94
+ - pattern-either:
95
+ - pattern: |
96
+ async function $F(...) {
97
+ "use server"
98
+ ...
99
+ <... $R.headers.get($HN) === $X ...>
100
+ ...
101
+ }
102
+ - pattern: |
103
+ async function $F(...) {
104
+ "use server"
105
+ ...
106
+ <... $R.headers.get($HN) !== $X ...>
107
+ ...
108
+ }
109
+ - pattern: |
110
+ async function $F(...) {
111
+ "use server"
112
+ ...
113
+ $H = $R.headers.get($HN)
114
+ ...
115
+ <... $H === $X ...>
116
+ ...
117
+ }
118
+ - pattern: |
119
+ async function $F(...) {
120
+ "use server"
121
+ ...
122
+ $H = $R.headers.get($HN)
123
+ ...
124
+ <... $H !== $X ...>
125
+ ...
126
+ }
127
+ - pattern: |
128
+ const $F = async (...) => {
129
+ "use server"
130
+ ...
131
+ <... $R.headers.get($HN) === $X ...>
132
+ ...
133
+ }
134
+ - pattern: |
135
+ const $F = async (...) => {
136
+ "use server"
137
+ ...
138
+ <... $R.headers.get($HN) !== $X ...>
139
+ ...
140
+ }
141
+ - pattern: |
142
+ const $F = async (...) => {
143
+ "use server"
144
+ ...
145
+ $H = $R.headers.get($HN)
146
+ ...
147
+ <... $H === $X ...>
148
+ ...
149
+ }
150
+ - pattern: |
151
+ const $F = async (...) => {
152
+ "use server"
153
+ ...
154
+ $H = $R.headers.get($HN)
155
+ ...
156
+ <... $H !== $X ...>
157
+ ...
158
+ }
159
+ - metavariable-regex:
160
+ metavariable: $HN
161
+ regex: (?i)^["']authorization["']$
@@ -0,0 +1,193 @@
1
+ rules:
2
+ - id: vsg-nextjs-route-write-no-auth
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ message: >-
6
+ This Next.js route handler writes data (Supabase or Prisma) but never checks who is calling it, so anyone who can reach the URL can change data.
7
+ Check the session inside the handler before the write (for example supabase.auth.getUser(), auth(), getServerSession() or currentUser()) and reject the request when there is no user.
8
+ Middleware alone is not a safe substitute because a route can be reached without it.
9
+ metadata:
10
+ vsg-blocking: true
11
+ vsg-title: Route handler writes data without checking the caller
12
+ vsg-fix: Call your auth check (supabase.auth.getUser(), auth(), getServerSession() or currentUser()) at the top of the handler, return 401 when there is no user, and scope the write to that user.
13
+ cwe: "CWE-862: Missing Authorization"
14
+ owasp: "A01:2025 - Broken Access Control"
15
+ category: security
16
+ confidence: HIGH
17
+ technology: [nextjs, supabase, prisma]
18
+ patterns:
19
+ - pattern-either:
20
+ - pattern: $SB.from(...).insert(...)
21
+ - pattern: $SB.from(...).update(...)
22
+ - pattern: $SB.from(...).upsert(...)
23
+ - pattern: $SB.from(...).delete(...)
24
+ - pattern: prisma.$M.create(...)
25
+ - pattern: prisma.$M.createMany(...)
26
+ - pattern: prisma.$M.update(...)
27
+ - pattern: prisma.$M.updateMany(...)
28
+ - pattern: prisma.$M.upsert(...)
29
+ - pattern: prisma.$M.delete(...)
30
+ - pattern: prisma.$M.deleteMany(...)
31
+ - pattern-inside:
32
+ pattern-either:
33
+ - pattern: |
34
+ export async function $F(...) { ... }
35
+ - pattern: |
36
+ export function $F(...) { ... }
37
+ - pattern: |
38
+ export const $F = async (...) => { ... }
39
+ - metavariable-regex:
40
+ metavariable: $F
41
+ regex: ^(POST|PUT|PATCH|DELETE)$
42
+ - pattern-not-inside:
43
+ patterns:
44
+ - pattern-either:
45
+ - pattern: |
46
+ export async function $F(...) {
47
+ ...
48
+ <... $FN(...) ...>
49
+ ...
50
+ }
51
+ - pattern: |
52
+ export function $F(...) {
53
+ ...
54
+ <... $FN(...) ...>
55
+ ...
56
+ }
57
+ - pattern: |
58
+ export const $F = async (...) => {
59
+ ...
60
+ <... $FN(...) ...>
61
+ ...
62
+ }
63
+ - metavariable-regex:
64
+ metavariable: $FN
65
+ regex: ^(.*\.)?(auth|getAuth|getUser|getSession|getClaims|getServerSession|currentUser|get(?!\w*By(Id|Email))\w*User\w*|getCurrentUser\w*|(require|assert|ensure)\w*(User|Auth|Session|Context|Admin|Member|Role|Permission|Owner|Access)\w*|verify\w*(Signature|Webhook|Token|Jwt)\w*|constructEvent|constructEventAsync|validateRequest|jwtVerify|timingSafeEqual\w*|__vsg_discovered__)$
66
+ # Shared-secret checks (cron and webhook routes): the Authorization header compared with a secret, usually "Bearer <secret>".
67
+ - pattern-not-inside:
68
+ pattern-either:
69
+ - pattern: |
70
+ export async function $F(...) {
71
+ ...
72
+ <... $A === `Bearer ${...}` ...>
73
+ ...
74
+ }
75
+ - pattern: |
76
+ export async function $F(...) {
77
+ ...
78
+ <... $A !== `Bearer ${...}` ...>
79
+ ...
80
+ }
81
+ - pattern: |
82
+ export function $F(...) {
83
+ ...
84
+ <... $A === `Bearer ${...}` ...>
85
+ ...
86
+ }
87
+ - pattern: |
88
+ export function $F(...) {
89
+ ...
90
+ <... $A !== `Bearer ${...}` ...>
91
+ ...
92
+ }
93
+ - pattern: |
94
+ export const $F = async (...) => {
95
+ ...
96
+ <... $A === `Bearer ${...}` ...>
97
+ ...
98
+ }
99
+ - pattern: |
100
+ export const $F = async (...) => {
101
+ ...
102
+ <... $A !== `Bearer ${...}` ...>
103
+ ...
104
+ }
105
+ - patterns:
106
+ - pattern-either:
107
+ - pattern: |
108
+ export async function $F(...) {
109
+ ...
110
+ <... $R.headers.get($HN) === $X ...>
111
+ ...
112
+ }
113
+ - pattern: |
114
+ export async function $F(...) {
115
+ ...
116
+ <... $R.headers.get($HN) !== $X ...>
117
+ ...
118
+ }
119
+ - pattern: |
120
+ export async function $F(...) {
121
+ ...
122
+ $H = $R.headers.get($HN)
123
+ ...
124
+ <... $H === $X ...>
125
+ ...
126
+ }
127
+ - pattern: |
128
+ export async function $F(...) {
129
+ ...
130
+ $H = $R.headers.get($HN)
131
+ ...
132
+ <... $H !== $X ...>
133
+ ...
134
+ }
135
+ - pattern: |
136
+ export function $F(...) {
137
+ ...
138
+ <... $R.headers.get($HN) === $X ...>
139
+ ...
140
+ }
141
+ - pattern: |
142
+ export function $F(...) {
143
+ ...
144
+ <... $R.headers.get($HN) !== $X ...>
145
+ ...
146
+ }
147
+ - pattern: |
148
+ export function $F(...) {
149
+ ...
150
+ $H = $R.headers.get($HN)
151
+ ...
152
+ <... $H === $X ...>
153
+ ...
154
+ }
155
+ - pattern: |
156
+ export function $F(...) {
157
+ ...
158
+ $H = $R.headers.get($HN)
159
+ ...
160
+ <... $H !== $X ...>
161
+ ...
162
+ }
163
+ - pattern: |
164
+ export const $F = async (...) => {
165
+ ...
166
+ <... $R.headers.get($HN) === $X ...>
167
+ ...
168
+ }
169
+ - pattern: |
170
+ export const $F = async (...) => {
171
+ ...
172
+ <... $R.headers.get($HN) !== $X ...>
173
+ ...
174
+ }
175
+ - pattern: |
176
+ export const $F = async (...) => {
177
+ ...
178
+ $H = $R.headers.get($HN)
179
+ ...
180
+ <... $H === $X ...>
181
+ ...
182
+ }
183
+ - pattern: |
184
+ export const $F = async (...) => {
185
+ ...
186
+ $H = $R.headers.get($HN)
187
+ ...
188
+ <... $H !== $X ...>
189
+ ...
190
+ }
191
+ - metavariable-regex:
192
+ metavariable: $HN
193
+ regex: (?i)^["']authorization["']$
@@ -0,0 +1,36 @@
1
+ rules:
2
+ - id: vsg-nosql-where-injection
3
+ languages: [typescript, javascript]
4
+ mode: taint
5
+ severity: ERROR
6
+ message: >-
7
+ A MongoDB or Mongoose $where expression is built from request data. $where runs a string of JavaScript inside the database, so an attacker who controls part of the string can read other users' documents, change the query logic, or hang the database with an infinite loop.
8
+ Query with plain field filters (find({ product: id })) and operators instead of $where, and validate the type of every value taken from the request.
9
+ metadata:
10
+ vsg-blocking: true
11
+ vsg-title: NoSQL injection through a $where expression built from request data
12
+ vsg-fix: "Replace the $where string with a normal filter such as collection.find({ product: id }) (or an aggregation with $expr), and validate the request value (type and length) before using it. Never concatenate request data into a $where string or function."
13
+ cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
14
+ owasp: "A05:2025 - Injection"
15
+ category: security
16
+ confidence: HIGH
17
+ technology: [mongodb, mongoose, express, nodejs]
18
+ pattern-sources:
19
+ - pattern: $REQ.body
20
+ - pattern: $REQ.query
21
+ - pattern: $REQ.params
22
+ - pattern: $REQ.headers
23
+ - pattern: $REQ.cookies
24
+ pattern-sanitizers:
25
+ - pattern: parseInt(...)
26
+ - pattern: Number(...)
27
+ - pattern: parseFloat(...)
28
+ pattern-sinks:
29
+ - patterns:
30
+ - pattern-either:
31
+ - pattern: |
32
+ { ..., $where: $SINK, ... }
33
+ - pattern: |
34
+ { ..., "$where": $SINK, ... }
35
+ - pattern: $Q.$where($SINK)
36
+ - focus-metavariable: $SINK
@@ -0,0 +1,26 @@
1
+ rules:
2
+ - id: vsg-python-pickle-load
3
+ languages: [python]
4
+ severity: ERROR
5
+ message: >-
6
+ pickle.load and pickle.loads run code embedded in the data they read. If the bytes or file can come from a user, the network, a shared drive or any source an attacker can influence, loading them gives the attacker code execution on your machine.
7
+ Use a data-only format such as JSON, or sign the data with an HMAC and verify it before unpickling.
8
+ metadata:
9
+ vsg-blocking: true
10
+ vsg-title: Unsafe deserialization with pickle
11
+ vsg-fix: Replace pickle with JSON (or another data-only format). If pickle is unavoidable, verify an HMAC over the bytes with a secret key before calling pickle.loads, and never unpickle data from users or the network.
12
+ cwe: "CWE-502: Deserialization of Untrusted Data"
13
+ owasp: "A08:2025 - Software or Data Integrity Failures"
14
+ category: security
15
+ confidence: HIGH
16
+ technology: [python]
17
+ patterns:
18
+ - pattern-either:
19
+ - pattern: $MOD.loads($DATA, ...)
20
+ - pattern: $MOD.load($DATA, ...)
21
+ - pattern: $MOD.Unpickler($DATA, ...)
22
+ - metavariable-regex:
23
+ metavariable: $MOD
24
+ regex: ^(pickle|cPickle|_pickle|dill|cloudpickle)$
25
+ - pattern-not: $MOD.$F("...", ...)
26
+ - pattern-not: $MOD.$F(b"...", ...)
@@ -0,0 +1,34 @@
1
+ rules:
2
+ - id: vsg-python-requests-verify-false
3
+ languages: [python]
4
+ severity: WARNING
5
+ message: >-
6
+ TLS certificate verification is turned off for this requests call (verify=False). The connection is encrypted but not authenticated, so anyone on the network path can impersonate the server and read or change the traffic, including tokens and passwords.
7
+ Remove verify=False. If the server uses a private certificate authority, pass verify="/path/to/ca-bundle.pem" instead.
8
+ metadata:
9
+ vsg-title: TLS certificate verification disabled (requests verify=False)
10
+ vsg-fix: Remove verify=False. For a private certificate authority use verify="/path/to/ca-bundle.pem".
11
+ cwe: "CWE-295: Improper Certificate Validation"
12
+ owasp: "A07:2025 - Authentication Failures"
13
+ category: security
14
+ confidence: HIGH
15
+ technology: [python, requests]
16
+ pattern-either:
17
+ - patterns:
18
+ - pattern: requests.$M(..., verify=False, ...)
19
+ - metavariable-regex:
20
+ metavariable: $M
21
+ regex: ^(get|post|put|patch|delete|head|options|request)$
22
+ - patterns:
23
+ - pattern: $S.verify = False
24
+ - pattern-inside: |
25
+ $S = requests.Session()
26
+ ...
27
+ - patterns:
28
+ - pattern: $S.$M(..., verify=False, ...)
29
+ - pattern-inside: |
30
+ $S = requests.Session()
31
+ ...
32
+ - metavariable-regex:
33
+ metavariable: $M
34
+ regex: ^(get|post|put|patch|delete|head|options|request)$
@@ -0,0 +1,23 @@
1
+ rules:
2
+ - id: vsg-python-subprocess-shell
3
+ languages: [python]
4
+ severity: ERROR
5
+ message: >-
6
+ A subprocess call runs through the shell (shell=True) with a command that is built at run time. If any part of it comes from a user, a file, the network or an AI model, an attacker can append their own shell commands (command injection).
7
+ Pass the command as a list of arguments without shell=True, for example subprocess.run(["git", "clone", url], check=True), and validate any value that must be part of a command.
8
+ metadata:
9
+ vsg-blocking: true
10
+ vsg-title: Shell command built from variable input (shell=True)
11
+ vsg-fix: Replace the string with an argument list and drop shell=True (for example subprocess.run(["tool", arg], check=True)). If a shell is unavoidable, quote every dynamic part with shlex.quote().
12
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
13
+ owasp: "A05:2025 - Injection"
14
+ category: security
15
+ confidence: HIGH
16
+ technology: [python]
17
+ patterns:
18
+ - pattern: subprocess.$F($CMD, ..., shell=True, ...)
19
+ - metavariable-regex:
20
+ metavariable: $F
21
+ regex: ^(run|call|check_call|check_output|Popen|getoutput|getstatusoutput)$
22
+ - pattern-not: subprocess.$F("...", ..., shell=True, ...)
23
+ - pattern-not: subprocess.$F([...], ..., shell=True, ...)
@@ -0,0 +1,51 @@
1
+ rules:
2
+ - id: vsg-stripe-client-price
3
+ languages: [typescript, javascript]
4
+ mode: taint
5
+ severity: ERROR
6
+ message: >-
7
+ A price or amount taken from the request (body, JSON, form data or query string) reaches a Stripe charge. The browser controls those values, so anyone can pay 1 cent for any product.
8
+ Look the price up on the server from a product ID the client sends (your database or a Stripe Price ID you define), and never use a client-sent amount.
9
+ metadata:
10
+ vsg-blocking: true
11
+ vsg-title: Client-supplied price reaches a Stripe charge
12
+ vsg-fix: Accept only a product or plan identifier from the client, look the price up on the server (your database or a Stripe Price ID you control), and pass that server-side value to Stripe.
13
+ cwe: "CWE-602: Client-Side Enforcement of Server-Side Security"
14
+ owasp: "A06:2025 - Insecure Design"
15
+ category: security
16
+ confidence: HIGH
17
+ technology: [nextjs, stripe]
18
+ options:
19
+ taint_assume_safe_indexes: true
20
+ pattern-sources:
21
+ - pattern: await $REQ.json()
22
+ - pattern: await $REQ.formData()
23
+ - pattern: $REQ.body
24
+ - pattern: $REQ.query
25
+ - pattern: $REQ.nextUrl.searchParams
26
+ - pattern: new URL($REQ.url).searchParams
27
+ pattern-sanitizers:
28
+ - pattern: await $DB.$M.findUnique(...)
29
+ - pattern: await $DB.$M.findUniqueOrThrow(...)
30
+ - pattern: await $DB.$M.findFirst(...)
31
+ - pattern: await $DB.$M.findFirstOrThrow(...)
32
+ - pattern: await $DB.$M.findMany(...)
33
+ - pattern: await $DB.$M.findOne(...)
34
+ - pattern: await $DB.$M.findById(...)
35
+ - pattern: await $SB.from(...).select(...)...
36
+ - pattern: await $STRIPE.prices.retrieve(...)
37
+ - pattern: await $STRIPE.products.retrieve(...)
38
+ pattern-sinks:
39
+ - patterns:
40
+ - pattern-inside: $STRIPE.checkout.sessions.create(...)
41
+ - pattern-either:
42
+ - pattern: |
43
+ {..., unit_amount: $SINK, ...}
44
+ - pattern: |
45
+ {..., amount: $SINK, ...}
46
+ - focus-metavariable: $SINK
47
+ - patterns:
48
+ - pattern-inside: $STRIPE.paymentIntents.create(...)
49
+ - pattern: |
50
+ {..., amount: $SINK, ...}
51
+ - focus-metavariable: $SINK
@@ -0,0 +1,31 @@
1
+ rules:
2
+ - id: vsg-stripe-webhook-no-signature
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ # Test code posts hand-made events on purpose; it is not a deployed webhook.
6
+ paths:
7
+ exclude: ["*.test.*", "*.spec.*", "__tests__", "test", "tests"]
8
+ message: >-
9
+ This Stripe webhook route handles Stripe events but never calls stripe.webhooks.constructEvent (or constructEventAsync) to verify the stripe-signature header. Anyone can post a fake "checkout.session.completed" event to this URL and get paid features, refunds or account changes for free.
10
+ Read the raw body with request.text(), verify it with stripe.webhooks.constructEvent(body, signature, webhookSecret), and return 400 when verification throws.
11
+ metadata:
12
+ vsg-blocking: true
13
+ vsg-title: Stripe webhook does not verify the signature
14
+ vsg-fix: Read the raw body with await request.text(), then call stripe.webhooks.constructEvent(body, request.headers.get("stripe-signature"), process.env.STRIPE_WEBHOOK_SECRET) inside try/catch and return 400 on failure. Only act on the verified event.
15
+ cwe: "CWE-345: Insufficient Verification of Data Authenticity"
16
+ owasp: "A08:2025 - Software or Data Integrity Failures"
17
+ category: security
18
+ confidence: HIGH
19
+ technology: [nextjs, stripe]
20
+ patterns:
21
+ - pattern: |
22
+ export async function POST(...) { ... }
23
+ - pattern-either:
24
+ - pattern: |
25
+ export async function POST(...) { ... <... $H.get("stripe-signature") ...>; ... }
26
+ - pattern: |
27
+ export async function POST(...) { ... <... $E.data.object ...>; ... }
28
+ - pattern-not: |
29
+ export async function POST(...) { ... <... $S.webhooks.constructEvent(...) ...>; ... }
30
+ - pattern-not: |
31
+ export async function POST(...) { ... <... $S.webhooks.constructEventAsync(...) ...>; ... }
@@ -0,0 +1,51 @@
1
+ rules:
2
+ - id: vsg-stripe-webhook-pages-no-signature
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ # Test code posts hand-made events on purpose; it is not a deployed webhook.
6
+ paths:
7
+ exclude: ["*.test.*", "*.spec.*", "__tests__", "test", "tests"]
8
+ message: >-
9
+ This Stripe webhook API route handles Stripe events but never calls stripe.webhooks.constructEvent (or constructEventAsync) to verify the stripe-signature header. Anyone can post a fake "checkout.session.completed" event to this URL and get paid features, refunds or account changes for free.
10
+ Read the raw body (disable the body parser), verify it with stripe.webhooks.constructEvent(rawBody, signature, webhookSecret), and return 400 when verification throws.
11
+ metadata:
12
+ vsg-blocking: true
13
+ vsg-title: Stripe webhook does not verify the signature
14
+ vsg-fix: Disable the body parser for this route, read the raw body, then call stripe.webhooks.constructEvent(rawBody, req.headers["stripe-signature"], process.env.STRIPE_WEBHOOK_SECRET) inside try/catch and respond 400 on failure. Only act on the verified event.
15
+ cwe: "CWE-345: Insufficient Verification of Data Authenticity"
16
+ owasp: "A08:2025 - Software or Data Integrity Failures"
17
+ category: security
18
+ confidence: HIGH
19
+ technology: [nextjs, stripe]
20
+ patterns:
21
+ - pattern-either:
22
+ - pattern: |
23
+ export default async function $H($REQ, $RES) { ... }
24
+ - pattern: |
25
+ export default function $H($REQ, $RES) { ... }
26
+ - pattern-either:
27
+ - pattern: |
28
+ export default async function $H($REQ, $RES) { ... <... "stripe-signature" ...>; ... }
29
+ - pattern: |
30
+ export default function $H($REQ, $RES) { ... <... "stripe-signature" ...>; ... }
31
+ - pattern: |
32
+ export default async function $H($REQ, $RES) { ... <... $E.data.object ...>; ... }
33
+ - pattern: |
34
+ export default function $H($REQ, $RES) { ... <... $E.data.object ...>; ... }
35
+ # A Pages API handler takes the request and the response. Without this the first pattern matches any function with two parameters
36
+ # (Opengrep ignores "export default"), so a helper such as mirrorStripeEvent(supabase, event) that receives an already verified
37
+ # event was reported as an unverified webhook.
38
+ - metavariable-regex:
39
+ metavariable: $REQ
40
+ regex: ^_?(req|request)$
41
+ - metavariable-regex:
42
+ metavariable: $RES
43
+ regex: ^_?(res|response)$
44
+ - pattern-not: |
45
+ export default async function $H($REQ, $RES) { ... <... $S.webhooks.constructEvent(...) ...>; ... }
46
+ - pattern-not: |
47
+ export default function $H($REQ, $RES) { ... <... $S.webhooks.constructEvent(...) ...>; ... }
48
+ - pattern-not: |
49
+ export default async function $H($REQ, $RES) { ... <... $S.webhooks.constructEventAsync(...) ...>; ... }
50
+ - pattern-not: |
51
+ export default function $H($REQ, $RES) { ... <... $S.webhooks.constructEventAsync(...) ...>; ... }
@@ -0,0 +1,27 @@
1
+ rules:
2
+ - id: vsg-supabase-service-role-in-client
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ message: >-
6
+ A Supabase service-role key is referenced in a "use client" file. Client components are bundled and sent to every visitor, and the service-role key bypasses Row Level Security, so anyone could read and write your whole database.
7
+ Use the anon key in the browser and keep the service-role key in server-only code (route handlers, server actions, server components).
8
+ metadata:
9
+ vsg-blocking: true
10
+ vsg-title: Supabase service-role key referenced in client code
11
+ vsg-fix: Remove the service-role key from this client file, use the anon key with Row Level Security in the browser, move privileged work to a server-only route handler or server action, and rotate the service-role key because it may already have shipped to browsers.
12
+ cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
13
+ owasp: "A01:2025 - Broken Access Control"
14
+ category: security
15
+ confidence: HIGH
16
+ technology: [nextjs, supabase]
17
+ patterns:
18
+ - pattern-inside: |
19
+ "use client"
20
+ ...
21
+ - pattern-either:
22
+ - pattern: process.env.$NAME
23
+ - pattern: process.env[$NAME]
24
+ - pattern: import.meta.env.$NAME
25
+ - metavariable-regex:
26
+ metavariable: $NAME
27
+ regex: (?i).*service[_-]?role
@@ -0,0 +1,24 @@
1
+ rules:
2
+ - id: vsg-supabase-service-role-public-env
3
+ languages: [typescript, javascript]
4
+ severity: ERROR
5
+ message: >-
6
+ A Supabase service-role key is read from a public environment variable (NEXT_PUBLIC_, EXPO_PUBLIC_, VITE_ and similar prefixes). Frameworks inline these variables into the browser or app bundle, and the service-role key bypasses Row Level Security, so anyone could read and write your whole database.
7
+ Keep the service-role key in a server-only variable without a public prefix and use the anon key in client code.
8
+ metadata:
9
+ vsg-blocking: true
10
+ vsg-title: Supabase service-role key behind a public environment variable
11
+ vsg-fix: Rename the variable so it has no public prefix, read it only in server-only code, use the anon key in client code, and rotate the service-role key because it may already have shipped to browsers or devices.
12
+ cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
13
+ owasp: "A01:2025 - Broken Access Control"
14
+ category: security
15
+ confidence: HIGH
16
+ technology: [nextjs, expo, supabase]
17
+ patterns:
18
+ - pattern-either:
19
+ - pattern: process.env.$NAME
20
+ - pattern: process.env[$NAME]
21
+ - pattern: import.meta.env.$NAME
22
+ - metavariable-regex:
23
+ metavariable: $NAME
24
+ regex: (?i)^["'`]?(NEXT_PUBLIC|EXPO_PUBLIC|VITE|REACT_APP|GATSBY|NUXT_PUBLIC|PUBLIC)_[A-Z0-9_]*SERVICE[_-]?ROLE