audit-tech-stack — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-tech-stack (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Audit the codebase against best practices for the detected tech stack. Adapts checks based on what's actually in use.
$ARGUMENTS — optional:/audit:tech-stack src/components/)--fix — auto-fix issues after audit--report — save report to _local/reports/tech-stack-audit-<YYYY-MM-DD>.mdRead project config files to identify what's in use. This determines which checks to run.
| Check | How | Records |
|---|---|---|
| Framework | package.json deps: next, react, vue, @angular/core, svelte. requirements.txt: django, flask. go.mod, Cargo.toml. | Framework + version |
| TypeScript | tsconfig.json exists? Check strict flag value. | TS enabled, strict mode on/off |
| CSS framework | package.json deps: tailwindcss. Glob for *.module.css (CSS modules). styled-components in deps. | CSS approach |
| CSS tokens | If Tailwind: read tailwind.config.* or globals.css for @theme block. Extract available design tokens/custom properties. If no Tailwind: check globals.css for CSS custom properties (--color-*, --font-*). | Token list |
| Linting | package.json deps: eslint, biome, prettier. Check for .eslintrc*, biome.json. | Linter names |
| Testing | package.json deps/devDeps: vitest, jest, mocha, playwright, cypress. | Test framework |
| Build commands | package.json scripts: build, lint, test, typecheck. | Exact commands |
Stack-dependent checks: Only run checks relevant to the detected stack. If no TypeScript, skip TypeScript checks. If no Tailwind, skip Tailwind vs inline styles. If no Next.js, skip Next.js best practices.
Print detected stack summary before starting checks:
Stack: Next.js 14 + TypeScript (strict) + Tailwind 4
Linting: ESLint + Prettier
Testing: vitest
Scope: [full project or specified path]Skip if: no CSS framework detected (pure inline styling is the approach — nothing to compare against).
For each component file in scope:
How to count:
style={{ or style={ in JSX/TSX files. Count occurrences per file.className= in the same files. Count occurrences per file.Findings:
Skip if: no design tokens detected (no CSS custom properties, no Tailwind theme config).
How to search:
#[0-9a-fA-F]{3,8} (exclude comments, SVG path data, and image data URIs)Findings:
Skip if: no TypeScript detected.
How to search:
\bany\b in .ts and .tsx files (use word boundary \b to avoid matching "company", "many", etc.). Exclude: node_modules/, type declaration files (*.d.ts), test files if they use any for mocking.: any, as any, <any> separately.@ts-ignore and @ts-expect-errortsconfig.json for strict: true. If not strict, flag as HIGH.Findings:
strict: false in tsconfigas any (type assertion bypass)@ts-expect-error with explanation comment (acceptable), HIGH without explanationSkip if: no linter detected.
How to search:
eslint-disable (all forms: eslint-disable-next-line, eslint-disable-line, /* eslint-disable */)no-img-element for dynamic image gallery, react-hooks/exhaustive-deps with documented reason) vs fixable (the underlying issue could be resolved)Findings:
For each component file in scope:
How to check:
"use client" is necessary. It's needed ONLY for: useState, useEffect, useRef, useContext, event handlers (onClick, onChange, etc.), useRouter (next/navigation), browser APIs. If none of these are used, "use client" is unnecessary.Findings:
"use client"Run only checks relevant to the detected framework.
Next.js checks:
<img (HTML img) vs next/image imports. Flag <img usage (should use next/image for optimization). Exception: SVGs and tiny icons.metadata objects (App Router) or use <Head> (Pages Router)dynamic() importnext/font usage vs external font loadingReact (non-Next) checks:
React.lazy() usage on route-level componentsVue checks:
defineProps type safety<script setup> usage (preferred over options API)No framework checks available for the detected stack: Skip this section and note "No framework-specific checks available for [stack]."
Skip if: no CSS files detected (pure Tailwind or CSS-in-JS).
How to check:
Findings:
Skip if: project has fewer than 5 component files (too small for reuse analysis).
How to check:
NOTE: Do NOT look for specific component names like "ImageLightbox" or "ZoomHint" — these are project-specific. Instead, look for PATTERNS that are duplicated and SHOULD be shared components, whatever they may be.
Findings:
Each check scores 0-10 based on the ratio of findings to total items checked:
| Score | Meaning |
|---|---|
| 10 | No findings |
| 8-9 | Only LOW findings |
| 6-7 | Some MEDIUM findings, no HIGH |
| 4-5 | HIGH findings present |
| 2-3 | Multiple HIGH findings |
| 0-1 | Pervasive issues across the codebase |
Overall grade = average of all applicable check scores (skip checks that were N/A):
## Tech Stack Audit — [Project Name]
### Stack: [detected] | Date: [YYYY-MM-DD] | Scope: [path]
| # | Check | Score | Status | Key Issues |
|---|-------|-------|--------|------------|
| 1 | CSS Framework vs Inline | 7/10 | MEDIUM | 4 files with >80% inline |
| 2 | Design Tokens | N/A | — | No tokens configured |
| 3 | TypeScript | 8/10 | LOW | 3 `as any` casts |
| 4 | Lint Compliance | 9/10 | LOW | 2 justified disables |
| 5 | Component Architecture | 5/10 | HIGH | 2 files >300 lines |
| 6 | Framework Best Practices | 8/10 | LOW | 5 `<img>` should use next/image |
| 7 | CSS Architecture | N/A | — | Pure Tailwind, no CSS files |
| 8 | Shared Patterns | 7/10 | MEDIUM | 3 duplicated patterns |
| **Overall** | **7.3/10** | **C** | |
### Priority Actions
1. [HIGH] Split large components: ComponentA.tsx (450 lines), ComponentB.tsx (380 lines)
2. [HIGH] Enable TypeScript strict mode
3. [MEDIUM] Replace hardcoded #0F2847 with var(--color-navy-dark) in 6 files
...Print to conversation: Scorecard table + priority actions. Save to file if --report is set, using report location logic (same as other audit skills).
If --fix is passed, apply fixes in this order:
<img> -> framework image component, add metadata, etc.)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.