@programinglive/dev-workflow-mcp-server 1.8.1 → 1.10.0
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/.env.example +21 -1
- package/AGENTS.md +25 -0
- package/README.md +372 -649
- package/factory-client.js +554 -0
- package/git-facade.js +35 -0
- package/index.js +9 -34
- package/package.json +21 -20
- package/scripts/bootstrap-unix.sh +55 -0
- package/scripts/bootstrap-windows.ps1 +75 -0
- package/scripts/install-husky.js +43 -0
- package/scripts/setup-stack.js +436 -0
- package/scripts/setup-test-dbs.sh +61 -0
- package/scripts/test-db-adapters.sh +71 -0
- package/scripts/verify-bundle.mjs +92 -0
- package/tools/definitions.js +143 -0
- package/tools/handler-modules/commit-handlers.js +2 -1
- package/tools/handler-modules/factory-handlers.js +276 -0
- package/tools/handler-modules/index.js +24 -7
- package/tools/handler-modules/shared.js +7 -41
- package/tools/handler-modules/status-handlers.js +25 -3
- package/tools/handler-modules/workflow-handlers.js +57 -10
- package/vite.config.js +6 -0
- package/workflow-state.js +176 -2
- package/.agent/workflows/dev-workflow-bugfix.md +0 -250
- package/.agent/workflows/dev-workflow-feature.md +0 -201
- package/.agent/workflows/dev-workflow-full-cycle.md +0 -400
- package/.agent/workflows/dev-workflow-refactor.md +0 -238
- package/.env.production +0 -16
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -34
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -25
- package/.github/pull_request_template.md +0 -22
- package/.github/workflows/github-release.yml +0 -131
- package/.husky/commit-msg +0 -3
- package/.husky/pre-commit +0 -2
- package/CHANGELOG.md +0 -1145
- package/docs/GCP_DEPLOYMENT.md +0 -298
- package/docs/NETLIFY_DEPLOYMENT.md +0 -125
- package/docs/PLESK_DEPLOYMENT.md +0 -170
- package/docs/PRD.md +0 -86
- package/docs/WORKFLOW-BEST-PRACTICES.md +0 -58
- package/docs/antigravity/EXAMPLES.md +0 -535
- package/docs/antigravity/GETTING-STARTED.md +0 -292
- package/docs/antigravity/TROUBLESHOOTING.md +0 -742
- package/docs/antigravity/WALKTHROUGH.md +0 -25
- package/docs/antigravity/WORKFLOW-TEMPLATES.md +0 -670
- package/docs/release-notes/RELEASE_NOTES.md +0 -524
- package/docs/web-dashboard.md +0 -175
- package/scripts/test-auth-flow.js +0 -75
- package/tailwind.config.js +0 -8
- package/tests/build.test.js +0 -74
- package/tests/db-adapters.test.js +0 -108
- package/tests/env-support.test.js +0 -46
- package/tests/exec.test.js +0 -35
- package/tests/handlers-commit.test.js +0 -174
- package/tests/handlers-release.test.js +0 -212
- package/tests/handlers-workflow.test.js +0 -68
- package/tests/handlers.test.js +0 -1142
- package/tests/hello-world.test.js +0 -13
- package/tests/mcpRegistry.test.js +0 -65
- package/tests/patch-release.test.js +0 -7
- package/tests/release-wrapper.test.js +0 -107
- package/tests/startup-resilience.test.js +0 -73
- package/tests/test-helpers.js +0 -50
- package/tests/workflowState.test.js +0 -520
- package/web/Dockerfile.api +0 -25
- package/web/README.md +0 -133
- package/web/__tests__/api/workflow-history.test.js +0 -63
- package/web/api-server.js +0 -211
- package/web/app/docs/page.tsx +0 -202
- package/web/app/favicon.ico +0 -0
- package/web/app/globals.css +0 -91
- package/web/app/history/page.tsx +0 -220
- package/web/app/layout.tsx +0 -39
- package/web/app/login/page.tsx +0 -142
- package/web/app/page.tsx +0 -13
- package/web/components/ApiReference.tsx +0 -20
- package/web/components/Features.tsx +0 -61
- package/web/components/Footer.tsx +0 -9
- package/web/components/Hero.tsx +0 -96
- package/web/components/History.tsx +0 -175
- package/web/components/Navbar.tsx +0 -208
- package/web/components/Terminal.tsx +0 -114
- package/web/components/ThemeProvider.tsx +0 -58
- package/web/eslint.config.mjs +0 -18
- package/web/lib/api-client.ts +0 -123
- package/web/lib/auth.js +0 -75
- package/web/lib/db.js +0 -131
- package/web/lib/docs.js +0 -73
- package/web/middleware/auth.js +0 -26
- package/web/netlify.toml +0 -8
- package/web/next.config.ts +0 -19
- package/web/package-lock.json +0 -10911
- package/web/package.json +0 -42
- package/web/postcss.config.mjs +0 -9
- package/web/public/assets/android-chrome-192x192.png +0 -0
- package/web/public/assets/android-chrome-512x512.png +0 -0
- package/web/public/assets/apple-touch-icon.png +0 -0
- package/web/public/assets/favicon-16x16.png +0 -0
- package/web/public/assets/favicon-32x32.png +0 -0
- package/web/public/assets/favicon.ico +0 -0
- package/web/public/assets/favicon.png +0 -0
- package/web/public/assets/logo.png +0 -0
- package/web/public/assets/og-preview.png +0 -0
- package/web/public/assets/site.webmanifest +0 -1
- package/web/public/file.svg +0 -1
- package/web/public/globe.svg +0 -1
- package/web/public/next.svg +0 -1
- package/web/public/vercel.svg +0 -1
- package/web/public/window.svg +0 -1
- package/web/scripts/db-query-history.js +0 -120
- package/web/scripts/smoke-test.js +0 -30
- package/web/server.js +0 -184
- package/web/tailwind.config.ts +0 -20
- package/web/tsconfig.json +0 -42
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { test, describe } from 'node:test';
|
|
2
|
-
import assert from 'node:assert';
|
|
3
|
-
import request from 'supertest';
|
|
4
|
-
import express from 'express';
|
|
5
|
-
|
|
6
|
-
describe('Workflow History API', () => {
|
|
7
|
-
let app;
|
|
8
|
-
let server;
|
|
9
|
-
|
|
10
|
-
test('setup app', () => {
|
|
11
|
-
// Mock Express app for testing
|
|
12
|
-
app = express();
|
|
13
|
-
app.use(express.json());
|
|
14
|
-
|
|
15
|
-
// Mock session middleware
|
|
16
|
-
app.use((req, res, next) => {
|
|
17
|
-
req.session = { userId: 1 };
|
|
18
|
-
next();
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// Mock history endpoint
|
|
22
|
-
app.get('/api/workflow/history', async (req, res) => {
|
|
23
|
-
// Mock response
|
|
24
|
-
res.json({
|
|
25
|
-
history: [
|
|
26
|
-
{
|
|
27
|
-
id: 1,
|
|
28
|
-
task_type: 'feature',
|
|
29
|
-
description: 'Test feature',
|
|
30
|
-
commit_message: 'feat: test commit',
|
|
31
|
-
completed_at: new Date().toISOString(),
|
|
32
|
-
tests_passed: true,
|
|
33
|
-
documentation_type: 'README'
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test('GET /api/workflow/history returns workflow history', async () => {
|
|
41
|
-
const response = await request(app)
|
|
42
|
-
.get('/api/workflow/history')
|
|
43
|
-
.expect(200);
|
|
44
|
-
|
|
45
|
-
assert(response.body.history, 'History property should exist');
|
|
46
|
-
assert(Array.isArray(response.body.history), 'History should be an array');
|
|
47
|
-
assert(response.body.history.length > 0, 'History should not be empty');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('History items have required fields', async () => {
|
|
51
|
-
const response = await request(app)
|
|
52
|
-
.get('/api/workflow/history')
|
|
53
|
-
.expect(200);
|
|
54
|
-
|
|
55
|
-
const item = response.body.history[0];
|
|
56
|
-
assert(item.id, 'Item should have id');
|
|
57
|
-
assert(item.task_type, 'Item should have task_type');
|
|
58
|
-
assert(item.description, 'Item should have description');
|
|
59
|
-
assert(item.commit_message, 'Item should have commit_message');
|
|
60
|
-
assert(item.completed_at, 'Item should have completed_at');
|
|
61
|
-
assert(item.tests_passed !== undefined, 'Item should have tests_passed');
|
|
62
|
-
});
|
|
63
|
-
});
|
package/web/api-server.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import cors from 'cors';
|
|
3
|
-
import pg from 'pg';
|
|
4
|
-
import dotenv from 'dotenv';
|
|
5
|
-
import bcrypt from 'bcrypt';
|
|
6
|
-
import jwt from 'jsonwebtoken';
|
|
7
|
-
|
|
8
|
-
dotenv.config({ path: '../.env' });
|
|
9
|
-
|
|
10
|
-
const app = express();
|
|
11
|
-
const { Pool } = pg;
|
|
12
|
-
|
|
13
|
-
const PORT = process.env.API_PORT || 8080;
|
|
14
|
-
const dbUrl = process.env.DEV_WORKFLOW_DB_URL;
|
|
15
|
-
const JWT_SECRET = process.env.JWT_SECRET || 'dev-workflow-jwt-secret-change-me';
|
|
16
|
-
|
|
17
|
-
if (!dbUrl) {
|
|
18
|
-
console.error('❌ DEV_WORKFLOW_DB_URL is not set');
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const pool = new Pool({ connectionString: dbUrl });
|
|
23
|
-
|
|
24
|
-
// Authentication helper functions
|
|
25
|
-
async function authenticateUser(pool, username, password) {
|
|
26
|
-
const result = await pool.query(
|
|
27
|
-
'SELECT * FROM users WHERE username = $1',
|
|
28
|
-
[username]
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
if (result.rows.length === 0) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const user = result.rows[0];
|
|
36
|
-
const isValid = await bcrypt.compare(password, user.password_hash);
|
|
37
|
-
|
|
38
|
-
if (!isValid) {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
id: user.id,
|
|
44
|
-
username: user.username,
|
|
45
|
-
email: user.email,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function getUserById(pool, userId) {
|
|
50
|
-
const result = await pool.query(
|
|
51
|
-
'SELECT id, username, email FROM users WHERE id = $1',
|
|
52
|
-
[userId]
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
return result.rows[0] || null;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// CORS configuration - allow Netlify domain
|
|
59
|
-
const corsOptions = {
|
|
60
|
-
origin: [
|
|
61
|
-
'https://devworkflow.programinglive.com',
|
|
62
|
-
'http://localhost:3000',
|
|
63
|
-
],
|
|
64
|
-
credentials: true,
|
|
65
|
-
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
66
|
-
allowedHeaders: ['Content-Type', 'Authorization'],
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
app.use(cors(corsOptions));
|
|
70
|
-
app.use(express.json());
|
|
71
|
-
app.use(express.urlencoded({ extended: true }));
|
|
72
|
-
app.set('trust proxy', 1);
|
|
73
|
-
|
|
74
|
-
// Middleware to verify JWT
|
|
75
|
-
const requireAuth = (req, res, next) => {
|
|
76
|
-
const authHeader = req.headers.authorization;
|
|
77
|
-
|
|
78
|
-
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
79
|
-
const token = authHeader.split(' ')[1];
|
|
80
|
-
try {
|
|
81
|
-
const decoded = jwt.verify(token, JWT_SECRET);
|
|
82
|
-
req.user = decoded;
|
|
83
|
-
return next();
|
|
84
|
-
} catch (err) {
|
|
85
|
-
return res.status(401).json({ error: 'Invalid token' });
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return res.status(401).json({ error: 'Authentication required' });
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// Health check endpoint
|
|
93
|
-
app.get('/api/health', (req, res) => {
|
|
94
|
-
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
// Authentication endpoints
|
|
98
|
-
app.post('/api/auth/login', async (req, res) => {
|
|
99
|
-
try {
|
|
100
|
-
const { username, password } = req.body;
|
|
101
|
-
|
|
102
|
-
if (!username || !password) {
|
|
103
|
-
return res.status(400).json({ error: 'Username and password are required' });
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const user = await authenticateUser(pool, username, password);
|
|
107
|
-
|
|
108
|
-
if (!user) {
|
|
109
|
-
return res.status(401).json({ error: 'Invalid credentials' });
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Generate JWT Token
|
|
113
|
-
const token = jwt.sign(
|
|
114
|
-
{ userId: user.id, username: user.username },
|
|
115
|
-
JWT_SECRET,
|
|
116
|
-
{ expiresIn: '30d' }
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
res.json({
|
|
120
|
-
success: true,
|
|
121
|
-
token,
|
|
122
|
-
user: {
|
|
123
|
-
id: user.id,
|
|
124
|
-
username: user.username,
|
|
125
|
-
email: user.email,
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
} catch (error) {
|
|
129
|
-
console.error('Login error:', error);
|
|
130
|
-
res.status(500).json({ error: 'Internal server error' });
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
app.post('/api/auth/logout', (req, res) => {
|
|
135
|
-
// Client-side only action for JWT
|
|
136
|
-
res.json({ success: true });
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
app.get('/api/auth/me', requireAuth, async (req, res) => {
|
|
140
|
-
try {
|
|
141
|
-
const user = await getUserById(pool, req.user.userId);
|
|
142
|
-
|
|
143
|
-
if (!user) {
|
|
144
|
-
return res.status(404).json({ error: 'User not found' });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
res.json({
|
|
148
|
-
id: user.id,
|
|
149
|
-
username: user.username,
|
|
150
|
-
email: user.email,
|
|
151
|
-
});
|
|
152
|
-
} catch (error) {
|
|
153
|
-
console.error('Get user error:', error);
|
|
154
|
-
res.status(500).json({ error: 'Internal server error' });
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
// Workflow history endpoints
|
|
159
|
-
app.get('/api/history', requireAuth, async (req, res) => {
|
|
160
|
-
try {
|
|
161
|
-
const result = await pool.query(
|
|
162
|
-
`SELECT id, task_type, description, commit_message, completed_at, tests_passed, documentation_type
|
|
163
|
-
FROM workflow_history
|
|
164
|
-
WHERE user_id = $1
|
|
165
|
-
ORDER BY completed_at DESC
|
|
166
|
-
LIMIT 100`,
|
|
167
|
-
[req.user.userId]
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
res.json({
|
|
171
|
-
history: result.rows,
|
|
172
|
-
});
|
|
173
|
-
} catch (error) {
|
|
174
|
-
console.error('Get history error:', error);
|
|
175
|
-
res.status(500).json({ error: 'Failed to fetch history' });
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
app.post('/api/history', requireAuth, async (req, res) => {
|
|
180
|
-
try {
|
|
181
|
-
const { task_type, description, commit_message, tests_passed, documentation_type } = req.body;
|
|
182
|
-
|
|
183
|
-
const result = await pool.query(
|
|
184
|
-
`INSERT INTO workflow_history (user_id, task_type, description, commit_message, tests_passed, documentation_type, completed_at)
|
|
185
|
-
VALUES ($1, $2, $3, $4, $5, $6, NOW())
|
|
186
|
-
RETURNING *`,
|
|
187
|
-
[req.user.userId, task_type, description, commit_message, tests_passed, documentation_type]
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
res.json({
|
|
191
|
-
success: true,
|
|
192
|
-
history: result.rows[0],
|
|
193
|
-
});
|
|
194
|
-
} catch (error) {
|
|
195
|
-
console.error('Create history error:', error);
|
|
196
|
-
res.status(500).json({ error: 'Failed to create history entry' });
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
// Error handling middleware
|
|
201
|
-
app.use((err, req, res, next) => {
|
|
202
|
-
console.error('Unhandled error:', err);
|
|
203
|
-
res.status(500).json({ error: 'Internal server error' });
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
// Start server
|
|
207
|
-
app.listen(PORT, '0.0.0.0', () => {
|
|
208
|
-
console.log(`✅ API server running on port ${PORT}`);
|
|
209
|
-
console.log(`📊 Database: ${dbUrl.replace(/:[^:]*@/, ':****@')}`);
|
|
210
|
-
console.log(`🌐 CORS enabled for: ${corsOptions.origin.join(', ')}`);
|
|
211
|
-
});
|
package/web/app/docs/page.tsx
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
import { ArrowLeft, CheckCircle, GitBranch, FileText, TestTube, Rocket } from "lucide-react";
|
|
3
|
-
|
|
4
|
-
export default function DocsPage() {
|
|
5
|
-
return (
|
|
6
|
-
<div className="min-h-screen bg-white dark:bg-[#0a0a0f] text-gray-900 dark:text-white pt-20 px-4 pb-12 transition-colors duration-300">
|
|
7
|
-
<div className="max-w-4xl mx-auto">
|
|
8
|
-
<div className="mb-8">
|
|
9
|
-
<Link href="/" className="inline-flex items-center gap-2 text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 transition">
|
|
10
|
-
<ArrowLeft className="w-4 h-4" />
|
|
11
|
-
Back to Dashboard
|
|
12
|
-
</Link>
|
|
13
|
-
</div>
|
|
14
|
-
|
|
15
|
-
<div className="prose dark:prose-invert max-w-none">
|
|
16
|
-
<h1 className="text-5xl font-bold mb-4 bg-gradient-to-r from-indigo-600 dark:from-indigo-400 via-purple-600 dark:via-purple-400 to-pink-600 dark:to-pink-400 bg-clip-text text-transparent">
|
|
17
|
-
Dev Workflow MCP Server
|
|
18
|
-
</h1>
|
|
19
|
-
<p className="text-xl text-gray-600 dark:text-gray-400 mb-8">
|
|
20
|
-
An MCP server that acts as your coding conscience. Enforce test-driven development, ensure documentation,
|
|
21
|
-
and never skip a step in your release process.
|
|
22
|
-
</p>
|
|
23
|
-
|
|
24
|
-
<div className="bg-emerald-50 dark:bg-emerald-500/10 border border-emerald-200 dark:border-emerald-500/20 rounded-lg p-4 mb-8">
|
|
25
|
-
<p className="text-emerald-700 dark:text-emerald-400 font-semibold">Version: 1.7.15</p>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Features</h2>
|
|
29
|
-
<div className="grid md:grid-cols-2 gap-4 mb-8">
|
|
30
|
-
<div className="p-4 rounded-lg bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10">
|
|
31
|
-
<div className="flex items-center gap-3 mb-2">
|
|
32
|
-
<CheckCircle className="w-5 h-5 text-indigo-600 dark:text-indigo-400" />
|
|
33
|
-
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">Enforced Discipline</h3>
|
|
34
|
-
</div>
|
|
35
|
-
<p className="text-gray-600 dark:text-gray-400 text-sm">Won't let you skip important steps. Follows a strict, proven development workflow.</p>
|
|
36
|
-
</div>
|
|
37
|
-
<div className="p-4 rounded-lg bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10">
|
|
38
|
-
<div className="flex items-center gap-3 mb-2">
|
|
39
|
-
<TestTube className="w-5 h-5 text-purple-600 dark:text-purple-400" />
|
|
40
|
-
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">Test-Driven</h3>
|
|
41
|
-
</div>
|
|
42
|
-
<p className="text-gray-600 dark:text-gray-400 text-sm">Blocks commits if tests fail. Encourages writing tests before marking tasks complete.</p>
|
|
43
|
-
</div>
|
|
44
|
-
<div className="p-4 rounded-lg bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10">
|
|
45
|
-
<div className="flex items-center gap-3 mb-2">
|
|
46
|
-
<FileText className="w-5 h-5 text-emerald-600 dark:text-emerald-400" />
|
|
47
|
-
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">Documentation</h3>
|
|
48
|
-
</div>
|
|
49
|
-
<p className="text-gray-600 dark:text-gray-400 text-sm">Reminds you to update documentation (README, docs, changelog) for every change.</p>
|
|
50
|
-
</div>
|
|
51
|
-
<div className="p-4 rounded-lg bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10">
|
|
52
|
-
<div className="flex items-center gap-3 mb-2">
|
|
53
|
-
<GitBranch className="w-5 h-5 text-orange-600 dark:text-orange-400" />
|
|
54
|
-
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">State Tracking</h3>
|
|
55
|
-
</div>
|
|
56
|
-
<p className="text-gray-600 dark:text-gray-400 text-sm">Remembers exactly where you are in the workflow, even across sessions.</p>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Installation</h2>
|
|
61
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-6 border border-gray-300 dark:border-white/10 mb-8">
|
|
62
|
-
<pre className="text-sm overflow-x-auto">
|
|
63
|
-
<code className="text-gray-700 dark:text-gray-300">npm install -g @programinglive/dev-workflow-mcp-server</code>
|
|
64
|
-
</pre>
|
|
65
|
-
</div>
|
|
66
|
-
|
|
67
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Quick Start</h2>
|
|
68
|
-
<ol className="space-y-4 mb-8">
|
|
69
|
-
<li className="flex gap-4">
|
|
70
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-indigo-100 dark:bg-indigo-500/20 flex items-center justify-center text-indigo-600 dark:text-indigo-400 font-bold">1</span>
|
|
71
|
-
<div>
|
|
72
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Start a Task</h3>
|
|
73
|
-
<p className="text-gray-600 dark:text-gray-400">Begin your coding session by defining what you're working on.</p>
|
|
74
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
75
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">start_task</code>
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
|
-
</li>
|
|
79
|
-
<li className="flex gap-4">
|
|
80
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-purple-100 dark:bg-purple-500/20 flex items-center justify-center text-purple-600 dark:text-purple-400 font-bold">2</span>
|
|
81
|
-
<div>
|
|
82
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Mark Bug Fixed</h3>
|
|
83
|
-
<p className="text-gray-600 dark:text-gray-400">Once you've implemented your feature or fix, mark it as complete.</p>
|
|
84
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
85
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">mark_bug_fixed</code>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
</li>
|
|
89
|
-
<li className="flex gap-4">
|
|
90
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-emerald-100 dark:bg-emerald-500/20 flex items-center justify-center text-emerald-600 dark:text-emerald-400 font-bold">3</span>
|
|
91
|
-
<div>
|
|
92
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Create Tests</h3>
|
|
93
|
-
<p className="text-gray-600 dark:text-gray-400">Write tests to verify your changes work correctly.</p>
|
|
94
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
95
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">create_tests</code>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
</li>
|
|
99
|
-
<li className="flex gap-4">
|
|
100
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-orange-100 dark:bg-orange-500/20 flex items-center justify-center text-orange-600 dark:text-orange-400 font-bold">4</span>
|
|
101
|
-
<div>
|
|
102
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Run Tests</h3>
|
|
103
|
-
<p className="text-gray-600 dark:text-gray-400">Execute your test suite and ensure everything passes.</p>
|
|
104
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
105
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">run_tests</code>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
</li>
|
|
109
|
-
<li className="flex gap-4">
|
|
110
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-pink-100 dark:bg-pink-500/20 flex items-center justify-center text-pink-600 dark:text-pink-400 font-bold">5</span>
|
|
111
|
-
<div>
|
|
112
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Create Documentation</h3>
|
|
113
|
-
<p className="text-gray-600 dark:text-gray-400">Update relevant documentation for your changes.</p>
|
|
114
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
115
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">create_documentation</code>
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
</li>
|
|
119
|
-
<li className="flex gap-4">
|
|
120
|
-
<span className="flex-shrink-0 w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-500/20 flex items-center justify-center text-blue-600 dark:text-blue-400 font-bold">6</span>
|
|
121
|
-
<div>
|
|
122
|
-
<h3 className="font-semibold mb-1 text-gray-900 dark:text-white">Commit and Push</h3>
|
|
123
|
-
<p className="text-gray-600 dark:text-gray-400">Commit your changes and push to the repository.</p>
|
|
124
|
-
<div className="bg-gray-100 dark:bg-[#1a1a24] rounded-lg p-3 mt-2 border border-gray-300 dark:border-white/10">
|
|
125
|
-
<code className="text-sm text-gray-700 dark:text-gray-300">commit_and_push</code>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
</li>
|
|
129
|
-
</ol>
|
|
130
|
-
|
|
131
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Available Commands</h2>
|
|
132
|
-
<div className="space-y-3 mb-8">
|
|
133
|
-
{[
|
|
134
|
-
{ cmd: "start_task", desc: "Begin a new coding task" },
|
|
135
|
-
{ cmd: "mark_bug_fixed", desc: "Mark feature/bugfix as complete" },
|
|
136
|
-
{ cmd: "create_tests", desc: "Record that tests have been created" },
|
|
137
|
-
{ cmd: "run_tests", desc: "Execute and record test results" },
|
|
138
|
-
{ cmd: "skip_tests", desc: "Skip tests with justification" },
|
|
139
|
-
{ cmd: "create_documentation", desc: "Record documentation updates" },
|
|
140
|
-
{ cmd: "commit_and_push", desc: "Commit and push changes" },
|
|
141
|
-
{ cmd: "perform_release", desc: "Execute release process" },
|
|
142
|
-
{ cmd: "complete_task", desc: "Mark task as complete" },
|
|
143
|
-
{ cmd: "get_workflow_status", desc: "Check current workflow state" },
|
|
144
|
-
{ cmd: "view_history", desc: "View completed tasks" },
|
|
145
|
-
].map((item) => (
|
|
146
|
-
<div key={item.cmd} className="p-4 rounded-lg bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10 hover:bg-gray-100 dark:hover:bg-white/10 transition">
|
|
147
|
-
<code className="text-indigo-600 dark:text-indigo-400 font-mono">{item.cmd}</code>
|
|
148
|
-
<p className="text-gray-600 dark:text-gray-400 text-sm mt-1">{item.desc}</p>
|
|
149
|
-
</div>
|
|
150
|
-
))}
|
|
151
|
-
</div>
|
|
152
|
-
|
|
153
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Configuration</h2>
|
|
154
|
-
<p className="text-gray-600 dark:text-gray-400 mb-4">
|
|
155
|
-
The server stores workflow state in a SQLite database located at <code className="text-indigo-600 dark:text-indigo-400 bg-gray-100 dark:bg-white/5 px-2 py-1 rounded">.state/dev-workflow.db</code>
|
|
156
|
-
</p>
|
|
157
|
-
<p className="text-gray-600 dark:text-gray-400 mb-8">
|
|
158
|
-
Set the <code className="text-indigo-600 dark:text-indigo-400 bg-gray-100 dark:bg-white/5 px-2 py-1 rounded">DEV_WORKFLOW_USER_ID</code> environment variable to isolate workflow state per user.
|
|
159
|
-
</p>
|
|
160
|
-
|
|
161
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">Requirements</h2>
|
|
162
|
-
<ul className="space-y-2 mb-8">
|
|
163
|
-
<li className="flex items-center gap-2 text-gray-600 dark:text-gray-400">
|
|
164
|
-
<CheckCircle className="w-4 h-4 text-emerald-600 dark:text-emerald-400" />
|
|
165
|
-
Node.js 18 or higher
|
|
166
|
-
</li>
|
|
167
|
-
<li className="flex items-center gap-2 text-gray-600 dark:text-gray-400">
|
|
168
|
-
<CheckCircle className="w-4 h-4 text-emerald-600 dark:text-emerald-400" />
|
|
169
|
-
Git installed and configured
|
|
170
|
-
</li>
|
|
171
|
-
<li className="flex items-center gap-2 text-gray-600 dark:text-gray-400">
|
|
172
|
-
<CheckCircle className="w-4 h-4 text-emerald-600 dark:text-emerald-400" />
|
|
173
|
-
MCP-compatible AI assistant (e.g., Claude Desktop)
|
|
174
|
-
</li>
|
|
175
|
-
</ul>
|
|
176
|
-
|
|
177
|
-
<h2 className="text-3xl font-bold mt-12 mb-6 text-gray-900 dark:text-white">License</h2>
|
|
178
|
-
<p className="text-gray-600 dark:text-gray-400 mb-8">
|
|
179
|
-
MIT License - Free to use for personal and commercial projects.
|
|
180
|
-
</p>
|
|
181
|
-
|
|
182
|
-
<div className="bg-gradient-to-r from-indigo-50 dark:from-indigo-500/10 via-purple-50 dark:via-purple-500/10 to-pink-50 dark:to-pink-500/10 border border-gray-300 dark:border-white/10 rounded-lg p-6 mt-12">
|
|
183
|
-
<div className="flex items-center gap-3 mb-3">
|
|
184
|
-
<Rocket className="w-6 h-6 text-pink-600 dark:text-pink-400" />
|
|
185
|
-
<h3 className="text-xl font-bold text-gray-900 dark:text-white">Ready to get started?</h3>
|
|
186
|
-
</div>
|
|
187
|
-
<p className="text-gray-600 dark:text-gray-400 mb-4">
|
|
188
|
-
Install the MCP server and start enforcing best practices in your development workflow today!
|
|
189
|
-
</p>
|
|
190
|
-
<Link
|
|
191
|
-
href="https://github.com/programinglive/dev-workflow-mcp-server"
|
|
192
|
-
target="_blank"
|
|
193
|
-
className="inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-indigo-600 to-purple-600 dark:from-indigo-600 dark:to-purple-600 rounded-lg font-semibold text-white hover:shadow-lg hover:shadow-indigo-500/50 transition"
|
|
194
|
-
>
|
|
195
|
-
View on GitHub
|
|
196
|
-
</Link>
|
|
197
|
-
</div>
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
</div>
|
|
201
|
-
);
|
|
202
|
-
}
|
package/web/app/favicon.ico
DELETED
|
Binary file
|
package/web/app/globals.css
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
@tailwind base;
|
|
2
|
-
@tailwind components;
|
|
3
|
-
@tailwind utilities;
|
|
4
|
-
|
|
5
|
-
:root {
|
|
6
|
-
--background: #0a0a0f;
|
|
7
|
-
--foreground: #ffffff;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
body {
|
|
11
|
-
color: var(--foreground);
|
|
12
|
-
background: var(--background);
|
|
13
|
-
font-family: Arial, Helvetica, sans-serif;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@layer utilities {
|
|
17
|
-
@keyframes fadeInUp {
|
|
18
|
-
0% {
|
|
19
|
-
opacity: 0;
|
|
20
|
-
transform: translateY(20px);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
100% {
|
|
24
|
-
opacity: 1;
|
|
25
|
-
transform: translateY(0px);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@keyframes fadeInRight {
|
|
30
|
-
0% {
|
|
31
|
-
opacity: 0;
|
|
32
|
-
transform: translateY(-50%) translateX(40px);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
100% {
|
|
36
|
-
opacity: 1;
|
|
37
|
-
transform: translateY(-50%) translateX(0px);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@keyframes fadeIn {
|
|
42
|
-
0% {
|
|
43
|
-
opacity: 0;
|
|
44
|
-
transform: translateX(-10px);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
100% {
|
|
48
|
-
opacity: 1;
|
|
49
|
-
transform: translateX(0px);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.animate-fade-in-up {
|
|
54
|
-
animation: fadeInUp 0.8s ease-out forwards;
|
|
55
|
-
opacity: 0;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
.animate-fade-in-right {
|
|
59
|
-
animation: fadeInRight 0.8s ease-out forwards;
|
|
60
|
-
opacity: 0;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.terminal-line {
|
|
64
|
-
opacity: 0;
|
|
65
|
-
display: flex;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.terminal-line.visible {
|
|
69
|
-
opacity: 1;
|
|
70
|
-
transition: opacity 0.1s;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.typing-cursor::after {
|
|
74
|
-
content: '▋';
|
|
75
|
-
animation: blink 1s step-end infinite;
|
|
76
|
-
margin-left: 4px;
|
|
77
|
-
color: #a855f7;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
@keyframes blink {
|
|
81
|
-
|
|
82
|
-
0%,
|
|
83
|
-
100% {
|
|
84
|
-
opacity: 1;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
50% {
|
|
88
|
-
opacity: 0;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|