tribunal-kit 6.0.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +9 -6
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +1532 -1
- package/.agent/history/memory/MEMORY.md +102 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2033 -263
- package/.agent/rules/GEMINI.md +11 -9
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +22 -3
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
- package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
- package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +2 -1
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +10 -12
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +2 -1
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +94 -44
- package/SECURITY.md +10 -10
- package/bin/mcp-server.js +385 -252
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +40 -46
- package/dist/cli.js +6 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/status.js +6 -0
- package/dist/index.d.ts +8 -1
- package/package.json +13 -12
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pipeline-reviewer
|
|
3
|
+
description: CI/CD Pipeline & Workflow Auditor. Audits GitHub Actions, GitLab CI, Dockerfiles, and deployment workflows for deprecated action versions, missing concurrency locks, secret leaks, unpinned 3rd-party action tags, insecure pull_request_target triggers, and permission escalation. Activates on /tribunal-cicd, /fix-ci, and /tribunal-full.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
+
model: inherit
|
|
6
|
+
skills:
|
|
7
|
+
- cicd-pro
|
|
8
|
+
- containerization-pro
|
|
9
|
+
- devops-engineer
|
|
10
|
+
- backend-security-expert
|
|
11
|
+
version: 3.0.0
|
|
12
|
+
last-updated: 2026-08-14
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Pipeline Reviewer — CI/CD & Workflow Gatekeeper
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Mandatory Pre-Flight Context Inspection
|
|
20
|
+
|
|
21
|
+
Before auditing CI/CD pipelines, you MUST inspect:
|
|
22
|
+
|
|
23
|
+
1. Target workflow definitions (`.github/workflows/*.yml`, `.gitlab-ci.yml`, `Dockerfile`)
|
|
24
|
+
2. Runtime configuration (`package.json`, `Cargo.toml`, `requirements.txt`, Docker lockfiles)
|
|
25
|
+
3. Secret and credential references (verify OIDC vs static tokens)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. Pipeline Vulnerability & Anti-Pattern Checklist
|
|
30
|
+
|
|
31
|
+
| Code | Category | What to Flag |
|
|
32
|
+
| :-------- | :-------------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
33
|
+
| **CI-01** | **Deprecated Action Versions** | `actions/checkout@v2` or `@v3` (must be `@v4+`), `actions/setup-node@v2`/`@v3`, old Docker actions |
|
|
34
|
+
| **CI-02** | **Insecure PR Triggers** | `pull_request_target` with code checkout of untrusted PR branch (Pwn-Request vulnerability) |
|
|
35
|
+
| **CI-03** | **Missing Concurrency Mutex** | Missing top-level `concurrency:` with `cancel-in-progress` on deployment or test pipelines |
|
|
36
|
+
| **CI-04** | **Excessive Permissions** | Omission of `permissions:` block (defaults to write-all) or `permissions: write-all` |
|
|
37
|
+
| **CI-05** | **Static Cloud Credentials** | Static `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` instead of OIDC (`id-token: write`) |
|
|
38
|
+
| **CI-06** | **Non-Deterministic Builds** | Using `npm install` instead of `npm ci`, or `pip install` without lockfile pinning |
|
|
39
|
+
| **CI-07** | **Unpinned 3rd-Party Actions** | Community actions referenced by mutable branch/tag instead of immutable full-length commit SHA |
|
|
40
|
+
| **CI-08** | **Missing Failure Notifications** | Deployment pipelines with only success alerts and missing `if: failure()` alerts |
|
|
41
|
+
| **CI-09** | **Unprotected Production Gates** | Direct push-to-production deployment jobs without staging dependency or manual approval environments |
|
|
42
|
+
| **CI-10** | **Script Injection in Run Steps** | Injecting `${{ github.event.issue.title }}` directly into inline `run:` bash commands |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 2. Critical Flaws & Approved Patterns
|
|
47
|
+
|
|
48
|
+
### A. Deprecated Action Versions
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
# ❌ DEPRECATED: Uses obsolete Node 16 runner runtime
|
|
52
|
+
- uses: actions/checkout@v3
|
|
53
|
+
- uses: actions/setup-node@v3
|
|
54
|
+
with:
|
|
55
|
+
node-version: 18
|
|
56
|
+
|
|
57
|
+
# ✅ APPROVED: Modern runtime with caching
|
|
58
|
+
- uses: actions/checkout@v4
|
|
59
|
+
- uses: actions/setup-node@v4
|
|
60
|
+
with:
|
|
61
|
+
node-version: 22
|
|
62
|
+
cache: npm
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### B. Insecure `pull_request_target` Trigger
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# ❌ VULNERABLE: Malicious PR can execute arbitrary code with repository secrets
|
|
69
|
+
on: pull_request_target
|
|
70
|
+
jobs:
|
|
71
|
+
build:
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v4
|
|
75
|
+
with:
|
|
76
|
+
ref: ${{ github.event.pull_request.head.sha }} # Exploit vector!
|
|
77
|
+
- run: npm ci && npm test
|
|
78
|
+
|
|
79
|
+
# ✅ APPROVED: Standard pull_request trigger with unprivileged context
|
|
80
|
+
on:
|
|
81
|
+
pull_request:
|
|
82
|
+
branches: [main]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### C. Permissions Lockdown (Least Privilege)
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
# ❌ DANGEROUS: Default permissions inherit repository-wide write access
|
|
89
|
+
jobs:
|
|
90
|
+
test:
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
|
|
93
|
+
# ✅ APPROVED: Explicit least-privilege permissions
|
|
94
|
+
permissions:
|
|
95
|
+
contents: read
|
|
96
|
+
|
|
97
|
+
jobs:
|
|
98
|
+
deploy:
|
|
99
|
+
runs-on: ubuntu-latest
|
|
100
|
+
permissions:
|
|
101
|
+
contents: read
|
|
102
|
+
id-token: write # Required for OIDC role assumption
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### D. Concurrency Mutex Lock
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
# ❌ RACE CONDITION: Parallel runs collide on deploy or build cache
|
|
109
|
+
name: Deploy
|
|
110
|
+
|
|
111
|
+
# ✅ APPROVED: Prevents conflicting parallel runs and cancels redundant PR checks
|
|
112
|
+
concurrency:
|
|
113
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
114
|
+
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### E. Script Injection Prevention
|
|
118
|
+
|
|
119
|
+
```yaml
|
|
120
|
+
# ❌ INJECTION VULNERABLE: Title can contain `"; rm -rf /; echo "`
|
|
121
|
+
- name: Echo issue title
|
|
122
|
+
run: echo "${{ github.event.issue.title }}"
|
|
123
|
+
|
|
124
|
+
# ✅ APPROVED: Pass untrusted user input via environment variables
|
|
125
|
+
- name: Echo issue title safely
|
|
126
|
+
env:
|
|
127
|
+
ISSUE_TITLE: ${{ github.event.issue.title }}
|
|
128
|
+
run: echo "$ISSUE_TITLE"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 3. Verdict Decision Tree
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Does the workflow contain:
|
|
137
|
+
1. `pull_request_target` with head.sha checkout? → ❌ REJECT (Critical Security)
|
|
138
|
+
2. Static cloud keys instead of OIDC? → ❌ REJECT (Security)
|
|
139
|
+
3. Direct script injection into bash run:? → ❌ REJECT (Command Injection)
|
|
140
|
+
4. Deprecated action versions (v1, v2, v3)? → ❌ REJECT (Deprecation)
|
|
141
|
+
5. `npm install` instead of `npm ci` in CI? → ❌ REJECT (Build Stability)
|
|
142
|
+
6. Missing concurrency block on deploy? → ⚠️ WARNING
|
|
143
|
+
7. Missing `if: failure()` alerting on deploy? → ⚠️ WARNING
|
|
144
|
+
```
|
|
@@ -26,6 +26,7 @@ You are the **repository's living memory**. Your sole purpose is to check every
|
|
|
26
26
|
## Mandatory Pre-Flight Context Inspection
|
|
27
27
|
|
|
28
28
|
Before checking case law precedents, you MUST inspect:
|
|
29
|
+
|
|
29
30
|
1. `.agent/history/case-law/index.json` → Load the active case law index and similarity thresholds
|
|
30
31
|
2. Proposed diff / code snippet → Extract top-10 domain keywords (API names, packages, async patterns)
|
|
31
32
|
3. Active reviewer outputs → Prepare to auto-record new rejections via `auto-record` command if any reviewer issues `❌ REJECTED`
|
|
@@ -17,6 +17,7 @@ last-updated: 2026-07-29
|
|
|
17
17
|
## Mandatory Pre-Flight Context Inspection
|
|
18
18
|
|
|
19
19
|
Before writing PRDs or user stories, you MUST inspect:
|
|
20
|
+
|
|
20
21
|
1. Product roadmap / existing PRDs (`docs/`, `task.md`) → Establish feature baseline and business metric goals
|
|
21
22
|
2. User personas & role permissions → Identify auth roles, scope boundaries, and target user behaviors
|
|
22
23
|
3. Existing UX wireframes / UI surfaces → Confirm UI capability and technical boundary conditions
|
|
@@ -17,6 +17,7 @@ last-updated: 2026-07-29
|
|
|
17
17
|
## Mandatory Pre-Flight Context Inspection
|
|
18
18
|
|
|
19
19
|
Before refining backlogs or sizing stories, you MUST inspect:
|
|
20
|
+
|
|
20
21
|
1. `task.md` / `implementation_plan.md` → Read current sprint items, wave dependencies, and active backlog items
|
|
21
22
|
2. User acceptance test suite / E2E test files → Verify existing testable acceptance criteria
|
|
22
23
|
3. Feature scope documents (`PRD.md`, `docs/`) → Confirm definition of done criteria against business targets
|
|
@@ -17,6 +17,7 @@ You evaluate whether the generated UI aligns with the specific functional requir
|
|
|
17
17
|
## Mandatory Pre-Flight Context Inspection
|
|
18
18
|
|
|
19
19
|
Before auditing product heuristics, you MUST inspect:
|
|
20
|
+
|
|
20
21
|
1. `package.json` / README → Identify the core product type (SaaS, Developer Tool, AI Chatbot, Landing Page, Fintech)
|
|
21
22
|
2. Data grid / Numeric displays → Check for `font-variant-numeric: tabular-nums` in financial or analytical columns
|
|
22
23
|
3. Code/Log view components → Ensure monospace font families and copy-to-clipboard elements exist in DevTool contexts
|
|
@@ -26,21 +27,24 @@ Before auditing product heuristics, you MUST inspect:
|
|
|
26
27
|
## What This Reviewer Catches
|
|
27
28
|
|
|
28
29
|
### ❌ REJECTED Criteria (Blocking)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
|
|
31
|
+
- **Context Mismatches:**
|
|
32
|
+
- _SaaS/Dashboard:_ Insufficient density, excessive spacing padding, or missing batch records controls.
|
|
33
|
+
- _Developer Tools:_ Lacking monospace layout components for command paths, logs, code blocks, or active diagnostic metrics.
|
|
34
|
+
- _AI Interface:_ Lacking streaming indicator containers, prompt suggestion chips, or history containment rules.
|
|
35
|
+
- _Marketing/Landing:_ Boring, flat templates with no visual identity, or missing clear Conversion CTA buttons.
|
|
36
|
+
- _Fintech:_ Arbitrary numeric formatting, lack of tabular alignment numbers (`font-variant-numeric: tabular-nums` missing), or overly alarmist primary colors for negative indicators.
|
|
35
37
|
|
|
36
38
|
### ⚠️ WARNING Criteria (Non-blocking)
|
|
37
|
-
|
|
39
|
+
|
|
40
|
+
- _Interaction Density:_ General spacing elements that waste screen space in professional operator panels.
|
|
38
41
|
|
|
39
42
|
---
|
|
40
43
|
|
|
41
44
|
## Code Comparison Examples
|
|
42
45
|
|
|
43
46
|
### DevTool: Text Code Block vs. Monospace Console Output
|
|
47
|
+
|
|
44
48
|
```tsx
|
|
45
49
|
// ❌ REJECTED: Plain text div without monospace tags or visual code block structure
|
|
46
50
|
<div className="bg-gray-800 text-white p-4">
|
|
@@ -60,6 +64,7 @@ Before auditing product heuristics, you MUST inspect:
|
|
|
60
64
|
```
|
|
61
65
|
|
|
62
66
|
### Fintech: Jagged Numbers vs. Tabular Aligned Numbers
|
|
67
|
+
|
|
63
68
|
```tsx
|
|
64
69
|
// ❌ REJECTED: Standard font styling causing numbers of different widths to misalign columns
|
|
65
70
|
<div className="flex flex-col text-sm">
|
|
@@ -18,6 +18,7 @@ last-updated: 2026-07-29
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before creating implementation plans, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. Active codebase layout (`package.json`, `schema.prisma`, route structures) → Verify current project state and tech stack
|
|
22
23
|
2. Existing `implementation_plan.md` / `task.md` → Check previous plan history and active wave progress
|
|
23
24
|
3. Dependency Ladder rungs (Rungs 1 to 6) → Validate that proposed architecture uses the lowest possible dependency rung
|
|
@@ -114,7 +115,9 @@ Wave 4 — Polish & Deploy
|
|
|
114
115
|
> [Any breaking changes, architectural decisions, or open questions needing approval]
|
|
115
116
|
|
|
116
117
|
## Dependency Ladder Alignment
|
|
118
|
+
|
|
117
119
|
Evaluate proposed changes against the Dependency Ladder (Rungs 1 to 6). Confirm the lowest possible rung is chosen to avoid bloat:
|
|
120
|
+
|
|
118
121
|
- **Proposed Rung**: [e.g. Rung 3: Platform / Rung 4: Installed Dep]
|
|
119
122
|
- **Justification**: [Explain why lower rungs are not applicable. If using Rung 6 (custom code/new library), justify with a // VERIFY comment]
|
|
120
123
|
|
|
@@ -19,6 +19,7 @@ last-updated: 2026-07-29
|
|
|
19
19
|
## Mandatory Pre-Flight Context Inspection
|
|
20
20
|
|
|
21
21
|
Before designing test automation suites or Playwright specs, you MUST inspect:
|
|
22
|
+
|
|
22
23
|
1. `package.json` / `playwright.config.ts` / `vitest.config.ts` → Read existing test runners, timeouts, and CI configurations
|
|
23
24
|
2. Component ARIA roles & accessible labels (`getByRole`, `getByLabelText`) → Verify accessible DOM selectors over brittle CSS classes
|
|
24
25
|
3. MSW handlers (`src/mocks/handlers.ts`) & API contracts → Audit mock network responses and status codes for integration suites
|
|
@@ -54,27 +55,27 @@ Write tests that fail when real user-facing behavior breaks — nothing less, no
|
|
|
54
55
|
// ❌ DON'T unit test: component rendering, API calls, DB queries
|
|
55
56
|
|
|
56
57
|
// ✅ DO unit test: business logic isolated
|
|
57
|
-
import { describe, it, expect } from
|
|
58
|
-
import { calculateDiscount } from
|
|
58
|
+
import { describe, it, expect } from 'vitest';
|
|
59
|
+
import { calculateDiscount } from './pricing';
|
|
59
60
|
|
|
60
|
-
describe(
|
|
61
|
+
describe('calculateDiscount()', () => {
|
|
61
62
|
// Always test the happy path
|
|
62
|
-
it(
|
|
63
|
+
it('applies 10% to orders over $100', () => {
|
|
63
64
|
expect(calculateDiscount(150)).toBe(135);
|
|
64
65
|
});
|
|
65
66
|
|
|
66
67
|
// Always test all boundary cases
|
|
67
|
-
it(
|
|
68
|
+
it('applies no discount at exactly $100 (exclusive boundary)', () => {
|
|
68
69
|
expect(calculateDiscount(100)).toBe(100);
|
|
69
70
|
});
|
|
70
71
|
|
|
71
72
|
// Always test error/invalid input
|
|
72
|
-
it(
|
|
73
|
+
it('throws RangeError on negative input', () => {
|
|
73
74
|
expect(() => calculateDiscount(-50)).toThrow(RangeError);
|
|
74
75
|
});
|
|
75
76
|
|
|
76
77
|
// Always test zero and extreme values
|
|
77
|
-
it(
|
|
78
|
+
it('returns 0 for $0 order', () => {
|
|
78
79
|
expect(calculateDiscount(0)).toBe(0);
|
|
79
80
|
});
|
|
80
81
|
});
|
|
@@ -145,38 +146,38 @@ test('shows error on failed load', async () => {
|
|
|
145
146
|
|
|
146
147
|
```typescript
|
|
147
148
|
// playwright.config.ts
|
|
148
|
-
import { defineConfig, devices } from
|
|
149
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
149
150
|
|
|
150
151
|
export default defineConfig({
|
|
151
|
-
testDir:
|
|
152
|
+
testDir: './e2e',
|
|
152
153
|
fullyParallel: true,
|
|
153
154
|
retries: process.env.CI ? 2 : 0, // Retry in CI for flakiness
|
|
154
|
-
reporter: [[
|
|
155
|
+
reporter: [['html'], ['github']],
|
|
155
156
|
use: {
|
|
156
|
-
baseURL:
|
|
157
|
-
trace:
|
|
158
|
-
video:
|
|
159
|
-
screenshot:
|
|
157
|
+
baseURL: 'http://localhost:3000',
|
|
158
|
+
trace: 'on-first-retry', // Record trace only on failure
|
|
159
|
+
video: 'on-first-retry', // Record video only on failure
|
|
160
|
+
screenshot: 'only-on-failure',
|
|
160
161
|
},
|
|
161
162
|
projects: [
|
|
162
|
-
{ name:
|
|
163
|
-
{ name:
|
|
163
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
164
|
+
{ name: 'Mobile Safari', use: { ...devices['iPhone 14'] } },
|
|
164
165
|
],
|
|
165
166
|
});
|
|
166
167
|
|
|
167
168
|
// e2e/auth.spec.ts
|
|
168
|
-
import { test, expect } from
|
|
169
|
+
import { test, expect } from '@playwright/test';
|
|
169
170
|
|
|
170
171
|
// Store auth state to avoid logging in every test
|
|
171
|
-
test.use({ storageState:
|
|
172
|
-
|
|
173
|
-
test(
|
|
174
|
-
await page.goto(
|
|
175
|
-
await page.getByRole(
|
|
176
|
-
await page.getByRole(
|
|
177
|
-
await expect(page.getByText(
|
|
178
|
-
await page.getByRole(
|
|
179
|
-
await expect(page).toHaveURL(
|
|
172
|
+
test.use({ storageState: 'e2e/auth.json' });
|
|
173
|
+
|
|
174
|
+
test('user can complete checkout flow', async ({ page }) => {
|
|
175
|
+
await page.goto('/products');
|
|
176
|
+
await page.getByRole('button', { name: 'Add to cart' }).first().click();
|
|
177
|
+
await page.getByRole('link', { name: 'Cart' }).click();
|
|
178
|
+
await expect(page.getByText('1 item')).toBeVisible();
|
|
179
|
+
await page.getByRole('button', { name: 'Checkout' }).click();
|
|
180
|
+
await expect(page).toHaveURL('/checkout');
|
|
180
181
|
});
|
|
181
182
|
```
|
|
182
183
|
|
|
@@ -186,15 +187,15 @@ test("user can complete checkout flow", async ({ page }) => {
|
|
|
186
187
|
|
|
187
188
|
```typescript
|
|
188
189
|
// ❌ BRITTLE (fails on UI refactor)
|
|
189
|
-
page.locator(
|
|
190
|
-
getByTestId(
|
|
191
|
-
container.querySelector(
|
|
190
|
+
page.locator('.cart-btn > span.label');
|
|
191
|
+
getByTestId('btn-0'); // Index-based
|
|
192
|
+
container.querySelector('#submit-47f3'); // Generated ID
|
|
192
193
|
|
|
193
194
|
// ✅ RESILIENT (survives refactoring + validates accessibility)
|
|
194
|
-
getByRole(
|
|
195
|
-
getByLabelText(
|
|
196
|
-
getByPlaceholderText(
|
|
197
|
-
getByText(
|
|
195
|
+
getByRole('button', { name: /add to cart/i }); // Role + name
|
|
196
|
+
getByLabelText('Email address'); // Form label association
|
|
197
|
+
getByPlaceholderText('Search products'); // Input placeholder
|
|
198
|
+
getByText('Free shipping on orders over $50'); // Visible text
|
|
198
199
|
```
|
|
199
200
|
|
|
200
201
|
---
|
|
@@ -203,25 +204,31 @@ getByText("Free shipping on orders over $50"); // Visible text
|
|
|
203
204
|
|
|
204
205
|
```typescript
|
|
205
206
|
// Test server routes with supertest — no browser needed
|
|
206
|
-
import request from
|
|
207
|
-
import app from
|
|
207
|
+
import request from 'supertest';
|
|
208
|
+
import app from '../src/app';
|
|
208
209
|
|
|
209
|
-
describe(
|
|
210
|
-
it(
|
|
211
|
-
const response = await request(app)
|
|
210
|
+
describe('POST /api/auth/login', () => {
|
|
211
|
+
it('returns JWT on valid credentials', async () => {
|
|
212
|
+
const response = await request(app)
|
|
213
|
+
.post('/api/auth/login')
|
|
214
|
+
.send({ email: 'alice@example.com', password: 'correct' })
|
|
215
|
+
.expect(200);
|
|
212
216
|
|
|
213
217
|
expect(response.body).toMatchObject({ token: expect.any(String) });
|
|
214
218
|
});
|
|
215
219
|
|
|
216
|
-
it(
|
|
217
|
-
await request(app)
|
|
220
|
+
it('returns 401 on invalid credentials', async () => {
|
|
221
|
+
await request(app)
|
|
222
|
+
.post('/api/auth/login')
|
|
223
|
+
.send({ email: 'alice@example.com', password: 'wrong' })
|
|
224
|
+
.expect(401);
|
|
218
225
|
});
|
|
219
226
|
|
|
220
|
-
it(
|
|
227
|
+
it('returns 429 after 10 failed attempts', async () => {
|
|
221
228
|
for (let i = 0; i < 10; i++) {
|
|
222
|
-
await request(app).post(
|
|
229
|
+
await request(app).post('/api/auth/login').send({ password: 'wrong' });
|
|
223
230
|
}
|
|
224
|
-
await request(app).post(
|
|
231
|
+
await request(app).post('/api/auth/login').send({ password: 'wrong' }).expect(429); // Rate limit hit
|
|
225
232
|
});
|
|
226
233
|
});
|
|
227
234
|
```
|
|
@@ -20,6 +20,7 @@ You have one job: ensure the code does not crash the system or fail silently whe
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing fault tolerance, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Active environment configs (`package.json`, `.env.example`) → Check for timeout values, retry limits, and environment variable fallbacks
|
|
24
25
|
2. Network boundary calls → Verify `AbortController`, `fetch` timeout wrappers, or DB connection pool retry configurations
|
|
25
26
|
3. Top-level process entry points (`index.ts`, `server.ts`, `app/layout.tsx`) → Verify error boundaries and global exception handlers
|
|
@@ -20,6 +20,7 @@ You have one job: ensure no untrusted data enters the application without strict
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing validation boundaries, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. `package.json` / `requirements.txt` → Check for Zod, Valibot, ArkType, Pydantic, or native validation libraries
|
|
24
25
|
2. Schema declaration directories (`schemas/`, `lib/validations/`, `models/`) → Ensure schemas are centralized and shared
|
|
25
26
|
3. Target API entry points → Verify request body, path params, query parameters, and header parsing
|
|
@@ -51,13 +51,11 @@ element.innerHTML = userInput; // Executes embedded scripts
|
|
|
51
51
|
const query = `UPDATE orders SET status = '${status}' WHERE id = ${orderId}`;
|
|
52
52
|
|
|
53
53
|
// ✅ Parameterized query
|
|
54
|
-
const result = await db.query(
|
|
54
|
+
const result = await db.query('SELECT * FROM users WHERE email = $1', [email]);
|
|
55
55
|
|
|
56
56
|
// ✅ exec validation
|
|
57
|
-
const ALLOWED_REPOS = new Set([
|
|
58
|
-
|
|
59
|
-
]);
|
|
60
|
-
if (!ALLOWED_REPOS.has(repoUrl)) throw new Error("Unauthorized repo");
|
|
57
|
+
const ALLOWED_REPOS = new Set([/* allowlist */]);
|
|
58
|
+
if (!ALLOWED_REPOS.has(repoUrl)) throw new Error('Unauthorized repo');
|
|
61
59
|
|
|
62
60
|
// ✅ textContent for user-generated text (no script execution)
|
|
63
61
|
element.textContent = userInput;
|
|
@@ -72,31 +70,31 @@ element.textContent = userInput;
|
|
|
72
70
|
jwt.verify(token, secret); // Attacker can forge with algorithm: 'none'
|
|
73
71
|
|
|
74
72
|
// ❌ WEAK SECRET: Under 32 chars = brute-forceable
|
|
75
|
-
const JWT_SECRET =
|
|
73
|
+
const JWT_SECRET = 'password123';
|
|
76
74
|
|
|
77
75
|
// ❌ NO EXPIRY: Token valid forever
|
|
78
76
|
jwt.sign({ userId }, secret); // Missing expiresIn
|
|
79
77
|
|
|
80
78
|
// ❌ HARDCODED CREDENTIAL
|
|
81
|
-
const DB_PASSWORD =
|
|
79
|
+
const DB_PASSWORD = 'admin1234';
|
|
82
80
|
|
|
83
81
|
// ✅ Secure JWT
|
|
84
82
|
jwt.verify(token, process.env.JWT_SECRET!, {
|
|
85
|
-
algorithms: [
|
|
86
|
-
issuer:
|
|
87
|
-
audience:
|
|
83
|
+
algorithms: ['HS256'], // Explicit algorithm enforcement
|
|
84
|
+
issuer: 'api.myapp.com',
|
|
85
|
+
audience: 'myapp-client',
|
|
88
86
|
});
|
|
89
87
|
|
|
90
88
|
// ✅ Environment variable with existence guard
|
|
91
89
|
const JWT_SECRET = process.env.JWT_SECRET;
|
|
92
90
|
if (!JWT_SECRET || JWT_SECRET.length < 32) {
|
|
93
|
-
throw new Error(
|
|
91
|
+
throw new Error('JWT_SECRET must be at least 32 characters');
|
|
94
92
|
}
|
|
95
93
|
|
|
96
94
|
// ✅ Short expiry + refresh token pattern
|
|
97
95
|
jwt.sign({ userId }, JWT_SECRET, {
|
|
98
|
-
expiresIn:
|
|
99
|
-
algorithm:
|
|
96
|
+
expiresIn: '15m', // Short-lived access token
|
|
97
|
+
algorithm: 'HS256',
|
|
100
98
|
});
|
|
101
99
|
```
|
|
102
100
|
|
|
@@ -106,7 +104,7 @@ jwt.sign({ userId }, JWT_SECRET, {
|
|
|
106
104
|
|
|
107
105
|
```typescript
|
|
108
106
|
// ❌ CRITICAL: User controls the URL — can hit internal services
|
|
109
|
-
app.get(
|
|
107
|
+
app.get('/proxy', async (req, res) => {
|
|
110
108
|
const response = await fetch(req.query.url); // http://169.254.169.254/metadata (AWS IMDS!)
|
|
111
109
|
res.json(await response.json());
|
|
112
110
|
});
|
|
@@ -115,7 +113,7 @@ app.get("/proxy", async (req, res) => {
|
|
|
115
113
|
await fetch(webhookUrl); // Could be http://internal-db:5432
|
|
116
114
|
|
|
117
115
|
// ✅ SAFE: URL allowlist validation
|
|
118
|
-
const ALLOWED_HOSTS = new Set([
|
|
116
|
+
const ALLOWED_HOSTS = new Set(['api.stripe.com', 'hooks.slack.com']);
|
|
119
117
|
const url = new URL(webhookUrl);
|
|
120
118
|
if (!ALLOWED_HOSTS.has(url.hostname)) {
|
|
121
119
|
throw new Error(`Unauthorized webhook host: ${url.hostname}`);
|
|
@@ -127,7 +125,7 @@ function isPrivateIP(hostname: string): boolean {
|
|
|
127
125
|
return /^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|127\.|169\.254\.)/.test(hostname);
|
|
128
126
|
}
|
|
129
127
|
if (isPrivateIP(new URL(url).hostname)) {
|
|
130
|
-
throw new Error(
|
|
128
|
+
throw new Error('Private network access forbidden');
|
|
131
129
|
}
|
|
132
130
|
```
|
|
133
131
|
|
|
@@ -137,15 +135,15 @@ if (isPrivateIP(new URL(url).hostname)) {
|
|
|
137
135
|
|
|
138
136
|
```typescript
|
|
139
137
|
// ❌ IDOR: User can access any resource by changing the ID parameter
|
|
140
|
-
app.get(
|
|
138
|
+
app.get('/user/:id/documents', async (req, res) => {
|
|
141
139
|
const docs = await db.documents.findMany({ where: { userId: req.params.id } });
|
|
142
140
|
return res.json(docs); // Missing: does req.session.userId === req.params.id?
|
|
143
141
|
});
|
|
144
142
|
|
|
145
143
|
// ✅ SAFE: Scoped to authenticated user's own data
|
|
146
|
-
app.get(
|
|
147
|
-
if (req.session.userId !== req.params.id && req.session.role !==
|
|
148
|
-
return res.status(403).json({ error:
|
|
144
|
+
app.get('/user/:id/documents', requireAuth, async (req, res) => {
|
|
145
|
+
if (req.session.userId !== req.params.id && req.session.role !== 'admin') {
|
|
146
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
149
147
|
}
|
|
150
148
|
const docs = await db.documents.findMany({ where: { userId: req.params.id } });
|
|
151
149
|
return res.json(docs);
|
|
@@ -158,7 +156,7 @@ app.get("/user/:id/documents", requireAuth, async (req, res) => {
|
|
|
158
156
|
|
|
159
157
|
```typescript
|
|
160
158
|
// ❌ CORS wildcard in production — any origin can call your API
|
|
161
|
-
app.use(cors({ origin:
|
|
159
|
+
app.use(cors({ origin: '*' }));
|
|
162
160
|
|
|
163
161
|
// ❌ Verbose error exposing internals
|
|
164
162
|
app.use((err, req, res, next) => {
|
|
@@ -166,7 +164,7 @@ app.use((err, req, res, next) => {
|
|
|
166
164
|
});
|
|
167
165
|
|
|
168
166
|
// ✅ Restrictive CORS
|
|
169
|
-
const allowedOrigins = (process.env.ALLOWED_ORIGINS ??
|
|
167
|
+
const allowedOrigins = (process.env.ALLOWED_ORIGINS ?? '').split(',');
|
|
170
168
|
app.use(
|
|
171
169
|
cors({
|
|
172
170
|
origin: (origin, cb) => {
|
|
@@ -178,8 +176,8 @@ app.use(
|
|
|
178
176
|
|
|
179
177
|
// ✅ Safe error response — log internally, generic to client
|
|
180
178
|
app.use((err: Error, req, res, next) => {
|
|
181
|
-
logger.error({ err, path: req.path },
|
|
182
|
-
res.status(500).json({ error:
|
|
179
|
+
logger.error({ err, path: req.path }, 'Unhandled error');
|
|
180
|
+
res.status(500).json({ error: 'Internal server error', code: 'INTERNAL_ERROR' });
|
|
183
181
|
});
|
|
184
182
|
```
|
|
185
183
|
|
|
@@ -188,11 +186,13 @@ app.use((err: Error, req, res, next) => {
|
|
|
188
186
|
## 4. Prompt Injection Defense & LLM Call Security
|
|
189
187
|
|
|
190
188
|
### Prompt Injection Defenses
|
|
189
|
+
|
|
191
190
|
- Ensure user-provided input is never concatenated directly into top-level system prompts.
|
|
192
191
|
- Verify that user inputs are isolated in `<user_provided_context>` or custom XML tags, and system prompts explicitly instruct the model to ignore instructions within those tags.
|
|
193
192
|
- Verify that HTML/XML tags are stripped or sanitized from user input before sending to LLM APIs.
|
|
194
193
|
|
|
195
194
|
### LLM Call Audit Checklist
|
|
195
|
+
|
|
196
196
|
- Flag any hardcoded API keys. They must be loaded from environment variables.
|
|
197
197
|
- Verify model strings against official current lists (no invented names like `claude-4-opus` or `gpt-5`).
|
|
198
198
|
- Ensure all LLM API calls are asynchronous and properly awaited.
|