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 @@
|
|
|
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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"}
|