@programinglive/dev-workflow-mcp-server 1.3.2 → 1.3.4

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/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.3.4](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.3.3...v1.3.4) (2025-11-22)
6
+
7
+
8
+ ### 🐛 Bug Fixes
9
+
10
+ * move marked to dependencies for production build ([15b9a93](https://github.com/programinglive/dev-workflow-mcp-server/commit/15b9a932d822c0b12206642cbbc24c020453fdc4))
11
+
12
+ ### [1.3.3](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.3.2...v1.3.3) (2025-11-22)
13
+
14
+
15
+ ### ✨ Features
16
+
17
+ * **web:** add version display to dashboard ([cb412bf](https://github.com/programinglive/dev-workflow-mcp-server/commit/cb412bf03f015e9549c09d967463790bb3564bc3))
18
+
5
19
  ### [1.3.2](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.3.1...v1.3.2) (2025-11-22)
6
20
 
7
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@programinglive/dev-workflow-mcp-server",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "description": "MCP server to enforce development workflow discipline",
5
5
  "homepage": "https://devworkflow.programinglive.com/",
6
6
  "type": "module",
@@ -41,6 +41,7 @@
41
41
  "better-sqlite3": "^11.8.0",
42
42
  "esbuild": "^0.25.0",
43
43
  "get-port": "^7.1.0",
44
+ "marked": "^12.0.2",
44
45
  "vite": "^7.1.12"
45
46
  },
46
47
  "publishConfig": {
@@ -51,7 +52,6 @@
51
52
  "@commitlint/config-conventional": "^20.0.0",
52
53
  "@programinglive/commiter": "^1.1.8",
53
54
  "husky": "^9.1.7",
54
- "marked": "^12.0.2",
55
55
  "standard-version": "^9.5.0"
56
56
  },
57
57
  "standard-version": {
package/web/index.html CHANGED
@@ -1,5 +1,6 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
+
3
4
  <head>
4
5
  <meta charset="UTF-8">
5
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -8,6 +9,7 @@
8
9
  <script src="https://unpkg.com/lucide@latest"></script>
9
10
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
10
11
  </head>
12
+
11
13
  <body class="bg-slate-50 text-slate-900">
12
14
  <div class="min-h-screen flex flex-col">
13
15
  <header class="border-b bg-gradient-to-r from-indigo-600 via-indigo-500 to-purple-500 text-white shadow-lg">
@@ -15,47 +17,69 @@
15
17
  <div class="flex items-start gap-4">
16
18
  <div class="relative">
17
19
  <div class="absolute inset-0 rounded-2xl bg-white/20 blur-md"></div>
18
- <span class="relative inline-flex items-center justify-center h-14 w-14 rounded-2xl bg-white text-indigo-600 text-xl font-semibold shadow-lg">
20
+ <span
21
+ class="relative inline-flex items-center justify-center h-14 w-14 rounded-2xl bg-white text-indigo-600 text-xl font-semibold shadow-lg">
19
22
  DW
20
23
  </span>
21
24
  </div>
22
25
  <div>
23
26
  <h1 class="text-3xl font-semibold flex items-center gap-3">
24
- <span class="inline-flex h-9 w-9 items-center justify-center rounded-full bg-white/20 text-white shadow-sm">
27
+ <span
28
+ class="inline-flex h-9 w-9 items-center justify-center rounded-full bg-white/20 text-white shadow-sm">
25
29
  <i data-lucide="book-open"></i>
26
30
  </span>
27
31
  Dev Workflow Knowledge Hub
32
+ <span id="appVersion"
33
+ class="text-sm bg-white/20 px-2 py-0.5 rounded-full font-normal opacity-90 hidden"></span>
28
34
  </h1>
29
35
  <p class="text-sm md:text-base text-indigo-100/90 mt-2 max-w-xl">
30
- History, commands, and documentation unified into one dashboard so every task follows the disciplined workflow.
36
+ History, commands, and documentation unified into one dashboard so every task follows the disciplined
37
+ workflow.
31
38
  </p>
32
39
  <div class="mt-4 flex flex-wrap gap-3 text-sm">
33
- <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i data-lucide="sparkles" class="h-4 w-4"></i> Live insights</span>
34
- <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i data-lucide="workflow" class="h-4 w-4"></i> Workflow guardrails</span>
35
- <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i data-lucide="book-open-check" class="h-4 w-4"></i> Embedded documentation</span>
40
+ <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i data-lucide="sparkles"
41
+ class="h-4 w-4"></i> Live insights</span>
42
+ <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i data-lucide="workflow"
43
+ class="h-4 w-4"></i> Workflow guardrails</span>
44
+ <span class="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1"><i
45
+ data-lucide="book-open-check" class="h-4 w-4"></i> Embedded documentation</span>
36
46
  </div>
37
47
  </div>
38
48
  </div>
39
49
  <div class="flex flex-col gap-4 md:items-end">
40
50
  <div class="flex items-center gap-3 w-full md:w-auto">
41
51
  <div class="relative flex-1 md:flex-initial">
42
- <i data-lucide="search" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-indigo-300 h-4 w-4"></i>
43
- <input type="search" placeholder="Search sections" aria-label="Search sections" class="w-full pl-9 pr-4 py-2 rounded-full bg-white/20 text-white placeholder:text-indigo-200/80 focus:outline-none focus:ring-2 focus:ring-white/60 focus:bg-white/30" oninput="handleSectionSearch(event)" />
52
+ <i data-lucide="search"
53
+ class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-indigo-300 h-4 w-4"></i>
54
+ <input type="search" placeholder="Search sections" aria-label="Search sections"
55
+ class="w-full pl-9 pr-4 py-2 rounded-full bg-white/20 text-white placeholder:text-indigo-200/80 focus:outline-none focus:ring-2 focus:ring-white/60 focus:bg-white/30"
56
+ oninput="handleSectionSearch(event)" />
44
57
  </div>
45
- <button class="inline-flex items-center gap-2 rounded-full bg-white text-indigo-600 px-4 py-2 text-sm font-semibold shadow-md hover:bg-indigo-50" id="refreshDashboardBtn">
58
+ <button
59
+ class="inline-flex items-center gap-2 rounded-full bg-white text-indigo-600 px-4 py-2 text-sm font-semibold shadow-md hover:bg-indigo-50"
60
+ id="refreshDashboardBtn">
46
61
  <i data-lucide="refresh-ccw"></i>
47
62
  Refresh data
48
63
  </button>
49
64
  </div>
50
65
  <div class="flex flex-wrap gap-2 text-xs text-indigo-100/80 md:justify-end">
51
- <span class="inline-flex items-center gap-2"><i data-lucide="keyboard"></i> Press ⬇️ to navigate sections</span>
66
+ <span class="inline-flex items-center gap-2"><i data-lucide="keyboard"></i> Press ⬇️ to navigate
67
+ sections</span>
52
68
  <span class="inline-flex items-center gap-2"><i data-lucide="external-link"></i> Docs open inline</span>
53
69
  </div>
54
70
  <div class="flex flex-wrap gap-3 md:justify-end">
55
- <button class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition" data-scroll-target="#overview"><i data-lucide="compass" class="h-4 w-4"></i> Overview</button>
56
- <button class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition" data-scroll-target="#history"><i data-lucide="clock" class="h-4 w-4"></i> History</button>
57
- <button class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition" data-scroll-target="#commands"><i data-lucide="workflow" class="h-4 w-4"></i> Commands</button>
58
- <button class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition" data-scroll-target="#api"><i data-lucide="code" class="h-4 w-4"></i> API</button>
71
+ <button
72
+ class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition"
73
+ data-scroll-target="#overview"><i data-lucide="compass" class="h-4 w-4"></i> Overview</button>
74
+ <button
75
+ class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition"
76
+ data-scroll-target="#history"><i data-lucide="clock" class="h-4 w-4"></i> History</button>
77
+ <button
78
+ class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition"
79
+ data-scroll-target="#commands"><i data-lucide="workflow" class="h-4 w-4"></i> Commands</button>
80
+ <button
81
+ class="scroll-link inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-sm font-medium hover:bg-white/25 transition"
82
+ data-scroll-target="#api"><i data-lucide="code" class="h-4 w-4"></i> API</button>
59
83
  </div>
60
84
  </div>
61
85
  </div>
@@ -67,25 +91,46 @@
67
91
  <div>
68
92
  <h2 class="text-xs uppercase tracking-wide text-slate-500 mb-2">Documentation</h2>
69
93
  <ul class="space-y-1 text-sm" id="sidebarNav">
70
- <li><a href="#overview" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Overview</a></li>
71
- <li><a href="#history" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Workflow History</a></li>
72
- <li><a href="#usage" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Using Filters</a></li>
73
- <li><a href="#commands" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Commands Reference</a></li>
74
- <li><a href="#api" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">API Endpoints</a></li>
75
- <li><a href="#troubleshooting" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Troubleshooting</a></li>
94
+ <li><a href="#overview" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Overview</a>
95
+ </li>
96
+ <li><a href="#history" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Workflow
97
+ History</a></li>
98
+ <li><a href="#usage" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Using Filters</a>
99
+ </li>
100
+ <li><a href="#commands" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Commands
101
+ Reference</a></li>
102
+ <li><a href="#api" class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">API Endpoints</a>
103
+ </li>
104
+ <li><a href="#troubleshooting"
105
+ class="block px-3 py-2 rounded hover:bg-indigo-50 text-slate-700">Troubleshooting</a></li>
76
106
  </ul>
77
107
  </div>
78
108
  <div class="border-t pt-4">
79
109
  <h2 class="text-xs uppercase tracking-wide text-slate-500 mb-2">Resources</h2>
80
110
  <ul class="space-y-1 text-sm">
81
- <li><a href="https://github.com/programinglive/dev-workflow-mcp-server" target="_blank" rel="noopener" class="block px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">GitHub Repository</a></li>
82
- <li><button data-doc="README.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Project README</button></li>
83
- <li><button data-doc="web-dashboard.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Web Dashboard Guide</button></li>
84
- <li><button data-doc="GETTING-STARTED.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Getting Started</button></li>
85
- <li><button data-doc="EXAMPLES.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Examples</button></li>
86
- <li><button data-doc="WORKFLOW-TEMPLATES.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Workflow Templates</button></li>
87
- <li><button data-doc="TROUBLESHOOTING.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Troubleshooting</button></li>
88
- <li><button data-doc="RELEASE_NOTES.md" class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Release Notes</button></li>
111
+ <li><a href="https://github.com/programinglive/dev-workflow-mcp-server" target="_blank" rel="noopener"
112
+ class="block px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">GitHub Repository</a></li>
113
+ <li><button data-doc="README.md"
114
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Project
115
+ README</button></li>
116
+ <li><button data-doc="web-dashboard.md"
117
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Web
118
+ Dashboard Guide</button></li>
119
+ <li><button data-doc="GETTING-STARTED.md"
120
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Getting
121
+ Started</button></li>
122
+ <li><button data-doc="EXAMPLES.md"
123
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Examples</button>
124
+ </li>
125
+ <li><button data-doc="WORKFLOW-TEMPLATES.md"
126
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Workflow
127
+ Templates</button></li>
128
+ <li><button data-doc="TROUBLESHOOTING.md"
129
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Troubleshooting</button>
130
+ </li>
131
+ <li><button data-doc="RELEASE_NOTES.md"
132
+ class="doc-link block w-full text-left px-3 py-2 rounded hover:bg-indigo-50 text-indigo-600">Release
133
+ Notes</button></li>
89
134
  </ul>
90
135
  </div>
91
136
  </nav>
@@ -99,29 +144,37 @@
99
144
  <i data-lucide="compass"></i>
100
145
  Overview
101
146
  </h2>
102
- <p class="mt-2 text-slate-600">Learn how the Dev Workflow dashboard surfaces workflow history and offers inline documentation for every MCP command.</p>
147
+ <p class="mt-2 text-slate-600">Learn how the Dev Workflow dashboard surfaces workflow history and offers
148
+ inline documentation for every MCP command.</p>
103
149
  <div class="mt-4 bg-amber-50 border border-amber-200 text-amber-800 text-sm rounded-lg p-4 flex gap-3">
104
150
  <i data-lucide="alert-circle" class="mt-1 shrink-0"></i>
105
151
  <p>
106
- The dashboard is read-only. MCP clients (Windsurf, Claude Desktop, etc.) must launch the server via <code>node index.js</code>
107
- over stdio on the machine they control. Hosting this site publicly does <strong>not</strong> expose the MCP protocol; without SSH or another
152
+ The dashboard is read-only. MCP clients (Windsurf, Claude Desktop, etc.) must launch the server via
153
+ <code>node index.js</code>
154
+ over stdio on the machine they control. Hosting this site publicly does <strong>not</strong> expose
155
+ the MCP protocol; without SSH or another
108
156
  execution path to the server, remote users cannot connect their MCP agents.
109
157
  </p>
110
158
  </div>
111
159
  </div>
112
160
  <div class="hidden md:flex items-center gap-2 text-sm text-slate-500">
113
161
  <i data-lucide="info"></i>
114
- <span>Need help? Jump to <a href="#commands" class="text-indigo-600 underline">Commands Reference</a>.</span>
162
+ <span>Need help? Jump to <a href="#commands" class="text-indigo-600 underline">Commands
163
+ Reference</a>.</span>
115
164
  </div>
116
165
  </div>
117
166
  <div class="mt-6 grid gap-6 md:grid-cols-2">
118
167
  <div class="p-4 bg-indigo-50 rounded-lg border border-indigo-100">
119
- <h3 class="font-medium text-indigo-900 flex items-center gap-2"><i data-lucide="activity"></i> Live Insights</h3>
120
- <p class="text-sm text-indigo-900/80 mt-2">Connects directly to your `.state` history to show progress, release cadence, and team activity trends.</p>
168
+ <h3 class="font-medium text-indigo-900 flex items-center gap-2"><i data-lucide="activity"></i> Live
169
+ Insights</h3>
170
+ <p class="text-sm text-indigo-900/80 mt-2">Connects directly to your `.state` history to show progress,
171
+ release cadence, and team activity trends.</p>
121
172
  </div>
122
173
  <div class="p-4 bg-emerald-50 rounded-lg border border-emerald-100">
123
- <h3 class="font-medium text-emerald-900 flex items-center gap-2"><i data-lucide="book"></i> Built-in Playbook</h3>
124
- <p class="text-sm text-emerald-900/80 mt-2">Every MCP tool is documented with prerequisites, recommended usage, and follow-up actions.</p>
174
+ <h3 class="font-medium text-emerald-900 flex items-center gap-2"><i data-lucide="book"></i> Built-in
175
+ Playbook</h3>
176
+ <p class="text-sm text-emerald-900/80 mt-2">Every MCP tool is documented with prerequisites, recommended
177
+ usage, and follow-up actions.</p>
125
178
  </div>
126
179
  </div>
127
180
  </section>
@@ -133,7 +186,8 @@
133
186
  <i data-lucide="clock-4"></i>
134
187
  Workflow History Explorer
135
188
  </h2>
136
- <p class="text-slate-600 mt-2">Slice and explore your task history. Use the filters below to focus on a user, time range, or frequency.</p>
189
+ <p class="text-slate-600 mt-2">Slice and explore your task history. Use the filters below to focus on a
190
+ user, time range, or frequency.</p>
137
191
  </div>
138
192
  <a href="#api" class="inline-flex items-center gap-2 text-sm text-indigo-600 hover:text-indigo-700">
139
193
  <i data-lucide="terminal"></i>
@@ -150,19 +204,23 @@
150
204
  <div class="grid gap-4 sm:grid-cols-2 xl:grid-cols-3">
151
205
  <label class="flex flex-col gap-1">
152
206
  <span class="text-sm font-medium text-slate-600">User ID</span>
153
- <input id="userId" type="text" placeholder="default" class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
207
+ <input id="userId" type="text" placeholder="default"
208
+ class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
154
209
  </label>
155
210
  <label class="flex flex-col gap-1">
156
211
  <span class="text-sm font-medium text-slate-600">Start date</span>
157
- <input id="startDate" type="date" class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
212
+ <input id="startDate" type="date"
213
+ class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
158
214
  </label>
159
215
  <label class="flex flex-col gap-1">
160
216
  <span class="text-sm font-medium text-slate-600">End date</span>
161
- <input id="endDate" type="date" class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
217
+ <input id="endDate" type="date"
218
+ class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
162
219
  </label>
163
220
  <label class="flex flex-col gap-1">
164
221
  <span class="text-sm font-medium text-slate-600">Activity frequency</span>
165
- <select id="frequency" class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500">
222
+ <select id="frequency"
223
+ class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500">
166
224
  <option value="daily">Daily</option>
167
225
  <option value="monthly">Monthly</option>
168
226
  <option value="yearly">Yearly</option>
@@ -170,7 +228,8 @@
170
228
  </label>
171
229
  <label class="flex flex-col gap-1">
172
230
  <span class="text-sm font-medium text-slate-600">Page size</span>
173
- <select id="pageSize" class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500">
231
+ <select id="pageSize"
232
+ class="border border-slate-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500">
174
233
  <option value="10">10</option>
175
234
  <option value="20" selected>20</option>
176
235
  <option value="50">50</option>
@@ -178,8 +237,10 @@
178
237
  </label>
179
238
  </div>
180
239
  <div class="flex flex-wrap gap-3 items-center mt-5">
181
- <button id="applyFiltersBtn" class="bg-indigo-600 text-white px-4 py-2 rounded-md hover:bg-indigo-700">Apply filters</button>
182
- <button id="resetFiltersBtn" class="bg-white border border-slate-300 text-slate-700 px-4 py-2 rounded-md hover:bg-slate-100">Reset</button>
240
+ <button id="applyFiltersBtn"
241
+ class="bg-indigo-600 text-white px-4 py-2 rounded-md hover:bg-indigo-700">Apply filters</button>
242
+ <button id="resetFiltersBtn"
243
+ class="bg-white border border-slate-300 text-slate-700 px-4 py-2 rounded-md hover:bg-slate-100">Reset</button>
183
244
  <span class="text-sm text-slate-500">Leave fields empty to view all data for the default user.</span>
184
245
  </div>
185
246
  </div>
@@ -210,9 +271,11 @@
210
271
  </h3>
211
272
  <div id="historyContent" class="space-y-3 text-sm"></div>
212
273
  <div id="paginationControls" class="flex items-center justify-between mt-6 hidden">
213
- <button id="prevPageBtn" class="bg-white border border-slate-300 text-slate-700 px-3 py-1 rounded-md hover:bg-slate-100 disabled:opacity-50 disabled:cursor-not-allowed">Previous</button>
274
+ <button id="prevPageBtn"
275
+ class="bg-white border border-slate-300 text-slate-700 px-3 py-1 rounded-md hover:bg-slate-100 disabled:opacity-50 disabled:cursor-not-allowed">Previous</button>
214
276
  <span id="pageInfo" class="text-sm text-slate-600"></span>
215
- <button id="nextPageBtn" class="bg-white border border-slate-300 text-slate-700 px-3 py-1 rounded-md hover:bg-slate-100 disabled:opacity-50 disabled:cursor-not-allowed">Next</button>
277
+ <button id="nextPageBtn"
278
+ class="bg-white border border-slate-300 text-slate-700 px-3 py-1 rounded-md hover:bg-slate-100 disabled:opacity-50 disabled:cursor-not-allowed">Next</button>
216
279
  </div>
217
280
  </div>
218
281
  </section>
@@ -226,19 +289,23 @@
226
289
  <div class="mt-4 grid gap-6 md:grid-cols-2">
227
290
  <div>
228
291
  <h3 class="font-semibold text-slate-800">1. Filter your scope</h3>
229
- <p class="text-sm text-slate-600 mt-2">Pick a user ID to analyze individual contributions. Add date ranges to focus on a release window, sprint, or quarter.</p>
292
+ <p class="text-sm text-slate-600 mt-2">Pick a user ID to analyze individual contributions. Add date ranges
293
+ to focus on a release window, sprint, or quarter.</p>
230
294
  </div>
231
295
  <div>
232
296
  <h3 class="font-semibold text-slate-800">2. Inspect the summary</h3>
233
- <p class="text-sm text-slate-600 mt-2">Review overall throughput, mix of task types, and recent activity. The summary auto-updates whenever you change filters.</p>
297
+ <p class="text-sm text-slate-600 mt-2">Review overall throughput, mix of task types, and recent activity.
298
+ The summary auto-updates whenever you change filters.</p>
234
299
  </div>
235
300
  <div>
236
301
  <h3 class="font-semibold text-slate-800">3. Dive into entries</h3>
237
- <p class="text-sm text-slate-600 mt-2">Scroll the event log to see commit messages, forced completions, and dropped tasks. Use pagination to traverse older work.</p>
302
+ <p class="text-sm text-slate-600 mt-2">Scroll the event log to see commit messages, forced completions,
303
+ and dropped tasks. Use pagination to traverse older work.</p>
238
304
  </div>
239
305
  <div>
240
306
  <h3 class="font-semibold text-slate-800">4. Export via API</h3>
241
- <p class="text-sm text-slate-600 mt-2">Need automation or reporting? Jump to the <a href="#api" class="text-indigo-600 underline">API section</a> and query JSON endpoints directly.</p>
307
+ <p class="text-sm text-slate-600 mt-2">Need automation or reporting? Jump to the <a href="#api"
308
+ class="text-indigo-600 underline">API section</a> and query JSON endpoints directly.</p>
242
309
  </div>
243
310
  </div>
244
311
  </section>
@@ -250,13 +317,16 @@
250
317
  <i data-lucide="workflow"></i>
251
318
  Commands Reference
252
319
  </h2>
253
- <div class="mt-2 inline-flex items-center gap-2 rounded-full bg-indigo-50 px-3 py-1 text-xs font-semibold text-indigo-600 uppercase tracking-wide">
320
+ <div
321
+ class="mt-2 inline-flex items-center gap-2 rounded-full bg-indigo-50 px-3 py-1 text-xs font-semibold text-indigo-600 uppercase tracking-wide">
254
322
  <i data-lucide="check-square"></i>
255
323
  <span>All Tools · 20 commands</span>
256
324
  </div>
257
- <p class="text-slate-600 mt-3">Explore all <strong>20</strong> MCP tools that keep the workflow honest. Review prerequisites, usage tips, and next steps for each command below.</p>
325
+ <p class="text-slate-600 mt-3">Explore all <strong>20</strong> MCP tools that keep the workflow honest.
326
+ Review prerequisites, usage tips, and next steps for each command below.</p>
258
327
  </div>
259
- <button data-doc="README.md" data-doc-heading="🛠️ Available Tools" class="doc-link inline-flex items-center gap-2 text-sm text-indigo-600 hover:text-indigo-700">
328
+ <button data-doc="README.md" data-doc-heading="🛠️ Available Tools"
329
+ class="doc-link inline-flex items-center gap-2 text-sm text-indigo-600 hover:text-indigo-700">
260
330
  <i data-lucide="external-link"></i>
261
331
  Full README Reference
262
332
  </button>
@@ -271,7 +341,8 @@
271
341
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
272
342
  <p>Begin every effort with a clear description and task type.</p>
273
343
  <ul class="list-disc list-inside space-y-1">
274
- <li><strong>Parameters:</strong> <code>description</code> (string, required), <code>type</code> ("feature" | "bugfix" | "refactor" | "other", required)</li>
344
+ <li><strong>Parameters:</strong> <code>description</code> (string, required), <code>type</code>
345
+ ("feature" | "bugfix" | "refactor" | "other", required)</li>
275
346
  <li><strong>When to use:</strong> Before writing code or touching files.</li>
276
347
  <li><strong>Next step:</strong> Implement your changes then run <code>mark_bug_fixed</code>.</li>
277
348
  </ul>
@@ -331,7 +402,8 @@
331
402
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
332
403
  <p>Capture the outcome of your automated test run.</p>
333
404
  <ul class="list-disc list-inside space-y-1">
334
- <li><strong>Parameters:</strong> <code>passed</code> (boolean, required), <code>testCommand</code> (string, required), optional <code>details</code> (string)</li>
405
+ <li><strong>Parameters:</strong> <code>passed</code> (boolean, required), <code>testCommand</code>
406
+ (string, required), optional <code>details</code> (string)</li>
335
407
  <li><strong>Guidance:</strong> Never proceed if tests fail—return to coding and re-run.</li>
336
408
  <li><strong>Next step:</strong> Move to <code>create_documentation</code> when green.</li>
337
409
  </ul>
@@ -346,8 +418,10 @@
346
418
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
347
419
  <p>Record documentation updates before proceeding to verification.</p>
348
420
  <ul class="list-disc list-inside space-y-1">
349
- <li><strong>Parameters:</strong> <code>documentationType</code> (enum), <code>summary</code> (string)</li>
350
- <li><strong>Tip:</strong> Keep summaries short but action-oriented. Include links to README sections or docs PRs.</li>
421
+ <li><strong>Parameters:</strong> <code>documentationType</code> (enum), <code>summary</code> (string)
422
+ </li>
423
+ <li><strong>Tip:</strong> Keep summaries short but action-oriented. Include links to README sections
424
+ or docs PRs.</li>
351
425
  </ul>
352
426
  </div>
353
427
  </details>
@@ -374,7 +448,8 @@
374
448
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
375
449
  <p>Automatically stage, commit, and push once verification passes.</p>
376
450
  <ul class="list-disc list-inside space-y-1">
377
- <li><strong>Parameters:</strong> <code>commitMessage</code> (string), optional <code>branch</code> (string)</li>
451
+ <li><strong>Parameters:</strong> <code>commitMessage</code> (string), optional <code>branch</code>
452
+ (string)</li>
378
453
  <li><strong>Behavior:</strong> Detects clean working trees and reuses the latest commit metadata.</li>
379
454
  <li><strong>Reminder:</strong> Any new edits will bounce you back to this step.</li>
380
455
  </ul>
@@ -389,8 +464,11 @@
389
464
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
390
465
  <p>Record release details once the commit is live. Guards ensure the workflow order.</p>
391
466
  <ul class="list-disc list-inside space-y-1">
392
- <li><strong>Parameters:</strong> <code>command</code> (string), optional <code>notes</code>, <code>releaseType</code>, <code>preset</code></li>
393
- <li><strong>Integration:</strong> Wraps <code>release-wrapper.js</code> to prevent accidental version bumps.</li>
467
+ <li><strong>Parameters:</strong> <code>command</code> (string), optional <code>notes</code>,
468
+ <code>releaseType</code>, <code>preset</code>
469
+ </li>
470
+ <li><strong>Integration:</strong> Wraps <code>release-wrapper.js</code> to prevent accidental version
471
+ bumps.</li>
394
472
  </ul>
395
473
  </div>
396
474
  </details>
@@ -418,7 +496,8 @@
418
496
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
419
497
  <p>Record an incomplete task as finished with a justification.</p>
420
498
  <ul class="list-disc list-inside space-y-1">
421
- <li><strong>Parameters:</strong> optional <code>commitMessage</code>, optional <code>reason</code> (string)</li>
499
+ <li><strong>Parameters:</strong> optional <code>commitMessage</code>, optional <code>reason</code>
500
+ (string)</li>
422
501
  <li><strong>Use sparingly:</strong> Ideal for emergencies where remaining steps cannot be done.</li>
423
502
  <li><strong>Next step:</strong> Follow up manually on outstanding work.</li>
424
503
  </ul>
@@ -504,9 +583,15 @@
504
583
  <div class="px-5 pb-5 space-y-3 text-sm text-slate-600">
505
584
  <p>Execute every command in sequence when you already know the answers.</p>
506
585
  <ul class="list-disc list-inside space-y-1">
507
- <li><strong>Parameters (required):</strong> <code>summary</code>, <code>testCommand</code>, <code>documentationType</code>, <code>documentationSummary</code>, <code>commitMessage</code>, <code>releaseCommand</code></li>
508
- <li><strong>Optional:</strong> <code>testsPassed</code>, <code>testDetails</code>, <code>branch</code>, <code>releaseNotes</code>, <code>releaseType</code>, <code>preset</code></li>
509
- <li><strong>Ideal for:</strong> Scripted flows or demos where you want the guardrails without manual calls.</li>
586
+ <li><strong>Parameters (required):</strong> <code>summary</code>, <code>testCommand</code>,
587
+ <code>documentationType</code>, <code>documentationSummary</code>, <code>commitMessage</code>,
588
+ <code>releaseCommand</code>
589
+ </li>
590
+ <li><strong>Optional:</strong> <code>testsPassed</code>, <code>testDetails</code>,
591
+ <code>branch</code>, <code>releaseNotes</code>, <code>releaseType</code>, <code>preset</code>
592
+ </li>
593
+ <li><strong>Ideal for:</strong> Scripted flows or demos where you want the guardrails without manual
594
+ calls.</li>
510
595
  </ul>
511
596
  </div>
512
597
  </details>
@@ -560,7 +645,8 @@
560
645
  <i data-lucide="code"></i>
561
646
  API Endpoints
562
647
  </div>
563
- <p class="text-slate-600">Use these JSON endpoints to integrate task history into automation, dashboards, or reports.</p>
648
+ <p class="text-slate-600">Use these JSON endpoints to integrate task history into automation, dashboards, or
649
+ reports.</p>
564
650
  <div class="space-y-4 text-sm text-slate-700">
565
651
  <div class="border border-slate-200 rounded-lg p-4">
566
652
  <h3 class="font-medium text-slate-800">GET /api/summary</h3>
@@ -570,12 +656,16 @@
570
656
  <div class="border border-slate-200 rounded-lg p-4">
571
657
  <h3 class="font-medium text-slate-800">GET /api/history</h3>
572
658
  <p class="mt-1">Paginated timeline of workflow entries with commit metadata.</p>
573
- <p class="mt-2 text-xs text-slate-500">Query params: <code>user</code>, <code>page</code>, <code>pageSize</code>, <code>startDate</code>, <code>endDate</code></p>
659
+ <p class="mt-2 text-xs text-slate-500">Query params: <code>user</code>, <code>page</code>,
660
+ <code>pageSize</code>, <code>startDate</code>, <code>endDate</code>
661
+ </p>
574
662
  </div>
575
663
  <div class="border border-slate-200 rounded-lg p-4">
576
664
  <h3 class="font-medium text-slate-800">GET /api/history-summary</h3>
577
665
  <p class="mt-1">Counts per day, month, or year for trend analysis.</p>
578
- <p class="mt-2 text-xs text-slate-500">Query params: <code>user</code>, <code>frequency</code>, <code>startDate</code>, <code>endDate</code></p>
666
+ <p class="mt-2 text-xs text-slate-500">Query params: <code>user</code>, <code>frequency</code>,
667
+ <code>startDate</code>, <code>endDate</code>
668
+ </p>
579
669
  </div>
580
670
  </div>
581
671
  </section>
@@ -596,15 +686,19 @@
596
686
  <tbody class="divide-y divide-slate-100">
597
687
  <tr>
598
688
  <td class="px-4 py-3">Dashboard shows empty data</td>
599
- <td class="px-4 py-3">Verify the MCP server has created `.state/users/<user>/workflow-state.json` and that the selected user matches.</td>
689
+ <td class="px-4 py-3">Verify the MCP server has created `.state/users/<user>/workflow-state.json` and
690
+ that the selected user matches.</td>
600
691
  </tr>
601
692
  <tr>
602
693
  <td class="px-4 py-3">`better-sqlite3` build error on startup</td>
603
- <td class="px-4 py-3">Install Python 3 and native build tools (Windows) or ensure SQLite headers are installed (macOS/Linux).</td>
694
+ <td class="px-4 py-3">Install Python 3 and native build tools (Windows) or ensure SQLite headers are
695
+ installed (macOS/Linux).</td>
604
696
  </tr>
605
697
  <tr>
606
698
  <td class="px-4 py-3">Port already in use</td>
607
- <td class="px-4 py-3">Set <code>DEV_WORKFLOW_WEB_PORT</code> to a free port before running <code>npm run web</code>.</td>
699
+ <td class="px-4 py-3">Set <code>DEV_WORKFLOW_WEB_PORT</code> to a free port before running
700
+ <code>npm run web</code>.
701
+ </td>
608
702
  </tr>
609
703
  </tbody>
610
704
  </table>
@@ -623,7 +717,8 @@
623
717
  <h3 id="docModalTitle" class="text-lg font-semibold text-slate-800">Documentation</h3>
624
718
  <p id="docModalSubtitle" class="text-xs text-slate-500 mt-1"></p>
625
719
  </div>
626
- <button id="docModalClose" class="p-2 rounded-md text-slate-500 hover:text-slate-700 hover:bg-slate-100" aria-label="Close documentation">
720
+ <button id="docModalClose" class="p-2 rounded-md text-slate-500 hover:text-slate-700 hover:bg-slate-100"
721
+ aria-label="Close documentation">
627
722
  <i data-lucide="x"></i>
628
723
  </button>
629
724
  </header>
@@ -784,6 +879,16 @@
784
879
 
785
880
  async function load() {
786
881
  const userId = state.userId || "default";
882
+
883
+ // Fetch version
884
+ fetchJson('/api/version').then(({ version }) => {
885
+ const verEl = el('appVersion');
886
+ if (verEl && version) {
887
+ verEl.textContent = `v${version}`;
888
+ verEl.classList.remove('hidden');
889
+ }
890
+ }).catch(() => { }); // Ignore version fetch errors
891
+
787
892
  try {
788
893
  const historyParams = {
789
894
  user: userId,
@@ -935,4 +1040,5 @@
935
1040
  load();
936
1041
  </script>
937
1042
  </body>
938
- </html>
1043
+
1044
+ </html>
package/web/server.js CHANGED
@@ -132,6 +132,11 @@ async function start() {
132
132
 
133
133
  res.writeHead(200, { "Content-Type": "application/json" });
134
134
  res.end(JSON.stringify({ doc: resolvedKey, content: result.content, format: result.format }));
135
+ } else if (req.method === "GET" && url.pathname === "/api/version") {
136
+ const packageJson = await readFile(join(projectRoot, "package.json"), "utf-8");
137
+ const { version } = JSON.parse(packageJson);
138
+ res.writeHead(200, { "Content-Type": "application/json" });
139
+ res.end(JSON.stringify({ version }));
135
140
  } else {
136
141
  res.writeHead(404, { "Content-Type": "text/plain" });
137
142
  res.end("Not found");