@mneme-ai/xray 2.158.0 → 2.160.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/pack.d.ts.map +1 -1
- package/dist/pack.js +50 -8
- package/dist/pack.js.map +1 -1
- package/package.json +1 -1
- package/public/card.js +4 -0
- package/public/index.html +62 -75
- package/public/report.html +4 -0
package/dist/pack.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAiI5G"}
|
package/dist/pack.js
CHANGED
|
@@ -72,11 +72,17 @@ export function buildContextPack(repoPath, opts = {}) {
|
|
|
72
72
|
const score = entrypointBonus(f.rel) + ch * 8 + Math.min(extname(f.rel).match(CODE_EXT) ? 60 : 10, 60);
|
|
73
73
|
return { ...f, score, changes: ch };
|
|
74
74
|
}).sort((a, b) => b.score - a.score);
|
|
75
|
+
// reserve room for the structure tree + header so the TOTAL stays within the
|
|
76
|
+
// budget (the pack must fit the model, tree included).
|
|
77
|
+
const treeCap = Math.max(150, Math.min(1500, Math.floor(budget / 120)));
|
|
78
|
+
const treeStr = tree(files.map((f) => f.rel), treeCap);
|
|
79
|
+
const reserve = estTok(treeStr) + 1400; // tree + header + reading guide overhead
|
|
80
|
+
const sectionBudget = Math.max(8000, budget - reserve);
|
|
75
81
|
const FULL_CAP = 10; // the few most-central files go in full
|
|
76
82
|
let used = 0, full = 0, outl = 0, omitted = 0, redacted = 0;
|
|
77
83
|
const sections = [];
|
|
78
84
|
for (let i = 0; i < scored.length; i++) {
|
|
79
|
-
if (used >=
|
|
85
|
+
if (used >= sectionBudget) {
|
|
80
86
|
omitted = scored.length - i;
|
|
81
87
|
break;
|
|
82
88
|
}
|
|
@@ -122,9 +128,14 @@ export function buildContextPack(repoPath, opts = {}) {
|
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
const lang = (extname(f.rel).slice(1) || "").toLowerCase();
|
|
125
|
-
|
|
131
|
+
// CORRUPTION GUARD: if the body contains a run of backticks, the code fence
|
|
132
|
+
// must be LONGER than that run, or the markdown breaks when pasted into an
|
|
133
|
+
// AI (it would mis-detect where the file ends). Use (longest run + 1), min 3.
|
|
134
|
+
const longestTicks = (body.match(/`+/g) || []).reduce((m, s) => Math.max(m, s.length), 0);
|
|
135
|
+
const fence = "`".repeat(Math.max(3, longestTicks + 1));
|
|
136
|
+
const section = `\n### ${f.rel} _(${kind}${f.changes ? `, changed ${f.changes}×` : ""})_\n\n${fence}${lang}\n${body}\n${fence}\n`;
|
|
126
137
|
const cost = estTok(section);
|
|
127
|
-
if (used + cost >
|
|
138
|
+
if (used + cost > sectionBudget && used > 0) {
|
|
128
139
|
omitted = scored.length - i;
|
|
129
140
|
break;
|
|
130
141
|
}
|
|
@@ -137,19 +148,50 @@ export function buildContextPack(repoPath, opts = {}) {
|
|
|
137
148
|
}
|
|
138
149
|
// reading guide from the top-scored files
|
|
139
150
|
const top = scored.slice(0, 8).map((f) => `- \`${f.rel}\`${f.changes ? ` — changed ${f.changes}× (hotspot)` : ""}`).join("\n");
|
|
140
|
-
const
|
|
151
|
+
const coverage = omitted === 0
|
|
152
|
+
? `Complete: all ${files.length} source files are included.`
|
|
153
|
+
: `${full + outl} of ${files.length} files included as content (the highest-signal ones); the remaining ${omitted} are listed in the Structure tree below but their contents were omitted to fit the model. Raise the budget or pack a sub-folder for full contents.`;
|
|
154
|
+
const header = `SYSTEM / INSTRUCTIONS FOR THE AI ASSISTANT — read this first.
|
|
141
155
|
|
|
142
|
-
|
|
156
|
+
You have just been given a complete CONTEXT PACK of a software project named "${repoName}".
|
|
157
|
+
It contains the repo's full structure plus its highest-signal files (FULL = verbatim
|
|
158
|
+
content; OUTLINE = exact function/class SIGNATURES with bodies elided to save space;
|
|
159
|
+
secrets shown as «REDACTED:…»). Treat it as the ground truth for this codebase.
|
|
160
|
+
|
|
161
|
+
YOUR TASK, right now, before anything else:
|
|
162
|
+
1. Read the whole pack.
|
|
163
|
+
2. Reply with a 3–4 sentence summary of what this project does and how it's architected.
|
|
164
|
+
3. List the 3 areas most likely to hold bugs or need refactoring (cite file paths).
|
|
165
|
+
4. Then ask: "What would you like help with?" and wait for me.
|
|
166
|
+
|
|
167
|
+
RULES: Ground every answer in the files below. If something I ask about isn't in the
|
|
168
|
+
pack, say "that file isn't in the pack" instead of guessing — do not invent code.
|
|
169
|
+
|
|
170
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
171
|
+
|
|
172
|
+
# 📦 AI Context Pack — ${repoName}
|
|
173
|
+
|
|
174
|
+
> Built by Mneme X-Ray: **prioritized** by real signals (not a raw dump),
|
|
175
|
+
> **secret-redacted**, and **token-budgeted** to fit your model. ~${used.toLocaleString()} tokens.
|
|
176
|
+
>
|
|
177
|
+
> **Coverage:** ${coverage}
|
|
178
|
+
|
|
179
|
+
## 💡 After the AI summarises, try asking:
|
|
180
|
+
- "Explain how <feature> works and which files it lives in."
|
|
181
|
+
- "Find the riskiest code here and suggest concrete fixes."
|
|
182
|
+
- "I want to add <feature> — exactly which files do I change, and how?"
|
|
183
|
+
- "Review <path> for bugs, security and edge cases."
|
|
184
|
+
- "Draw the architecture / data flow of this project."
|
|
143
185
|
|
|
144
186
|
## 🧭 Read this first (highest-signal files)
|
|
145
187
|
${top}
|
|
146
188
|
|
|
147
|
-
## 🗂
|
|
189
|
+
## 🗂 Full structure (every file in the repo)
|
|
148
190
|
\`\`\`
|
|
149
|
-
${
|
|
191
|
+
${treeStr}
|
|
150
192
|
\`\`\`
|
|
151
193
|
|
|
152
|
-
## 📄 Files (
|
|
194
|
+
## 📄 Files (FULL for central files · OUTLINE = exact signatures for the rest · secrets redacted)
|
|
153
195
|
`;
|
|
154
196
|
const markdown = header + sections.join("");
|
|
155
197
|
return {
|
package/dist/pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.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.160.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
|
@@ -56,6 +56,10 @@
|
|
|
56
56
|
<div><div class="repo">${esc(r.subject.repoName)}</div>
|
|
57
57
|
<div class="head">${esc(s.headline)} · ${s.signalsRun} signals · @ ${esc(String(r.subject.commitHash).slice(0, 10))}</div></div>
|
|
58
58
|
</div>
|
|
59
|
+
<div class="trustbar">
|
|
60
|
+
<span class="hgauge"><span class="hdot"></span>0% hallucination risk</span>
|
|
61
|
+
<span class="htext">Every number is computed from git, code & package metadata — <b>no AI guessed anything</b>. ${s.signalsRun} deterministic signals${verified ? ` · <b>signed</b>, verifies offline` : ""}.</span>
|
|
62
|
+
</div>
|
|
59
63
|
<div class="rows">
|
|
60
64
|
<div class="row">${kcell("Dependencies")}<div class="v"><span class="big">${dep.total}</span> total · ${dep.byBand.dead + dep.byBand.moribund} dying · ${(lic["strong-copyleft"] + lic["weak-copyleft"])} copyleft<div class="chips">${depChips}${licChips}</div></div></div>
|
|
61
65
|
<div class="row">${kcell("Secrets")}<div class="v"><span class="big">${sec.totalFindings}</span> in production code · ${sec.filesScanned} files${sec.excludedTestHits ? ` · <span class="muted">+${sec.excludedTestHits} in tests/docs (excluded)</span>` : ""}<div class="chips">${secChips}</div></div></div>
|
package/public/index.html
CHANGED
|
@@ -22,19 +22,13 @@
|
|
|
22
22
|
font-feature-settings:"cv11","ss01";letter-spacing:-0.011em}
|
|
23
23
|
::selection{background:var(--a-soft)}
|
|
24
24
|
.wrap{max-width:720px;margin:0 auto;padding:0 24px;position:relative;z-index:1}
|
|
25
|
-
/*
|
|
25
|
+
/* grand meteor-impact illustration — wide screens only (desktop / iPad), static */
|
|
26
26
|
.comet{position:fixed;pointer-events:none;z-index:0;opacity:0;display:none}
|
|
27
|
-
.comet-a{top:
|
|
28
|
-
.comet-
|
|
29
|
-
@media (min-width:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
.comet-b{animation:cometIn 1.2s ease .6s forwards, driftB 19s ease-in-out 2s infinite alternate}
|
|
33
|
-
}
|
|
34
|
-
@keyframes cometIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
|
|
35
|
-
@keyframes driftA{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(-14px,18px) rotate(-3deg)}}
|
|
36
|
-
@keyframes driftB{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(16px,-14px) rotate(3deg)}}
|
|
37
|
-
@media (prefers-reduced-motion:reduce){.comet{animation:none!important;opacity:1!important}}
|
|
27
|
+
.comet-a{top:7%;right:1.5vw}
|
|
28
|
+
@media (min-width:1180px){ .comet-a{display:block;animation:cometIn 1.1s cubic-bezier(.2,.7,.2,1) .25s forwards} }
|
|
29
|
+
@media (min-width:1500px){ .comet-a{right:4vw} }
|
|
30
|
+
@keyframes cometIn{from{opacity:0;transform:translateY(-12px) scale(.97)}to{opacity:.92;transform:none}}
|
|
31
|
+
@media (prefers-reduced-motion:reduce){.comet{animation:none!important;opacity:.92!important}}
|
|
38
32
|
/* hero */
|
|
39
33
|
header{padding:96px 0 40px;text-align:center}
|
|
40
34
|
.mark{font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--sub);font-weight:600}
|
|
@@ -73,6 +67,10 @@
|
|
|
73
67
|
.g-F{background:linear-gradient(135deg,#f43f5e,#be123c)}
|
|
74
68
|
.top .repo{font-size:22px;font-weight:640;letter-spacing:-.02em;color:var(--ink);word-break:break-all;line-height:1.2}
|
|
75
69
|
.top .head{color:var(--sub);font-size:14px;margin-top:4px}
|
|
70
|
+
.trustbar{display:flex;align-items:center;gap:14px;padding:13px 30px;background:#f0fdf4;border-bottom:1px solid #dcfce7;flex-wrap:wrap}
|
|
71
|
+
.hgauge{display:inline-flex;align-items:center;gap:8px;font-weight:680;color:#15803d;font-size:14px;white-space:nowrap}
|
|
72
|
+
.hdot{width:10px;height:10px;border-radius:50%;background:#16a34a;box-shadow:0 0 0 4px rgba(22,163,74,.16)}
|
|
73
|
+
.htext{font-size:12.5px;color:#3f6b4e;line-height:1.5}.htext b{color:#14532d;font-weight:640}
|
|
76
74
|
.rows{padding:6px 30px 16px}
|
|
77
75
|
.row{display:flex;gap:18px;padding:17px 0;border-bottom:1px solid var(--line2);align-items:baseline}
|
|
78
76
|
.row:last-child{border-bottom:0}
|
|
@@ -110,10 +108,11 @@
|
|
|
110
108
|
.kstate{align-self:center;color:var(--green);font-size:12.5px;white-space:nowrap}
|
|
111
109
|
/* board / listview */
|
|
112
110
|
.board{margin:60px 0 30px}
|
|
113
|
-
.tabs{display:flex;gap:
|
|
114
|
-
.tab{background:none;border:0;padding:
|
|
115
|
-
|
|
116
|
-
.tab
|
|
111
|
+
.tabs{display:inline-flex;gap:6px;margin-bottom:14px;background:var(--soft);border:1px solid var(--line);border-radius:12px;padding:5px}
|
|
112
|
+
.tab{background:none;border:0;padding:9px 18px;border-radius:9px;font-size:13px;letter-spacing:.02em;
|
|
113
|
+
color:var(--sub);cursor:pointer;font-weight:700;transition:background .15s,color .15s;white-space:nowrap}
|
|
114
|
+
.tab:hover{background:#1a1b22;color:#fff}
|
|
115
|
+
.tab.on{background:var(--ink);color:#fff}
|
|
117
116
|
.listbox{max-height:440px;overflow:auto;border:1px solid var(--line);border-radius:var(--r);background:#fff;box-shadow:var(--sh-sm)}
|
|
118
117
|
.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}
|
|
119
118
|
.bitem:last-child{border-bottom:0}
|
|
@@ -126,6 +125,8 @@
|
|
|
126
125
|
.bitem .arr{color:#c2c6cd}
|
|
127
126
|
.bitem.muted{cursor:default;color:var(--sub)}.bitem.muted:hover{background:none}
|
|
128
127
|
.lock{margin-right:4px}
|
|
128
|
+
.signincta{border:1px dashed var(--line);border-radius:var(--r);padding:28px;text-align:center;color:var(--sub);font-size:14px;line-height:1.7;background:var(--soft)}
|
|
129
|
+
.signincta b{color:var(--ink)}
|
|
129
130
|
.listfoot{display:flex;justify-content:space-between;align-items:center;padding:14px 4px 0;font-size:13px}
|
|
130
131
|
.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}
|
|
131
132
|
.moreb:hover{border-color:var(--ink)}
|
|
@@ -196,70 +197,50 @@
|
|
|
196
197
|
</style>
|
|
197
198
|
</head>
|
|
198
199
|
<body>
|
|
199
|
-
<!--
|
|
200
|
+
<!-- grand meteor-impact illustration — desktop / iPad only, behind content -->
|
|
200
201
|
<div class="comet comet-a" aria-hidden="true">
|
|
201
|
-
<svg viewBox="0 0
|
|
202
|
+
<svg viewBox="0 0 360 420" width="360" height="420">
|
|
202
203
|
<defs>
|
|
203
204
|
<linearGradient id="mtail" x1="1" y1="0" x2="0" y2="1">
|
|
204
|
-
<stop offset="0" stop-color="#0b0b0f" stop-opacity=".
|
|
205
|
-
|
|
206
|
-
<
|
|
205
|
+
<stop offset="0" stop-color="#0b0b0f" stop-opacity=".55"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></linearGradient>
|
|
206
|
+
<radialGradient id="dust" cx="50%" cy="60%"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".16"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></radialGradient>
|
|
207
|
+
<linearGradient id="rock" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#22232b"/><stop offset="1" stop-color="#0b0b0f"/></linearGradient>
|
|
207
208
|
</defs>
|
|
208
|
-
<!--
|
|
209
|
-
<
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
<circle cx="74" cy="266" r="46" fill="url(#dust)">
|
|
216
|
-
<animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.4;.66"/>
|
|
217
|
-
</circle>
|
|
218
|
-
<!-- the meteor: rocky head + burning tail, streaks in then vanishes at impact -->
|
|
219
|
-
<g>
|
|
220
|
-
<animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;.95;.95;0;0" keyTimes="0;.07;.32;.35;1"/>
|
|
221
|
-
<animateTransform attributeName="transform" type="translate" dur="9s" repeatCount="indefinite"
|
|
222
|
-
values="190 -150; 0 0; 0 0" keyTimes="0;.34;1" calcMode="spline" keySplines="0.5 0 0.9 1; 0 0 1 1"/>
|
|
223
|
-
<path d="M246 40 Q150 110 78 258 Q150 122 236 52 Z" fill="url(#mtail)"/>
|
|
224
|
-
<polygon points="250,30 268,42 263,62 243,60 236,42" fill="#0b0b0f"/>
|
|
225
|
-
<polygon points="250,30 268,42 256,48" fill="#34343d"/>
|
|
209
|
+
<!-- ground + crater -->
|
|
210
|
+
<path d="M-20 322 Q90 300 150 330 Q175 344 200 330 Q280 300 380 320" fill="none" stroke="#0b0b0f" stroke-width="2" opacity=".5"/>
|
|
211
|
+
<ellipse cx="172" cy="332" rx="78" ry="20" fill="url(#dust)"/>
|
|
212
|
+
<path d="M150 330 Q172 318 196 330 Q176 340 150 330 Z" fill="#0b0b0f" opacity=".55"/>
|
|
213
|
+
<!-- crater cracks -->
|
|
214
|
+
<g stroke="#0b0b0f" stroke-width="1.4" opacity=".4" fill="none">
|
|
215
|
+
<path d="M150 332 L96 352"/><path d="M196 330 L256 350"/><path d="M172 340 L168 372"/><path d="M150 330 L110 318"/>
|
|
226
216
|
</g>
|
|
227
|
-
<!--
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
<animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;-180" keyTimes="0;.34;.62"/></g>
|
|
237
|
-
<g opacity="0"><polygon points="0,0 10,2 7,11 -1,8"/>
|
|
238
|
-
<animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.6"/>
|
|
239
|
-
<animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;112 196;120 222" keyTimes="0;.34;.52;.6" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
|
|
240
|
-
<animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;300" keyTimes="0;.34;.6"/></g>
|
|
241
|
-
<g opacity="0"><polygon points="0,0 7,2 5,8 -1,6"/>
|
|
242
|
-
<animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.64"/>
|
|
243
|
-
<animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;146 226;156 248" keyTimes="0;.34;.52;.64" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
|
|
244
|
-
<animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;160" keyTimes="0;.34;.64"/></g>
|
|
245
|
-
<g opacity="0"><polygon points="0,0 8,2 6,10 -2,7"/>
|
|
246
|
-
<animate attributeName="opacity" dur="9s" repeatCount="indefinite" values="0;0;1;0" keyTimes="0;.34;.37;.58"/>
|
|
247
|
-
<animateTransform attributeName="transform" type="translate" additive="sum" dur="9s" repeatCount="indefinite" values="74 266;74 266;10 244;4 262" keyTimes="0;.34;.52;.58" calcMode="spline" keySplines="0 0 1 1;0.3 0 0.8 1;0.4 0 1 1"/>
|
|
248
|
-
<animateTransform attributeName="transform" type="rotate" additive="sum" dur="9s" repeatCount="indefinite" values="0;0;-120" keyTimes="0;.34;.58"/></g>
|
|
217
|
+
<!-- motion streak of the descending meteor -->
|
|
218
|
+
<path d="M300 24 Q236 96 196 250 Q244 110 296 40 Z" fill="url(#mtail)"/>
|
|
219
|
+
<!-- the meteor: a faceted rock, mid-descent -->
|
|
220
|
+
<g transform="translate(196 250)">
|
|
221
|
+
<polygon points="-34,-6 -18,-34 14,-40 36,-18 30,18 2,34 -28,22" fill="url(#rock)"/>
|
|
222
|
+
<g stroke="#3a3b45" stroke-width="1.3" opacity=".7" fill="none">
|
|
223
|
+
<path d="M-18 -34 L2 -6 L36 -18"/><path d="M2 -6 L-28 22"/><path d="M2 -6 L2 34"/><path d="M2 -6 L30 18"/>
|
|
224
|
+
</g>
|
|
225
|
+
<polygon points="-18,-34 14,-40 2,-6" fill="#2c2d36"/>
|
|
249
226
|
</g>
|
|
250
|
-
<!--
|
|
251
|
-
<g
|
|
252
|
-
<
|
|
253
|
-
<polygon points="
|
|
227
|
+
<!-- big angular rock shards flung upward (grand) -->
|
|
228
|
+
<g>
|
|
229
|
+
<polygon points="86,178 110,150 128,170 116,210 92,206" fill="url(#rock)"/>
|
|
230
|
+
<polygon points="86,178 110,150 116,184" fill="#2c2d36"/>
|
|
231
|
+
<polygon points="248,170 276,150 296,184 272,206 250,194" fill="url(#rock)"/>
|
|
232
|
+
<polygon points="248,170 276,150 272,188" fill="#2c2d36"/>
|
|
233
|
+
<polygon points="150,128 168,104 186,124 178,156 154,152" fill="url(#rock)"/>
|
|
234
|
+
<polygon points="150,128 168,104 172,138" fill="#2c2d36"/>
|
|
235
|
+
<polygon points="44,256 64,242 74,266 56,278" fill="#0b0b0f"/>
|
|
236
|
+
<polygon points="300,250 318,238 326,262 306,272" fill="#0b0b0f"/>
|
|
237
|
+
<polygon points="208,150 222,134 234,150 226,170" fill="#0b0b0f" opacity=".82"/>
|
|
238
|
+
</g>
|
|
239
|
+
<!-- small flying debris -->
|
|
240
|
+
<g fill="#0b0b0f" opacity=".7">
|
|
241
|
+
<polygon points="130,96 140,90 142,102 132,104"/><polygon points="232,108 242,102 244,114 234,116"/>
|
|
242
|
+
<polygon points="70,150 79,145 81,156 71,158"/><polygon points="286,138 295,133 297,144 287,146"/>
|
|
254
243
|
</g>
|
|
255
|
-
</svg>
|
|
256
|
-
</div>
|
|
257
|
-
<div class="comet comet-b" aria-hidden="true">
|
|
258
|
-
<svg viewBox="0 0 300 300" width="220" height="220"><defs>
|
|
259
|
-
<linearGradient id="tb" x1="0" y1="1" x2="1" y2="0"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".5"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></linearGradient></defs>
|
|
260
|
-
<path d="M38 256 Q150 182 270 48 Q150 168 48 246 Z" fill="url(#tb)"/>
|
|
261
|
-
<circle cx="38" cy="256" r="12" fill="#0b0b0f" opacity=".12"/>
|
|
262
|
-
<circle cx="38" cy="256" r="6" fill="#0b0b0f"/>
|
|
263
244
|
</svg>
|
|
264
245
|
</div>
|
|
265
246
|
<div class="wrap">
|
|
@@ -396,11 +377,17 @@ async function fetchPage(off){
|
|
|
396
377
|
async function loadList(reset=true){
|
|
397
378
|
const el=document.getElementById("board");
|
|
398
379
|
if(reset){ offset=0; loaded=[]; el.innerHTML='<div class="bitem muted">Loading…</div>'; }
|
|
380
|
+
// My repos needs a key — guide the user instead of showing a blank list
|
|
381
|
+
if(tab==="mine" && !getKey()){
|
|
382
|
+
el.innerHTML=`<div class="signincta"><b>My repos</b> keeps every X-Ray & AI Pack you run.<br/>Create a key to start — it’s just a password you make up.<br/><button class="moreb" id="gokey" style="margin-top:12px">Create a key ↑</button></div>`;
|
|
383
|
+
const g=document.getElementById("gokey"); if(g) g.addEventListener("click",()=>{ const kb=document.querySelector(".keybox"); if(kb) kb.open=true; document.getElementById("key").focus(); window.scrollTo({top:0,behavior:"smooth"}); });
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
399
386
|
try{
|
|
400
387
|
const data=await fetchPage(offset);
|
|
401
388
|
loaded=loaded.concat(data.items||[]);
|
|
402
389
|
if(loaded.length===0){
|
|
403
|
-
el.innerHTML=`<div class="bitem muted">${tab==="mine"?"
|
|
390
|
+
el.innerHTML=`<div class="bitem muted">${tab==="mine"?"Nothing here yet — run an <b>X-Ray</b> or <b>📦 AI Pack</b> above and it appears here automatically. (Private folder? use the local Browse panel.)":"No reports yet — be the first."}</div>`;
|
|
404
391
|
return;
|
|
405
392
|
}
|
|
406
393
|
const more = (data.offset+data.limit) < data.total;
|
|
@@ -483,7 +470,7 @@ function renderPack(p){
|
|
|
483
470
|
<button class="sbtn ghost" id="pdl">Download .md</button>
|
|
484
471
|
<span class="paste-hint">→ paste into <b>any</b> AI chat (ChatGPT · Claude · Grok · Gemini · Copilot…) so it understands your whole codebase</span>
|
|
485
472
|
</div>
|
|
486
|
-
<div class="pwhy">
|
|
473
|
+
<div class="pwhy"><b>What you get:</b> paste this into any AI chat and it instantly understands your <b>whole repo</b> — the pack even tells the AI what to do, so it replies with a summary + risks and asks how to help. Then ask it to explain code, find bugs, or add a feature. Prioritized · secret-redacted · fits the model (not millions of unusable tokens).</div>
|
|
487
474
|
<pre class="pre">${esc(md.slice(0,20000))}${md.length>20000?"\n\n… (truncated preview — Copy/Download for the full pack)":""}</pre>
|
|
488
475
|
</div>`;
|
|
489
476
|
document.getElementById("pcopy").addEventListener("click",async e=>{try{await navigator.clipboard.writeText(md);e.target.textContent="Copied ✓ — paste into any AI";setTimeout(()=>e.target.textContent="📋 Copy for your AI",1600);}catch{}});
|
package/public/report.html
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
.grade{width:78px;height:78px;border-radius:18px;display:grid;place-items:center;font-size:40px;font-weight:720;color:#fff;flex:none}
|
|
20
20
|
.g-A{background:var(--green)}.g-B{background:#65a30d}.g-C{background:var(--amber)}.g-D{background:#ea580c}.g-F{background:var(--red)}
|
|
21
21
|
.top .repo{font-size:21px;font-weight:620;word-break:break-all}.top .head{color:var(--sub);font-size:14.5px;margin-top:2px}
|
|
22
|
+
.trustbar{display:flex;align-items:center;gap:14px;padding:13px 28px;background:#f0fdf4;border-bottom:1px solid #dcfce7;flex-wrap:wrap}
|
|
23
|
+
.hgauge{display:inline-flex;align-items:center;gap:8px;font-weight:680;color:#15803d;font-size:14px}
|
|
24
|
+
.hdot{width:10px;height:10px;border-radius:50%;background:#16a34a;box-shadow:0 0 0 4px rgba(22,163,74,.16)}
|
|
25
|
+
.htext{font-size:12.5px;color:#3f6b4e;line-height:1.5}.htext b{color:#14532d;font-weight:640}
|
|
22
26
|
.rows{padding:8px 28px 14px}
|
|
23
27
|
.row{display:flex;gap:14px;padding:15px 0;border-bottom:1px solid var(--soft);align-items:baseline}.row:last-child{border-bottom:0}
|
|
24
28
|
.row .k{font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--sub);width:140px;flex:none;display:flex;flex-direction:column;gap:3px}
|