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.
Files changed (49) hide show
  1. package/README.md +198 -192
  2. package/dashboard/README.md +13 -0
  3. package/dashboard/app/{agents → [locale]/agents}/page.tsx +11 -14
  4. package/dashboard/app/{config → [locale]/config}/page.tsx +11 -13
  5. package/dashboard/app/[locale]/error.tsx +25 -0
  6. package/dashboard/app/[locale]/layout.tsx +42 -0
  7. package/dashboard/app/[locale]/not-found.tsx +27 -0
  8. package/dashboard/app/[locale]/page.tsx +53 -0
  9. package/dashboard/app/[locale]/settings/page.tsx +741 -0
  10. package/dashboard/app/api/agents-md/route.ts +2 -8
  11. package/dashboard/app/api/check-tools/route.ts +134 -0
  12. package/dashboard/app/api/config/route.ts +2 -8
  13. package/dashboard/app/api/info/route.ts +26 -0
  14. package/dashboard/app/api/run-checks/route.ts +9 -2
  15. package/dashboard/app/api/settings/route.ts +74 -16
  16. package/dashboard/app/api/status/route.ts +3 -5
  17. package/dashboard/app/api/ui-config/route.ts +62 -0
  18. package/dashboard/app/global-error.tsx +31 -0
  19. package/dashboard/app/globals.css +26 -0
  20. package/dashboard/app/layout.tsx +2 -12
  21. package/dashboard/app/not-found.tsx +22 -0
  22. package/dashboard/components/AvailableChecks.tsx +260 -0
  23. package/dashboard/components/CheckCard.tsx +415 -65
  24. package/dashboard/components/CheckCardList.tsx +28 -23
  25. package/dashboard/components/Header.tsx +52 -16
  26. package/dashboard/components/Icons.tsx +20 -0
  27. package/dashboard/components/LayoutContent.tsx +24 -0
  28. package/dashboard/components/MyShimChecks.tsx +257 -0
  29. package/dashboard/components/Nav.tsx +9 -6
  30. package/dashboard/components/SetDocumentLang.tsx +18 -0
  31. package/dashboard/components/SidebarMyShim.tsx +108 -19
  32. package/dashboard/components/StatusCard.tsx +5 -12
  33. package/dashboard/components/TriggerCommandos.tsx +311 -42
  34. package/dashboard/lib/checks.ts +134 -17
  35. package/dashboard/lib/presets.ts +60 -28
  36. package/dashboard/lib/projectRoot.ts +22 -12
  37. package/dashboard/next-env.d.ts +2 -1
  38. package/dashboard/next.config.js +10 -1
  39. package/dashboard/package.json +11 -6
  40. package/dashboard/scripts/find-port-and-dev.js +48 -15
  41. package/dashboard/tailwind.config.js +1 -4
  42. package/dashboard/tsconfig.json +9 -2
  43. package/package.json +4 -6
  44. package/scripts/run-checks.sh +77 -24
  45. package/scripts/supabase-checked.sh +23 -7
  46. package/scripts/update-readme.js +72 -0
  47. package/templates/run-checks.sh +80 -27
  48. package/dashboard/app/page.tsx +0 -151
  49. package/dashboard/app/settings/page.tsx +0 -467
@@ -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
- if [[ "$run_frontend" = true ]]; then
37
- echo "Running frontend checks..."
38
- npm run lint
39
- npm run check:mock-data
40
- npm run build
41
- npm run test:run
42
- echo "Running frontend security (npm audit)..."
43
- npm audit --audit-level=high
44
- if [[ -z "${SKIP_SNYK:-}" ]]; then
45
- if command -v snyk >/dev/null 2>&1; then
46
- echo "Running Snyk (dependency scan)..."
47
- snyk test
48
- elif npm exec --yes snyk -- --version >/dev/null 2>&1; then
49
- echo "Running Snyk (dependency scan)..."
50
- npx snyk test
51
- else
52
- echo "Skipping Snyk: not installed (optional; set SKIP_SNYK=1 to suppress)." >&2
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
- echo "Running Supabase edge function checks..."
59
- deno fmt --check supabase/functions
60
- deno lint supabase/functions
61
- echo "Running backend security (deno audit)..."
62
- (cd supabase/functions/server && deno audit)
63
- fi
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
- bash "$ROOT_DIR/scripts/ai-code-review.sh"
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
@@ -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
- }