@mneme-ai/xray 2.153.0 → 2.154.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.
@@ -0,0 +1,3 @@
1
+ import type { SecurityBlock } from "../types.js";
2
+ export declare function analyzeSecurity(repoPath: string, maxFiles?: number): SecurityBlock;
3
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/battery/security.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiCjD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,aAAa,CAiChF"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * SECURITY signal — bring Mneme's CERBERUS command-gate + FIREWALL injection
3
+ * detector to bear on a REPO (not just runtime). Answers a question no
4
+ * dependency/secret scanner does: "does this repo's build/CI/scripts run
5
+ * DANGEROUS commands, and is there prompt-injection hidden in its docs?"
6
+ *
7
+ * • CERBERUS (hephaestus.classifyCommandRisk): extract the executable surface
8
+ * — package.json scripts, CI `run:` steps, Dockerfile RUN, *.sh — and
9
+ * classify each command read/write/DESTRUCTIVE (curl|bash, rm -rf, etc.).
10
+ * • FIREWALL (firewall.scanInjection): scan docs/markdown for indirect
11
+ * prompt-injection payloads (a real AI-supply-chain risk).
12
+ *
13
+ * Deterministic, no LLM. (The Agent GOVERNOR governs an agent's actions at
14
+ * RUNTIME — it isn't a static-repo signal, so it is intentionally not forced here.)
15
+ */
16
+ import { hephaestus, firewall } from "@mneme-ai/core";
17
+ import { listTextFiles, readText } from "../util.js";
18
+ import { join } from "node:path";
19
+ function extractCommands(repoPath) {
20
+ const out = [];
21
+ const pj = readText(join(repoPath, "package.json"));
22
+ if (pj) {
23
+ try {
24
+ const scripts = JSON.parse(pj).scripts ?? {};
25
+ for (const [k, v] of Object.entries(scripts))
26
+ out.push({ cmd: String(v), where: `package.json → scripts.${k}` });
27
+ }
28
+ catch { /* ignore */ }
29
+ }
30
+ const { files } = listTextFiles(repoPath, 2000);
31
+ for (const f of files) {
32
+ if (out.length >= 800)
33
+ break;
34
+ const isSh = /\.(sh|bash|zsh)$/i.test(f.rel);
35
+ const isCI = /(^|\/)\.github\/workflows\/.+\.ya?ml$/i.test(f.rel) || /(^|\/)\.gitlab-ci\.yml$/i.test(f.rel);
36
+ const isDocker = /(^|\/)dockerfile/i.test(f.rel);
37
+ if (!isSh && !isCI && !isDocker)
38
+ continue;
39
+ const t = readText(f.abs);
40
+ if (!t)
41
+ continue;
42
+ for (const raw of t.split("\n")) {
43
+ const ln = raw.trim();
44
+ if (!ln || ln.startsWith("#"))
45
+ continue;
46
+ let cmd = "";
47
+ if (isSh)
48
+ cmd = ln;
49
+ else if (isDocker) {
50
+ const m = ln.match(/^RUN\s+(.+)/i);
51
+ if (m)
52
+ cmd = m[1];
53
+ }
54
+ else if (isCI) {
55
+ const m = ln.match(/^-?\s*run:\s*(.+)/) || ln.match(/^\s+(.+\|\s*(?:ba)?sh.*)$/);
56
+ if (m)
57
+ cmd = m[1].replace(/^["']|["']$/g, "");
58
+ }
59
+ if (cmd && cmd.length <= 2000) {
60
+ out.push({ cmd, where: f.rel });
61
+ if (out.length >= 800)
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ export function analyzeSecurity(repoPath, maxFiles = 2000) {
69
+ const cmds = extractCommands(repoPath);
70
+ const destructive = [];
71
+ let writeCount = 0;
72
+ for (const { cmd, where } of cmds) {
73
+ let r;
74
+ try {
75
+ r = hephaestus.classifyCommandRisk(cmd);
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ if (r.risk === "destructive") {
81
+ if (destructive.length < 30)
82
+ destructive.push({ command: cmd.slice(0, 160), where, signals: (r.signals || []).slice(0, 3) });
83
+ }
84
+ else if (r.risk === "write")
85
+ writeCount++;
86
+ }
87
+ // prompt-injection in docs (the indirect-injection vector)
88
+ let injectionFindings = 0;
89
+ const injectionWhere = [];
90
+ const { files } = listTextFiles(repoPath, maxFiles);
91
+ let scanned = 0;
92
+ for (const f of files) {
93
+ if (scanned >= 300)
94
+ break;
95
+ if (!/\.(md|mdx|txt|rst|adoc)$/i.test(f.rel) && !/readme/i.test(f.rel))
96
+ continue;
97
+ const t = readText(f.abs);
98
+ if (!t)
99
+ continue;
100
+ scanned++;
101
+ let fr;
102
+ try {
103
+ fr = firewall.scanInjection(t);
104
+ }
105
+ catch {
106
+ continue;
107
+ }
108
+ if (fr.verdict !== "clean") {
109
+ injectionFindings += fr.findings.length;
110
+ if (injectionWhere.length < 10)
111
+ injectionWhere.push(f.rel);
112
+ }
113
+ }
114
+ const note = destructive.length
115
+ ? `${destructive.length} destructive command(s) in build/CI/scripts — review before trusting this repo's automation.`
116
+ : injectionFindings
117
+ ? `${injectionFindings} possible prompt-injection payload(s) in docs.`
118
+ : `No destructive build commands or doc prompt-injection detected (${cmds.length} commands checked).`;
119
+ return { commandsScanned: cmds.length, writeCount, destructive, injectionFindings, injectionWhere, note };
120
+ }
121
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/battery/security.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUlE,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAkDvE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWlE,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAmDvE"}
package/dist/engine.js CHANGED
@@ -13,6 +13,7 @@ import { analyzeAge } from "./battery/age.js";
13
13
  import { analyzeComplexity } from "./battery/complexity.js";
14
14
  import { analyzeHotspots } from "./battery/hotspots.js";
15
15
  import { analyzeCoupling } from "./battery/coupling.js";
16
+ import { analyzeSecurity } from "./battery/security.js";
16
17
  import { shallowClone } from "./clone.js";
17
18
  import { headCommit, repoNameFromUrl, repoNameFromPath } from "./util.js";
18
19
  export async function buildXRay(opts) {
@@ -45,8 +46,9 @@ export async function buildXRay(opts) {
45
46
  const complexity = analyzeComplexity(repoPath, maxFiles);
46
47
  const hotspots = analyzeHotspots(repoPath, now);
47
48
  const coupling = analyzeCoupling(repoPath, now);
48
- const summary = grade({ deps, secrets, busFactor, age, complexity, hotspots, coupling });
49
- const blocks = { deps, secrets, busFactor, age, complexity, hotspots, coupling };
49
+ const security = analyzeSecurity(repoPath, maxFiles);
50
+ const summary = grade({ deps, secrets, busFactor, age, complexity, hotspots, coupling, security });
51
+ const blocks = { deps, secrets, busFactor, age, complexity, hotspots, coupling, security };
50
52
  const fingerprint = createHash("sha256")
51
53
  .update(JSON.stringify({ subject: { repoName: subject.repoName, commitHash: subject.commitHash }, blocks }))
52
54
  .digest("hex");
@@ -98,13 +100,14 @@ function grade(b) {
98
100
  if (copyleft > 0)
99
101
  bullets.push(`⚖️ ${copyleft} copyleft-licensed dep(s)${b.deps.licenseFlags[0] ? ` (e.g. ${b.deps.licenseFlags[0].name}: ${b.deps.licenseFlags[0].license})` : ""} — review for commercial use.`);
100
102
  }
101
- // bus factor
103
+ // bus factor — real key-person risk, but inherent to solo projects, so it's a
104
+ // notch, not a fail.
102
105
  if (b.busFactor.authors > 0) {
103
106
  signalsRun++;
104
107
  if (b.busFactor.busFactor <= 1)
105
- score -= 15;
106
- if (b.busFactor.singleOwnerFilePct >= 50)
107
108
  score -= 10;
109
+ if (b.busFactor.singleOwnerFilePct >= 60)
110
+ score -= 6;
108
111
  bullets.push(b.busFactor.busFactor <= 1
109
112
  ? `🚌 Bus factor 1 — one person holds ${b.busFactor.topContributorShare}% of commits.`
110
113
  : `🚌 Bus factor ${b.busFactor.busFactor}; ${b.busFactor.singleOwnerFilePct}% of files single-owner.`);
@@ -124,7 +127,7 @@ function grade(b) {
124
127
  if (b.complexity.filesAnalysed > 0) {
125
128
  signalsRun++;
126
129
  const huge = b.complexity.hotspots.filter((h) => h.bodyLines >= 150).length;
127
- score -= Math.min(10, huge * 2);
130
+ score -= Math.min(8, huge * 2);
128
131
  bullets.push(b.complexity.hotspots[0]
129
132
  ? `🧩 Largest symbol ${b.complexity.hotspots[0].bodyLines} lines (${b.complexity.hotspots[0].file}).`
130
133
  : `🧩 ${b.complexity.totalSymbols} symbols analysed.`);
@@ -141,6 +144,20 @@ function grade(b) {
141
144
  const c = b.coupling.pairs[0];
142
145
  bullets.push(`🔗 ${c.a} ⇄ ${c.b} change together ${Math.round(c.confidence * 100)}%${c.hidden ? " (hidden cross-dir coupling)" : ""}.`);
143
146
  }
147
+ // security — CERBERUS command-risk + FIREWALL injection on the repo
148
+ if (b.security.commandsScanned > 0 || b.security.injectionFindings > 0) {
149
+ signalsRun++;
150
+ // a "review" signal — destructive commands in CI are often intentional
151
+ // cleanup; we flag, but don't auto-fail the repo on them.
152
+ score -= Math.min(8, b.security.destructive.length * 2);
153
+ score -= Math.min(10, b.security.injectionFindings * 5); // injection is a stronger signal
154
+ if (b.security.destructive.length)
155
+ bullets.push(`🛡 ${b.security.destructive.length} destructive build/CI command(s) — e.g. ${b.security.destructive[0].where}.`);
156
+ else if (b.security.injectionFindings)
157
+ bullets.push(`🛡 ${b.security.injectionFindings} possible prompt-injection in docs.`);
158
+ else
159
+ bullets.push(`🛡 ${b.security.commandsScanned} build/CI commands checked — no destructive ones.`);
160
+ }
144
161
  score = Math.max(0, Math.min(100, Math.round(score)));
145
162
  const g = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 55 ? "D" : "F";
146
163
  const headline = g === "A" ? "Healthy — strong signals across the board."
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gauntlet.d.ts","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD,wBAAgB,YAAY,IAAI,YAAY,CAyB3C"}
1
+ {"version":3,"file":"gauntlet.d.ts","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAoBD,wBAAgB,YAAY,IAAI,YAAY,CAyB3C"}
package/dist/gauntlet.js CHANGED
@@ -18,6 +18,7 @@ function cleanFixture() {
18
18
  complexity: { filesAnalysed: 40, totalSymbols: 320, hotspots: [{ file: "src/core.ts", symbol: "function handleRequest(req, res)", bodyLines: 180, startLine: 12 }], maxDepth: 4, note: "hotspot" },
19
19
  hotspots: { windowDays: 365, filesConsidered: 40, hotspots: [{ file: "src/core.ts", changes: 30, loc: 400, score: 12000, expert: "alice@acme.dev", authors: 3 }], trend: [2, 4, 6, 3, 8, 5, 7, 9], note: "Hotspot: src/core.ts — changed 30× and 400 lines." },
20
20
  coupling: { windowDays: 365, pairs: [{ a: "src/core.ts", b: "src/api/routes.ts", coChanges: 12, confidence: 0.8, hidden: true }], note: "src/core.ts ⇄ src/api/routes.ts change together 80%." },
21
+ security: { commandsScanned: 24, writeCount: 18, destructive: [{ command: "curl x | bash", where: ".github/workflows/ci.yml", signals: ["pipe-to-shell"] }], injectionFindings: 0, injectionWhere: [], note: "1 destructive command in CI." },
21
22
  fingerprint: "deadbeef",
22
23
  };
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gauntlet.js","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gauntlet.js","sourceRoot":"","sources":["../src/gauntlet.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -135,6 +135,20 @@ export interface HotspotsBlock {
135
135
  trend: number[];
136
136
  note: string;
137
137
  }
138
+ /** Repo executable-surface security — CERBERUS command-risk + FIREWALL injection. */
139
+ export interface SecurityBlock {
140
+ commandsScanned: number;
141
+ writeCount: number;
142
+ /** destructive commands found in build/CI/scripts (curl|bash, rm -rf, …). */
143
+ destructive: Array<{
144
+ command: string;
145
+ where: string;
146
+ signals: string[];
147
+ }>;
148
+ injectionFindings: number;
149
+ injectionWhere: string[];
150
+ note: string;
151
+ }
138
152
  export interface XRaySummary {
139
153
  headline: string;
140
154
  grade: Grade;
@@ -155,6 +169,7 @@ export interface XRayReport {
155
169
  complexity: ComplexityBlock;
156
170
  hotspots: HotspotsBlock;
157
171
  coupling: CouplingBlock;
172
+ security: SecurityBlock;
158
173
  /** sha256 over the canonicalised metric blocks — a tamper-evident content id. */
159
174
  fingerprint: string;
160
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/xray",
3
- "version": "2.153.0",
3
+ "version": "2.154.0",
4
4
  "description": "Mneme Repo X-Ray — a signed, raw-free, deterministic X-Ray of any repo. Every number is reproducible from git/AST/metadata and sealed with an offline-verifiable NOTARY receipt. No source code ever leaves the machine; no LLM guesses anything.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/public/card.js CHANGED
@@ -20,6 +20,7 @@
20
20
  Complexity: "The biggest, most tangled code.",
21
21
  Hotspots: "Where bugs hide — refactor these first.",
22
22
  Coupling: "Files that secretly change together.",
23
+ Security: "Dangerous commands in build/CI + doc prompt-injection.",
23
24
  };
24
25
  const kcell = (label) => `<div class="k">${label}${INFO[label] ? `<span class="kdesc">${INFO[label]}</span>` : ""}</div>`;
25
26
 
@@ -42,6 +43,9 @@
42
43
  const lic = (dep.licenses) || { permissive: 0, "weak-copyleft": 0, "strong-copyleft": 0, unknown: 0 };
43
44
  const licChips = (dep.licenseFlags || []).slice(0, 5).map((l) => `<span class="chip ${l.class === "strong-copyleft" ? "bad" : "warn"}">${esc(l.name)} · ${esc(l.license)}</span>`).join("");
44
45
  const spark = sparkline(hs.trend || []);
46
+ const secu = r.security || { destructive: [], commandsScanned: 0, injectionFindings: 0 };
47
+ const secuChips = (secu.destructive || []).slice(0, 5).map((d) => `<span class="chip bad">${esc(d.where)}: ${esc(d.command).slice(0, 38)}</span>`).join("")
48
+ || (secu.injectionFindings ? (secu.injectionWhere || []).slice(0, 4).map((w) => `<span class="chip warn">injection: ${esc(w)}</span>`).join("") : `<span class="chip">${secu.commandsScanned || 0} cmds · clean</span>`);
45
49
 
46
50
  const share = opts.share ? `<div class="share" id="share"></div>` : "";
47
51
 
@@ -60,6 +64,7 @@
60
64
  <div class="row">${kcell("Complexity")}<div class="v"><span class="big">${cx.totalSymbols}</span> symbols · ${cx.filesAnalysed} files · max depth ${cx.maxDepth}<div class="chips">${hot}</div></div></div>
61
65
  <div class="row">${kcell("Hotspots")}<div class="v"><span class="muted">refactor-ROI · churn × size · last ${hs.windowDays||365}d</span> ${spark}<div class="chips">${hsChips}</div></div></div>
62
66
  <div class="row">${kcell("Coupling")}<div class="v"><span class="muted">${(cp.pairs||[]).length} coupled pair(s) · hidden = cross-directory</span><div class="chips">${cpChips}</div></div></div>
67
+ <div class="row">${kcell("Security")}<div class="v"><span class="big">${(secu.destructive||[]).length}</span> destructive cmd(s) · ${secu.commandsScanned||0} checked${secu.injectionFindings?` · ${secu.injectionFindings} doc injection`:""}<div class="chips">${secuChips}</div></div></div>
63
68
  </div>
64
69
  <div class="foot">${verified}<span>fingerprint <code>${esc(String(r.fingerprint).slice(0, 28))}…</code></span></div>
65
70
  ${share}
package/public/index.html CHANGED
@@ -7,150 +7,160 @@
7
7
  <link rel="icon" href="/favicon.svg" />
8
8
  <style>
9
9
  :root{
10
- --ink:#0a0a0a; --sub:#6b7280; --line:#ececec; --bg:#ffffff; --soft:#fafafa;
11
- --a:#4f46e5; --green:#16a34a; --amber:#d97706; --red:#dc2626;
12
- --radius:14px;
10
+ --ink:#0b0b0f; --ink2:#33333b; --sub:#8b8f98; --line:#ececef; --line2:#f3f3f5;
11
+ --bg:#ffffff; --soft:#fafafb; --a:#5b5bf6; --a-soft:#eef0ff;
12
+ --green:#16a34a; --amber:#d97706; --red:#e11d48;
13
+ --r:18px; --rs:12px;
14
+ --sh:0 1px 2px rgba(11,11,20,.04), 0 14px 44px -12px rgba(11,11,20,.10);
15
+ --sh-sm:0 1px 2px rgba(11,11,20,.05);
13
16
  }
14
17
  *{box-sizing:border-box}
15
- html,body{margin:0;background:var(--bg);color:var(--ink);
16
- font:16px/1.55 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,sans-serif;
17
- -webkit-font-smoothing:antialiased}
18
- .wrap{max-width:760px;margin:0 auto;padding:0 22px}
19
- header{padding:74px 0 34px;text-align:center}
20
- .mark{font-size:13px;letter-spacing:.18em;text-transform:uppercase;color:var(--sub)}
21
- h1{font-size:46px;line-height:1.08;font-weight:680;margin:14px 0 10px;letter-spacing:-.02em}
22
- .lede{color:var(--sub);font-size:18px;max-width:540px;margin:0 auto}
23
- form{display:flex;gap:10px;margin:34px 0 8px}
24
- input{flex:1;padding:15px 17px;border:1px solid var(--line);border-radius:var(--radius);
25
- font-size:16px;outline:none;transition:border-color .15s}
26
- input:focus{border-color:var(--ink)}
27
- button{padding:15px 22px;border:0;border-radius:var(--radius);background:var(--ink);color:#fff;
28
- font-size:16px;font-weight:560;cursor:pointer;transition:opacity .15s}
29
- button:disabled{opacity:.45;cursor:default}
30
- .hint{color:var(--sub);font-size:13.5px;text-align:center}
31
- .hint b{color:var(--ink);font-weight:560}
18
+ html{-webkit-text-size-adjust:100%}
19
+ body{margin:0;background:var(--bg);color:var(--ink2);
20
+ font:16px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,"Helvetica Neue",Roboto,sans-serif;
21
+ -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
22
+ font-feature-settings:"cv11","ss01";letter-spacing:-0.011em}
23
+ ::selection{background:var(--a-soft)}
24
+ .wrap{max-width:720px;margin:0 auto;padding:0 24px}
25
+ /* hero */
26
+ header{padding:96px 0 40px;text-align:center}
27
+ .mark{font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--sub);font-weight:600}
28
+ h1{font-size:54px;line-height:1.04;font-weight:700;margin:18px 0 14px;letter-spacing:-.035em;color:var(--ink)}
29
+ .lede{color:var(--sub);font-size:19px;line-height:1.55;max-width:500px;margin:0 auto;font-weight:400}
30
+ form{display:flex;gap:10px;margin:38px auto 10px;max-width:600px}
31
+ input{flex:1;padding:0 18px;height:54px;border:1px solid var(--line);border-radius:var(--rs);
32
+ font-size:16px;color:var(--ink);outline:none;background:#fff;transition:border-color .18s, box-shadow .18s}
33
+ input::placeholder{color:#b7bbc2}
34
+ input:focus{border-color:var(--a);box-shadow:0 0 0 4px var(--a-soft)}
35
+ button{height:54px;padding:0 24px;border:0;border-radius:var(--rs);background:var(--ink);color:#fff;
36
+ font-size:15.5px;font-weight:560;cursor:pointer;transition:transform .12s, opacity .18s, background .18s;white-space:nowrap}
37
+ button:hover{background:#22232c}
38
+ button:active{transform:scale(.98)}
39
+ button:disabled{opacity:.5;cursor:default}
40
+ .hint{color:var(--sub);font-size:13.5px;text-align:center;line-height:1.6}
41
+ .hint b{color:var(--ink2);font-weight:560}
32
42
  .err{color:var(--red);text-align:center;margin-top:18px;font-size:14.5px}
33
- /* card */
34
- .card{border:1px solid var(--line);border-radius:18px;margin-top:30px;overflow:hidden;
35
- box-shadow:0 1px 2px rgba(0,0,0,.03),0 8px 30px rgba(0,0,0,.04);animation:rise .3s ease}
36
- @keyframes rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
37
- .card .top{display:flex;align-items:center;gap:20px;padding:26px 28px;border-bottom:1px solid var(--line)}
38
- .grade{width:78px;height:78px;border-radius:18px;display:grid;place-items:center;
39
- font-size:40px;font-weight:720;color:#fff;flex:none}
40
- .g-A{background:var(--green)} .g-B{background:#65a30d} .g-C{background:var(--amber)}
41
- .g-D{background:#ea580c} .g-F{background:var(--red)}
42
- .top .repo{font-size:21px;font-weight:620;letter-spacing:-.01em;word-break:break-all}
43
- .top .head{color:var(--sub);font-size:14.5px;margin-top:2px}
44
- .rows{padding:8px 28px 14px}
45
- .row{display:flex;gap:14px;padding:15px 0;border-bottom:1px solid var(--soft);align-items:baseline}
43
+ /* cards */
44
+ .card,.packcard{border:1px solid var(--line);border-radius:var(--r);margin-top:32px;overflow:hidden;
45
+ background:#fff;box-shadow:var(--sh);animation:rise .35s cubic-bezier(.2,.7,.2,1)}
46
+ @keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
47
+ .card .top{display:flex;align-items:center;gap:22px;padding:28px 30px;border-bottom:1px solid var(--line2);
48
+ background:linear-gradient(180deg,#fff,#fcfcfd)}
49
+ .grade{width:72px;height:72px;border-radius:16px;display:grid;place-items:center;
50
+ font-size:36px;font-weight:740;color:#fff;flex:none;box-shadow:inset 0 -2px 6px rgba(0,0,0,.12)}
51
+ .g-A{background:linear-gradient(135deg,#1fb255,#15863f)} .g-B{background:linear-gradient(135deg,#7bb736,#5c8f1e)}
52
+ .g-C{background:linear-gradient(135deg,#eaa83a,#c9821a)} .g-D{background:linear-gradient(135deg,#f0742e,#d4571a)}
53
+ .g-F{background:linear-gradient(135deg,#f43f5e,#be123c)}
54
+ .top .repo{font-size:22px;font-weight:640;letter-spacing:-.02em;color:var(--ink);word-break:break-all;line-height:1.2}
55
+ .top .head{color:var(--sub);font-size:14px;margin-top:4px}
56
+ .rows{padding:6px 30px 16px}
57
+ .row{display:flex;gap:18px;padding:17px 0;border-bottom:1px solid var(--line2);align-items:baseline}
46
58
  .row:last-child{border-bottom:0}
47
- .row .k{font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--sub);width:128px;flex:none}
48
- .row .v{font-size:15.5px}
49
- .row .v .big{font-weight:640}
50
- .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
51
- .chip{font-size:12.5px;padding:3px 9px;border-radius:999px;background:var(--soft);border:1px solid var(--line);color:#374151}
52
- .chip.bad{background:#fef2f2;border-color:#fee2e2;color:var(--red)}
53
- .chip.warn{background:#fffbeb;border-color:#fef3c7;color:var(--amber)}
59
+ .row .k{width:132px;flex:none;display:flex;flex-direction:column;gap:3px}
60
+ .row .k>:first-child,.row .k{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--sub);font-weight:600}
61
+ .kdesc{font-size:11px;color:#a3a7af;text-transform:none;letter-spacing:0;font-weight:400;line-height:1.35}
62
+ .row .v{font-size:15px;color:var(--ink2)}
63
+ .row .v .big{font-weight:660;color:var(--ink);font-size:16px}
64
+ .muted{color:var(--sub)}
65
+ .spark{font-family:ui-monospace,Menlo,monospace;letter-spacing:1px;color:var(--a)}
66
+ .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
67
+ .chip{font-size:12px;padding:4px 10px;border-radius:8px;background:var(--soft);border:1px solid var(--line);color:#5c616b;font-weight:450}
68
+ .chip.bad{background:#fff1f3;border-color:#ffe0e6;color:var(--red)}
69
+ .chip.warn{background:#fff8ed;border-color:#fde6cc;color:#b45309}
54
70
  .foot{display:flex;align-items:center;justify-content:space-between;gap:12px;
55
- padding:16px 28px;background:var(--soft);font-size:13px;color:var(--sub);flex-wrap:wrap}
71
+ padding:16px 30px;background:var(--soft);font-size:13px;color:var(--sub);flex-wrap:wrap}
56
72
  .verified{display:inline-flex;align-items:center;gap:7px;color:var(--green);font-weight:560}
57
- .dot{width:8px;height:8px;border-radius:50%;background:var(--green)}
58
- code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
59
- /* board */
60
- .board{margin:54px 0 40px}
61
- .board h3{font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--sub);font-weight:560}
62
- .bitem{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--soft);font-size:14.5px}
63
- .bg{width:24px;height:24px;border-radius:7px;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;flex:none}
64
- .bitem .nm{font-weight:540}.bitem .hd{color:var(--sub);margin-left:auto;font-size:13px}
65
- footer{padding:30px 0 60px;text-align:center;color:var(--sub);font-size:13px}
66
- .pill{display:inline-block;margin-top:14px;font-size:12.5px;color:var(--sub);background:var(--soft);
67
- border:1px solid var(--line);border-radius:999px;padding:5px 13px}
68
- .steps{display:flex;flex-wrap:wrap;gap:8px 18px;justify-content:center;margin:18px auto 0;max-width:640px;
73
+ .dot{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px rgba(22,163,74,.14)}
74
+ code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;background:var(--soft);
75
+ padding:2px 6px;border-radius:6px;border:1px solid var(--line)}
76
+ /* secondary panels — quieter than the hero */
77
+ .steps{display:flex;flex-wrap:wrap;gap:10px 22px;justify-content:center;margin:22px auto 0;max-width:660px;
69
78
  color:var(--sub);font-size:13px}
70
- .steps span{display:inline-flex;align-items:center;gap:7px}
71
- .steps b{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:50%;background:var(--ink);
79
+ .steps span{display:inline-flex;align-items:center;gap:8px}
80
+ .steps b{display:inline-grid;place-items:center;width:19px;height:19px;border-radius:50%;background:var(--ink);
72
81
  color:#fff;font-size:11px;font-weight:700}
73
- .keybox{max-width:560px;margin:20px auto 0;font-size:13px;color:var(--sub)}
74
- .keybox summary{cursor:pointer;text-align:center;list-style:none}
82
+ .pill{display:inline-block;margin-top:14px;font-size:12.5px;color:var(--sub);background:var(--soft);
83
+ border:1px solid var(--line);border-radius:999px;padding:5px 13px}
84
+ .keybox{max-width:560px;margin:22px auto 0;font-size:13px;color:var(--sub)}
85
+ .keybox summary{cursor:pointer;text-align:center;list-style:none;color:var(--a);font-weight:540}
75
86
  .keybox summary::-webkit-details-marker{display:none}
76
- .keyrow{display:flex;gap:8px;margin-top:12px}
77
- .keyrow input{flex:1;padding:11px 13px;border:1px solid var(--line);border-radius:10px;font-size:14px}
78
- .keyrow button{padding:11px 16px;border:0;border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;font-size:14px}
87
+ .keyrow{display:flex;gap:8px;margin-top:14px}
88
+ .keyrow input{flex:1;height:44px;padding:0 14px;border:1px solid var(--line);border-radius:10px;font-size:14px}
89
+ .keyrow button{height:44px;padding:0 18px;border:0;border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;font-size:14px}
79
90
  .kstate{align-self:center;color:var(--green);font-size:12.5px;white-space:nowrap}
80
- .tabs{display:flex;gap:8px;margin-bottom:6px}
81
- .tab{background:none;border:0;padding:4px 0;margin-right:16px;font-size:13px;letter-spacing:.14em;
82
- text-transform:uppercase;color:var(--sub);cursor:pointer;border-bottom:2px solid transparent}
91
+ /* board / listview */
92
+ .board{margin:60px 0 30px}
93
+ .tabs{display:flex;gap:8px;margin-bottom:12px}
94
+ .tab{background:none;border:0;padding:6px 0;margin-right:20px;font-size:12px;letter-spacing:.14em;
95
+ text-transform:uppercase;color:var(--sub);cursor:pointer;border-bottom:2px solid transparent;font-weight:600}
83
96
  .tab.on{color:var(--ink);border-bottom-color:var(--ink)}
84
- .listbox{max-height:430px;overflow:auto;border:1px solid var(--line);border-radius:14px}
85
- .bitem{display:flex;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid var(--soft);font-size:14.5px;cursor:pointer}
97
+ .listbox{max-height:440px;overflow:auto;border:1px solid var(--line);border-radius:var(--r);background:#fff;box-shadow:var(--sh-sm)}
98
+ .bitem{display:flex;align-items:center;gap:14px;padding:14px 18px;border-bottom:1px solid var(--line2);font-size:14.5px;cursor:pointer;transition:background .12s}
86
99
  .bitem:last-child{border-bottom:0}
87
100
  .bitem:hover{background:var(--soft)}
88
- .bitem .bg{width:24px;height:24px;border-radius:7px;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;flex:none}
89
- .bitem .nm{font-weight:560;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
90
- .bitem .dates{display:flex;gap:14px;color:var(--sub);font-size:12.5px;white-space:nowrap}
91
- .bitem .dates b{color:var(--ink);font-weight:560}
92
- .bitem .cnt{color:var(--sub);font-size:12.5px;white-space:nowrap;min-width:56px;text-align:right}
93
- .bitem .arr{color:var(--sub)}
94
- .bitem.muted{cursor:default;color:var(--sub)}
95
- .bitem.muted:hover{background:none}
101
+ .bg{width:26px;height:26px;border-radius:8px;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;flex:none}
102
+ .bitem .nm{font-weight:560;color:var(--ink);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
103
+ .bitem .dates{display:flex;gap:16px;color:var(--sub);font-size:12.5px;white-space:nowrap}
104
+ .bitem .dates b{color:var(--ink2);font-weight:560}
105
+ .bitem .cnt{color:var(--sub);font-size:12.5px;white-space:nowrap;min-width:58px;text-align:right}
106
+ .bitem .arr{color:#c2c6cd}
107
+ .bitem.muted{cursor:default;color:var(--sub)}.bitem.muted:hover{background:none}
96
108
  .lock{margin-right:4px}
97
- .listfoot{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 0;font-size:13px}
98
- .moreb{padding:8px 16px;border:1px solid var(--line);background:#fff;border-radius:9px;cursor:pointer;font-size:13px}
109
+ .listfoot{display:flex;justify-content:space-between;align-items:center;padding:14px 4px 0;font-size:13px}
110
+ .moreb{height:38px;padding:0 18px;border:1px solid var(--line);background:#fff;border-radius:10px;cursor:pointer;font-size:13px;font-weight:540;transition:border-color .15s}
99
111
  .moreb:hover{border-color:var(--ink)}
100
- @media (max-width:680px){ .bitem .dates{display:none} .bitem .cnt{min-width:auto} }
101
- .share{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:16px 28px;border-top:1px solid var(--line)}
112
+ /* share + buttons */
113
+ .share{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:18px 30px;border-top:1px solid var(--line2)}
102
114
  .badgeimg{height:20px}
103
- .sbtn{padding:8px 13px;border:1px solid var(--ink);background:var(--ink);color:#fff;border-radius:9px;
104
- font-size:13px;cursor:pointer;text-decoration:none}
115
+ .sbtn{height:38px;display:inline-flex;align-items:center;padding:0 15px;border:1px solid var(--ink);background:var(--ink);color:#fff;border-radius:10px;
116
+ font-size:13px;font-weight:540;cursor:pointer;text-decoration:none;transition:opacity .15s}
117
+ .sbtn:hover{opacity:.88}
105
118
  .sbtn.ghost{background:#fff;color:var(--ink)}
106
119
  .ghostbtn{background:#fff;color:var(--ink);border:1px solid var(--line)}
107
- .ghostbtn:hover{border-color:var(--ink)}
108
- .packcard{border:1px solid var(--line);border-radius:18px;margin-top:30px;overflow:hidden;box-shadow:0 1px 2px rgba(0,0,0,.03),0 8px 30px rgba(0,0,0,.04);animation:rise .3s ease}
109
- .packcard .ptop{padding:22px 28px;border-bottom:1px solid var(--line)}
110
- .packcard .ptop b{font-size:18px}
111
- .pstats{display:flex;flex-wrap:wrap;gap:18px;margin-top:10px;color:var(--sub);font-size:13.5px}
112
- .pstats .pn{color:var(--ink);font-weight:640}
113
- .pactions{display:flex;gap:10px;flex-wrap:wrap;padding:16px 28px;background:var(--soft);border-bottom:1px solid var(--line)}
114
- .pre{max-height:420px;overflow:auto;margin:0;padding:18px 28px;font-family:ui-monospace,Menlo,monospace;font-size:12px;white-space:pre-wrap;word-break:break-word;color:#374151}
115
- .pwhy{padding:12px 28px;font-size:12.5px;color:var(--sub);background:var(--soft)}
116
- .spin{display:inline-block;width:15px;height:15px;border:2px solid #fff;border-top-color:transparent;
117
- border-radius:50%;animation:s .7s linear infinite;vertical-align:-2px;margin-right:7px}
118
- @keyframes s{to{transform:rotate(360deg)}}
119
- .muted{color:var(--sub)}
120
- /* crisper section separation */
121
- .card .top{background:linear-gradient(#fff,#fcfcfd)}
122
- .row .k{font-weight:560;display:flex;flex-direction:column;gap:3px}
123
- .kdesc{font-size:11px;color:var(--sub);text-transform:none;letter-spacing:0;font-weight:400;line-height:1.3}
124
- .spark{font-family:ui-monospace,Menlo,monospace;letter-spacing:1px;color:var(--a)}
125
- /* local-folder bridge panel */
126
- .localbox{max-width:560px;margin:18px auto 0;border:1px solid var(--line);border-radius:14px;padding:16px 18px;background:var(--soft);display:none}
120
+ .ghostbtn:hover{background:var(--soft);border-color:var(--ink)}
121
+ /* AI pack card */
122
+ .packcard .ptop{padding:24px 30px;border-bottom:1px solid var(--line2)}
123
+ .packcard .ptop b{font-size:19px;color:var(--ink);font-weight:640}
124
+ .pstats{display:flex;flex-wrap:wrap;gap:20px;margin-top:12px;color:var(--sub);font-size:13.5px}
125
+ .pstats .pn{color:var(--ink);font-weight:660}
126
+ .pactions{display:flex;gap:10px;flex-wrap:wrap;padding:16px 30px;background:var(--soft);border-bottom:1px solid var(--line2)}
127
+ .pre{max-height:440px;overflow:auto;margin:0;padding:20px 30px;font-family:ui-monospace,Menlo,monospace;font-size:12px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:#4b5059}
128
+ .pwhy{padding:13px 30px;font-size:12.5px;color:var(--sub);background:var(--soft)}
129
+ /* local bridge panel */
130
+ .localbox{max-width:560px;margin:22px auto 0;border:1px solid var(--line);border-radius:var(--rs);padding:18px 20px;background:var(--soft);display:none;text-align:left}
127
131
  .localbox.on{display:block}
128
- .localbox .lh{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:560}
129
- .localdot{width:8px;height:8px;border-radius:50%;background:var(--green)}
130
- .localrow{display:flex;gap:8px;margin-top:10px}
131
- .localrow input{flex:1;padding:11px 13px;border:1px solid var(--line);border-radius:10px;font-size:14px;font-family:ui-monospace,Menlo,monospace}
132
- .localrow button{padding:11px 16px;border:0;border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;font-size:14px}
133
- .localhint{font-size:12px;color:var(--sub);margin-top:8px}
134
- /* ---- mobile / cross-browser responsive ---- */
132
+ .localbox .lh{display:flex;align-items:center;gap:9px;font-size:13.5px;font-weight:560;color:var(--ink2)}
133
+ .localdot{width:9px;height:9px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px rgba(22,163,74,.14)}
134
+ .localrow{display:flex;gap:8px;margin-top:12px}
135
+ .localrow input{flex:1;height:44px;padding:0 14px;border:1px solid var(--line);border-radius:10px;font-size:13.5px;font-family:ui-monospace,Menlo,monospace}
136
+ .localrow button{height:44px;padding:0 16px;border:0;border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;font-size:13.5px}
137
+ .localhint{font-size:12px;color:var(--sub);margin-top:9px}
138
+ footer{padding:40px 0 70px;text-align:center;color:#aab0b8;font-size:13px}
139
+ .spin{display:inline-block;width:15px;height:15px;border:2px solid currentColor;border-top-color:transparent;
140
+ border-radius:50%;animation:s .7s linear infinite;vertical-align:-2px;margin-right:7px;opacity:.9}
141
+ @keyframes s{to{transform:rotate(360deg)}}
142
+ @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
143
+ /* ---- responsive — every breakpoint, every browser ---- */
135
144
  @media (max-width:680px){
136
- .wrap{padding:0 16px}
137
- header{padding:48px 0 26px}
138
- h1{font-size:32px}
139
- .lede{font-size:16px}
140
- form{flex-direction:column}
145
+ .wrap{padding:0 18px}
146
+ header{padding:56px 0 28px}
147
+ h1{font-size:34px;letter-spacing:-.03em}
148
+ .lede{font-size:16.5px}
149
+ form{flex-direction:column;gap:8px}
141
150
  button{width:100%}
142
- .steps{gap:8px 12px;font-size:12.5px}
143
- .card .top{flex-direction:row;gap:14px;padding:18px}
144
- .grade{width:56px;height:56px;font-size:28px;border-radius:14px}
145
- .top .repo{font-size:17px}
146
- .rows{padding:4px 18px 10px}
147
- .row{flex-direction:column;gap:4px;padding:13px 0}
148
- .row .k{width:auto}
149
- .foot,.share{padding:14px 18px}
150
- .share{gap:8px}
151
- .sbtn{flex:1;text-align:center}
151
+ .steps{gap:8px 14px;font-size:12.5px}
152
+ .card .top{gap:16px;padding:20px}
153
+ .grade{width:58px;height:58px;font-size:27px;border-radius:14px}
154
+ .top .repo{font-size:18px}
155
+ .rows{padding:2px 18px 10px}
156
+ .row{flex-direction:column;gap:5px;padding:14px 0}
157
+ .row .k{width:auto;flex-direction:row;align-items:baseline;gap:8px}
158
+ .kdesc{display:none}
159
+ .foot,.share,.pactions,.ptop,.pre,.pwhy{padding-left:18px;padding-right:18px}
160
+ .bitem .dates{display:none}.bitem .cnt{min-width:auto}
161
+ .sbtn{flex:1;justify-content:center}
152
162
  }
153
- @media (max-width:380px){ h1{font-size:27px} .grade{width:48px;height:48px;font-size:24px} }
163
+ @media (max-width:380px){ h1{font-size:29px} .grade{width:50px;height:50px;font-size:23px} }
154
164
  </style>
155
165
  </head>
156
166
  <body>