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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/lib/portfolio.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAY,SAAS,EAAE,MAAM,SAAS,CAAC;AAIxD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IACF,qDAAqD;IACrD,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,8BAA8B;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,4BAA4B;IAC5B,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,mCAAmC;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,oDAAoD;IACpD,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,sEAAsE;IACtE,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,sCAAsC;IACtC,SAAS,EAAE;QACT,kBAAkB;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,6EAA6E;QAC7E,KAAK,EAAE,MAAM,CAAC;QACd,4CAA4C;QAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,8BAA8B;QAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,0DAA0D;IAC1D,cAAc,EAAE,UAAU,EAAE,CAAC;CAC9B;AAgUD,yCAAyC;AACzC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,eAAe,CAkC/D;AA2BD,uCAAuC;AACvC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAuEvE;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA2BtE;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,y0KAyHgL,CAAC;AAElN,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAQrF"}
@@ -0,0 +1,618 @@
1
+ /**
2
+ * Gnosys Portfolio — Cross-project status dashboard
3
+ *
4
+ * Queries the central DB for all registered projects and generates
5
+ * a formatted dashboard showing blockers, production readiness,
6
+ * open questions, and roadmap status.
7
+ */
8
+ // ─── Core ───────────────────────────────────────────────────────────────
9
+ /** Parse tags from the DB column (JSON array string or comma-separated) */
10
+ function parseTags(raw) {
11
+ if (!raw)
12
+ return [];
13
+ try {
14
+ const parsed = JSON.parse(raw);
15
+ if (Array.isArray(parsed))
16
+ return parsed.filter((t) => typeof t === "string");
17
+ }
18
+ catch {
19
+ // fallback: comma-separated
20
+ }
21
+ return raw.split(",").map((s) => s.trim()).filter(Boolean);
22
+ }
23
+ /** Extract action items from memory content */
24
+ function extractActionItems(content, projectName, sourceId, sourceTitle) {
25
+ const items = [];
26
+ const lines = content.split("\n");
27
+ // Track which section we're in to improve classification
28
+ let inWaitingOnHuman = false;
29
+ let inBlockers = false;
30
+ let inOpenDecisions = false;
31
+ for (const line of lines) {
32
+ // Detect guided-checklist section headings
33
+ if (/^#+\s*waiting on human/i.test(line)) {
34
+ inWaitingOnHuman = true;
35
+ inBlockers = false;
36
+ inOpenDecisions = false;
37
+ continue;
38
+ }
39
+ if (/^#+\s*blocker/i.test(line)) {
40
+ inBlockers = true;
41
+ inWaitingOnHuman = false;
42
+ inOpenDecisions = false;
43
+ continue;
44
+ }
45
+ if (/^#+\s*open decision/i.test(line)) {
46
+ inOpenDecisions = true;
47
+ inWaitingOnHuman = false;
48
+ inBlockers = false;
49
+ continue;
50
+ }
51
+ if (/^#+\s/.test(line)) {
52
+ inWaitingOnHuman = false;
53
+ inBlockers = false;
54
+ inOpenDecisions = false;
55
+ }
56
+ const trimmed = line.replace(/^[-*\d.)\s]+/, "").trim();
57
+ if (!trimmed || trimmed.length < 10)
58
+ continue;
59
+ // Skip checklist formatting
60
+ if (/^\[[ xX]\]/.test(trimmed))
61
+ continue;
62
+ // Items in explicit sections get classified directly
63
+ if (inWaitingOnHuman) {
64
+ items.push({ type: "manual", text: trimmed.replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "), projectName, sourceId, sourceTitle });
65
+ continue;
66
+ }
67
+ if (inBlockers) {
68
+ items.push({ type: "blocker", text: trimmed.replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "), projectName, sourceId, sourceTitle });
69
+ continue;
70
+ }
71
+ if (inOpenDecisions) {
72
+ items.push({ type: "decision", text: trimmed.replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "), projectName, sourceId, sourceTitle });
73
+ continue;
74
+ }
75
+ // Fallback: pattern-match for action items in unstructured content
76
+ // Account/service setup
77
+ if (/\b(apple developer|developer program|sign[- ]?up|create.*(account|certificate)|register|enroll|submission|publish to|deploy to)\b/i.test(trimmed) &&
78
+ /\b(need|require|must|block|pending|not yet|missing)\b/i.test(trimmed)) {
79
+ items.push({ type: "manual", text: trimmed, projectName, sourceId, sourceTitle });
80
+ continue;
81
+ }
82
+ // Decisions needed
83
+ if (/\b(needs?.*(edward|confirm|decision|your|input)|decision.*needed|open question|still open|choose between|recommend)\b/i.test(trimmed) &&
84
+ !/resolved/i.test(trimmed)) {
85
+ items.push({ type: "decision", text: trimmed, projectName, sourceId, sourceTitle });
86
+ continue;
87
+ }
88
+ // Explicit blockers
89
+ if (/\b(block(s|ed|er|ing)|require[sd]?|must|cannot|gatekeeper|without (it|this))\b/i.test(trimmed) &&
90
+ /\b(sign|notari|certificate|account|api key|token|credential|dns|domain|migration|deploy|publish|submit)\b/i.test(trimmed)) {
91
+ items.push({ type: "blocker", text: trimmed, projectName, sourceId, sourceTitle });
92
+ }
93
+ }
94
+ return items;
95
+ }
96
+ /** Extract blockers and "done" items from status content for readiness */
97
+ function extractReadiness(snap) {
98
+ const done = [];
99
+ const blocking = [];
100
+ if (!snap.latestStatus) {
101
+ return { score: 0, label: "Unknown", done: [], blocking: ["No status snapshot available"] };
102
+ }
103
+ const content = snap.latestStatus.content;
104
+ const lines = content.split("\n");
105
+ // Patterns that signal "done" sections
106
+ const donePattern = /^#+\s*(what'?s?.*(complete|done|built|shipped)|all.*done|complete[d]?\s*(work|as|in|features)?|features|core (architecture|features|functionality)|infrastructure)/i;
107
+ // Also match plain text section openers like "Completed in the app:"
108
+ const doneTextPattern = /^(completed|done|built|shipped|working|functional|implemented)\b/i;
109
+ // Patterns that signal "blocking/remaining" sections — includes new guided checklist headings
110
+ const blockPattern = /^#+\s*(what'?s?.*(not|left|missing|next|blocking)|to (go live|ship)|gap|blocker|remaining|pending|bug|not (started|done|built)|issue|missing|product gaps|waiting on human|open decision|roadmap change)/i;
111
+ // Also match "X gaps:" or "Not started:" as plain text
112
+ const blockTextPattern = /^(not (started|done|built|implemented)|remaining|gaps?|blocker|missing|pending|issue|app product gaps|waiting on)\b/i;
113
+ let section = "none";
114
+ for (const line of lines) {
115
+ // Detect section headings (markdown ## or ### style)
116
+ if (donePattern.test(line)) {
117
+ section = "done";
118
+ continue;
119
+ }
120
+ if (blockPattern.test(line)) {
121
+ section = "blocking";
122
+ continue;
123
+ }
124
+ // Detect plain text section openers (e.g. "Completed in the app:")
125
+ if (section === "none" && doneTextPattern.test(line.trim()) && line.trim().endsWith(":")) {
126
+ section = "done";
127
+ continue;
128
+ }
129
+ if (section === "none" && blockTextPattern.test(line.trim()) && line.trim().endsWith(":")) {
130
+ section = "blocking";
131
+ continue;
132
+ }
133
+ // Sub-headings within a section: keep the section but skip the heading text
134
+ if (/^#{3,}\s/.test(line) && section !== "none") {
135
+ // Check if sub-heading switches context
136
+ if (donePattern.test(line)) {
137
+ section = "done";
138
+ continue;
139
+ }
140
+ if (blockPattern.test(line)) {
141
+ section = "blocking";
142
+ continue;
143
+ }
144
+ continue; // stay in current section
145
+ }
146
+ // Top-level headings (# or ##) reset section
147
+ if (/^#{1,2}\s/.test(line) && section !== "none") {
148
+ // Unless it's clearly a continuation of done/blocking
149
+ if (donePattern.test(line)) {
150
+ section = "done";
151
+ continue;
152
+ }
153
+ if (blockPattern.test(line)) {
154
+ section = "blocking";
155
+ continue;
156
+ }
157
+ section = "none";
158
+ continue;
159
+ }
160
+ // Bold-label lines like "**name**: description" — treat as items in current section
161
+ // or if no section yet, infer from content (success words = done, problem words = blocking)
162
+ if (/^\*\*[^*]+\*\*:/.test(line.trim()) && section === "none") {
163
+ const lower = line.toLowerCase();
164
+ if (/succeed|pass|complete|built|working|functional|clean|integrat/i.test(lower)) {
165
+ done.push(line.trim().replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "));
166
+ }
167
+ else if (/fail|miss|broken|block|error|not|issue|gap|pending/i.test(lower)) {
168
+ blocking.push(line.trim().replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "));
169
+ }
170
+ else {
171
+ // Ambiguous — treat as done (build status reports are usually positive when listing)
172
+ done.push(line.trim().replace(/^\*\*(.+?)\*\*:?\s*/, "$1: "));
173
+ }
174
+ continue;
175
+ }
176
+ const trimmed = line.replace(/^[-*\d.)\s]+/, "").trim();
177
+ if (!trimmed || trimmed.length < 5)
178
+ continue;
179
+ // Skip pure markdown formatting
180
+ if (/^\*\*[^*]+\*\*$/.test(trimmed) && trimmed.length < 30)
181
+ continue;
182
+ // Strip leading bold markers for cleaner display
183
+ const cleaned = trimmed.replace(/^\*\*(.+?)\*\*:?\s*/, "$1: ").replace(/^\*\*(.+?)\*\*$/, "$1");
184
+ if (section === "done") {
185
+ done.push(cleaned);
186
+ }
187
+ else if (section === "blocking") {
188
+ blocking.push(cleaned);
189
+ }
190
+ }
191
+ // Calculate score
192
+ const totalItems = done.length + blocking.length;
193
+ let score;
194
+ if (totalItems === 0) {
195
+ score = 50; // No structured done/blocking data found
196
+ }
197
+ else {
198
+ score = Math.round((done.length / totalItems) * 100);
199
+ }
200
+ // Adjust for open questions (each unresolved question reduces score slightly)
201
+ const unresolvedQuestions = snap.openQuestions.filter((q) => !/resolved/i.test(q.title)).length;
202
+ score = Math.max(0, score - unresolvedQuestions * 3);
203
+ // Determine label
204
+ let label;
205
+ if (score >= 95)
206
+ label = "Shipped";
207
+ else if (score >= 85)
208
+ label = "Ready";
209
+ else if (score >= 65)
210
+ label = "Mostly Done";
211
+ else if (score >= 30)
212
+ label = "In Progress";
213
+ else
214
+ label = "Early";
215
+ return { score, label, done: done.slice(0, 20), blocking: blocking.slice(0, 20) };
216
+ }
217
+ /** Build a snapshot for a single project */
218
+ function buildProjectSnapshot(db, project) {
219
+ const memories = db.getMemoriesByProject(project.id);
220
+ // Count by category
221
+ const byCategory = {};
222
+ for (const m of memories) {
223
+ byCategory[m.category] = (byCategory[m.category] || 0) + 1;
224
+ }
225
+ // Find best status snapshot — search ALL categories, prefer "status" or "go-live" in title
226
+ const statusCandidates = memories
227
+ .filter((m) => /status|go.?live|complete|shipped|what'?s (left|done|built)|readiness/i.test(m.title))
228
+ .sort((a, b) => {
229
+ // Prefer memories with "status" or "project status" in title
230
+ const aIsStatus = /\bstatus\b/i.test(a.title) ? 1 : 0;
231
+ const bIsStatus = /\bstatus\b/i.test(b.title) ? 1 : 0;
232
+ if (bIsStatus !== aIsStatus)
233
+ return bIsStatus - aIsStatus;
234
+ // Then by recency
235
+ return (b.modified || b.created).localeCompare(a.modified || a.created);
236
+ });
237
+ // If multiple status memories exist (e.g. "completed" + "remaining"), merge them
238
+ // Prefer memories with "Project Status" or "status" in title for the merge
239
+ const completedMem = statusCandidates.find((m) => /\bstatus\b.*complete|complete.*\bstatus\b|shipped/i.test(m.title))
240
+ || statusCandidates.find((m) => /complete|shipped|done|built/i.test(m.title));
241
+ const remainingMem = statusCandidates.find((m) => /left|remaining|gaps|not done|not started/i.test(m.title) && m.id !== completedMem?.id);
242
+ let latestStatus = null;
243
+ if (completedMem && remainingMem) {
244
+ // Merge both into one synthetic status
245
+ const merged = `${completedMem.content || ""}\n\n${remainingMem.content || ""}`;
246
+ latestStatus = {
247
+ id: completedMem.id,
248
+ title: `${completedMem.title} + ${remainingMem.title}`,
249
+ modified: completedMem.modified || completedMem.created,
250
+ content: merged,
251
+ };
252
+ }
253
+ else if (statusCandidates[0]) {
254
+ const s = statusCandidates[0];
255
+ latestStatus = { id: s.id, title: s.title, modified: s.modified || s.created, content: s.content || "" };
256
+ }
257
+ else {
258
+ // Fallback: latest landscape memory
259
+ const landscapes = memories
260
+ .filter((m) => m.category === "landscape")
261
+ .sort((a, b) => (b.modified || b.created).localeCompare(a.modified || a.created));
262
+ if (landscapes[0]) {
263
+ const s = landscapes[0];
264
+ latestStatus = { id: s.id, title: s.title, modified: s.modified || s.created, content: s.content || "" };
265
+ }
266
+ }
267
+ // Roadmap memories
268
+ const roadmap = memories
269
+ .filter((m) => m.category === "roadmap")
270
+ .map((m) => ({ id: m.id, title: m.title, content: m.content || "" }));
271
+ // Open questions (exclude resolved)
272
+ const openQuestions = memories
273
+ .filter((m) => m.category === "open-questions")
274
+ .map((m) => ({ id: m.id, title: m.title, content: m.content || "" }));
275
+ // Top tags
276
+ const tagCounts = new Map();
277
+ for (const m of memories) {
278
+ for (const tag of parseTags(m.tags)) {
279
+ tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);
280
+ }
281
+ }
282
+ const topTags = [...tagCounts.entries()]
283
+ .sort((a, b) => b[1] - a[1])
284
+ .slice(0, 8)
285
+ .map(([tag, count]) => ({ tag, count }));
286
+ // Recent activity (last 7 days)
287
+ const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
288
+ const recentActivity = memories
289
+ .filter((m) => (m.modified || m.created) >= sevenDaysAgo)
290
+ .sort((a, b) => (b.modified || b.created).localeCompare(a.modified || a.created))
291
+ .slice(0, 10)
292
+ .map((m) => ({ id: m.id, title: m.title, category: m.category, modified: m.modified || m.created }));
293
+ // Extract action items from status + roadmap memories
294
+ const actionItems = [];
295
+ if (latestStatus) {
296
+ actionItems.push(...extractActionItems(latestStatus.content, project.name, latestStatus.id, latestStatus.title));
297
+ }
298
+ for (const r of roadmap) {
299
+ actionItems.push(...extractActionItems(r.content, project.name, r.id, r.title));
300
+ }
301
+ // Open questions are action items by definition
302
+ for (const q of openQuestions) {
303
+ if (!/resolved/i.test(q.title)) {
304
+ actionItems.push({
305
+ type: "question",
306
+ text: q.title.replace(/^(open question:?\s*)/i, ""),
307
+ projectName: project.name,
308
+ sourceId: q.id,
309
+ sourceTitle: q.title,
310
+ });
311
+ }
312
+ }
313
+ // Deduplicate by text similarity
314
+ const seen = new Set();
315
+ const uniqueActions = actionItems.filter((a) => {
316
+ const key = a.text.toLowerCase().slice(0, 60);
317
+ if (seen.has(key))
318
+ return false;
319
+ seen.add(key);
320
+ return true;
321
+ });
322
+ const readiness = extractReadiness({ latestStatus, roadmap, openQuestions });
323
+ return {
324
+ project,
325
+ memoryCounts: { total: memories.length, byCategory },
326
+ latestStatus,
327
+ roadmap,
328
+ openQuestions,
329
+ topTags,
330
+ recentActivity,
331
+ actionItems: uniqueActions,
332
+ readiness,
333
+ };
334
+ }
335
+ /** Generate the full portfolio report */
336
+ export function generatePortfolio(db) {
337
+ const projects = db.getAllProjects();
338
+ // Filter out test projects (those in /tmp/ or /private/tmp/)
339
+ const realProjects = projects.filter((p) => !p.working_directory.startsWith("/tmp/") && !p.working_directory.startsWith("/private/tmp/"));
340
+ const snapshots = realProjects.map((p) => buildProjectSnapshot(db, p));
341
+ // Filter out projects with 0 memories
342
+ const activeSnapshots = snapshots.filter((s) => s.memoryCounts.total > 0);
343
+ const totalMemories = activeSnapshots.reduce((sum, s) => sum + s.memoryCounts.total, 0);
344
+ // Collect all action items, sorted: questions first, then blockers, then manual, then decisions
345
+ const typeOrder = { question: 0, blocker: 1, manual: 2, decision: 3 };
346
+ const allActionItems = activeSnapshots
347
+ .flatMap((s) => s.actionItems)
348
+ .sort((a, b) => (typeOrder[a.type] ?? 9) - (typeOrder[b.type] ?? 9));
349
+ // Sort projects: most action items first, then by readiness (lowest first)
350
+ activeSnapshots.sort((a, b) => {
351
+ if (b.actionItems.length !== a.actionItems.length)
352
+ return b.actionItems.length - a.actionItems.length;
353
+ return a.readiness.score - b.readiness.score;
354
+ });
355
+ return {
356
+ generated: new Date().toISOString().split("T")[0],
357
+ totalProjects: activeSnapshots.length,
358
+ totalMemories,
359
+ projects: activeSnapshots,
360
+ allActionItems,
361
+ };
362
+ }
363
+ // ─── Formatters ─────────────────────────────────────────────────────────
364
+ /** Extract a short summary from a status landscape memory's content */
365
+ function extractStatusSummary(content, maxLines = 8) {
366
+ const lines = content.split("\n");
367
+ const summaryLines = [];
368
+ let capturing = false;
369
+ for (const line of lines) {
370
+ if (/^#+\s*(what'?s?.*(not|left|next|missing|blocking)|to go live|gaps|blockers)/i.test(line)) {
371
+ capturing = true;
372
+ summaryLines.push(line);
373
+ continue;
374
+ }
375
+ if (capturing) {
376
+ if (/^#+\s/.test(line) && summaryLines.length > 1)
377
+ break;
378
+ summaryLines.push(line);
379
+ if (summaryLines.length >= maxLines)
380
+ break;
381
+ }
382
+ }
383
+ if (summaryLines.length > 0)
384
+ return summaryLines.join("\n").trim();
385
+ return lines.filter((l) => l.trim()).slice(0, maxLines).join("\n").trim();
386
+ }
387
+ /** Format the portfolio as markdown */
388
+ export function formatPortfolioMarkdown(report) {
389
+ const lines = [
390
+ "# Gnosys Portfolio Dashboard",
391
+ "",
392
+ `_Auto-generated ${report.generated} | ${report.totalProjects} projects | ${report.totalMemories} memories_`,
393
+ "",
394
+ ];
395
+ // Action items summary
396
+ if (report.allActionItems.length > 0) {
397
+ lines.push("## Needs Your Attention", "");
398
+ for (const item of report.allActionItems) {
399
+ const icon = item.type === "question" ? "?" : item.type === "blocker" ? "!" : item.type === "manual" ? ">" : "*";
400
+ lines.push(`- [${icon}] **${item.projectName}**: ${item.text}`);
401
+ }
402
+ lines.push("");
403
+ }
404
+ // Readiness overview
405
+ lines.push("## Production Readiness", "");
406
+ lines.push("| Project | Readiness | Score | Blockers |");
407
+ lines.push("|---------|-----------|-------|----------|");
408
+ for (const snap of report.projects) {
409
+ const blockerCount = snap.readiness.blocking.length;
410
+ lines.push(`| **${snap.project.name}** | ${snap.readiness.label} | ${snap.readiness.score}% | ${blockerCount} |`);
411
+ }
412
+ lines.push("", "---", "");
413
+ // Per-project details
414
+ for (const snap of report.projects) {
415
+ lines.push(`## ${snap.project.name} — ${snap.readiness.label} (${snap.readiness.score}%)`, "");
416
+ if (snap.actionItems.length > 0) {
417
+ lines.push("### Action Items", "");
418
+ for (const item of snap.actionItems) {
419
+ lines.push(`- [${item.type}] ${item.text}`);
420
+ }
421
+ lines.push("");
422
+ }
423
+ if (snap.readiness.blocking.length > 0) {
424
+ lines.push("### Blocking Go-Live", "");
425
+ for (const b of snap.readiness.blocking) {
426
+ lines.push(`- ${b}`);
427
+ }
428
+ lines.push("");
429
+ }
430
+ const catEntries = Object.entries(snap.memoryCounts.byCategory).sort((a, b) => b[1] - a[1]);
431
+ lines.push(`**${snap.memoryCounts.total} memories** across ${catEntries.length} categories`, "");
432
+ if (snap.roadmap.length > 0) {
433
+ lines.push("### Roadmap", "");
434
+ for (const r of snap.roadmap) {
435
+ lines.push(`- **${r.title}** (${r.id})`);
436
+ }
437
+ lines.push("");
438
+ }
439
+ if (snap.recentActivity.length > 0) {
440
+ lines.push("### Recent Activity (7d)", "");
441
+ for (const a of snap.recentActivity) {
442
+ lines.push(`- ${a.title} — _${a.category}_ (${a.modified.split("T")[0]})`);
443
+ }
444
+ lines.push("");
445
+ }
446
+ lines.push("---", "");
447
+ }
448
+ return lines.join("\n");
449
+ }
450
+ /** Format as compact text (for MCP tool responses) */
451
+ export function formatPortfolioCompact(report) {
452
+ const lines = [
453
+ `# Portfolio Dashboard (${report.generated})`,
454
+ `${report.totalProjects} projects, ${report.totalMemories} total memories`,
455
+ "",
456
+ ];
457
+ if (report.allActionItems.length > 0) {
458
+ lines.push("## NEEDS ATTENTION");
459
+ for (const item of report.allActionItems) {
460
+ lines.push(` [${item.type}] ${item.projectName}: ${item.text}`);
461
+ }
462
+ lines.push("");
463
+ }
464
+ for (const snap of report.projects) {
465
+ lines.push(`## ${snap.project.name} — ${snap.readiness.label} (${snap.readiness.score}%)`);
466
+ if (snap.readiness.blocking.length > 0) {
467
+ lines.push(` Blocking: ${snap.readiness.blocking.slice(0, 3).join("; ")}`);
468
+ }
469
+ if (snap.roadmap.length > 0) {
470
+ lines.push(` Roadmap: ${snap.roadmap.map((r) => r.title).join("; ")}`);
471
+ }
472
+ lines.push("");
473
+ }
474
+ return lines.join("\n");
475
+ }
476
+ // ─── Status Template ────────────────────────────────────────────────────
477
+ /**
478
+ * The canonical prompt to give any AI agent so it writes a dashboard-compatible
479
+ * status memory via gnosys_add_structured.
480
+ *
481
+ * The prompt is structured as a guided checklist. The AI must:
482
+ * 1. Analyze the codebase to fill in what it can determine
483
+ * 2. ASK the user for anything it cannot determine from code alone
484
+ * 3. Only write the status memory once all sections are addressed
485
+ */
486
+ export const STATUS_UPDATE_PROMPT = `# Gnosys Status Update — Guided Checklist
487
+
488
+ You are updating the project status for the Gnosys portfolio dashboard. Follow this process exactly.
489
+
490
+ ## Step 1: Analyze the codebase
491
+
492
+ Read the project structure, recent git history, test results, build status, and any existing status memories (use gnosys_discover and gnosys_read). Fill in as much as you can from code.
493
+
494
+ ## Step 2: Work through every section below
495
+
496
+ For EACH section, either fill it in from your analysis or ASK the user. Do NOT skip sections. Do NOT write the status memory until all sections are addressed.
497
+
498
+ ### Section A: What's Complete
499
+ List all features, milestones, and capabilities that are done and working. Be specific (e.g., "14 Playwright E2E tests passing" not "tests exist").
500
+
501
+ ### Section B: What's NOT Done
502
+ List everything remaining before the project can go live. Include partial work, missing features, and known gaps.
503
+
504
+ ### Section C: Waiting on Human
505
+ **YOU MUST ASK THE USER** if you cannot determine these from code:
506
+ - Are there accounts that need to be created or configured? (Apple Developer, cloud providers, API keys, DNS, domain registrars, app store submissions)
507
+ - Are there approvals or sign-offs needed? (legal, compliance, stakeholder review)
508
+ - Are there purchases needed? (certificates, licenses, subscriptions)
509
+ - Are there manual deployment steps only the user can do?
510
+ - Is the user waiting on anyone else? (contractors, partners, third-party services)
511
+
512
+ If the code shows signs of these (e.g., placeholder API keys, TODO comments about accounts, unsigned builds), list what you found and confirm with the user.
513
+
514
+ ### Section D: Blockers
515
+ Items that are actively preventing progress. Distinguish between:
516
+ - **Technical blockers**: bugs, dependency issues, broken builds
517
+ - **External blockers**: waiting on third-party, account access, API approval
518
+ - **Decision blockers**: choices that need to be made before work can continue
519
+
520
+ ### Section E: Open Decisions
521
+ Questions or choices that haven't been resolved yet. **ASK the user** about any you find:
522
+ - Architecture or technology choices still open
523
+ - Scope decisions (what's in v1 vs deferred)
524
+ - Prioritization questions
525
+ - Trade-offs that need a human call
526
+
527
+ ### Section F: Go-Live Readiness
528
+ Assess each area — mark as Ready, Partial, Not Started, or N/A:
529
+ - [ ] Core features functional
530
+ - [ ] Error handling and edge cases
531
+ - [ ] Security review (auth, input validation, secrets management)
532
+ - [ ] Performance acceptable (or: performance testing not done)
533
+ - [ ] Functional testing sufficient (state coverage level and any known gaps)
534
+ - [ ] Documentation (user-facing: README, API docs, guides)
535
+ - [ ] Deployment pipeline (CI/CD, hosting, domain, SSL)
536
+ - [ ] Monitoring and logging
537
+ - [ ] Data migration / seed data
538
+ - [ ] Legal (privacy policy, terms, licenses, compliance)
539
+
540
+ ### Section G: Testing Status
541
+ - **Functional tests**: What exists? What's the coverage? Any known failing tests?
542
+ - **Performance tests**: Have they been run? Any issues found? Any remediation done?
543
+ - **Integration tests**: Do external services / APIs work end-to-end?
544
+ - **Known defects**: List any open bugs with severity (critical/major/minor)
545
+ - **Defect remediation**: Any bugs that were found and fixed recently?
546
+
547
+ ### Section H: Roadmap Changes
548
+ - Has the plan changed since the last status update?
549
+ - Any new work discovered during development?
550
+ - Any scope added or removed?
551
+ - What's the recommended next priority?
552
+
553
+ ## Step 3: Ask the user about gaps
554
+
555
+ Before writing the memory, present your findings and explicitly ask about anything you couldn't determine:
556
+
557
+ > "I've analyzed the codebase and filled in what I can. I need your input on these items before I can write the status:
558
+ > 1. [specific question]
559
+ > 2. [specific question]
560
+ > ..."
561
+
562
+ If the user says "skip" or "not applicable" for a section, mark it as "N/A — skipped by owner" in the status.
563
+
564
+ ## Step 4: Write the status memory
565
+
566
+ Once all sections are addressed, call gnosys_add_structured with:
567
+
568
+ - **title**: "[Project Name] status as of [YYYY-MM-DD] — [one-line summary]"
569
+ - **category**: "landscape"
570
+ - **tags**: { "type": ["status", "milestone"], "concern": ["release"] }
571
+ - **relevance**: "[project-name] status complete shipped ready go-live production blockers testing"
572
+ - **author**: "human+ai"
573
+ - **authority**: "observed"
574
+ - **confidence**: 0.95
575
+ - **projectRoot**: "[the project's working directory]"
576
+
577
+ The content MUST use these exact heading formats (the dashboard parser depends on them):
578
+
579
+ \`\`\`markdown
580
+ # [Project Name] Status — [YYYY-MM-DD]
581
+
582
+ ## What's Complete
583
+ - [from Section A]
584
+
585
+ ## What's NOT Done
586
+ - [from Section B]
587
+
588
+ ## Waiting on Human
589
+ - [from Section C — manual steps, accounts, approvals]
590
+
591
+ ## Blockers
592
+ - [from Section D — categorized as Technical / External / Decision]
593
+
594
+ ## Open Decisions
595
+ - [from Section E]
596
+
597
+ ## Go-Live Readiness
598
+ - [from Section F — checklist with status per area]
599
+
600
+ ## Testing Status
601
+ - [from Section G — functional, performance, integration, defects]
602
+
603
+ ## Roadmap Changes
604
+ - [from Section H — plan changes, new work, next priority]
605
+ \`\`\`
606
+
607
+ IMPORTANT: Be specific enough that someone reading the dashboard can take action immediately. "Needs testing" is useless — "No load tests run; API response times unknown under concurrent usage" is actionable.`;
608
+ /** Generate the status update prompt pre-filled for a specific project */
609
+ export function generateStatusPrompt(projectName, projectRoot) {
610
+ const date = new Date().toISOString().split("T")[0];
611
+ return STATUS_UPDATE_PROMPT
612
+ .replace(/\[Project Name\]/g, projectName)
613
+ .replace(/\[YYYY-MM-DD\]/g, date)
614
+ .replace(/\[project-name\]/g, projectName.toLowerCase().replace(/\s+/g, "-"))
615
+ .replace(/\[the project's working directory\]/g, projectRoot)
616
+ .replace(/\[one-line summary\]/g, "[fill in based on analysis]");
617
+ }
618
+ //# sourceMappingURL=portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/lib/portfolio.ts"],"names":[],"mappings":"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"}