shimwrappercheck 0.3.0 → 0.4.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/README.md +198 -192
- package/dashboard/README.md +13 -0
- package/dashboard/app/{agents → [locale]/agents}/page.tsx +11 -14
- package/dashboard/app/{config → [locale]/config}/page.tsx +11 -13
- package/dashboard/app/[locale]/error.tsx +25 -0
- package/dashboard/app/[locale]/layout.tsx +42 -0
- package/dashboard/app/[locale]/not-found.tsx +27 -0
- package/dashboard/app/[locale]/page.tsx +53 -0
- package/dashboard/app/[locale]/settings/page.tsx +741 -0
- package/dashboard/app/api/agents-md/route.ts +2 -8
- package/dashboard/app/api/check-tools/route.ts +134 -0
- package/dashboard/app/api/config/route.ts +2 -8
- package/dashboard/app/api/info/route.ts +26 -0
- package/dashboard/app/api/run-checks/route.ts +9 -2
- package/dashboard/app/api/settings/route.ts +74 -16
- package/dashboard/app/api/status/route.ts +3 -5
- package/dashboard/app/api/ui-config/route.ts +62 -0
- package/dashboard/app/global-error.tsx +31 -0
- package/dashboard/app/globals.css +26 -0
- package/dashboard/app/layout.tsx +2 -12
- package/dashboard/app/not-found.tsx +22 -0
- package/dashboard/components/AvailableChecks.tsx +260 -0
- package/dashboard/components/CheckCard.tsx +415 -65
- package/dashboard/components/CheckCardList.tsx +28 -23
- package/dashboard/components/Header.tsx +52 -16
- package/dashboard/components/Icons.tsx +20 -0
- package/dashboard/components/LayoutContent.tsx +24 -0
- package/dashboard/components/MyShimChecks.tsx +257 -0
- package/dashboard/components/Nav.tsx +9 -6
- package/dashboard/components/SetDocumentLang.tsx +18 -0
- package/dashboard/components/SidebarMyShim.tsx +108 -19
- package/dashboard/components/StatusCard.tsx +5 -12
- package/dashboard/components/TriggerCommandos.tsx +311 -42
- package/dashboard/lib/checks.ts +134 -17
- package/dashboard/lib/presets.ts +60 -28
- package/dashboard/lib/projectRoot.ts +22 -12
- package/dashboard/next-env.d.ts +2 -1
- package/dashboard/next.config.js +10 -1
- package/dashboard/package.json +11 -6
- package/dashboard/scripts/find-port-and-dev.js +48 -15
- package/dashboard/tailwind.config.js +1 -4
- package/dashboard/tsconfig.json +9 -2
- package/package.json +4 -6
- package/scripts/run-checks.sh +77 -24
- package/scripts/supabase-checked.sh +23 -7
- package/scripts/update-readme.js +72 -0
- package/templates/run-checks.sh +80 -27
- package/dashboard/app/page.tsx +0 -151
- package/dashboard/app/settings/page.tsx +0 -467
package/templates/run-checks.sh
CHANGED
|
@@ -33,35 +33,88 @@ fi
|
|
|
33
33
|
# Opt-out via env: SKIP_AI_REVIEW=1 disables AI review
|
|
34
34
|
[[ -n "${SKIP_AI_REVIEW:-}" ]] && run_ai_review=false
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
36
|
+
# Granular toggles from .shimwrappercheckrc (SHIM_RUN_*=1|0). Default 1 when run_frontend/run_backend is true.
|
|
37
|
+
run_lint="${SHIM_RUN_LINT:-1}"
|
|
38
|
+
run_check_mock_data="${SHIM_RUN_CHECK_MOCK_DATA:-1}"
|
|
39
|
+
run_test_run="${SHIM_RUN_TEST_RUN:-1}"
|
|
40
|
+
run_npm_audit="${SHIM_RUN_NPM_AUDIT:-1}"
|
|
41
|
+
run_snyk="${SHIM_RUN_SNYK:-1}"
|
|
42
|
+
run_deno_fmt="${SHIM_RUN_DENO_FMT:-1}"
|
|
43
|
+
run_deno_lint="${SHIM_RUN_DENO_LINT:-1}"
|
|
44
|
+
run_deno_audit="${SHIM_RUN_DENO_AUDIT:-1}"
|
|
45
|
+
run_update_readme="${SHIM_RUN_UPDATE_README:-1}"
|
|
46
|
+
|
|
47
|
+
# Wenn SHIM_CHECK_ORDER gesetzt: Checks in dieser Reihenfolge ausführen (wie in My Checks).
|
|
48
|
+
run_one() {
|
|
49
|
+
local id="$1"
|
|
50
|
+
case "$id" in
|
|
51
|
+
lint) [[ "$run_lint" = "1" ]] && { echo "Lint..."; npm run lint; } ;;
|
|
52
|
+
checkMockData) [[ "$run_check_mock_data" = "1" ]] && { echo "Check mock data..."; npm run check:mock-data; } ;;
|
|
53
|
+
testRun) [[ "$run_test_run" = "1" ]] && { echo "Test run..."; npm run build; npm run test:run; } ;;
|
|
54
|
+
npmAudit) [[ "$run_npm_audit" = "1" ]] && { echo "npm audit..."; npm audit --audit-level="${SHIM_AUDIT_LEVEL:-high}"; } ;;
|
|
55
|
+
snyk) if [[ "$run_snyk" = "1" ]] && [[ -z "${SKIP_SNYK:-}" ]]; then
|
|
56
|
+
if command -v snyk >/dev/null 2>&1; then echo "Snyk..."; snyk test;
|
|
57
|
+
elif npm exec --yes snyk -- --version >/dev/null 2>&1; then echo "Snyk..."; npx snyk test;
|
|
58
|
+
else echo "Skipping Snyk: not installed." >&2; fi
|
|
59
|
+
fi ;;
|
|
60
|
+
denoFmt) [[ "$run_deno_fmt" = "1" ]] && { echo "Deno fmt..."; deno fmt --check supabase/functions; } ;;
|
|
61
|
+
denoLint) [[ "$run_deno_lint" = "1" ]] && { echo "Deno lint..."; deno lint supabase/functions; } ;;
|
|
62
|
+
denoAudit) [[ "$run_deno_audit" = "1" ]] && { echo "Deno audit..."; (cd supabase/functions/server && deno audit); } ;;
|
|
63
|
+
aiReview) [[ "$run_ai_review" = true ]] && { echo "AI Review..."; bash "$ROOT_DIR/scripts/ai-code-review.sh"; } ;;
|
|
64
|
+
updateReadme) [[ "$run_update_readme" = "1" ]] && { echo "Update README...";
|
|
65
|
+
if [[ -f "$ROOT_DIR/node_modules/shimwrappercheck/scripts/update-readme.js" ]]; then node "$ROOT_DIR/node_modules/shimwrappercheck/scripts/update-readme.js";
|
|
66
|
+
elif [[ -f "$ROOT_DIR/scripts/update-readme.js" ]]; then node "$ROOT_DIR/scripts/update-readme.js";
|
|
67
|
+
else echo "Skipping Update README: no scripts/update-readme.js (use shimwrappercheck script or add own)." >&2; fi; } ;;
|
|
68
|
+
*) echo "Unknown check id: $id" >&2 ;;
|
|
69
|
+
esac
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if [[ -n "${SHIM_CHECK_ORDER:-}" ]]; then
|
|
73
|
+
echo "Running checks in My Checks order..."
|
|
74
|
+
for id in $(echo "$SHIM_CHECK_ORDER" | tr ',' ' '); do
|
|
75
|
+
run_one "$id"
|
|
76
|
+
done
|
|
77
|
+
else
|
|
78
|
+
if [[ "$run_frontend" = true ]]; then
|
|
79
|
+
echo "Running frontend checks..."
|
|
80
|
+
if [[ "$run_update_readme" = "1" ]]; then
|
|
81
|
+
echo "Update README..."
|
|
82
|
+
if [[ -f "$ROOT_DIR/node_modules/shimwrappercheck/scripts/update-readme.js" ]]; then node "$ROOT_DIR/node_modules/shimwrappercheck/scripts/update-readme.js";
|
|
83
|
+
elif [[ -f "$ROOT_DIR/scripts/update-readme.js" ]]; then node "$ROOT_DIR/scripts/update-readme.js";
|
|
84
|
+
else echo "Skipping Update README: no scripts/update-readme.js (use shimwrappercheck script or add own)." >&2; fi
|
|
85
|
+
fi
|
|
86
|
+
[[ "$run_lint" = "1" ]] && { echo "Lint..."; npm run lint; }
|
|
87
|
+
[[ "$run_check_mock_data" = "1" ]] && { echo "Check mock data..."; npm run check:mock-data; }
|
|
88
|
+
npm run build
|
|
89
|
+
[[ "$run_test_run" = "1" ]] && { echo "Test run..."; npm run test:run; }
|
|
90
|
+
if [[ "$run_npm_audit" = "1" ]]; then
|
|
91
|
+
echo "Running frontend security (npm audit)..."
|
|
92
|
+
npm audit --audit-level="${SHIM_AUDIT_LEVEL:-high}"
|
|
93
|
+
fi
|
|
94
|
+
if [[ "$run_snyk" = "1" ]] && [[ -z "${SKIP_SNYK:-}" ]]; then
|
|
95
|
+
if command -v snyk >/dev/null 2>&1; then
|
|
96
|
+
echo "Running Snyk (dependency scan)..."
|
|
97
|
+
snyk test
|
|
98
|
+
elif npm exec --yes snyk -- --version >/dev/null 2>&1; then
|
|
99
|
+
echo "Running Snyk (dependency scan)..."
|
|
100
|
+
npx snyk test
|
|
101
|
+
else
|
|
102
|
+
echo "Skipping Snyk: not installed (optional; set SKIP_SNYK=1 to suppress)." >&2
|
|
103
|
+
fi
|
|
53
104
|
fi
|
|
54
105
|
fi
|
|
55
|
-
fi
|
|
56
106
|
|
|
57
|
-
if [[ "$run_backend" = true ]]; then
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
107
|
+
if [[ "$run_backend" = true ]]; then
|
|
108
|
+
echo "Running Supabase edge function checks..."
|
|
109
|
+
[[ "$run_deno_fmt" = "1" ]] && { echo "Deno fmt..."; deno fmt --check supabase/functions; }
|
|
110
|
+
[[ "$run_deno_lint" = "1" ]] && { echo "Deno lint..."; deno lint supabase/functions; }
|
|
111
|
+
if [[ "$run_deno_audit" = "1" ]]; then
|
|
112
|
+
echo "Running backend security (deno audit)..."
|
|
113
|
+
(cd supabase/functions/server && deno audit)
|
|
114
|
+
fi
|
|
115
|
+
fi
|
|
64
116
|
|
|
65
|
-
if [[ "$run_ai_review" = true ]] && { [[ "$run_frontend" = true ]] || [[ "$run_backend" = true ]]; }; then
|
|
66
|
-
|
|
117
|
+
if [[ "$run_ai_review" = true ]] && { [[ "$run_frontend" = true ]] || [[ "$run_backend" = true ]]; }; then
|
|
118
|
+
bash "$ROOT_DIR/scripts/ai-code-review.sh"
|
|
119
|
+
fi
|
|
67
120
|
fi
|
package/dashboard/app/page.tsx
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dashboard home: status, quick actions (run checks), links to Config and AGENTS.md.
|
|
3
|
-
* Location: app/page.tsx
|
|
4
|
-
*/
|
|
5
|
-
"use client";
|
|
6
|
-
|
|
7
|
-
import { useEffect, useState } from "react";
|
|
8
|
-
import Link from "next/link";
|
|
9
|
-
import StatusCard from "@/components/StatusCard";
|
|
10
|
-
|
|
11
|
-
type Status = {
|
|
12
|
-
projectRoot?: string;
|
|
13
|
-
config?: boolean;
|
|
14
|
-
presetsFile?: boolean;
|
|
15
|
-
agentsMd?: boolean;
|
|
16
|
-
runChecksScript?: boolean;
|
|
17
|
-
shimRunner?: boolean;
|
|
18
|
-
prePushHusky?: boolean;
|
|
19
|
-
prePushGit?: boolean;
|
|
20
|
-
supabase?: boolean;
|
|
21
|
-
lastError?: { check?: string; message?: string; suggestion?: string; timestamp?: string } | null;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export default function DashboardPage() {
|
|
25
|
-
const [status, setStatus] = useState<Status | null>(null);
|
|
26
|
-
const [loading, setLoading] = useState(true);
|
|
27
|
-
const [runResult, setRunResult] = useState<{ stdout: string; stderr: string; code: number } | null>(null);
|
|
28
|
-
const [running, setRunning] = useState(false);
|
|
29
|
-
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
fetch("/api/status")
|
|
32
|
-
.then((r) => r.json())
|
|
33
|
-
.then((data) => {
|
|
34
|
-
setStatus(data);
|
|
35
|
-
setLoading(false);
|
|
36
|
-
})
|
|
37
|
-
.catch(() => setLoading(false));
|
|
38
|
-
}, []);
|
|
39
|
-
|
|
40
|
-
const runChecks = () => {
|
|
41
|
-
setRunning(true);
|
|
42
|
-
setRunResult(null);
|
|
43
|
-
fetch("/api/run-checks", { method: "POST" })
|
|
44
|
-
.then((r) => r.json())
|
|
45
|
-
.then((data) => {
|
|
46
|
-
setRunResult({ stdout: data.stdout ?? "", stderr: data.stderr ?? "", code: data.code ?? 1 });
|
|
47
|
-
setRunning(false);
|
|
48
|
-
})
|
|
49
|
-
.catch(() => {
|
|
50
|
-
setRunResult({ stdout: "", stderr: "Request failed", code: 1 });
|
|
51
|
-
setRunning(false);
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
if (loading || !status) {
|
|
56
|
-
return (
|
|
57
|
-
<div className="flex justify-center py-12">
|
|
58
|
-
<span className="loading loading-spinner loading-lg" />
|
|
59
|
-
</div>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return (
|
|
64
|
-
<div className="space-y-8 text-white">
|
|
65
|
-
<div className="flex items-center justify-between gap-4 flex-wrap">
|
|
66
|
-
<h1 className="text-2xl font-bold">Available Checks</h1>
|
|
67
|
-
<div className="relative">
|
|
68
|
-
<input
|
|
69
|
-
type="text"
|
|
70
|
-
placeholder="Suchen..."
|
|
71
|
-
className="input input-bordered input-sm bg-neutral-800 border-neutral-600 text-white w-56 pl-8"
|
|
72
|
-
/>
|
|
73
|
-
<svg
|
|
74
|
-
className="absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-neutral-500 pointer-events-none"
|
|
75
|
-
fill="none"
|
|
76
|
-
stroke="currentColor"
|
|
77
|
-
viewBox="0 0 24 24"
|
|
78
|
-
>
|
|
79
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
80
|
-
</svg>
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
<div className="border border-neutral-600 rounded-lg bg-neutral-800/40 min-h-[320px] p-4">
|
|
84
|
-
{/* Platz für verfügbare Checks / Detail-Ansicht */}
|
|
85
|
-
</div>
|
|
86
|
-
|
|
87
|
-
<div>
|
|
88
|
-
<h2 className="text-xl font-semibold mb-4">Status</h2>
|
|
89
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
90
|
-
<StatusCard label=".shimwrappercheckrc" ok={!!status.config} />
|
|
91
|
-
<StatusCard label="Presets (.shimwrappercheck-presets.json)" ok={!!status.presetsFile} detail="Presets & Check-Toggles (Einstellungen)" />
|
|
92
|
-
<StatusCard label="AGENTS.md" ok={!!status.agentsMd} detail="Agent-Anweisungen (über GUI bearbeitbar)" />
|
|
93
|
-
<StatusCard label="scripts/run-checks.sh" ok={!!status.runChecksScript} />
|
|
94
|
-
<StatusCard label="Shim Runner" ok={!!status.shimRunner} detail="Node orchestrator (npx shimwrappercheck run)" />
|
|
95
|
-
<StatusCard label="Husky pre-push" ok={!!status.prePushHusky} />
|
|
96
|
-
<StatusCard label="Git pre-push Hook" ok={!!status.prePushGit} />
|
|
97
|
-
<StatusCard label="Supabase" ok={!!status.supabase} />
|
|
98
|
-
</div>
|
|
99
|
-
{status.projectRoot && (
|
|
100
|
-
<p className="mt-2 text-sm text-neutral-400">Projekt-Root: {status.projectRoot}</p>
|
|
101
|
-
)}
|
|
102
|
-
{status.lastError && (
|
|
103
|
-
<div className="mt-4 alert alert-warning shadow-lg">
|
|
104
|
-
<div>
|
|
105
|
-
<h3 className="font-bold">Letzter Check-Fehler (.shim/last_error.json)</h3>
|
|
106
|
-
<p className="text-sm">{status.lastError.check}: {status.lastError.message}</p>
|
|
107
|
-
{status.lastError.suggestion && <p className="text-sm opacity-90">Vorschlag: {status.lastError.suggestion}</p>}
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
110
|
-
)}
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
<div>
|
|
114
|
-
<h2 className="text-xl font-semibold mb-4">Aktionen</h2>
|
|
115
|
-
<div className="flex flex-wrap gap-4">
|
|
116
|
-
<button
|
|
117
|
-
type="button"
|
|
118
|
-
className="btn btn-primary bg-primary text-primary-content"
|
|
119
|
-
onClick={runChecks}
|
|
120
|
-
disabled={running || (!status.runChecksScript && !status.shimRunner)}
|
|
121
|
-
>
|
|
122
|
-
{running ? "Läuft…" : "Nur Checks ausführen"}
|
|
123
|
-
</button>
|
|
124
|
-
<Link href="/settings" className="btn btn-outline border-neutral-600 text-neutral-300">
|
|
125
|
-
Einstellungen (Presets & Checks)
|
|
126
|
-
</Link>
|
|
127
|
-
<Link href="/config" className="btn btn-outline border-neutral-600 text-neutral-300">
|
|
128
|
-
Config (Raw)
|
|
129
|
-
</Link>
|
|
130
|
-
<Link href="/agents" className="btn btn-outline border-neutral-600 text-neutral-300">
|
|
131
|
-
AGENTS.md bearbeiten
|
|
132
|
-
</Link>
|
|
133
|
-
</div>
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
{runResult && (
|
|
137
|
-
<div className="card bg-neutral-800 border border-neutral-600 shadow-md">
|
|
138
|
-
<div className="card-body">
|
|
139
|
-
<h3 className="card-title text-white">
|
|
140
|
-
Letzte Check-Ausgabe {runResult.code === 0 ? "(OK)" : "(Fehler)"}
|
|
141
|
-
</h3>
|
|
142
|
-
<pre className="bg-neutral-900 p-4 rounded-lg text-sm overflow-auto max-h-64 whitespace-pre-wrap text-neutral-300">
|
|
143
|
-
{runResult.stdout || "(keine Ausgabe)"}
|
|
144
|
-
{runResult.stderr ? `\n${runResult.stderr}` : ""}
|
|
145
|
-
</pre>
|
|
146
|
-
</div>
|
|
147
|
-
</div>
|
|
148
|
-
)}
|
|
149
|
-
</div>
|
|
150
|
-
);
|
|
151
|
-
}
|