@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.
- package/dist/battery/security.d.ts +3 -0
- package/dist/battery/security.d.ts.map +1 -0
- package/dist/battery/security.js +121 -0
- package/dist/battery/security.js.map +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +23 -6
- package/dist/engine.js.map +1 -1
- package/dist/gauntlet.d.ts.map +1 -1
- package/dist/gauntlet.js +1 -0
- package/dist/gauntlet.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/public/card.js +5 -0
- package/public/index.html +132 -122
|
@@ -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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"}
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
49
|
-
const
|
|
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(
|
|
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."
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAO1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAkB;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IAEvC,IAAI,QAAgB,CAAC;IACrB,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,IAAI,OAA8B,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;QAClB,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACpB,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACjH,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzB,OAAO,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5G,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/gauntlet.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
}
|
package/dist/gauntlet.js.map
CHANGED
|
@@ -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
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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:#
|
|
11
|
-
--
|
|
12
|
-
--
|
|
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
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
/*
|
|
34
|
-
.card{border:1px solid var(--line);border-radius:
|
|
35
|
-
box-shadow:
|
|
36
|
-
@keyframes rise{from{opacity:0;transform:translateY(
|
|
37
|
-
.card .top{display:flex;align-items:center;gap:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.g-
|
|
42
|
-
.
|
|
43
|
-
.
|
|
44
|
-
.
|
|
45
|
-
.
|
|
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{
|
|
48
|
-
.row .
|
|
49
|
-
.
|
|
50
|
-
.
|
|
51
|
-
.
|
|
52
|
-
.
|
|
53
|
-
.
|
|
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
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
.
|
|
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:
|
|
71
|
-
.steps b{display:inline-grid;place-items:center;width:
|
|
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
|
-
.
|
|
74
|
-
|
|
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:
|
|
77
|
-
.keyrow input{flex:1;padding:
|
|
78
|
-
.keyrow button{padding:
|
|
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
|
-
|
|
81
|
-
.
|
|
82
|
-
|
|
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:
|
|
85
|
-
.bitem{display:flex;align-items:center;gap:
|
|
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
|
-
.
|
|
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:
|
|
91
|
-
.bitem .dates b{color:var(--
|
|
92
|
-
.bitem .cnt{color:var(--sub);font-size:12.5px;white-space:nowrap;min-width:
|
|
93
|
-
.bitem .arr{color
|
|
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:
|
|
98
|
-
.moreb{padding:
|
|
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
|
-
|
|
101
|
-
.share{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:
|
|
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:
|
|
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
|
-
|
|
109
|
-
.packcard .ptop{padding:
|
|
110
|
-
.packcard .ptop b{font-size:
|
|
111
|
-
.pstats{display:flex;flex-wrap:wrap;gap:
|
|
112
|
-
.pstats .pn{color:var(--ink);font-weight:
|
|
113
|
-
.pactions{display:flex;gap:10px;flex-wrap:wrap;padding:16px
|
|
114
|
-
.pre{max-height:
|
|
115
|
-
.pwhy{padding:
|
|
116
|
-
|
|
117
|
-
|
|
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:
|
|
129
|
-
.localdot{width:
|
|
130
|
-
.localrow{display:flex;gap:8px;margin-top:
|
|
131
|
-
.localrow input{flex:1;padding:
|
|
132
|
-
.localrow button{padding:
|
|
133
|
-
.localhint{font-size:12px;color:var(--sub);margin-top:
|
|
134
|
-
|
|
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
|
|
137
|
-
header{padding:
|
|
138
|
-
h1{font-size:
|
|
139
|
-
.lede{font-size:
|
|
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
|
|
143
|
-
.card .top{
|
|
144
|
-
.grade{width:
|
|
145
|
-
.top .repo{font-size:
|
|
146
|
-
.rows{padding:
|
|
147
|
-
.row{flex-direction:column;gap:
|
|
148
|
-
.row .k{width:auto}
|
|
149
|
-
.
|
|
150
|
-
.share{
|
|
151
|
-
.
|
|
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:
|
|
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>
|