@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.
- package/DISCLOSURE +1 -0
- package/README.md +118 -2
- package/bundles/expo-mobile/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
- package/bundles/expo-mobile/.agents/skills/lattice-release-manager/SKILL.md +29 -0
- package/bundles/expo-mobile/.agents/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/expo-mobile/.claude/agents/lattice-feature-agent.md +10 -0
- package/bundles/expo-mobile/.claude/agents/lattice-release-manager.md +9 -0
- package/bundles/expo-mobile/.claude/hooks/README.md +9 -0
- package/bundles/expo-mobile/.claude/hooks/pre-commit-verify.mjs +10 -0
- package/bundles/expo-mobile/.claude/hooks/pre-tool-use.mjs +51 -0
- package/bundles/expo-mobile/.claude/rules/lattice-core.md +20 -0
- package/bundles/expo-mobile/.claude/settings.json +38 -0
- package/bundles/expo-mobile/.claude/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/expo-mobile/.codex/agents/lattice-feature-agent.toml +9 -0
- package/bundles/expo-mobile/.codex/agents/lattice-release-manager.toml +9 -0
- package/bundles/expo-mobile/.cursor/mcp.json +34 -0
- package/bundles/expo-mobile/.cursor/rules/lattice-core.mdc +35 -0
- package/bundles/expo-mobile/.cursor/rules.md +94 -0
- package/bundles/expo-mobile/.env.example +19 -0
- package/bundles/expo-mobile/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- package/bundles/expo-mobile/.github/agents/lattice-feature-agent.agent.md +7 -0
- package/bundles/expo-mobile/.github/agents/lattice-release-manager.agent.md +7 -0
- package/bundles/expo-mobile/.github/copilot-instructions.md +37 -0
- package/bundles/expo-mobile/.github/instructions/lattice-core.instructions.md +11 -0
- package/bundles/expo-mobile/.github/workflows/ci.yml +26 -0
- package/bundles/expo-mobile/.gitmessage +24 -0
- package/bundles/expo-mobile/.lattice/config.json +9 -0
- package/bundles/expo-mobile/.lattice/dependency-security.json +91 -0
- package/bundles/expo-mobile/.lattice/prompts/01-feature.md +36 -0
- package/bundles/expo-mobile/.lattice/prompts/02-bugfix.md +32 -0
- package/bundles/expo-mobile/.lattice/prompts/03-refactor.md +30 -0
- package/bundles/expo-mobile/.lattice/prompts/04-test.md +31 -0
- package/bundles/expo-mobile/.lattice/prompts/05-polish.md +38 -0
- package/bundles/expo-mobile/.lattice/prompts/06-security.md +32 -0
- package/bundles/expo-mobile/.lattice/release-workflow.json +55 -0
- package/bundles/expo-mobile/.lattice/schemas/feature-handoff.schema.json +264 -0
- package/bundles/expo-mobile/.lattice/templates/feature-handoff.json +52 -0
- package/bundles/expo-mobile/.mcp.json +35 -0
- package/bundles/expo-mobile/AGENTS.md +58 -0
- package/bundles/expo-mobile/CLAUDE.md +75 -0
- package/bundles/expo-mobile/PROJECT_GUIDE.md +299 -0
- package/bundles/expo-mobile/README.md +39 -0
- package/bundles/expo-mobile/__tests__/home.test.tsx +22 -0
- package/bundles/expo-mobile/app/_layout.tsx +20 -0
- package/bundles/expo-mobile/app/index.tsx +72 -0
- package/bundles/expo-mobile/app.json +33 -0
- package/bundles/expo-mobile/components/ui/Button.tsx +75 -0
- package/bundles/expo-mobile/components/ui/Input.tsx +50 -0
- package/bundles/expo-mobile/components/ui/index.ts +2 -0
- package/bundles/expo-mobile/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
- package/bundles/expo-mobile/docs/rules/codex.md +62 -0
- package/bundles/expo-mobile/eslint.config.js +7 -0
- package/bundles/expo-mobile/lib/supabase/client.ts +22 -0
- package/bundles/expo-mobile/lib/supabase/realtime.ts +10 -0
- package/bundles/expo-mobile/lib/supabase/storage.ts +6 -0
- package/bundles/expo-mobile/package.json +65 -0
- package/bundles/expo-mobile/plugins/with-lattice-commons-io.cjs +42 -0
- package/bundles/expo-mobile/prompts/01-feature-implementation.md +48 -0
- package/bundles/expo-mobile/prompts/02-bug-fix.md +43 -0
- package/bundles/expo-mobile/prompts/03-safe-refactor.md +38 -0
- package/bundles/expo-mobile/prompts/04-test-first.md +41 -0
- package/bundles/expo-mobile/prompts/05-ui-polish.md +44 -0
- package/bundles/expo-mobile/prompts/06-security-review.md +39 -0
- package/bundles/expo-mobile/prompts/quality.md +143 -0
- package/bundles/expo-mobile/supabase/migrations/001_initial_schema.sql +66 -0
- package/bundles/expo-mobile/tsconfig.json +21 -0
- package/bundles/expo-mobile/types/database.types.ts +76 -0
- package/bundles/expo-mobile/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
- package/bundles/expo-supabase/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
- package/bundles/expo-supabase/.agents/skills/lattice-release-manager/SKILL.md +29 -0
- package/bundles/expo-supabase/.agents/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/expo-supabase/.claude/agents/lattice-feature-agent.md +10 -0
- package/bundles/expo-supabase/.claude/agents/lattice-release-manager.md +9 -0
- package/bundles/expo-supabase/.claude/hooks/README.md +9 -0
- package/bundles/expo-supabase/.claude/hooks/pre-commit-verify.mjs +10 -0
- package/bundles/expo-supabase/.claude/hooks/pre-tool-use.mjs +51 -0
- package/bundles/expo-supabase/.claude/rules/lattice-core.md +20 -0
- package/bundles/expo-supabase/.claude/settings.json +38 -0
- package/bundles/expo-supabase/.claude/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/expo-supabase/.codex/agents/lattice-feature-agent.toml +9 -0
- package/bundles/expo-supabase/.codex/agents/lattice-release-manager.toml +9 -0
- package/bundles/expo-supabase/.cursor/mcp.json +34 -0
- package/bundles/expo-supabase/.cursor/rules/lattice-core.mdc +35 -0
- package/bundles/expo-supabase/.cursor/rules.md +94 -0
- package/bundles/expo-supabase/.env.example +12 -0
- package/bundles/expo-supabase/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- package/bundles/expo-supabase/.github/agents/lattice-feature-agent.agent.md +7 -0
- package/bundles/expo-supabase/.github/agents/lattice-release-manager.agent.md +7 -0
- package/bundles/expo-supabase/.github/copilot-instructions.md +37 -0
- package/bundles/expo-supabase/.github/instructions/lattice-core.instructions.md +11 -0
- package/bundles/expo-supabase/.github/workflows/ci.yml +26 -0
- package/bundles/expo-supabase/.gitmessage +24 -0
- package/bundles/expo-supabase/.lattice/config.json +9 -0
- package/bundles/expo-supabase/.lattice/dependency-security.json +91 -0
- package/bundles/expo-supabase/.lattice/prompts/01-feature.md +36 -0
- package/bundles/expo-supabase/.lattice/prompts/02-bugfix.md +32 -0
- package/bundles/expo-supabase/.lattice/prompts/03-refactor.md +30 -0
- package/bundles/expo-supabase/.lattice/prompts/04-test.md +31 -0
- package/bundles/expo-supabase/.lattice/prompts/05-polish.md +38 -0
- package/bundles/expo-supabase/.lattice/prompts/06-security.md +32 -0
- package/bundles/expo-supabase/.lattice/release-workflow.json +55 -0
- package/bundles/expo-supabase/.lattice/schemas/feature-handoff.schema.json +264 -0
- package/bundles/expo-supabase/.lattice/templates/feature-handoff.json +52 -0
- package/bundles/expo-supabase/.mcp.json +35 -0
- package/bundles/expo-supabase/AGENTS.md +58 -0
- package/bundles/expo-supabase/CLAUDE.md +75 -0
- package/bundles/expo-supabase/PROJECT_GUIDE.md +201 -0
- package/bundles/expo-supabase/README.md +38 -0
- package/bundles/expo-supabase/__tests__/home.test.tsx +22 -0
- package/bundles/expo-supabase/app/_layout.tsx +14 -0
- package/bundles/expo-supabase/app/index.tsx +72 -0
- package/bundles/expo-supabase/app.json +33 -0
- package/bundles/expo-supabase/components/ui/Button.tsx +75 -0
- package/bundles/expo-supabase/components/ui/Input.tsx +50 -0
- package/bundles/expo-supabase/components/ui/index.ts +2 -0
- package/bundles/expo-supabase/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
- package/bundles/expo-supabase/docs/rules/codex.md +62 -0
- package/bundles/expo-supabase/eslint.config.js +7 -0
- package/bundles/expo-supabase/lib/supabase/client.ts +22 -0
- package/bundles/expo-supabase/lib/supabase/realtime.ts +10 -0
- package/bundles/expo-supabase/lib/supabase/storage.ts +6 -0
- package/bundles/expo-supabase/package.json +60 -0
- package/bundles/expo-supabase/plugins/with-lattice-commons-io.cjs +42 -0
- package/bundles/expo-supabase/prompts/01-feature-implementation.md +8 -0
- package/bundles/expo-supabase/prompts/02-bug-fix.md +9 -0
- package/bundles/expo-supabase/prompts/03-safe-refactor.md +8 -0
- package/bundles/expo-supabase/prompts/04-test-first.md +7 -0
- package/bundles/expo-supabase/prompts/05-ui-polish.md +7 -0
- package/bundles/expo-supabase/prompts/06-security-review.md +7 -0
- package/bundles/expo-supabase/prompts/quality.md +143 -0
- package/bundles/expo-supabase/supabase/migrations/001_initial_schema.sql +66 -0
- package/bundles/expo-supabase/tsconfig.json +21 -0
- package/bundles/expo-supabase/types/database.types.ts +76 -0
- package/bundles/expo-supabase/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
- package/bundles/nextjs-landing/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
- package/bundles/nextjs-landing/.agents/skills/lattice-release-manager/SKILL.md +29 -0
- package/bundles/nextjs-landing/.agents/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-landing/.claude/agents/lattice-feature-agent.md +10 -0
- package/bundles/nextjs-landing/.claude/agents/lattice-release-manager.md +9 -0
- package/bundles/nextjs-landing/.claude/hooks/README.md +9 -0
- package/bundles/nextjs-landing/.claude/hooks/pre-commit-verify.mjs +10 -0
- package/bundles/nextjs-landing/.claude/hooks/pre-tool-use.mjs +51 -0
- package/bundles/nextjs-landing/.claude/rules/lattice-core.md +20 -0
- package/bundles/nextjs-landing/.claude/settings.json +38 -0
- package/bundles/nextjs-landing/.claude/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-landing/.codex/agents/lattice-feature-agent.toml +9 -0
- package/bundles/nextjs-landing/.codex/agents/lattice-release-manager.toml +9 -0
- package/bundles/nextjs-landing/.cursor/mcp.json +34 -0
- package/bundles/nextjs-landing/.cursor/rules/lattice-core.mdc +35 -0
- package/bundles/nextjs-landing/.cursor/rules.md +95 -0
- package/bundles/nextjs-landing/.env.example +24 -0
- package/bundles/nextjs-landing/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- package/bundles/nextjs-landing/.github/agents/lattice-feature-agent.agent.md +7 -0
- package/bundles/nextjs-landing/.github/agents/lattice-release-manager.agent.md +7 -0
- package/bundles/nextjs-landing/.github/copilot-instructions.md +37 -0
- package/bundles/nextjs-landing/.github/instructions/lattice-core.instructions.md +11 -0
- package/bundles/nextjs-landing/.github/workflows/ci.yml +26 -0
- package/bundles/nextjs-landing/.gitmessage +24 -0
- package/bundles/nextjs-landing/.lattice/config.json +9 -0
- package/bundles/nextjs-landing/.lattice/dependency-security.json +46 -0
- package/bundles/nextjs-landing/.lattice/prompts/01-feature.md +36 -0
- package/bundles/nextjs-landing/.lattice/prompts/02-bugfix.md +32 -0
- package/bundles/nextjs-landing/.lattice/prompts/03-refactor.md +30 -0
- package/bundles/nextjs-landing/.lattice/prompts/04-test.md +31 -0
- package/bundles/nextjs-landing/.lattice/prompts/05-polish.md +38 -0
- package/bundles/nextjs-landing/.lattice/prompts/06-security.md +32 -0
- package/bundles/nextjs-landing/.lattice/release-workflow.json +55 -0
- package/bundles/nextjs-landing/.lattice/schemas/feature-handoff.schema.json +264 -0
- package/bundles/nextjs-landing/.lattice/templates/feature-handoff.json +52 -0
- package/bundles/nextjs-landing/.mcp.json +35 -0
- package/bundles/nextjs-landing/AGENTS.md +58 -0
- package/bundles/nextjs-landing/CLAUDE.md +76 -0
- package/bundles/nextjs-landing/PROJECT_GUIDE.md +216 -0
- package/bundles/nextjs-landing/README.md +39 -0
- package/bundles/nextjs-landing/app/api/example/[id]/route.ts +34 -0
- package/bundles/nextjs-landing/app/api/example/route.ts +24 -0
- package/bundles/nextjs-landing/app/api/health/route.ts +8 -0
- package/bundles/nextjs-landing/app/global-error.tsx +17 -0
- package/bundles/nextjs-landing/app/globals.css +55 -0
- package/bundles/nextjs-landing/app/layout.tsx +22 -0
- package/bundles/nextjs-landing/app/page.tsx +42 -0
- package/bundles/nextjs-landing/components/ui/button.tsx +39 -0
- package/bundles/nextjs-landing/components/ui/card.tsx +53 -0
- package/bundles/nextjs-landing/components/ui/index.ts +4 -0
- package/bundles/nextjs-landing/components/ui/input.tsx +23 -0
- package/bundles/nextjs-landing/components/ui/spinner.tsx +22 -0
- package/bundles/nextjs-landing/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
- package/bundles/nextjs-landing/docs/rules/codex.md +62 -0
- package/bundles/nextjs-landing/eslint.config.mjs +16 -0
- package/bundles/nextjs-landing/instrumentation-client.ts +30 -0
- package/bundles/nextjs-landing/instrumentation.ts +12 -0
- package/bundles/nextjs-landing/jest.config.mjs +16 -0
- package/bundles/nextjs-landing/jest.setup.js +1 -0
- package/bundles/nextjs-landing/lib/utils.ts +6 -0
- package/bundles/nextjs-landing/next-env.d.ts +5 -0
- package/bundles/nextjs-landing/next.config.ts +15 -0
- package/bundles/nextjs-landing/package.json +48 -0
- package/bundles/nextjs-landing/postcss.config.mjs +7 -0
- package/bundles/nextjs-landing/prompts/01-feature-implementation.md +9 -0
- package/bundles/nextjs-landing/prompts/02-bug-fix.md +10 -0
- package/bundles/nextjs-landing/prompts/03-safe-refactor.md +8 -0
- package/bundles/nextjs-landing/prompts/04-test-first.md +8 -0
- package/bundles/nextjs-landing/prompts/05-ui-polish.md +8 -0
- package/bundles/nextjs-landing/prompts/06-security-review.md +7 -0
- package/bundles/nextjs-landing/prompts/quality.md +269 -0
- package/bundles/nextjs-landing/sentry.edge.config.ts +15 -0
- package/bundles/nextjs-landing/sentry.server.config.ts +15 -0
- package/bundles/nextjs-landing/tsconfig.json +42 -0
- package/bundles/nextjs-landing/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
- package/bundles/nextjs-saas/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
- package/bundles/nextjs-saas/.agents/skills/lattice-release-manager/SKILL.md +29 -0
- package/bundles/nextjs-saas/.agents/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-saas/.claude/agents/lattice-feature-agent.md +10 -0
- package/bundles/nextjs-saas/.claude/agents/lattice-release-manager.md +9 -0
- package/bundles/nextjs-saas/.claude/hooks/README.md +9 -0
- package/bundles/nextjs-saas/.claude/hooks/pre-commit-verify.mjs +10 -0
- package/bundles/nextjs-saas/.claude/hooks/pre-tool-use.mjs +51 -0
- package/bundles/nextjs-saas/.claude/rules/lattice-core.md +20 -0
- package/bundles/nextjs-saas/.claude/settings.json +38 -0
- package/bundles/nextjs-saas/.claude/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-saas/.codex/agents/lattice-feature-agent.toml +9 -0
- package/bundles/nextjs-saas/.codex/agents/lattice-release-manager.toml +9 -0
- package/bundles/nextjs-saas/.cursor/mcp.json +34 -0
- package/bundles/nextjs-saas/.cursor/rules/lattice-core.mdc +35 -0
- package/bundles/nextjs-saas/.cursor/rules.md +95 -0
- package/bundles/nextjs-saas/.env.example +48 -0
- package/bundles/nextjs-saas/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- package/bundles/nextjs-saas/.github/agents/lattice-feature-agent.agent.md +7 -0
- package/bundles/nextjs-saas/.github/agents/lattice-release-manager.agent.md +7 -0
- package/bundles/nextjs-saas/.github/copilot-instructions.md +37 -0
- package/bundles/nextjs-saas/.github/instructions/lattice-core.instructions.md +11 -0
- package/bundles/nextjs-saas/.github/workflows/ci.yml +26 -0
- package/bundles/nextjs-saas/.gitmessage +24 -0
- package/bundles/nextjs-saas/.lattice/config.json +9 -0
- package/bundles/nextjs-saas/.lattice/dependency-security.json +46 -0
- package/bundles/nextjs-saas/.lattice/prompts/01-feature.md +36 -0
- package/bundles/nextjs-saas/.lattice/prompts/02-bugfix.md +32 -0
- package/bundles/nextjs-saas/.lattice/prompts/03-refactor.md +30 -0
- package/bundles/nextjs-saas/.lattice/prompts/04-test.md +31 -0
- package/bundles/nextjs-saas/.lattice/prompts/05-polish.md +38 -0
- package/bundles/nextjs-saas/.lattice/prompts/06-security.md +32 -0
- package/bundles/nextjs-saas/.lattice/prompts/quality.md +269 -0
- package/bundles/nextjs-saas/.lattice/release-workflow.json +55 -0
- package/bundles/nextjs-saas/.lattice/schemas/feature-handoff.schema.json +264 -0
- package/bundles/nextjs-saas/.lattice/templates/feature-handoff.json +52 -0
- package/bundles/nextjs-saas/.mcp.json +35 -0
- package/bundles/nextjs-saas/AGENTS.md +58 -0
- package/bundles/nextjs-saas/CLAUDE.md +76 -0
- package/bundles/nextjs-saas/PROJECT_GUIDE.md +279 -0
- package/bundles/nextjs-saas/README.md +42 -0
- package/bundles/nextjs-saas/app/(auth)/forgot-password/page.tsx +101 -0
- package/bundles/nextjs-saas/app/(auth)/layout.tsx +7 -0
- package/bundles/nextjs-saas/app/(auth)/login/page.tsx +108 -0
- package/bundles/nextjs-saas/app/(auth)/reset-password/page.tsx +135 -0
- package/bundles/nextjs-saas/app/(auth)/signup/page.tsx +144 -0
- package/bundles/nextjs-saas/app/(dashboard)/dashboard/page.tsx +80 -0
- package/bundles/nextjs-saas/app/(dashboard)/layout.tsx +49 -0
- package/bundles/nextjs-saas/app/api/billing/checkout/route.ts +47 -0
- package/bundles/nextjs-saas/app/api/billing/portal/route.ts +29 -0
- package/bundles/nextjs-saas/app/api/example/[id]/route.ts +93 -0
- package/bundles/nextjs-saas/app/api/example/route.ts +61 -0
- package/bundles/nextjs-saas/app/api/health/route.ts +8 -0
- package/bundles/nextjs-saas/app/api/stripe/webhook/route.ts +57 -0
- package/bundles/nextjs-saas/app/api/user/route.ts +49 -0
- package/bundles/nextjs-saas/app/auth/callback/route.ts +16 -0
- package/bundles/nextjs-saas/app/auth/signout/route.ts +10 -0
- package/bundles/nextjs-saas/app/global-error.tsx +17 -0
- package/bundles/nextjs-saas/app/globals.css +55 -0
- package/bundles/nextjs-saas/app/layout.tsx +22 -0
- package/bundles/nextjs-saas/app/page.tsx +84 -0
- package/bundles/nextjs-saas/components/ui/button.tsx +39 -0
- package/bundles/nextjs-saas/components/ui/card.tsx +53 -0
- package/bundles/nextjs-saas/components/ui/index.ts +4 -0
- package/bundles/nextjs-saas/components/ui/input.tsx +23 -0
- package/bundles/nextjs-saas/components/ui/spinner.tsx +22 -0
- package/bundles/nextjs-saas/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
- package/bundles/nextjs-saas/docs/rules/codex.md +62 -0
- package/bundles/nextjs-saas/eslint.config.mjs +16 -0
- package/bundles/nextjs-saas/instrumentation-client.ts +30 -0
- package/bundles/nextjs-saas/instrumentation.ts +12 -0
- package/bundles/nextjs-saas/jest.config.mjs +16 -0
- package/bundles/nextjs-saas/jest.setup.js +1 -0
- package/bundles/nextjs-saas/lib/auth/password-recovery.ts +94 -0
- package/bundles/nextjs-saas/lib/stripe.ts +10 -0
- package/bundles/nextjs-saas/lib/supabase/admin.ts +14 -0
- package/bundles/nextjs-saas/lib/supabase/client.ts +8 -0
- package/bundles/nextjs-saas/lib/supabase/server.ts +27 -0
- package/bundles/nextjs-saas/lib/utils.ts +6 -0
- package/bundles/nextjs-saas/next-env.d.ts +5 -0
- package/bundles/nextjs-saas/next.config.ts +15 -0
- package/bundles/nextjs-saas/package.json +50 -0
- package/bundles/nextjs-saas/postcss.config.mjs +7 -0
- package/bundles/nextjs-saas/prompts/01-feature-implementation.md +92 -0
- package/bundles/nextjs-saas/prompts/02-bug-fix.md +78 -0
- package/bundles/nextjs-saas/prompts/03-safe-refactor.md +82 -0
- package/bundles/nextjs-saas/prompts/04-test-first.md +80 -0
- package/bundles/nextjs-saas/prompts/05-ui-polish.md +82 -0
- package/bundles/nextjs-saas/prompts/06-security-review.md +74 -0
- package/bundles/nextjs-saas/proxy.ts +61 -0
- package/bundles/nextjs-saas/sentry.edge.config.ts +15 -0
- package/bundles/nextjs-saas/sentry.server.config.ts +15 -0
- package/bundles/nextjs-saas/supabase/migrations/001_initial_schema.sql +66 -0
- package/bundles/nextjs-saas/supabase/migrations/002_billing.sql +17 -0
- package/bundles/nextjs-saas/tsconfig.json +42 -0
- package/bundles/nextjs-saas/types/database.types.ts +76 -0
- package/bundles/nextjs-saas/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
- package/bundles/nextjs-trpc/.agents/skills/lattice-feature-handoff/SKILL.md +31 -0
- package/bundles/nextjs-trpc/.agents/skills/lattice-release-manager/SKILL.md +29 -0
- package/bundles/nextjs-trpc/.agents/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-trpc/.claude/agents/lattice-feature-agent.md +10 -0
- package/bundles/nextjs-trpc/.claude/agents/lattice-release-manager.md +9 -0
- package/bundles/nextjs-trpc/.claude/hooks/README.md +9 -0
- package/bundles/nextjs-trpc/.claude/hooks/pre-commit-verify.mjs +10 -0
- package/bundles/nextjs-trpc/.claude/hooks/pre-tool-use.mjs +51 -0
- package/bundles/nextjs-trpc/.claude/rules/lattice-core.md +20 -0
- package/bundles/nextjs-trpc/.claude/settings.json +38 -0
- package/bundles/nextjs-trpc/.claude/skills/lattice-verify/SKILL.md +27 -0
- package/bundles/nextjs-trpc/.codex/agents/lattice-feature-agent.toml +9 -0
- package/bundles/nextjs-trpc/.codex/agents/lattice-release-manager.toml +9 -0
- package/bundles/nextjs-trpc/.cursor/mcp.json +34 -0
- package/bundles/nextjs-trpc/.cursor/rules/lattice-core.mdc +35 -0
- package/bundles/nextjs-trpc/.cursor/rules.md +95 -0
- package/bundles/nextjs-trpc/.env.example +21 -0
- package/bundles/nextjs-trpc/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- package/bundles/nextjs-trpc/.github/agents/lattice-feature-agent.agent.md +7 -0
- package/bundles/nextjs-trpc/.github/agents/lattice-release-manager.agent.md +7 -0
- package/bundles/nextjs-trpc/.github/copilot-instructions.md +37 -0
- package/bundles/nextjs-trpc/.github/instructions/lattice-core.instructions.md +11 -0
- package/bundles/nextjs-trpc/.github/workflows/ci.yml +26 -0
- package/bundles/nextjs-trpc/.gitmessage +24 -0
- package/bundles/nextjs-trpc/.lattice/config.json +9 -0
- package/bundles/nextjs-trpc/.lattice/dependency-security.json +46 -0
- package/bundles/nextjs-trpc/.lattice/prompts/01-feature.md +36 -0
- package/bundles/nextjs-trpc/.lattice/prompts/02-bugfix.md +32 -0
- package/bundles/nextjs-trpc/.lattice/prompts/03-refactor.md +30 -0
- package/bundles/nextjs-trpc/.lattice/prompts/04-test.md +31 -0
- package/bundles/nextjs-trpc/.lattice/prompts/05-polish.md +38 -0
- package/bundles/nextjs-trpc/.lattice/prompts/06-security.md +32 -0
- package/bundles/nextjs-trpc/.lattice/release-workflow.json +55 -0
- package/bundles/nextjs-trpc/.lattice/schemas/feature-handoff.schema.json +264 -0
- package/bundles/nextjs-trpc/.lattice/templates/feature-handoff.json +52 -0
- package/bundles/nextjs-trpc/.mcp.json +35 -0
- package/bundles/nextjs-trpc/AGENTS.md +58 -0
- package/bundles/nextjs-trpc/CLAUDE.md +76 -0
- package/bundles/nextjs-trpc/PROJECT_GUIDE.md +187 -0
- package/bundles/nextjs-trpc/README.md +49 -0
- package/bundles/nextjs-trpc/app/api/trpc/[trpc]/route.ts +12 -0
- package/bundles/nextjs-trpc/app/global-error.tsx +17 -0
- package/bundles/nextjs-trpc/app/globals.css +55 -0
- package/bundles/nextjs-trpc/app/layout.tsx +19 -0
- package/bundles/nextjs-trpc/app/page.tsx +16 -0
- package/bundles/nextjs-trpc/app/providers.tsx +24 -0
- package/bundles/nextjs-trpc/components/ui/button.tsx +39 -0
- package/bundles/nextjs-trpc/components/ui/card.tsx +53 -0
- package/bundles/nextjs-trpc/components/ui/index.ts +4 -0
- package/bundles/nextjs-trpc/components/ui/input.tsx +23 -0
- package/bundles/nextjs-trpc/components/ui/spinner.tsx +22 -0
- package/bundles/nextjs-trpc/components/user-list.tsx +17 -0
- package/bundles/nextjs-trpc/docs/LATTICE_RELEASE_WORKFLOW.md +53 -0
- package/bundles/nextjs-trpc/docs/rules/codex.md +62 -0
- package/bundles/nextjs-trpc/eslint.config.mjs +16 -0
- package/bundles/nextjs-trpc/instrumentation-client.ts +20 -0
- package/bundles/nextjs-trpc/instrumentation.ts +12 -0
- package/bundles/nextjs-trpc/jest.config.mjs +16 -0
- package/bundles/nextjs-trpc/jest.setup.js +1 -0
- package/bundles/nextjs-trpc/lib/db.ts +17 -0
- package/bundles/nextjs-trpc/lib/trpc/react.tsx +7 -0
- package/bundles/nextjs-trpc/lib/utils.ts +6 -0
- package/bundles/nextjs-trpc/next-env.d.ts +5 -0
- package/bundles/nextjs-trpc/next.config.ts +15 -0
- package/bundles/nextjs-trpc/package.json +62 -0
- package/bundles/nextjs-trpc/postcss.config.mjs +7 -0
- package/bundles/nextjs-trpc/prisma/schema.prisma +41 -0
- package/bundles/nextjs-trpc/prisma.config.ts +10 -0
- package/bundles/nextjs-trpc/prompts/01-feature-implementation.md +9 -0
- package/bundles/nextjs-trpc/prompts/02-bug-fix.md +9 -0
- package/bundles/nextjs-trpc/prompts/03-safe-refactor.md +8 -0
- package/bundles/nextjs-trpc/prompts/04-test-first.md +8 -0
- package/bundles/nextjs-trpc/prompts/05-ui-polish.md +7 -0
- package/bundles/nextjs-trpc/prompts/06-security-review.md +7 -0
- package/bundles/nextjs-trpc/prompts/quality.md +269 -0
- package/bundles/nextjs-trpc/sentry.edge.config.ts +15 -0
- package/bundles/nextjs-trpc/sentry.server.config.ts +15 -0
- package/bundles/nextjs-trpc/server/routers/_app.test.ts +60 -0
- package/bundles/nextjs-trpc/server/routers/_app.ts +25 -0
- package/bundles/nextjs-trpc/server/trpc.ts +12 -0
- package/bundles/nextjs-trpc/tsconfig.json +42 -0
- package/bundles/nextjs-trpc/vendor/m2ai-braces-3.0.3-m2ai.1.tar +0 -0
- package/dist/agent-install-session.d.ts +17 -0
- package/dist/agent-install-session.d.ts.map +1 -0
- package/dist/agent-install-session.js +106 -0
- package/dist/agent-install-session.js.map +1 -0
- package/dist/agent-install-session.test.d.ts +2 -0
- package/dist/agent-install-session.test.d.ts.map +1 -0
- package/dist/agent-install-session.test.js +62 -0
- package/dist/agent-install-session.test.js.map +1 -0
- package/dist/agent-install.d.ts +41 -0
- package/dist/agent-install.d.ts.map +1 -0
- package/dist/agent-install.js +42 -0
- package/dist/agent-install.js.map +1 -0
- package/dist/agent-install.test.d.ts +2 -0
- package/dist/agent-install.test.d.ts.map +1 -0
- package/dist/agent-install.test.js +58 -0
- package/dist/agent-install.test.js.map +1 -0
- package/dist/apply-merge.test.d.ts +2 -0
- package/dist/apply-merge.test.d.ts.map +1 -0
- package/dist/apply-merge.test.js +123 -0
- package/dist/apply-merge.test.js.map +1 -0
- package/dist/bundle-download.d.ts +23 -0
- package/dist/bundle-download.d.ts.map +1 -0
- package/dist/bundle-download.js +180 -0
- package/dist/bundle-download.js.map +1 -0
- package/dist/bundle-download.test.d.ts +2 -0
- package/dist/bundle-download.test.d.ts.map +1 -0
- package/dist/bundle-download.test.js +200 -0
- package/dist/bundle-download.test.js.map +1 -0
- package/dist/bundle-rollback.test.d.ts +2 -0
- package/dist/bundle-rollback.test.d.ts.map +1 -0
- package/dist/bundle-rollback.test.js +127 -0
- package/dist/bundle-rollback.test.js.map +1 -0
- package/dist/bundle-scaffold.test.d.ts +2 -0
- package/dist/bundle-scaffold.test.d.ts.map +1 -0
- package/dist/bundle-scaffold.test.js +105 -0
- package/dist/bundle-scaffold.test.js.map +1 -0
- package/dist/commands.d.ts +132 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +2012 -0
- package/dist/commands.js.map +1 -0
- package/dist/credential-store.d.ts +27 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +48 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/credential-store.test.d.ts +2 -0
- package/dist/credential-store.test.d.ts.map +1 -0
- package/dist/credential-store.test.js +80 -0
- package/dist/credential-store.test.js.map +1 -0
- package/dist/delivered-project-files.d.ts +31 -0
- package/dist/delivered-project-files.d.ts.map +1 -0
- package/dist/delivered-project-files.js +158 -0
- package/dist/delivered-project-files.js.map +1 -0
- package/dist/delivered-project-files.test.d.ts +2 -0
- package/dist/delivered-project-files.test.d.ts.map +1 -0
- package/dist/delivered-project-files.test.js +107 -0
- package/dist/delivered-project-files.test.js.map +1 -0
- package/dist/doctor-agents.test.d.ts +2 -0
- package/dist/doctor-agents.test.d.ts.map +1 -0
- package/dist/doctor-agents.test.js +65 -0
- package/dist/doctor-agents.test.js.map +1 -0
- package/dist/hermes-install.d.ts +102 -0
- package/dist/hermes-install.d.ts.map +1 -0
- package/dist/hermes-install.js +641 -0
- package/dist/hermes-install.js.map +1 -0
- package/dist/hermes-install.test.d.ts +2 -0
- package/dist/hermes-install.test.d.ts.map +1 -0
- package/dist/hermes-install.test.js +866 -0
- package/dist/hermes-install.test.js.map +1 -0
- package/dist/index.d.ts +115 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5311 -0
- package/dist/index.js.map +1 -0
- package/dist/openclaw-install.d.ts +67 -0
- package/dist/openclaw-install.d.ts.map +1 -0
- package/dist/openclaw-install.js +358 -0
- package/dist/openclaw-install.js.map +1 -0
- package/dist/openclaw-install.test.d.ts +2 -0
- package/dist/openclaw-install.test.d.ts.map +1 -0
- package/dist/openclaw-install.test.js +296 -0
- package/dist/openclaw-install.test.js.map +1 -0
- package/dist/password-recovery-bundle.test.d.ts +2 -0
- package/dist/password-recovery-bundle.test.d.ts.map +1 -0
- package/dist/password-recovery-bundle.test.js +132 -0
- package/dist/password-recovery-bundle.test.js.map +1 -0
- package/dist/project-bundle-env.d.ts +19 -0
- package/dist/project-bundle-env.d.ts.map +1 -0
- package/dist/project-bundle-env.js +111 -0
- package/dist/project-bundle-env.js.map +1 -0
- package/dist/project-bundle-env.test.d.ts +2 -0
- package/dist/project-bundle-env.test.d.ts.map +1 -0
- package/dist/project-bundle-env.test.js +93 -0
- package/dist/project-bundle-env.test.js.map +1 -0
- package/dist/project-path-confinement.test.d.ts +2 -0
- package/dist/project-path-confinement.test.d.ts.map +1 -0
- package/dist/project-path-confinement.test.js +222 -0
- package/dist/project-path-confinement.test.js.map +1 -0
- package/dist/security/api.d.ts +18 -0
- package/dist/security/api.d.ts.map +1 -0
- package/dist/security/api.js +238 -0
- package/dist/security/api.js.map +1 -0
- package/dist/security/api.test.d.ts +2 -0
- package/dist/security/api.test.d.ts.map +1 -0
- package/dist/security/api.test.js +220 -0
- package/dist/security/api.test.js.map +1 -0
- package/dist/security/artifact.d.ts +10 -0
- package/dist/security/artifact.d.ts.map +1 -0
- package/dist/security/artifact.js +283 -0
- package/dist/security/artifact.js.map +1 -0
- package/dist/security/artifact.test.d.ts +2 -0
- package/dist/security/artifact.test.d.ts.map +1 -0
- package/dist/security/artifact.test.js +229 -0
- package/dist/security/artifact.test.js.map +1 -0
- package/dist/security/commands.d.ts +42 -0
- package/dist/security/commands.d.ts.map +1 -0
- package/dist/security/commands.js +825 -0
- package/dist/security/commands.js.map +1 -0
- package/dist/security/commands.test.d.ts +2 -0
- package/dist/security/commands.test.d.ts.map +1 -0
- package/dist/security/commands.test.js +1051 -0
- package/dist/security/commands.test.js.map +1 -0
- package/dist/security/connection.d.ts +19 -0
- package/dist/security/connection.d.ts.map +1 -0
- package/dist/security/connection.js +145 -0
- package/dist/security/connection.js.map +1 -0
- package/dist/security/connection.test.d.ts +2 -0
- package/dist/security/connection.test.d.ts.map +1 -0
- package/dist/security/connection.test.js +62 -0
- package/dist/security/connection.test.js.map +1 -0
- package/dist/security/index-routing.test.d.ts +2 -0
- package/dist/security/index-routing.test.d.ts.map +1 -0
- package/dist/security/index-routing.test.js +169 -0
- package/dist/security/index-routing.test.js.map +1 -0
- package/dist/security/journal.d.ts +26 -0
- package/dist/security/journal.d.ts.map +1 -0
- package/dist/security/journal.js +441 -0
- package/dist/security/journal.js.map +1 -0
- package/dist/security/journal.test.d.ts +2 -0
- package/dist/security/journal.test.d.ts.map +1 -0
- package/dist/security/journal.test.js +226 -0
- package/dist/security/journal.test.js.map +1 -0
- package/dist/security/package-verifier.d.ts +15 -0
- package/dist/security/package-verifier.d.ts.map +1 -0
- package/dist/security/package-verifier.js +65 -0
- package/dist/security/package-verifier.js.map +1 -0
- package/dist/security/package-verifier.test.d.ts +2 -0
- package/dist/security/package-verifier.test.d.ts.map +1 -0
- package/dist/security/package-verifier.test.js +57 -0
- package/dist/security/package-verifier.test.js.map +1 -0
- package/dist/security/runtime.d.ts +43 -0
- package/dist/security/runtime.d.ts.map +1 -0
- package/dist/security/runtime.js +81 -0
- package/dist/security/runtime.js.map +1 -0
- package/dist/security/runtime.test.d.ts +2 -0
- package/dist/security/runtime.test.d.ts.map +1 -0
- package/dist/security/runtime.test.js +88 -0
- package/dist/security/runtime.test.js.map +1 -0
- package/dist/security/types.d.ts +169 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +3 -0
- package/dist/security/types.js.map +1 -0
- package/dist/security-runtime/LICENSE +202 -0
- package/dist/security-runtime/NOTICE +16 -0
- package/dist/security-runtime/artifact-manifest.json +960 -0
- package/dist/security-runtime/bin/vsg.mjs +5 -0
- package/dist/security-runtime/lattice-catalog.json +176585 -0
- package/dist/security-runtime/lattice-runtime.mjs +90 -0
- package/dist/security-runtime/licensing/candidates/apache-source-license-evidence.json +478 -0
- package/dist/security-runtime/licensing/candidates/betterleaks-generic-api-key.json +76 -0
- package/dist/security-runtime/licensing/candidates/betterleaks-jwt.json +74 -0
- package/dist/security-runtime/licensing/candidates/blackberry-additional-source-declaration-evidence.json +276 -0
- package/dist/security-runtime/licensing/candidates/blackberry-source-declaration-evidence.json +369 -0
- package/dist/security-runtime/licensing/candidates/cado-source-declaration-evidence.json +283 -0
- package/dist/security-runtime/licensing/candidates/commercial-rule-candidate.json +280 -0
- package/dist/security-runtime/licensing/candidates/commercial-runtime-release.json +389 -0
- package/dist/security-runtime/licensing/candidates/data-feed-evidence.json +259 -0
- package/dist/security-runtime/licensing/candidates/gitlab-sast-rule-identities.json +178 -0
- package/dist/security-runtime/licensing/candidates/gitlab-sast-source-evidence.json +1824 -0
- package/dist/security-runtime/licensing/candidates/gitlab-sast-source-notice-bundle.json +45 -0
- package/dist/security-runtime/licensing/candidates/malpedia-source-license-evidence.json +41 -0
- package/dist/security-runtime/licensing/candidates/rule-license-evidence.json +376 -0
- package/dist/security-runtime/licensing/candidates/runner-image-composition.json +1500 -0
- package/dist/security-runtime/licensing/candidates/selected-runtime-coverage.json +91 -0
- package/dist/security-runtime/licensing/candidates/yara-forge-20260927.json +58502 -0
- package/dist/security-runtime/licensing/commercial-components.json +379 -0
- package/dist/security-runtime/licensing/notices/betterleaks-1.9.0-MIT.txt +21 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/28a9529c7d0bb4dc51f4bf5c116a3d16ef247a052f7591466768ddf563fd1cf5.txt +428 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/33acf42afdd03163d75fe856cb431e70710e0b5deede3362e6d1c4697cfe1c6a.txt +28 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986.txt +674 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/4fecb8fcaf80fd9a6315bca5225ee43377015b46a0459c2925495be885cab19a.txt +21 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/811515f8723aa4007de2fbb75a364127fdec51cda534b87a7ea8f2fef2f96dd7.txt +24 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/814442c3987a2c0411171ad8ad43118e8c08f85c9c5d1dcdecc9787c7ca8689b.txt +664 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/8a959b2413d0c83ca1b3ce9153076c649abf2e4bbfebbb493fb24c2074a1eb8a.txt +38 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/995182e185856186fbbe49f150409ae026aa4cda7e94f83c6ed737cbb77fa9c7.txt +23 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/9b8e1305e46d1dd4011b6ed933c9f6223e08c9c4625001c5fd75a34fa930f616.txt +202 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a01f1a28424bfe7f49a23d339a01847cfa9ace3864d5e7295051772a4bae2271.txt +38 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a5681bf9b05db14d86776930017c647ad9e6e56ff6bbcfdf21e5848288dfaf1b.txt +165 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/a5b8bd9ae96c630bbf229d61c5c5def20274e00be39abfd2fab4d7879ceab462.txt +24 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/ada32b3747ce108d5e8bab7918af94abbd03f2fe2a46304f74c6333bbfd914ed.txt +8 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4.txt +201 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/c738ae413cf561f174e34f6961f8ca458aae2369a73640dda6234c629b98bcc4.txt +2732 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/ce41c9a2c986277f7f9ab146a2195c1888a5d8da062e22d7c9c88666bb7c38cd.txt +17 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/d5f4c36a0528e01cfdd9e4fc60879201d3af49b41c520200643d321fe53da5f9.txt +17 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/e08c368ccd455f85c7fb9e04830e730f26e9dbb5c0f77bc88e09a5b0cb37df5b.txt +38 -0
- package/dist/security-runtime/licensing/notices/candidate-sources/sha256/e9efb2f7daf11bb6379c06c16b870dddcecc4a10f8704bb8aad807529c8b3c97.txt +8 -0
- package/dist/security-runtime/licensing/notices/gitleaks-generic-origin-782f3104-MIT.txt +21 -0
- package/dist/security-runtime/package.json +17 -0
- package/dist/security-runtime/playbook/README.md +76 -0
- package/dist/security-runtime/playbook/access-control.md +56 -0
- package/dist/security-runtime/playbook/ai-features.md +53 -0
- package/dist/security-runtime/playbook/desktop-python.md +59 -0
- package/dist/security-runtime/playbook/input-handling.md +59 -0
- package/dist/security-runtime/playbook/mobile-expo.md +59 -0
- package/dist/security-runtime/playbook/payments.md +53 -0
- package/dist/security-runtime/playbook/privacy-account-recovery.md +59 -0
- package/dist/security-runtime/playbook/secrets-config.md +47 -0
- package/dist/security-runtime/playbook/supabase.md +48 -0
- package/dist/security-runtime/playbook/supply-chain.md +62 -0
- package/dist/security-runtime/playbook/webhooks-integrations.md +52 -0
- package/dist/security-runtime/rules/vsg-ai-key-in-client.yaml +41 -0
- package/dist/security-runtime/rules/vsg-ai-output-raw-html.yaml +35 -0
- package/dist/security-runtime/rules/vsg-angular-sanitizer-bypass.yaml +23 -0
- package/dist/security-runtime/rules/vsg-expo-token-in-asyncstorage.yaml +22 -0
- package/dist/security-runtime/rules/vsg-flask-public-bind.yaml +32 -0
- package/dist/security-runtime/rules/vsg-nextjs-action-write-no-auth.yaml +144 -0
- package/dist/security-runtime/rules/vsg-nextjs-inline-action-write-no-auth.yaml +161 -0
- package/dist/security-runtime/rules/vsg-nextjs-route-write-no-auth.yaml +193 -0
- package/dist/security-runtime/rules/vsg-nosql-where-injection.yaml +36 -0
- package/dist/security-runtime/rules/vsg-python-pickle-load.yaml +26 -0
- package/dist/security-runtime/rules/vsg-python-requests-verify-false.yaml +34 -0
- package/dist/security-runtime/rules/vsg-python-subprocess-shell.yaml +23 -0
- package/dist/security-runtime/rules/vsg-stripe-client-price.yaml +51 -0
- package/dist/security-runtime/rules/vsg-stripe-webhook-no-signature.yaml +31 -0
- package/dist/security-runtime/rules/vsg-stripe-webhook-pages-no-signature.yaml +51 -0
- package/dist/security-runtime/rules/vsg-supabase-service-role-in-client.yaml +27 -0
- package/dist/security-runtime/rules/vsg-supabase-service-role-public-env.yaml +24 -0
- package/dist/security-runtime/rules/vsg-xml-external-entities.yaml +19 -0
- package/dist/security-runtime/src/agent/brief.mjs +95 -0
- package/dist/security-runtime/src/agent/discover.mjs +108 -0
- package/dist/security-runtime/src/agent/exec.mjs +64 -0
- package/dist/security-runtime/src/agent/ingest.mjs +213 -0
- package/dist/security-runtime/src/agent/report.mjs +94 -0
- package/dist/security-runtime/src/agent/schema.mjs +62 -0
- package/dist/security-runtime/src/agent/tokenize.mjs +38 -0
- package/dist/security-runtime/src/checks/README.md +8 -0
- package/dist/security-runtime/src/checks/_lib/gitfiles.mjs +35 -0
- package/dist/security-runtime/src/checks/_lib/lockfiles.mjs +135 -0
- package/dist/security-runtime/src/checks/_lib/osv.mjs +6 -0
- package/dist/security-runtime/src/checks/_lib/secrets.mjs +381 -0
- package/dist/security-runtime/src/checks/_lib/targets.mjs +79 -0
- package/dist/security-runtime/src/checks/agent-review/index.mjs +52 -0
- package/dist/security-runtime/src/checks/agent-surface/config.mjs +223 -0
- package/dist/security-runtime/src/checks/agent-surface/index.mjs +113 -0
- package/dist/security-runtime/src/checks/agent-surface/instructions.mjs +87 -0
- package/dist/security-runtime/src/checks/agent-surface/patterns.mjs +68 -0
- package/dist/security-runtime/src/checks/agent-surface/unicode.mjs +88 -0
- package/dist/security-runtime/src/checks/code/auth-helpers.mjs +659 -0
- package/dist/security-runtime/src/checks/code/index.mjs +617 -0
- package/dist/security-runtime/src/checks/code/opengrep-container.mjs +85 -0
- package/dist/security-runtime/src/checks/code/opengrep-runner.mjs +86 -0
- package/dist/security-runtime/src/checks/code/selected-opengrep-runner.mjs +112 -0
- package/dist/security-runtime/src/checks/dep-change/guarddog.mjs +142 -0
- package/dist/security-runtime/src/checks/dep-change/index.mjs +316 -0
- package/dist/security-runtime/src/checks/dep-change/registries.mjs +199 -0
- package/dist/security-runtime/src/checks/deps-vuln/index.mjs +305 -0
- package/dist/security-runtime/src/checks/desktop-config/index.mjs +112 -0
- package/dist/security-runtime/src/checks/dns-mail/index.mjs +71 -0
- package/dist/security-runtime/src/checks/iac/index.mjs +83 -0
- package/dist/security-runtime/src/checks/install-posture/index.mjs +123 -0
- package/dist/security-runtime/src/checks/licenses/index.mjs +143 -0
- package/dist/security-runtime/src/checks/live-basic/index.mjs +77 -0
- package/dist/security-runtime/src/checks/live-js-secrets/index.mjs +100 -0
- package/dist/security-runtime/src/checks/malware/clamav.mjs +17 -0
- package/dist/security-runtime/src/checks/malware/defender.mjs +43 -0
- package/dist/security-runtime/src/checks/malware/index.mjs +186 -0
- package/dist/security-runtime/src/checks/malware/targets.mjs +147 -0
- package/dist/security-runtime/src/checks/malware/yara-runner.mjs +201 -0
- package/dist/security-runtime/src/checks/malware/yara.mjs +124 -0
- package/dist/security-runtime/src/checks/mobile-config/index.mjs +173 -0
- package/dist/security-runtime/src/checks/mobile-config/mobsf.mjs +105 -0
- package/dist/security-runtime/src/checks/posture/index.mjs +133 -0
- package/dist/security-runtime/src/checks/project-scripts/index.mjs +187 -0
- package/dist/security-runtime/src/checks/sbom/index.mjs +98 -0
- package/dist/security-runtime/src/checks/secrets-build/index.mjs +63 -0
- package/dist/security-runtime/src/checks/secrets-history/index.mjs +112 -0
- package/dist/security-runtime/src/checks/secrets-tree/env.mjs +120 -0
- package/dist/security-runtime/src/checks/secrets-tree/index.mjs +73 -0
- package/dist/security-runtime/src/checks/supabase-static/index.mjs +240 -0
- package/dist/security-runtime/src/checks/supabase-static/sql.mjs +557 -0
- package/dist/security-runtime/src/checks/workflows/index.mjs +93 -0
- package/dist/security-runtime/src/cli/deep.mjs +13 -0
- package/dist/security-runtime/src/cli/doctor.mjs +82 -0
- package/dist/security-runtime/src/cli/index.mjs +60 -0
- package/dist/security-runtime/src/cli/live-common.mjs +27 -0
- package/dist/security-runtime/src/cli/parse.mjs +56 -0
- package/dist/security-runtime/src/cli/portfolio.mjs +34 -0
- package/dist/security-runtime/src/cli/release.mjs +28 -0
- package/dist/security-runtime/src/cli/report.mjs +18 -0
- package/dist/security-runtime/src/cli/run-common.mjs +54 -0
- package/dist/security-runtime/src/cli/scan.mjs +12 -0
- package/dist/security-runtime/src/cli/setup.mjs +59 -0
- package/dist/security-runtime/src/cli/url.mjs +38 -0
- package/dist/security-runtime/src/core/accept.mjs +141 -0
- package/dist/security-runtime/src/core/archive.mjs +114 -0
- package/dist/security-runtime/src/core/base-ref.mjs +43 -0
- package/dist/security-runtime/src/core/checks.mjs +39 -0
- package/dist/security-runtime/src/core/detect.mjs +90 -0
- package/dist/security-runtime/src/core/errors.mjs +5 -0
- package/dist/security-runtime/src/core/fetch.mjs +139 -0
- package/dist/security-runtime/src/core/findings.mjs +177 -0
- package/dist/security-runtime/src/core/gate.mjs +131 -0
- package/dist/security-runtime/src/core/installer.mjs +255 -0
- package/dist/security-runtime/src/core/lock.mjs +38 -0
- package/dist/security-runtime/src/core/nested.mjs +107 -0
- package/dist/security-runtime/src/core/paths.mjs +20 -0
- package/dist/security-runtime/src/core/pipeline.mjs +196 -0
- package/dist/security-runtime/src/core/registry.mjs +81 -0
- package/dist/security-runtime/src/core/report.mjs +128 -0
- package/dist/security-runtime/src/core/runner.mjs +86 -0
- package/dist/security-runtime/src/core/sarif.mjs +141 -0
- package/dist/security-runtime/src/lattice/artifact.mjs +1201 -0
- package/dist/security-runtime/src/lattice/execution.mjs +45 -0
- package/dist/security-runtime/src/lattice/export.mjs +215 -0
- package/dist/security-runtime/src/lattice/provenance.mjs +70 -0
- package/dist/security-runtime/src/lattice/runtime.mjs +158 -0
- package/dist/security-runtime/src/lattice/selected-runtime.mjs +189 -0
- package/dist/security-runtime/src/lattice/source-acquirer.mjs +51 -0
- package/dist/security-runtime/src/lattice/source-fetcher.mjs +88 -0
- package/dist/security-runtime/src/lattice/transport.mjs +232 -0
- package/dist/security-runtime/src/live/analyze.mjs +101 -0
- package/dist/security-runtime/src/live/exposure.mjs +79 -0
- package/dist/security-runtime/src/live/secrets.mjs +31 -0
- package/dist/security-runtime/src/live/session.mjs +98 -0
- package/dist/security-runtime/src/live/targets.mjs +81 -0
- package/dist/security-runtime/src/portfolio/index.mjs +116 -0
- package/dist/security-runtime/tools/registry/betterleaks.json +29 -0
- package/dist/security-runtime/tools/registry/guarddog.json +9 -0
- package/dist/security-runtime/tools/registry/mobsf.json +10 -0
- package/dist/security-runtime/tools/registry/opengrep.json +28 -0
- package/dist/security-runtime/tools/registry/osv-scanner.json +14 -0
- package/dist/security-runtime/tools/registry/semgrep-rules.json +21 -0
- package/dist/security-runtime/tools/registry/trivy.json +30 -0
- package/dist/security-runtime/tools/registry/yara-forge-exclusions.json +14 -0
- package/dist/security-runtime/tools/registry/yara-forge.json +22 -0
- package/dist/security-runtime/tools/registry/yara-runner.json +10 -0
- package/dist/security-runtime/tools/registry/yara-x.json +24 -0
- package/dist/security-runtime/tools/registry/zizmor.json +30 -0
- package/dist/spinner.d.ts +16 -0
- package/dist/spinner.d.ts.map +1 -0
- package/dist/spinner.js +72 -0
- package/dist/spinner.js.map +1 -0
- package/dist/verify.test.d.ts +2 -0
- package/dist/verify.test.d.ts.map +1 -0
- package/dist/verify.test.js +98 -0
- package/dist/verify.test.js.map +1 -0
- 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
|