@programinglive/dev-workflow-mcp-server 1.6.0 ā 1.6.2
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 +25 -0
- package/README.md +5 -0
- package/docs/release-notes/RELEASE_NOTES.md +12 -0
- package/package.json +1 -1
- package/tests/handlers.test.js +6 -1
- package/tools/handlers.js +11 -1
- package/web/tests/build.test.js +0 -69
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
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.6.2](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.6.1...v1.6.2) (2025-12-06)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### š Documentation
|
|
9
|
+
|
|
10
|
+
* update release notest for 1.6.1 ([72a9284](https://github.com/programinglive/dev-workflow-mcp-server/commit/72a92847444436e2c4bd17407e664117fe08a31f))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### ā
Tests
|
|
14
|
+
|
|
15
|
+
* update create_documentation test to verify PRD check and remove incompatible jest test ([a7f2b28](https://github.com/programinglive/dev-workflow-mcp-server/commit/a7f2b28e65116cfb556767e7e6b25c0b4cdba613))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### ⨠Features
|
|
19
|
+
|
|
20
|
+
* add PRD file existence check to create_documentation workflow step ([62cdee3](https://github.com/programinglive/dev-workflow-mcp-server/commit/62cdee3f7402ed70e3e36003020e84958cdd4a3d))
|
|
21
|
+
* add PRD file existence check to create_documentation workflow step ([6c51012](https://github.com/programinglive/dev-workflow-mcp-server/commit/6c510121980789c3d0e96376fe0375fbaf78a656))
|
|
22
|
+
|
|
23
|
+
### [1.6.1](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.6.0...v1.6.1) (2025-12-06)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### š Bug Fixes
|
|
27
|
+
|
|
28
|
+
* add table header to release notes for release script compatibility ([44e47fc](https://github.com/programinglive/dev-workflow-mcp-server/commit/44e47fc49ee9334cad82df095de1277038d0a0e9))
|
|
29
|
+
|
|
5
30
|
## [1.6.0](https://github.com/programinglive/dev-workflow-mcp-server/compare/v1.5.11...v1.6.0) (2025-12-06)
|
|
6
31
|
|
|
7
32
|
|
package/README.md
CHANGED
|
@@ -353,6 +353,7 @@ The tool will:
|
|
|
353
353
|
2. `create_tests`
|
|
354
354
|
3. `run_tests` with `testsPassed`, `testCommand`, and optional `testDetails`
|
|
355
355
|
4. `create_documentation` with `documentationType` and `documentationSummary`
|
|
356
|
+
- **Requires**: `docs/product/PRD.md` must exist before documentation can be marked complete
|
|
356
357
|
5. `check_ready_to_commit`
|
|
357
358
|
6. `commit_and_push` with `commitMessage` and optional `branch`
|
|
358
359
|
7. `perform_release` with `releaseCommand`, plus optional `releaseNotes`, `releaseType`, and `preset`
|
|
@@ -360,6 +361,10 @@ The tool will:
|
|
|
360
361
|
|
|
361
362
|
All arguments except the optional flags are required and must be non-empty strings.
|
|
362
363
|
|
|
364
|
+
### Documentation Requirements
|
|
365
|
+
|
|
366
|
+
The `create_documentation` step enforces that a PRD (Product Requirements Document) exists at `docs/product/PRD.md` before documentation can be marked as complete. This ensures all projects maintain a current PRD that describes the product's goals, features, and requirements.
|
|
367
|
+
|
|
363
368
|
## š« Releasing Without the Workflow Steps
|
|
364
369
|
|
|
365
370
|
The package ships with a release guard (`release-wrapper.js`) that backs the `npm run release:*` scripts. The guard refuses to run unless:
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
Authoritative history of user-visible changes for the Development Workflow MCP Server. Each entry highlights the improvements that shipped with the tagged version.
|
|
4
4
|
|
|
5
|
+
| Version | Date | Notes |
|
|
6
|
+
|---------|------|-------|
|
|
7
|
+
| 1.6.1 | 2025-12-06 | add table header to release notes for release script compatibility (44e47fc) |
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## 1.6.1 ā š Bug Fixes
|
|
11
|
+
|
|
12
|
+
Released on **2025-12-06**.
|
|
13
|
+
|
|
14
|
+
- add table header to release notes for release script compatibility (44e47fc)
|
|
15
|
+
- add responsive vertical monitor support and dark/light mode toggle (5565765)
|
|
16
|
+
|
|
5
17
|
## Unreleased
|
|
6
18
|
|
|
7
19
|
## 1.5.11 ā 2025-12-05
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@programinglive/dev-workflow-mcp-server",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "MCP server to enforce development workflow discipline",
|
|
5
5
|
"homepage": "https://devworkflow.programinglive.com/",
|
|
6
6
|
"mcpName": "io.github.programinglive/dev-workflow-mcp-server",
|
package/tests/handlers.test.js
CHANGED
|
@@ -79,7 +79,7 @@ test("run_tests guidance mentions core documentation types", async () => {
|
|
|
79
79
|
});
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
test("create_documentation
|
|
82
|
+
test("create_documentation verifies PRD file exists", async () => {
|
|
83
83
|
await withWorkflowState(async (workflowState) => {
|
|
84
84
|
workflowState.state.testsPassed = true;
|
|
85
85
|
await workflowState.save();
|
|
@@ -105,6 +105,7 @@ test("create_documentation accepts PRD and records created/updated message", asy
|
|
|
105
105
|
utils,
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
+
// Should succeed since PRD.md exists in the project
|
|
108
109
|
assert.equal(workflowState.state.documentationCreated, true);
|
|
109
110
|
assert.equal(workflowState.state.documentationType, "PRD");
|
|
110
111
|
assert.equal(
|
|
@@ -115,6 +116,10 @@ test("create_documentation accepts PRD and records created/updated message", asy
|
|
|
115
116
|
response.content[0].text.includes("Documentation created/updated!"),
|
|
116
117
|
"create_documentation response should mention created/updated",
|
|
117
118
|
);
|
|
119
|
+
assert.ok(
|
|
120
|
+
response.content[0].text.includes("PRD verified"),
|
|
121
|
+
"create_documentation response should verify PRD file",
|
|
122
|
+
);
|
|
118
123
|
});
|
|
119
124
|
});
|
|
120
125
|
|
package/tools/handlers.js
CHANGED
|
@@ -355,6 +355,16 @@ async function handleCreateDocumentation(args, workflowState) {
|
|
|
355
355
|
return textResponse("ā ļø Please ensure tests are passing first! Run 'run_tests' with passed=true.");
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
+
// Check if PRD exists in docs folder
|
|
359
|
+
const prdPath = path.join(__dirname, "..", "docs", "product", "PRD.md");
|
|
360
|
+
const prdExists = existsSync(prdPath);
|
|
361
|
+
|
|
362
|
+
if (!prdExists) {
|
|
363
|
+
return textResponse(
|
|
364
|
+
`ā ļø PRD file not found!\n\nExpected location: docs/product/PRD.md\n\nPlease create or update the PRD before marking documentation as complete.`
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
358
368
|
workflowState.state.documentationCreated = true;
|
|
359
369
|
workflowState.state.documentationType = args.documentationType;
|
|
360
370
|
workflowState.state.documentationSummary = args.summary;
|
|
@@ -368,7 +378,7 @@ async function handleCreateDocumentation(args, workflowState) {
|
|
|
368
378
|
await workflowState.save();
|
|
369
379
|
|
|
370
380
|
return textResponse(
|
|
371
|
-
`ā
Documentation created/updated!\n\nType: ${args.documentationType}\nSummary: ${args.summary}\n\nš You're ready to verify your work!\n\nNext Steps:\n1. ā Fix/implement feature\n2. ā Create tests\n3. ā Run tests (GREEN!)\n4. ā Create/update documentation\n5. ā³ Run 'check_ready_to_commit' to verify\n6. ā³ Run 'commit_and_push'\n7. ā³ Run 'perform_release'\n8. ā³ Mark as complete with 'complete_task'`
|
|
381
|
+
`ā
Documentation created/updated!\n\nType: ${args.documentationType}\nSummary: ${args.summary}\nā
PRD verified: docs/product/PRD.md exists\n\nš You're ready to verify your work!\n\nNext Steps:\n1. ā Fix/implement feature\n2. ā Create tests\n3. ā Run tests (GREEN!)\n4. ā Create/update documentation\n5. ā³ Run 'check_ready_to_commit' to verify\n6. ā³ Run 'commit_and_push'\n7. ā³ Run 'perform_release'\n8. ā³ Mark as complete with 'complete_task'`
|
|
372
382
|
);
|
|
373
383
|
}
|
|
374
384
|
|
package/web/tests/build.test.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build Verification Tests
|
|
3
|
-
* Tests that the website builds successfully and key features are present
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { execSync } from 'child_process';
|
|
7
|
-
import fs from 'fs';
|
|
8
|
-
import path from 'path';
|
|
9
|
-
import { fileURLToPath } from 'url';
|
|
10
|
-
|
|
11
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
-
const webDir = path.join(__dirname, '..');
|
|
13
|
-
const outDir = path.join(webDir, 'out');
|
|
14
|
-
|
|
15
|
-
describe('Build Tests', () => {
|
|
16
|
-
test('should build successfully', () => {
|
|
17
|
-
execSync('npm run build', { cwd: webDir, stdio: 'pipe' });
|
|
18
|
-
expect(fs.existsSync(outDir)).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('should generate homepage', () => {
|
|
22
|
-
const indexPath = path.join(outDir, 'index.html');
|
|
23
|
-
expect(fs.existsSync(indexPath)).toBe(true);
|
|
24
|
-
const content = fs.readFileSync(indexPath, 'utf-8');
|
|
25
|
-
expect(content).toContain('Dev Workflow');
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('should include dark mode support', () => {
|
|
29
|
-
const indexPath = path.join(outDir, 'index.html');
|
|
30
|
-
const content = fs.readFileSync(indexPath, 'utf-8');
|
|
31
|
-
expect(content).toContain('dark:');
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('should include responsive design', () => {
|
|
35
|
-
const indexPath = path.join(outDir, 'index.html');
|
|
36
|
-
const content = fs.readFileSync(indexPath, 'utf-8');
|
|
37
|
-
expect(content).toContain('sm:');
|
|
38
|
-
expect(content).toContain('md:');
|
|
39
|
-
expect(content).toContain('lg:');
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe('Theme Toggle Tests', () => {
|
|
44
|
-
test('should have theme persistence', () => {
|
|
45
|
-
const navbarPath = path.join(webDir, 'components', 'Navbar.tsx');
|
|
46
|
-
const content = fs.readFileSync(navbarPath, 'utf-8');
|
|
47
|
-
expect(content).toContain('localStorage');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('should detect system preference', () => {
|
|
51
|
-
const navbarPath = path.join(webDir, 'components', 'Navbar.tsx');
|
|
52
|
-
const content = fs.readFileSync(navbarPath, 'utf-8');
|
|
53
|
-
expect(content).toContain('prefers-color-scheme');
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe('Responsive Design Tests', () => {
|
|
58
|
-
test('should optimize for vertical monitors', () => {
|
|
59
|
-
const heroPath = path.join(webDir, 'components', 'Hero.tsx');
|
|
60
|
-
const content = fs.readFileSync(heroPath, 'utf-8');
|
|
61
|
-
expect(content).toContain('xl:grid-cols-2');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('should have responsive navbar', () => {
|
|
65
|
-
const navbarPath = path.join(webDir, 'components', 'Navbar.tsx');
|
|
66
|
-
const content = fs.readFileSync(navbarPath, 'utf-8');
|
|
67
|
-
expect(content).toContain('md:hidden');
|
|
68
|
-
});
|
|
69
|
-
});
|