gnosys 5.2.7 → 5.2.8
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/cli.js +274 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/portfolio.d.ts +93 -0
- package/dist/lib/portfolio.d.ts.map +1 -0
- package/dist/lib/portfolio.js +618 -0
- package/dist/lib/portfolio.js.map +1 -0
- package/dist/lib/portfolioHtml.d.ts +9 -0
- package/dist/lib/portfolioHtml.d.ts.map +1 -0
- package/dist/lib/portfolioHtml.js +537 -0
- package/dist/lib/portfolioHtml.js.map +1 -0
- package/dist/postinstall.d.ts +2 -1
- package/dist/postinstall.d.ts.map +1 -1
- package/dist/postinstall.js +61 -9
- package/dist/postinstall.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Portfolio — HTML Dashboard Generator
|
|
3
|
+
*
|
|
4
|
+
* Blockers-first, production-readiness-focused dashboard.
|
|
5
|
+
* Self-contained HTML with embedded data and styling.
|
|
6
|
+
*/
|
|
7
|
+
import { PortfolioReport } from "./portfolio.js";
|
|
8
|
+
export declare function generatePortfolioHtml(report: PortfolioReport, outputPath?: string): string;
|
|
9
|
+
//# sourceMappingURL=portfolioHtml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolioHtml.d.ts","sourceRoot":"","sources":["../../src/lib/portfolioHtml.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAqD,MAAM,gBAAgB,CAAC;AA6NpG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAuU1F"}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Portfolio — HTML Dashboard Generator
|
|
3
|
+
*
|
|
4
|
+
* Blockers-first, production-readiness-focused dashboard.
|
|
5
|
+
* Self-contained HTML with embedded data and styling.
|
|
6
|
+
*/
|
|
7
|
+
import { STATUS_UPDATE_PROMPT } from "./portfolio.js";
|
|
8
|
+
// ─── Helpers ────────────────────────────────────────────────────────────
|
|
9
|
+
function esc(str) {
|
|
10
|
+
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
11
|
+
}
|
|
12
|
+
function inlineMd(text) {
|
|
13
|
+
return esc(text)
|
|
14
|
+
.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>")
|
|
15
|
+
.replace(/`(.+?)`/g, "<code>$1</code>");
|
|
16
|
+
}
|
|
17
|
+
// ─── Colors ─────────────────────────────────────────────────────────────
|
|
18
|
+
const PALETTE = [
|
|
19
|
+
{ accent: "#4285f4", light: "#e8f0fe" },
|
|
20
|
+
{ accent: "#ea4335", light: "#fce8e6" },
|
|
21
|
+
{ accent: "#34a853", light: "#e6f4ea" },
|
|
22
|
+
{ accent: "#fbbc04", light: "#fef7e0" },
|
|
23
|
+
{ accent: "#a142f4", light: "#f3e8fd" },
|
|
24
|
+
{ accent: "#12b5cb", light: "#e8f7f5" },
|
|
25
|
+
{ accent: "#f439a0", light: "#fde7ef" },
|
|
26
|
+
{ accent: "#5c6bc0", light: "#e8eaf6" },
|
|
27
|
+
];
|
|
28
|
+
function readinessColor(score) {
|
|
29
|
+
if (score >= 90)
|
|
30
|
+
return "#34a853";
|
|
31
|
+
if (score >= 70)
|
|
32
|
+
return "#4285f4";
|
|
33
|
+
if (score >= 40)
|
|
34
|
+
return "#fbbc04";
|
|
35
|
+
return "#ea4335";
|
|
36
|
+
}
|
|
37
|
+
function actionIcon(type) {
|
|
38
|
+
switch (type) {
|
|
39
|
+
case "question": return { icon: "help", color: "#e37400", label: "Decision Needed" };
|
|
40
|
+
case "blocker": return { icon: "block", color: "#d93025", label: "Blocker" };
|
|
41
|
+
case "manual": return { icon: "build", color: "#1a73e8", label: "Manual Step" };
|
|
42
|
+
case "decision": return { icon: "gavel", color: "#8430ce", label: "Decision Needed" };
|
|
43
|
+
default: return { icon: "flag", color: "#5f6368", label: "Action" };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ─── Generators ─────────────────────────────────────────────────────────
|
|
47
|
+
function generateActionCard(item) {
|
|
48
|
+
const a = actionIcon(item.type);
|
|
49
|
+
return `
|
|
50
|
+
<div class="action-card" data-project="${esc(item.projectName)}">
|
|
51
|
+
<div class="action-icon" style="background:${a.color}">
|
|
52
|
+
<span class="material-icons-outlined">${a.icon}</span>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="action-body">
|
|
55
|
+
<div class="action-text">${inlineMd(item.text)}</div>
|
|
56
|
+
<div class="action-meta">
|
|
57
|
+
<span class="action-project">${esc(item.projectName)}</span>
|
|
58
|
+
<span class="action-type">${a.label}</span>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>`;
|
|
62
|
+
}
|
|
63
|
+
function generateReadinessRing(score, size = 56) {
|
|
64
|
+
const r = (size - 6) / 2;
|
|
65
|
+
const c = Math.PI * 2 * r;
|
|
66
|
+
const offset = c - (score / 100) * c;
|
|
67
|
+
const color = readinessColor(score);
|
|
68
|
+
return `
|
|
69
|
+
<svg width="${size}" height="${size}" class="ring">
|
|
70
|
+
<circle cx="${size / 2}" cy="${size / 2}" r="${r}" fill="none" stroke="var(--border)" stroke-width="5"/>
|
|
71
|
+
<circle cx="${size / 2}" cy="${size / 2}" r="${r}" fill="none" stroke="${color}" stroke-width="5"
|
|
72
|
+
stroke-dasharray="${c}" stroke-dashoffset="${offset}"
|
|
73
|
+
stroke-linecap="round" transform="rotate(-90 ${size / 2} ${size / 2})"
|
|
74
|
+
style="transition:stroke-dashoffset 0.8s ease"/>
|
|
75
|
+
<text x="${size / 2}" y="${size / 2}" text-anchor="middle" dy="0.35em"
|
|
76
|
+
fill="${color}" font-size="13" font-weight="700" font-family="Inter,sans-serif">${score}%</text>
|
|
77
|
+
</svg>`;
|
|
78
|
+
}
|
|
79
|
+
function generateBlockingList(snap) {
|
|
80
|
+
if (snap.readiness.blocking.length === 0 && snap.actionItems.length === 0)
|
|
81
|
+
return "";
|
|
82
|
+
const items = [];
|
|
83
|
+
// Action items first (questions, blockers, manual steps)
|
|
84
|
+
for (const a of snap.actionItems) {
|
|
85
|
+
const ai = actionIcon(a.type);
|
|
86
|
+
items.push(`
|
|
87
|
+
<div class="block-item">
|
|
88
|
+
<span class="material-icons-outlined" style="color:${ai.color};font-size:1rem">${ai.icon}</span>
|
|
89
|
+
<span>${inlineMd(a.text)}</span>
|
|
90
|
+
</div>`);
|
|
91
|
+
}
|
|
92
|
+
// Then blocking items from status that aren't already covered
|
|
93
|
+
const actionTexts = new Set(snap.actionItems.map((a) => a.text.toLowerCase().slice(0, 40)));
|
|
94
|
+
for (const b of snap.readiness.blocking) {
|
|
95
|
+
if (actionTexts.has(b.toLowerCase().slice(0, 40)))
|
|
96
|
+
continue;
|
|
97
|
+
items.push(`
|
|
98
|
+
<div class="block-item">
|
|
99
|
+
<span class="material-icons-outlined" style="color:var(--text-secondary);font-size:1rem">arrow_forward</span>
|
|
100
|
+
<span>${inlineMd(b)}</span>
|
|
101
|
+
</div>`);
|
|
102
|
+
}
|
|
103
|
+
if (items.length === 0)
|
|
104
|
+
return "";
|
|
105
|
+
return `
|
|
106
|
+
<div class="section blockers-section">
|
|
107
|
+
<h4><span class="material-icons-outlined">priority_high</span> Blocking Go-Live</h4>
|
|
108
|
+
${items.join("\n")}
|
|
109
|
+
</div>`;
|
|
110
|
+
}
|
|
111
|
+
function generateDoneList(snap) {
|
|
112
|
+
if (snap.readiness.done.length === 0)
|
|
113
|
+
return "";
|
|
114
|
+
const items = snap.readiness.done.slice(0, 12).map((d) => `<div class="done-item"><span class="material-icons-outlined">check_circle</span><span>${inlineMd(d)}</span></div>`).join("\n");
|
|
115
|
+
return `
|
|
116
|
+
<div class="section done-section">
|
|
117
|
+
<h4><span class="material-icons-outlined">check_circle</span> Completed</h4>
|
|
118
|
+
${items}
|
|
119
|
+
</div>`;
|
|
120
|
+
}
|
|
121
|
+
function generateCategoryBars(snap, accent) {
|
|
122
|
+
const cats = Object.entries(snap.memoryCounts.byCategory).sort((a, b) => b[1] - a[1]);
|
|
123
|
+
const max = cats[0]?.[1] || 1;
|
|
124
|
+
return cats.map(([cat, count]) => {
|
|
125
|
+
const pct = Math.round((count / max) * 100);
|
|
126
|
+
return `<div class="cat-row">
|
|
127
|
+
<span class="cat-label">${esc(cat)}</span>
|
|
128
|
+
<div class="cat-track"><div class="cat-fill" style="width:${pct}%;background:${accent}"></div></div>
|
|
129
|
+
<span class="cat-count">${count}</span>
|
|
130
|
+
</div>`;
|
|
131
|
+
}).join("\n");
|
|
132
|
+
}
|
|
133
|
+
function generateRoadmap(snap) {
|
|
134
|
+
if (snap.roadmap.length === 0)
|
|
135
|
+
return "";
|
|
136
|
+
const items = snap.roadmap.map((r) => `<div class="road-item"><span class="material-icons-outlined">flag</span>
|
|
137
|
+
<div><strong>${esc(r.title)}</strong> <span class="mem-id">${esc(r.id)}</span></div></div>`).join("\n");
|
|
138
|
+
return `<div class="section"><h4><span class="material-icons-outlined">map</span> Roadmap</h4>${items}</div>`;
|
|
139
|
+
}
|
|
140
|
+
function generateActivity(snap, accent) {
|
|
141
|
+
if (snap.recentActivity.length === 0)
|
|
142
|
+
return "";
|
|
143
|
+
const items = snap.recentActivity.slice(0, 5).map((a) => `<div class="act-item">
|
|
144
|
+
<span class="act-cat" style="background:${accent}">${esc(a.category)}</span>
|
|
145
|
+
<span class="act-title">${esc(a.title)}</span>
|
|
146
|
+
<span class="act-date">${a.modified.split("T")[0]}</span>
|
|
147
|
+
</div>`).join("\n");
|
|
148
|
+
return `<div class="section"><h4><span class="material-icons-outlined">history</span> Recent Activity</h4>${items}</div>`;
|
|
149
|
+
}
|
|
150
|
+
function getStatusAge(snap) {
|
|
151
|
+
if (!snap.latestStatus)
|
|
152
|
+
return { days: -1, label: "No status", stale: true };
|
|
153
|
+
const modified = new Date(snap.latestStatus.modified).getTime();
|
|
154
|
+
const days = Math.floor((Date.now() - modified) / (1000 * 60 * 60 * 24));
|
|
155
|
+
if (days === 0)
|
|
156
|
+
return { days, label: "Today", stale: false };
|
|
157
|
+
if (days === 1)
|
|
158
|
+
return { days, label: "Yesterday", stale: false };
|
|
159
|
+
if (days <= 7)
|
|
160
|
+
return { days, label: `${days}d ago`, stale: false };
|
|
161
|
+
if (days <= 14)
|
|
162
|
+
return { days, label: `${days}d ago`, stale: true };
|
|
163
|
+
return { days, label: `${days}d ago`, stale: true };
|
|
164
|
+
}
|
|
165
|
+
function generateProjectCard(snap, index) {
|
|
166
|
+
const c = PALETTE[index % PALETTE.length];
|
|
167
|
+
const hasBlockers = snap.actionItems.length > 0 || snap.readiness.blocking.length > 0;
|
|
168
|
+
const blockerCount = snap.actionItems.length + snap.readiness.blocking.length;
|
|
169
|
+
const age = getStatusAge(snap);
|
|
170
|
+
const staleBadge = age.stale
|
|
171
|
+
? `<span class="stale-badge" title="${age.days < 0 ? "No status memory exists. Run gnosys update-status in this project." : `Status is ${age.days} days old. Run gnosys update-status to refresh.`}"><span class="material-icons-outlined">schedule</span>${age.label}</span>`
|
|
172
|
+
: `<span class="fresh-badge" title="Status last updated ${age.label}">${age.label}</span>`;
|
|
173
|
+
return `
|
|
174
|
+
<div class="project-card${hasBlockers ? " has-blockers" : ""}${age.stale ? " stale-status" : ""}" id="proj-${esc(snap.project.name)}" data-project="${esc(snap.project.name)}">
|
|
175
|
+
<div class="card-head" style="border-left:4px solid ${c.accent}" onclick="toggle(this)">
|
|
176
|
+
<div class="card-head-left">
|
|
177
|
+
${generateReadinessRing(snap.readiness.score)}
|
|
178
|
+
<div>
|
|
179
|
+
<h3 style="color:${c.accent}">${esc(snap.project.name)} ${staleBadge}</h3>
|
|
180
|
+
<div class="card-label">${snap.readiness.label}${hasBlockers ? ` — <strong style="color:#d93025">${blockerCount} blocker${blockerCount !== 1 ? "s" : ""}</strong>` : ""}</div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="card-head-right">
|
|
184
|
+
<div class="mini-stats">
|
|
185
|
+
<span title="Memories"><span class="material-icons-outlined">memory</span>${snap.memoryCounts.total}</span>
|
|
186
|
+
<span title="Roadmap"><span class="material-icons-outlined">map</span>${snap.roadmap.length}</span>
|
|
187
|
+
<span title="Recent 7d"><span class="material-icons-outlined">update</span>${snap.recentActivity.length}</span>
|
|
188
|
+
</div>
|
|
189
|
+
<span class="material-icons-outlined chevron">expand_more</span>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
<div class="card-body">
|
|
193
|
+
${generateBlockingList(snap)}
|
|
194
|
+
<div class="card-cols">
|
|
195
|
+
<div class="card-col">
|
|
196
|
+
${generateDoneList(snap)}
|
|
197
|
+
<div class="section">
|
|
198
|
+
<h4><span class="material-icons-outlined">bar_chart</span> Categories</h4>
|
|
199
|
+
${generateCategoryBars(snap, c.accent)}
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="card-col">
|
|
203
|
+
${generateRoadmap(snap)}
|
|
204
|
+
${generateActivity(snap, c.accent)}
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>`;
|
|
209
|
+
}
|
|
210
|
+
// ─── Main ───────────────────────────────────────────────────────────────
|
|
211
|
+
export function generatePortfolioHtml(report, outputPath) {
|
|
212
|
+
const homeDir = process.env.HOME || "~";
|
|
213
|
+
const dashboardPath = outputPath || `${homeDir}/gnosys-dashboard.html`;
|
|
214
|
+
const regenCmd = `gnosys portfolio --output ${dashboardPath} && open ${dashboardPath}`;
|
|
215
|
+
const cards = report.projects.map((s, i) => generateProjectCard(s, i)).join("\n");
|
|
216
|
+
const totalBlockers = report.projects.reduce((s, p) => s + p.actionItems.length + p.readiness.blocking.length, 0);
|
|
217
|
+
const totalQuestions = report.allActionItems.filter((a) => a.type === "question" || a.type === "decision").length;
|
|
218
|
+
const avgReadiness = report.projects.length > 0
|
|
219
|
+
? Math.round(report.projects.reduce((s, p) => s + p.readiness.score, 0) / report.projects.length)
|
|
220
|
+
: 0;
|
|
221
|
+
const actionCards = report.allActionItems.map((a) => generateActionCard(a)).join("\n");
|
|
222
|
+
return `<!DOCTYPE html>
|
|
223
|
+
<html lang="en">
|
|
224
|
+
<head>
|
|
225
|
+
<meta charset="UTF-8">
|
|
226
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
227
|
+
<title>Gnosys Portfolio</title>
|
|
228
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined" rel="stylesheet">
|
|
229
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
230
|
+
<style>
|
|
231
|
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
|
232
|
+
:root{--bg:#f5f6f8;--surface:#fff;--text:#1a1a2e;--text2:#5f6368;--border:#e2e4e9;--shadow:0 1px 3px rgba(0,0,0,.06);--shadow2:0 4px 16px rgba(0,0,0,.08);--radius:10px}
|
|
233
|
+
@media(prefers-color-scheme:dark){:root{--bg:#121220;--surface:#1e1e36;--text:#e4e4f0;--text2:#8e8ea8;--border:#2e2e4a;--shadow:0 1px 3px rgba(0,0,0,.3);--shadow2:0 4px 16px rgba(0,0,0,.4)}}
|
|
234
|
+
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.5}
|
|
235
|
+
code{font-family:'JetBrains Mono',monospace;font-size:.75rem;background:var(--border);padding:.1rem .3rem;border-radius:3px}
|
|
236
|
+
|
|
237
|
+
/* ── Hero ── */
|
|
238
|
+
.hero{background:linear-gradient(135deg,#0f0f2d 0%,#1a1a4a 50%,#0f0f2d 100%);color:#fff;padding:2rem 2rem 1.75rem}
|
|
239
|
+
.hero-inner{max-width:1100px;margin:0 auto}
|
|
240
|
+
.hero h1{font-size:1.5rem;font-weight:700;letter-spacing:-.02em}
|
|
241
|
+
.hero .sub{color:#8e8ea8;font-size:.8rem;margin-bottom:1.25rem}
|
|
242
|
+
.hero-stats{display:flex;gap:.5rem;flex-wrap:wrap}
|
|
243
|
+
.hero-stat{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:.6rem 1rem;display:flex;align-items:center;gap:.5rem;cursor:pointer;transition:all .15s;user-select:none}
|
|
244
|
+
.hero-stat:hover{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.2)}
|
|
245
|
+
.hero-stat.active{background:rgba(100,130,255,.15);border-color:rgba(100,130,255,.4)}
|
|
246
|
+
.hero-stat .material-icons-outlined{font-size:1.1rem}
|
|
247
|
+
.hero-stat .val{font-size:1.3rem;font-weight:700}
|
|
248
|
+
.hero-stat label{font-size:.65rem;text-transform:uppercase;letter-spacing:.04em;color:#8e8ea8}
|
|
249
|
+
.stat-alert .val{color:#ff6b6b}
|
|
250
|
+
.stat-alert .material-icons-outlined{color:#ff6b6b}
|
|
251
|
+
.stat-ok .val{color:#4ade80}
|
|
252
|
+
.stat-ok .material-icons-outlined{color:#4ade80}
|
|
253
|
+
.stat-warn .val{color:#fbbf24}
|
|
254
|
+
.stat-warn .material-icons-outlined{color:#fbbf24}
|
|
255
|
+
|
|
256
|
+
/* ── Container ── */
|
|
257
|
+
.container{max-width:1100px;margin:0 auto;padding:1rem 2rem 3rem}
|
|
258
|
+
@media(max-width:768px){.container{padding:1rem}}
|
|
259
|
+
|
|
260
|
+
/* ── Attention panel ── */
|
|
261
|
+
.attention{margin-bottom:1.5rem;display:none}
|
|
262
|
+
.attention.visible{display:block}
|
|
263
|
+
.attention h2{font-size:.9rem;font-weight:600;color:var(--text2);margin-bottom:.75rem;display:flex;align-items:center;gap:.35rem}
|
|
264
|
+
.attention h2 .material-icons-outlined{font-size:1.1rem;color:#d93025}
|
|
265
|
+
.action-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:.5rem}
|
|
266
|
+
.action-card{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:.65rem .8rem;display:flex;gap:.6rem;align-items:flex-start;transition:box-shadow .15s;cursor:pointer}
|
|
267
|
+
.action-card:hover{box-shadow:var(--shadow2)}
|
|
268
|
+
.action-icon{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
|
269
|
+
.action-icon .material-icons-outlined{font-size:.95rem;color:#fff}
|
|
270
|
+
.action-body{flex:1;min-width:0}
|
|
271
|
+
.action-text{font-size:.8rem;line-height:1.4}
|
|
272
|
+
.action-meta{display:flex;gap:.5rem;margin-top:.25rem;font-size:.65rem;color:var(--text2)}
|
|
273
|
+
.action-project{font-weight:600}
|
|
274
|
+
.action-type{font-family:'JetBrains Mono',monospace;text-transform:uppercase;font-size:.6rem;letter-spacing:.03em}
|
|
275
|
+
|
|
276
|
+
/* ── Readiness bar ── */
|
|
277
|
+
.readiness-bar{margin-bottom:1.5rem}
|
|
278
|
+
.readiness-bar h2{font-size:.9rem;font-weight:600;color:var(--text2);margin-bottom:.75rem;display:flex;align-items:center;gap:.35rem}
|
|
279
|
+
.readiness-bar h2 .material-icons-outlined{font-size:1.1rem}
|
|
280
|
+
.readiness-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.5rem}
|
|
281
|
+
.readiness-card{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:.75rem;text-align:center;cursor:pointer;transition:all .15s}
|
|
282
|
+
.readiness-card:hover{box-shadow:var(--shadow2);transform:translateY(-1px)}
|
|
283
|
+
.readiness-card h4{font-size:.8rem;margin-top:.35rem;font-weight:600}
|
|
284
|
+
.readiness-card .label{font-size:.7rem;color:var(--text2)}
|
|
285
|
+
.ring{display:block;margin:0 auto}
|
|
286
|
+
|
|
287
|
+
/* ── Project Cards ── */
|
|
288
|
+
.project-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:.75rem;overflow:hidden;transition:box-shadow .15s}
|
|
289
|
+
.project-card:hover{box-shadow:var(--shadow2)}
|
|
290
|
+
.project-card.has-blockers{border-color:#fca5a5}
|
|
291
|
+
@media(prefers-color-scheme:dark){.project-card.has-blockers{border-color:#7f1d1d}}
|
|
292
|
+
|
|
293
|
+
.card-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;cursor:pointer;user-select:none}
|
|
294
|
+
.card-head-left{display:flex;align-items:center;gap:.75rem}
|
|
295
|
+
.card-head-left h3{font-size:1rem;font-weight:600}
|
|
296
|
+
.card-label{font-size:.75rem;color:var(--text2)}
|
|
297
|
+
.card-head-right{display:flex;align-items:center;gap:.75rem}
|
|
298
|
+
.mini-stats{display:flex;gap:.75rem;font-size:.75rem;color:var(--text2)}
|
|
299
|
+
.mini-stats span{display:flex;align-items:center;gap:.2rem}
|
|
300
|
+
.mini-stats .material-icons-outlined{font-size:.9rem}
|
|
301
|
+
.chevron{color:var(--text2);transition:transform .25s;font-size:1.3rem}
|
|
302
|
+
.project-card.expanded .chevron{transform:rotate(180deg)}
|
|
303
|
+
|
|
304
|
+
.card-body{max-height:0;overflow:hidden;transition:max-height .35s ease}
|
|
305
|
+
.project-card.expanded .card-body{max-height:5000px}
|
|
306
|
+
|
|
307
|
+
.card-cols{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;padding:0 1rem 1rem}
|
|
308
|
+
@media(max-width:768px){.card-cols{grid-template-columns:1fr}}
|
|
309
|
+
|
|
310
|
+
/* ── Blockers section (inside card) ── */
|
|
311
|
+
.blockers-section{background:#fef2f2;border:1px solid #fca5a5;border-radius:8px;padding:.75rem;margin:0 1rem .75rem}
|
|
312
|
+
@media(prefers-color-scheme:dark){.blockers-section{background:#2a1215;border-color:#7f1d1d}}
|
|
313
|
+
.blockers-section h4{color:#d93025}
|
|
314
|
+
|
|
315
|
+
/* ── Sections ── */
|
|
316
|
+
.section{margin-bottom:1rem}
|
|
317
|
+
.section h4{font-size:.8rem;font-weight:600;color:var(--text2);margin-bottom:.5rem;display:flex;align-items:center;gap:.3rem}
|
|
318
|
+
.section h4 .material-icons-outlined{font-size:.95rem}
|
|
319
|
+
.block-item{display:flex;align-items:flex-start;gap:.4rem;padding:.25rem 0;font-size:.78rem;line-height:1.4}
|
|
320
|
+
.done-item{display:flex;align-items:flex-start;gap:.4rem;padding:.2rem 0;font-size:.75rem;color:var(--text2)}
|
|
321
|
+
.done-item .material-icons-outlined{font-size:.9rem;color:#34a853;flex-shrink:0;margin-top:1px}
|
|
322
|
+
.done-section{max-height:200px;overflow-y:auto}
|
|
323
|
+
|
|
324
|
+
/* ── Category bars ── */
|
|
325
|
+
.cat-row{display:flex;align-items:center;gap:.4rem;margin-bottom:.3rem;font-size:.75rem}
|
|
326
|
+
.cat-label{width:100px;flex-shrink:0;text-align:right;color:var(--text2);font-family:'JetBrains Mono',monospace;font-size:.7rem}
|
|
327
|
+
.cat-track{flex:1;height:5px;background:var(--border);border-radius:3px;overflow:hidden}
|
|
328
|
+
.cat-fill{height:100%;border-radius:3px;transition:width .6s ease}
|
|
329
|
+
.cat-count{width:22px;text-align:right;font-weight:600;font-size:.7rem;font-family:'JetBrains Mono',monospace}
|
|
330
|
+
|
|
331
|
+
/* ── Roadmap/Activity ── */
|
|
332
|
+
.road-item{display:flex;align-items:flex-start;gap:.4rem;padding:.3rem 0;font-size:.78rem}
|
|
333
|
+
.road-item .material-icons-outlined{font-size:.95rem;color:#1a73e8;flex-shrink:0;margin-top:1px}
|
|
334
|
+
.mem-id{font-family:'JetBrains Mono',monospace;font-size:.6rem;color:var(--text2);margin-left:.3rem}
|
|
335
|
+
.act-item{display:flex;align-items:center;gap:.4rem;padding:.2rem 0;font-size:.75rem}
|
|
336
|
+
.act-cat{font-size:.55rem;color:#fff;padding:.1rem .35rem;border-radius:3px;flex-shrink:0;font-family:'JetBrains Mono',monospace;text-transform:uppercase}
|
|
337
|
+
.act-title{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
338
|
+
.act-date{font-family:'JetBrains Mono',monospace;font-size:.65rem;color:var(--text2);flex-shrink:0}
|
|
339
|
+
|
|
340
|
+
.footer{text-align:center;padding:1.5rem;font-size:.7rem;color:var(--text2)}
|
|
341
|
+
|
|
342
|
+
/* ── Prompt panel ── */
|
|
343
|
+
.prompt-box{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:1rem;font-family:'JetBrains Mono',monospace;font-size:.72rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:400px;overflow-y:auto;color:var(--text)}
|
|
344
|
+
.prompt-hint{font-size:.75rem;color:var(--text2);margin-top:.5rem}
|
|
345
|
+
.prompt-hint code{font-size:.7rem}
|
|
346
|
+
.copy-btn{background:none;border:1px solid var(--border);border-radius:4px;cursor:pointer;padding:.15rem .3rem;margin-left:.5rem;color:var(--text2);vertical-align:middle;transition:all .15s}
|
|
347
|
+
.copy-btn:hover{border-color:var(--text);color:var(--text)}
|
|
348
|
+
.copy-btn .material-icons-outlined{font-size:.9rem}
|
|
349
|
+
|
|
350
|
+
/* ── Regen spinner ── */
|
|
351
|
+
@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
|
|
352
|
+
.spinning{animation:spin .8s linear infinite}
|
|
353
|
+
|
|
354
|
+
/* ── Staleness indicators ── */
|
|
355
|
+
.stale-badge{display:inline-flex;align-items:center;gap:.2rem;font-size:.6rem;font-weight:500;color:#d93025;background:#fef2f2;border:1px solid #fca5a5;padding:.1rem .4rem;border-radius:4px;margin-left:.4rem;vertical-align:middle}
|
|
356
|
+
.stale-badge .material-icons-outlined{font-size:.75rem}
|
|
357
|
+
.fresh-badge{display:inline-flex;font-size:.6rem;font-weight:500;color:var(--text2);background:var(--bg);padding:.1rem .4rem;border-radius:4px;margin-left:.4rem;vertical-align:middle}
|
|
358
|
+
@media(prefers-color-scheme:dark){.stale-badge{background:#2a1215;border-color:#7f1d1d}}
|
|
359
|
+
.stale-status .card-head{opacity:.85}
|
|
360
|
+
.readiness-stale{opacity:.7;border:1px dashed var(--border)}
|
|
361
|
+
.readiness-age{font-size:.6rem;color:var(--text2);margin-top:.25rem}
|
|
362
|
+
.readiness-age.stale{color:#d93025;font-weight:600}
|
|
363
|
+
</style>
|
|
364
|
+
</head>
|
|
365
|
+
<body>
|
|
366
|
+
|
|
367
|
+
<div class="hero">
|
|
368
|
+
<div class="hero-inner">
|
|
369
|
+
<h1>Gnosys Portfolio</h1>
|
|
370
|
+
<p class="sub">Updated ${esc(report.generated)}</p>
|
|
371
|
+
<div class="hero-stats">
|
|
372
|
+
<div class="hero-stat ${totalBlockers > 0 ? "stat-alert" : "stat-ok"}" onclick="togglePanel('attention')" title="Click to show/hide action items">
|
|
373
|
+
<span class="material-icons-outlined">${totalBlockers > 0 ? "warning" : "check_circle"}</span>
|
|
374
|
+
<span class="val">${totalBlockers}</span>
|
|
375
|
+
<label>Blockers</label>
|
|
376
|
+
</div>
|
|
377
|
+
<div class="hero-stat ${totalQuestions > 0 ? "stat-warn" : "stat-ok"}" onclick="filterByType('question')" title="Click to show open questions">
|
|
378
|
+
<span class="material-icons-outlined">help</span>
|
|
379
|
+
<span class="val">${totalQuestions}</span>
|
|
380
|
+
<label>Questions</label>
|
|
381
|
+
</div>
|
|
382
|
+
<div class="hero-stat" onclick="togglePanel('readiness-section')">
|
|
383
|
+
<span class="material-icons-outlined">speed</span>
|
|
384
|
+
<span class="val">${avgReadiness}%</span>
|
|
385
|
+
<label>Avg Ready</label>
|
|
386
|
+
</div>
|
|
387
|
+
<div class="hero-stat">
|
|
388
|
+
<span class="material-icons-outlined">folder_open</span>
|
|
389
|
+
<span class="val">${report.totalProjects}</span>
|
|
390
|
+
<label>Projects</label>
|
|
391
|
+
</div>
|
|
392
|
+
<div class="hero-stat">
|
|
393
|
+
<span class="material-icons-outlined">memory</span>
|
|
394
|
+
<span class="val">${report.totalMemories}</span>
|
|
395
|
+
<label>Memories</label>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="hero-stat" onclick="regenerate()" title="Regenerate this dashboard" style="margin-left:auto">
|
|
398
|
+
<span class="material-icons-outlined" id="regen-icon">refresh</span>
|
|
399
|
+
<label>Regenerate</label>
|
|
400
|
+
</div>
|
|
401
|
+
<div class="hero-stat" onclick="togglePanel('prompt-panel')" title="Show status update prompt for AI agents">
|
|
402
|
+
<span class="material-icons-outlined">terminal</span>
|
|
403
|
+
<label>AI Prompt</label>
|
|
404
|
+
</div>
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
</div>
|
|
408
|
+
|
|
409
|
+
<div class="container">
|
|
410
|
+
|
|
411
|
+
<!-- Attention Panel (toggled by hero stat) -->
|
|
412
|
+
<div class="attention${report.allActionItems.length > 0 ? " visible" : ""}" id="attention">
|
|
413
|
+
<h2><span class="material-icons-outlined">notification_important</span> Needs Your Attention</h2>
|
|
414
|
+
<div class="action-grid">
|
|
415
|
+
${actionCards}
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<!-- AI Status Prompt Panel -->
|
|
420
|
+
<div class="attention" id="prompt-panel">
|
|
421
|
+
<h2><span class="material-icons-outlined">terminal</span> AI Status Update Prompt <button class="copy-btn" onclick="copyPrompt()" title="Copy to clipboard"><span class="material-icons-outlined">content_copy</span></button></h2>
|
|
422
|
+
<pre class="prompt-box" id="status-prompt">${esc(STATUS_UPDATE_PROMPT)}</pre>
|
|
423
|
+
<p class="prompt-hint">Give this prompt to any AI agent working in a project. It will generate a dashboard-compatible status memory via <code>gnosys_add_structured</code>. You can also run <code>gnosys update-status</code> in a project directory to get a project-specific version.</p>
|
|
424
|
+
</div>
|
|
425
|
+
|
|
426
|
+
<!-- Readiness Overview -->
|
|
427
|
+
<div class="readiness-bar" id="readiness-section">
|
|
428
|
+
<h2><span class="material-icons-outlined">speed</span> Production Readiness</h2>
|
|
429
|
+
<div class="readiness-grid">
|
|
430
|
+
${report.projects.map((s, i) => {
|
|
431
|
+
const a = getStatusAge(s);
|
|
432
|
+
const staleClass = a.stale ? " readiness-stale" : "";
|
|
433
|
+
const ageHtml = a.stale
|
|
434
|
+
? `<div class="readiness-age stale">${a.label}</div>`
|
|
435
|
+
: `<div class="readiness-age">${a.label}</div>`;
|
|
436
|
+
return `
|
|
437
|
+
<div class="readiness-card${staleClass}" onclick="scrollToProject('${esc(s.project.name)}')">
|
|
438
|
+
${generateReadinessRing(s.readiness.score)}
|
|
439
|
+
<h4>${esc(s.project.name)}</h4>
|
|
440
|
+
<div class="label">${s.readiness.label}</div>
|
|
441
|
+
${ageHtml}
|
|
442
|
+
</div>`;
|
|
443
|
+
}).join("\n")}
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
|
|
447
|
+
<!-- Project Cards -->
|
|
448
|
+
${cards}
|
|
449
|
+
|
|
450
|
+
</div>
|
|
451
|
+
|
|
452
|
+
<div class="footer">
|
|
453
|
+
Powered by <strong>Gnosys</strong> — ${report.totalMemories} memories across ${report.totalProjects} projects
|
|
454
|
+
</div>
|
|
455
|
+
|
|
456
|
+
<script>
|
|
457
|
+
function toggle(el){el.closest('.project-card').classList.toggle('expanded')}
|
|
458
|
+
|
|
459
|
+
function togglePanel(id){
|
|
460
|
+
const el=document.getElementById(id);
|
|
461
|
+
if(el)el.classList.toggle('visible');
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function regenerate(){
|
|
465
|
+
const icon=document.getElementById('regen-icon');
|
|
466
|
+
icon.classList.add('spinning');
|
|
467
|
+
// Copy the regenerate command to clipboard so user can paste in terminal
|
|
468
|
+
const cmd='${esc(regenCmd)}';
|
|
469
|
+
navigator.clipboard.writeText(cmd).then(()=>{
|
|
470
|
+
icon.textContent='check';
|
|
471
|
+
icon.classList.remove('spinning');
|
|
472
|
+
setTimeout(()=>{icon.textContent='refresh'},2000);
|
|
473
|
+
// Show a brief toast
|
|
474
|
+
const toast=document.createElement('div');
|
|
475
|
+
toast.style.cssText='position:fixed;bottom:1.5rem;left:50%;transform:translateX(-50%);background:#1a1a2e;color:#fff;padding:.5rem 1rem;border-radius:8px;font-size:.8rem;z-index:999;box-shadow:0 4px 12px rgba(0,0,0,.3)';
|
|
476
|
+
toast.textContent='Regenerate command copied to clipboard — paste in terminal';
|
|
477
|
+
document.body.appendChild(toast);
|
|
478
|
+
setTimeout(()=>toast.remove(),3500);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
function copyPrompt(){
|
|
483
|
+
const text=document.getElementById('status-prompt').textContent;
|
|
484
|
+
navigator.clipboard.writeText(text).then(()=>{
|
|
485
|
+
const toast=document.createElement('div');
|
|
486
|
+
toast.style.cssText='position:fixed;bottom:1.5rem;left:50%;transform:translateX(-50%);background:#1a1a2e;color:#fff;padding:.5rem 1rem;border-radius:8px;font-size:.8rem;z-index:999;box-shadow:0 4px 12px rgba(0,0,0,.3)';
|
|
487
|
+
toast.textContent='Status update prompt copied to clipboard';
|
|
488
|
+
document.body.appendChild(toast);
|
|
489
|
+
setTimeout(()=>toast.remove(),2500);
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
function scrollToProject(name){
|
|
494
|
+
const card=document.getElementById('proj-'+name);
|
|
495
|
+
if(!card)return;
|
|
496
|
+
card.classList.add('expanded');
|
|
497
|
+
card.scrollIntoView({behavior:'smooth',block:'start'});
|
|
498
|
+
card.style.outline='2px solid #4285f4';
|
|
499
|
+
setTimeout(()=>card.style.outline='',2000);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function filterByType(type){
|
|
503
|
+
// Show attention panel
|
|
504
|
+
const panel=document.getElementById('attention');
|
|
505
|
+
panel.classList.add('visible');
|
|
506
|
+
|
|
507
|
+
// Expand projects that have this type of action item
|
|
508
|
+
document.querySelectorAll('.project-card').forEach(c=>{
|
|
509
|
+
const name=c.dataset.project;
|
|
510
|
+
const hasType=document.querySelector('.action-card[data-project="'+name+'"]');
|
|
511
|
+
if(hasType)c.classList.add('expanded');
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
// Highlight matching action cards
|
|
515
|
+
document.querySelectorAll('.action-card').forEach(c=>{
|
|
516
|
+
c.style.outline='none';
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// Scroll to attention panel
|
|
520
|
+
panel.scrollIntoView({behavior:'smooth',block:'start'});
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Click action card → scroll to that project
|
|
524
|
+
document.querySelectorAll('.action-card').forEach(card=>{
|
|
525
|
+
card.addEventListener('click',()=>{
|
|
526
|
+
const name=card.dataset.project;
|
|
527
|
+
scrollToProject(name);
|
|
528
|
+
});
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
// Auto-expand projects with blockers on load
|
|
532
|
+
document.querySelectorAll('.project-card.has-blockers').forEach(c=>c.classList.add('expanded'));
|
|
533
|
+
</script>
|
|
534
|
+
</body>
|
|
535
|
+
</html>`;
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=portfolioHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolioHtml.js","sourceRoot":"","sources":["../../src/lib/portfolioHtml.ts"],"names":[],"mappings":"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"}
|
package/dist/postinstall.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Postinstall hook —
|
|
3
|
+
* Postinstall hook — detects fresh install vs upgrade and tells the user
|
|
4
|
+
* exactly what to do next. Runs `gnosys upgrade` automatically on upgrades.
|
|
4
5
|
* Only runs in interactive terminals (TTY). Silently exits in CI/Docker/scripts.
|
|
5
6
|
*/
|
|
6
7
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|