@programinglive/dev-workflow-mcp-server 1.4.4 β 1.4.6
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 +14 -0
- package/README.md +23 -0
- package/docs/product/PRD.md +1 -0
- package/docs/release-notes/RELEASE_NOTES.md +22 -0
- package/package.json +2 -1
- package/server.json +13 -0
- package/tests/build.test.js +13 -0
- package/tests/mcpRegistry.test.js +55 -0
- package/web/components/Hero.tsx +8 -2
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.4.6](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.4.5...v1.4.6) (2025-11-27)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### π§Ή Chores
|
|
9
|
+
|
|
10
|
+
* add MCP registry metadata (mcpName & server.json) ([66caea1](https://github.com/programinglive/dev-workflow-mcp-server/commit/66caea1d684473cfc916917faa42e16fc4ad9e14))
|
|
11
|
+
|
|
12
|
+
### [1.4.5](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.4.4...v1.4.5) (2025-11-27)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### π Bug Fixes
|
|
16
|
+
|
|
17
|
+
* display dynamic version in web dashboard from /api/version ([69f561d](https://github.com/programinglive/dev-workflow-mcp-server/commit/69f561d369fa8347399fafe5dcdb3a2dbb485064))
|
|
18
|
+
|
|
5
19
|
### [1.4.4](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.4.1...v1.4.4) (2025-11-27)
|
|
6
20
|
|
|
7
21
|
|
package/README.md
CHANGED
|
@@ -205,6 +205,7 @@ npm run web
|
|
|
205
205
|
- **Environment overrides:** Honors `PORT` (common on hosts like Plesk/Render) or `DEV_WORKFLOW_WEB_PORT` before falling back to auto-selection.
|
|
206
206
|
- **Query parameter:** `?user=<id>` lets you inspect another userβs history (defaults to `default`).
|
|
207
207
|
- **API endpoints:**
|
|
208
|
+
- `GET /api/version` β current package version from `package.json` (used by dashboard to display version dynamically).
|
|
208
209
|
- `GET /api/summary?user=<id>` β overall stats for the user.
|
|
209
210
|
- `GET /api/history?user=<id>&page=1&pageSize=20&startDate=YYYY-MM-DD&endDate=YYYY-MM-DD` β paginated task history.
|
|
210
211
|
- `GET /api/history-summary?user=<id>&frequency=daily|monthly|yearly` β aggregated counts over time.
|
|
@@ -227,6 +228,28 @@ For MCP server usage, point your client at `index.js` (source) to avoid stdio tr
|
|
|
227
228
|
- Performance optimization
|
|
228
229
|
- Embedding in other projects
|
|
229
230
|
|
|
231
|
+
### MCP Tools Registry (Publishing)
|
|
232
|
+
|
|
233
|
+
This package is configured for the official MCP Tools Registry using **npm package deployment**:
|
|
234
|
+
|
|
235
|
+
- `package.json` declares `mcpName: "io.github.programinglive/dev-workflow-mcp-server"`.
|
|
236
|
+
- `server.json` describes the server and links it to the npm package `@programinglive/dev-workflow-mcp-server`.
|
|
237
|
+
|
|
238
|
+
To publish a new server version to the registry:
|
|
239
|
+
|
|
240
|
+
1. Release a new npm version (for example):
|
|
241
|
+
- `npm test`
|
|
242
|
+
- `npm run release:patch` (runs your existing release pipeline and publishes to npm)
|
|
243
|
+
2. Verify the new version exists on npm:
|
|
244
|
+
- `npm view @programinglive/dev-workflow-mcp-server version`
|
|
245
|
+
3. Install the MCP publisher CLI (once per machine):
|
|
246
|
+
- `brew install mcp-publisher` (or follow the docs at https://modelcontextprotocol.info/tools/registry/publishing/)
|
|
247
|
+
4. From this repo root, authenticate and publish:
|
|
248
|
+
- `mcp-publisher login github`
|
|
249
|
+
- `mcp-publisher publish`
|
|
250
|
+
5. Optionally verify in the registry:
|
|
251
|
+
- `curl "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.programinglive/dev-workflow-mcp-server"`
|
|
252
|
+
|
|
230
253
|
#### PowerShell CLI tip
|
|
231
254
|
|
|
232
255
|
When invoking the lightweight CLI from PowerShell, use `--%` to prevent PowerShell from rewriting JSON arguments, for example:
|
package/docs/product/PRD.md
CHANGED
|
@@ -35,6 +35,7 @@ Developers need structured guidance to maintain disciplined workflows across pro
|
|
|
35
35
|
- Offer aggregated project summaries (JSON artifacts, SQLite sync, optional web dashboard).
|
|
36
36
|
- Guard release commands to ensure prerequisites are satisfied.
|
|
37
37
|
- Support `run_full_workflow` for scripted execution of all steps with validation.
|
|
38
|
+
- Web dashboard displays version dynamically from `package.json` via `/api/version` endpoint to stay in sync after releases.
|
|
38
39
|
|
|
39
40
|
## 8. Technical Considerations
|
|
40
41
|
- Node.js (ESM) codebase leveraging `@modelcontextprotocol/sdk`.
|
|
@@ -4,6 +4,28 @@ Authoritative history of user-visible changes for the Development Workflow MCP S
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 1.4.5 β 2025-11-27 β π Bug Fixes
|
|
8
|
+
- display dynamic version in web dashboard from /api/version (69f561d)
|
|
9
|
+
|
|
10
|
+
## 1.4.4 β 2025-11-27 β β»οΈ Refactors
|
|
11
|
+
- consolidate workflow state to root .state folder only (3d69a14)
|
|
12
|
+
- ensure release guard uses freshest workflow state (e07eb42)
|
|
13
|
+
- remove invalid turbopack experimental config from next.config.ts (af0a7ea)
|
|
14
|
+
- **web:** configure next.js root to silence warnings (22ed002)
|
|
15
|
+
- **web:** improve mobile layout for hero section (53b26bf)
|
|
16
|
+
- add Plesk deployment guide (de35675)
|
|
17
|
+
- add 1.4.3 release notes (8b165f7)
|
|
18
|
+
- fix release state detection (ed5dfd1)
|
|
19
|
+
- prepare for release (a6ea2d0)
|
|
20
|
+
- **release:** 1.4.2 (fac8999)
|
|
21
|
+
- **release:** 1.4.2 π (01b0b3c)
|
|
22
|
+
- **release:** 1.4.3 π (04d8c3b)
|
|
23
|
+
- update task list (35663dd)
|
|
24
|
+
- **web:** fix next.js lockfile warning (05ffce0)
|
|
25
|
+
- add core doc types (PRD/README/RELEASE_NOTES) and fix CI build (8ed0567)
|
|
26
|
+
- update hero text and meta description to emphasize Indonesian programmer community (681547b)
|
|
27
|
+
- update program tracks and fix fast refresh warning (aa5bc9c)
|
|
28
|
+
|
|
7
29
|
## 1.4.3 β 2025-11-27 β π§Ή Chores
|
|
8
30
|
- **release:** 1.4.2 (fac8999)
|
|
9
31
|
- remove invalid turbopack experimental config from next.config.ts (af0a7ea)
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@programinglive/dev-workflow-mcp-server",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.6",
|
|
4
4
|
"description": "MCP server to enforce development workflow discipline",
|
|
5
5
|
"homepage": "https://devworkflow.programinglive.com/",
|
|
6
|
+
"mcpName": "io.github.programinglive/dev-workflow-mcp-server",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"main": "index.js",
|
|
8
9
|
"bin": {
|
package/server.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
|
|
3
|
+
"name": "io.github.programinglive/dev-workflow-mcp-server",
|
|
4
|
+
"description": "MCP server to enforce development workflow discipline",
|
|
5
|
+
"version": "1.4.6",
|
|
6
|
+
"packages": [
|
|
7
|
+
{
|
|
8
|
+
"registry_type": "npm",
|
|
9
|
+
"identifier": "@programinglive/dev-workflow-mcp-server",
|
|
10
|
+
"version": "1.4.6"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
package/tests/build.test.js
CHANGED
|
@@ -46,3 +46,16 @@ test('build script exists in package.json', async () => {
|
|
|
46
46
|
assert.strictEqual(typeof pkg.scripts['build:server'], 'string');
|
|
47
47
|
assert(pkg.scripts['build:server'].includes('vite build'));
|
|
48
48
|
});
|
|
49
|
+
|
|
50
|
+
test('Hero component fetches version dynamically', async () => {
|
|
51
|
+
const heroPath = path.join(process.cwd(), 'web', 'components', 'Hero.tsx');
|
|
52
|
+
const heroContent = await readFile(heroPath, 'utf-8');
|
|
53
|
+
|
|
54
|
+
// Verify no hardcoded version strings
|
|
55
|
+
assert(!heroContent.includes('v1.3.12'), 'Hero should not have hardcoded v1.3.12');
|
|
56
|
+
assert(!heroContent.includes('"1.3.12"'), 'Hero should not have hardcoded "1.3.12"');
|
|
57
|
+
|
|
58
|
+
// Verify it fetches from /api/version
|
|
59
|
+
assert(heroContent.includes('fetch("/api/version")'), 'Hero should fetch version from API');
|
|
60
|
+
assert(heroContent.includes('useState<string | null>(null)'), 'Hero should have version state');
|
|
61
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
const projectRoot = process.cwd();
|
|
7
|
+
|
|
8
|
+
async function readJson(relativePath) {
|
|
9
|
+
const fullPath = path.join(projectRoot, relativePath);
|
|
10
|
+
const content = await readFile(fullPath, "utf-8");
|
|
11
|
+
return JSON.parse(content);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
test("package.json includes mcpName for MCP registry", async () => {
|
|
15
|
+
const pkg = await readJson("package.json");
|
|
16
|
+
|
|
17
|
+
assert.strictEqual(
|
|
18
|
+
pkg.mcpName,
|
|
19
|
+
"io.github.programinglive/dev-workflow-mcp-server",
|
|
20
|
+
"package.json should declare mcpName matching the MCP server namespace",
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("server.json is configured for npm package deployment", async () => {
|
|
25
|
+
const server = await readJson("server.json");
|
|
26
|
+
|
|
27
|
+
assert.strictEqual(
|
|
28
|
+
server.name,
|
|
29
|
+
"io.github.programinglive/dev-workflow-mcp-server",
|
|
30
|
+
"server.json name should match the MCP server namespace",
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
assert.ok(Array.isArray(server.packages) && server.packages.length > 0,
|
|
34
|
+
"server.json should declare at least one package entry",
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const npmPkg = server.packages[0];
|
|
38
|
+
|
|
39
|
+
assert.strictEqual(
|
|
40
|
+
npmPkg.registry_type,
|
|
41
|
+
"npm",
|
|
42
|
+
"First server.json package entry should use npm registry_type",
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
assert.strictEqual(
|
|
46
|
+
npmPkg.identifier,
|
|
47
|
+
"@programinglive/dev-workflow-mcp-server",
|
|
48
|
+
"server.json npm identifier should match the published npm package name",
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
assert.ok(
|
|
52
|
+
typeof npmPkg.version === "string" && npmPkg.version.length > 0,
|
|
53
|
+
"server.json npm package version should be a non-empty string",
|
|
54
|
+
);
|
|
55
|
+
});
|
package/web/components/Hero.tsx
CHANGED
|
@@ -7,12 +7,18 @@ import { useEffect, useState } from "react";
|
|
|
7
7
|
|
|
8
8
|
export default function Hero() {
|
|
9
9
|
const [downloads, setDownloads] = useState<number | null>(null);
|
|
10
|
+
const [version, setVersion] = useState<string | null>(null);
|
|
10
11
|
|
|
11
12
|
useEffect(() => {
|
|
12
13
|
fetch("/api/npm-downloads")
|
|
13
14
|
.then(res => res.json())
|
|
14
15
|
.then(data => setDownloads(data.downloads))
|
|
15
16
|
.catch(() => setDownloads(null));
|
|
17
|
+
|
|
18
|
+
fetch("/api/version")
|
|
19
|
+
.then(res => res.json())
|
|
20
|
+
.then(data => setVersion(data.version))
|
|
21
|
+
.catch(() => setVersion(null));
|
|
16
22
|
}, []);
|
|
17
23
|
|
|
18
24
|
const formatDownloads = (num: number) => {
|
|
@@ -30,7 +36,7 @@ export default function Hero() {
|
|
|
30
36
|
<div className="animate-fade-in-up" style={{ animationDelay: "0.1s" }}>
|
|
31
37
|
<div className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm mb-8">
|
|
32
38
|
<span className="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse"></span>
|
|
33
|
-
<span>
|
|
39
|
+
<span>v{version ?? "..."} - Active</span>
|
|
34
40
|
</div>
|
|
35
41
|
</div>
|
|
36
42
|
|
|
@@ -51,7 +57,7 @@ export default function Hero() {
|
|
|
51
57
|
</div>
|
|
52
58
|
<div className="flex flex-wrap gap-6 sm:gap-8 text-sm animate-fade-in-up" style={{ animationDelay: "0.5s" }}>
|
|
53
59
|
<div>
|
|
54
|
-
<div className="text-2xl font-bold">
|
|
60
|
+
<div className="text-2xl font-bold">{version ?? "..."}</div>
|
|
55
61
|
<div className="text-gray-500">Latest Version</div>
|
|
56
62
|
</div>
|
|
57
63
|
<div>
|