@programinglive/dev-workflow-mcp-server 1.4.0 → 1.4.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/.github/workflows/npm-publish.yml +3 -0
- package/CHANGELOG.md +125 -2
- package/README.md +1 -1
- package/docs/PLESK_DEPLOYMENT.md +170 -0
- package/docs/WORKFLOW-BEST-PRACTICES.md +58 -0
- package/docs/release-notes/RELEASE_NOTES.md +40 -0
- package/package.json +7 -6
- package/release-wrapper.js +68 -33
- package/scripts/update-release-notes.cjs +14 -18
- package/tailwind.config.js +2 -4
- package/tests/build.test.js +3 -3
- package/tests/handlers.test.js +78 -0
- package/tests/release-wrapper.test.js +2 -0
- package/tests/workflowState.test.js +7 -4
- package/tools/definitions.js +2 -2
- package/tools/handlers.js +2 -2
- package/vite.web.config.js +23 -0
- package/web/README.md +36 -0
- package/web/app/api/docs/route.ts +32 -0
- package/web/app/api/history/route.ts +19 -0
- package/web/app/api/npm-downloads/route.ts +21 -0
- package/web/app/api/summary/route.ts +15 -0
- package/web/app/api/version/route.ts +15 -0
- package/web/app/docs/page.tsx +202 -0
- package/web/app/favicon.ico +0 -0
- package/web/app/globals.css +91 -0
- package/web/app/layout.tsx +36 -0
- package/web/app/page.tsx +15 -0
- package/web/components/ApiReference.tsx +20 -0
- package/web/components/Features.tsx +61 -0
- package/web/components/Footer.tsx +9 -0
- package/web/components/Hero.tsx +91 -0
- package/web/components/History.tsx +143 -0
- package/web/components/Navbar.tsx +64 -0
- package/web/components/Terminal.tsx +114 -0
- package/web/eslint.config.mjs +18 -0
- package/web/lib/db.js +131 -0
- package/web/lib/docs.js +73 -0
- package/web/next.config.ts +8 -0
- package/web/package-lock.json +6971 -0
- package/web/package.json +29 -0
- package/web/postcss.config.mjs +9 -0
- 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 +1 -0
- package/web/public/file.svg +1 -0
- package/web/public/globe.svg +1 -0
- package/web/public/next.svg +1 -0
- package/web/public/vercel.svg +1 -0
- package/web/public/window.svg +1 -0
- package/web/server.js +30 -158
- package/web/tailwind.config.ts +19 -0
- package/web/tsconfig.json +42 -0
- package/web-legacy/public/assets/android-chrome-192x192.png +0 -0
- package/web-legacy/public/assets/android-chrome-512x512.png +0 -0
- package/web-legacy/public/assets/apple-touch-icon.png +0 -0
- package/web-legacy/public/assets/favicon-16x16.png +0 -0
- package/web-legacy/public/assets/favicon-32x32.png +0 -0
- package/web-legacy/public/assets/favicon.ico +0 -0
- package/web-legacy/public/assets/favicon.png +0 -0
- package/web-legacy/public/assets/logo.png +0 -0
- package/web-legacy/public/assets/og-preview.png +0 -0
- package/web-legacy/public/assets/site.webmanifest +1 -0
- package/{dist → web-legacy/public}/docs/EXAMPLES.html +87 -2
- package/{dist → web-legacy/public}/docs/GETTING-STARTED.html +87 -2
- package/{dist → web-legacy/public}/docs/README.html +87 -2
- package/web-legacy/public/docs/RELEASE_NOTES.html +275 -0
- package/{dist → web-legacy/public}/docs/TROUBLESHOOTING.html +87 -2
- package/{dist → web-legacy/public}/docs/WORKFLOW-TEMPLATES.html +87 -2
- package/{dist → web-legacy/public}/docs/web-dashboard.html +87 -2
- package/web-legacy/public/index.html +223 -0
- package/web-legacy/public/input.css +80 -0
- package/web-legacy/public/main.js +167 -0
- package/web-legacy/public/output.css +1559 -0
- package/web-legacy/server.js +207 -0
- package/workflow-state.js +11 -25
- package/dist/docs/RELEASE_NOTES.html +0 -167
- package/web/public/index.html +0 -1046
- package/web/public/input.css +0 -3
- package/web/public/output.css +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { createServer } from "http";
|
|
2
|
+
import { readFile, access } from "fs/promises";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { dirname, join, extname } from "path";
|
|
5
|
+
import getPort from "get-port";
|
|
6
|
+
import { getHistoryForUser, getSummaryForUser, getHistorySummary } from "../db/index.js";
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const projectRoot = join(__dirname, "..");
|
|
11
|
+
|
|
12
|
+
const docSources = {
|
|
13
|
+
"README.md": {
|
|
14
|
+
markdown: join(projectRoot, "README.md"),
|
|
15
|
+
html: join(projectRoot, "dist", "docs", "README.html"),
|
|
16
|
+
},
|
|
17
|
+
"web-dashboard.md": {
|
|
18
|
+
markdown: join(projectRoot, "docs", "web-dashboard.md"),
|
|
19
|
+
html: join(projectRoot, "dist", "docs", "web-dashboard.html"),
|
|
20
|
+
},
|
|
21
|
+
"GETTING-STARTED.md": {
|
|
22
|
+
markdown: join(projectRoot, "docs", "antigravity", "GETTING-STARTED.md"),
|
|
23
|
+
html: join(projectRoot, "dist", "docs", "GETTING-STARTED.html"),
|
|
24
|
+
},
|
|
25
|
+
"EXAMPLES.md": {
|
|
26
|
+
markdown: join(projectRoot, "docs", "antigravity", "EXAMPLES.md"),
|
|
27
|
+
html: join(projectRoot, "dist", "docs", "EXAMPLES.html"),
|
|
28
|
+
},
|
|
29
|
+
"WORKFLOW-TEMPLATES.md": {
|
|
30
|
+
markdown: join(projectRoot, "docs", "antigravity", "WORKFLOW-TEMPLATES.md"),
|
|
31
|
+
html: join(projectRoot, "dist", "docs", "WORKFLOW-TEMPLATES.html"),
|
|
32
|
+
},
|
|
33
|
+
"TROUBLESHOOTING.md": {
|
|
34
|
+
markdown: join(projectRoot, "docs", "antigravity", "TROUBLESHOOTING.md"),
|
|
35
|
+
html: join(projectRoot, "dist", "docs", "TROUBLESHOOTING.html"),
|
|
36
|
+
},
|
|
37
|
+
"RELEASE_NOTES.md": {
|
|
38
|
+
markdown: join(projectRoot, "docs", "release-notes", "RELEASE_NOTES.md"),
|
|
39
|
+
html: join(projectRoot, "dist", "docs", "RELEASE_NOTES.html"),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
async function resolveDocContent(docKey) {
|
|
44
|
+
const entry = docSources[docKey];
|
|
45
|
+
if (!entry) {
|
|
46
|
+
return { exists: false };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Try HTML first, fall back to Markdown in development or if HTML missing.
|
|
50
|
+
const candidates = [entry.html, entry.markdown];
|
|
51
|
+
for (const candidate of candidates) {
|
|
52
|
+
try {
|
|
53
|
+
await access(candidate);
|
|
54
|
+
const content = await readFile(candidate, "utf-8");
|
|
55
|
+
const format = candidate.endsWith(".html") ? "html" : "markdown";
|
|
56
|
+
return { exists: true, content, format };
|
|
57
|
+
} catch {
|
|
58
|
+
// try next candidate
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { exists: false };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function getPreferredPort() {
|
|
66
|
+
const fromEnv = process.env.PORT || process.env.DEV_WORKFLOW_WEB_PORT;
|
|
67
|
+
|
|
68
|
+
if (!fromEnv) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const parsed = Number(fromEnv);
|
|
73
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function start() {
|
|
77
|
+
const preferred = getPreferredPort();
|
|
78
|
+
const PORT = preferred ?? await getPort({ port: 3111 });
|
|
79
|
+
|
|
80
|
+
const server = createServer(async (req, res) => {
|
|
81
|
+
try {
|
|
82
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
83
|
+
const userId = url.searchParams.get("user") || "default";
|
|
84
|
+
|
|
85
|
+
const noCacheHeaders = {
|
|
86
|
+
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
87
|
+
"Pragma": "no-cache",
|
|
88
|
+
"Expires": "0"
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Serve index.html for root path
|
|
92
|
+
if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/index.html")) {
|
|
93
|
+
try {
|
|
94
|
+
const html = await readFile(join(__dirname, "public", "index.html"), "utf-8");
|
|
95
|
+
res.writeHead(200, { "Content-Type": "text/html", ...noCacheHeaders });
|
|
96
|
+
res.end(html);
|
|
97
|
+
} catch (err) {
|
|
98
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
99
|
+
res.end("Error loading page");
|
|
100
|
+
}
|
|
101
|
+
} else if (req.method === "GET" && url.pathname === "/input.css") {
|
|
102
|
+
try {
|
|
103
|
+
// Serve the built CSS file
|
|
104
|
+
const css = await readFile(join(__dirname, "public", "output.css"), "utf-8");
|
|
105
|
+
res.writeHead(200, { "Content-Type": "text/css", ...noCacheHeaders });
|
|
106
|
+
res.end(css);
|
|
107
|
+
} catch (err) {
|
|
108
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
109
|
+
res.end("CSS not found");
|
|
110
|
+
}
|
|
111
|
+
} else if (req.method === "GET" && url.pathname === "/main.js") {
|
|
112
|
+
try {
|
|
113
|
+
const js = await readFile(join(__dirname, "public", "main.js"), "utf-8");
|
|
114
|
+
res.writeHead(200, { "Content-Type": "application/javascript", ...noCacheHeaders });
|
|
115
|
+
res.end(js);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
118
|
+
res.end("JS not found");
|
|
119
|
+
}
|
|
120
|
+
} else if (req.method === "GET" && url.pathname.startsWith("/assets/")) {
|
|
121
|
+
try {
|
|
122
|
+
const assetPath = join(__dirname, "public", url.pathname);
|
|
123
|
+
const content = await readFile(assetPath);
|
|
124
|
+
const ext = extname(assetPath);
|
|
125
|
+
const mimeTypes = {
|
|
126
|
+
".png": "image/png",
|
|
127
|
+
".jpg": "image/jpeg",
|
|
128
|
+
".svg": "image/svg+xml",
|
|
129
|
+
".ico": "image/x-icon",
|
|
130
|
+
};
|
|
131
|
+
res.writeHead(200, { "Content-Type": mimeTypes[ext] || "application/octet-stream" });
|
|
132
|
+
res.end(content);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
135
|
+
res.end("Asset not found");
|
|
136
|
+
}
|
|
137
|
+
} else if (req.method === "GET" && url.pathname === "/") {
|
|
138
|
+
const html = await readFile(join(__dirname, "public", "index.html"), "utf-8");
|
|
139
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
140
|
+
res.end(html);
|
|
141
|
+
} else if (req.method === "GET" && url.pathname === "/api/summary") {
|
|
142
|
+
const summary = getSummaryForUser(userId);
|
|
143
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
144
|
+
res.end(JSON.stringify({ summary }));
|
|
145
|
+
} else if (req.method === "GET" && url.pathname === "/api/history") {
|
|
146
|
+
const page = Number(url.searchParams.get("page") || "1");
|
|
147
|
+
const pageSize = Number(url.searchParams.get("pageSize") || "20");
|
|
148
|
+
const startDate = url.searchParams.get("startDate") || undefined;
|
|
149
|
+
const endDate = url.searchParams.get("endDate") || undefined;
|
|
150
|
+
const history = getHistoryForUser(userId, { page, pageSize, startDate, endDate });
|
|
151
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
152
|
+
res.end(JSON.stringify(history));
|
|
153
|
+
} else if (req.method === "GET" && url.pathname === "/api/history-summary") {
|
|
154
|
+
const startDate = url.searchParams.get("startDate") || undefined;
|
|
155
|
+
const endDate = url.searchParams.get("endDate") || undefined;
|
|
156
|
+
const frequency = url.searchParams.get("frequency") || "daily";
|
|
157
|
+
const summary = getHistorySummary(userId, { startDate, endDate, frequency });
|
|
158
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
159
|
+
res.end(JSON.stringify({ summary }));
|
|
160
|
+
} else if (req.method === "GET" && url.pathname === "/api/docs") {
|
|
161
|
+
const rawDocKey = url.searchParams.get("doc");
|
|
162
|
+
const availableDocs = Object.keys(docSources);
|
|
163
|
+
|
|
164
|
+
if (!rawDocKey) {
|
|
165
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
166
|
+
res.end(JSON.stringify({ docs: availableDocs }));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const docKey = rawDocKey.trim();
|
|
171
|
+
const resolvedKey = availableDocs.find((key) => key.toLowerCase() === docKey.toLowerCase());
|
|
172
|
+
if (!resolvedKey) {
|
|
173
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
174
|
+
res.end(JSON.stringify({ error: "Document not found", requested: docKey, available: availableDocs }));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const result = await resolveDocContent(resolvedKey);
|
|
179
|
+
if (!result.exists) {
|
|
180
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
181
|
+
res.end(JSON.stringify({ error: "Document asset is missing" }));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
186
|
+
res.end(JSON.stringify({ doc: resolvedKey, content: result.content, format: result.format }));
|
|
187
|
+
} else if (req.method === "GET" && url.pathname === "/api/version") {
|
|
188
|
+
const packageJson = await readFile(join(projectRoot, "package.json"), "utf-8");
|
|
189
|
+
const { version } = JSON.parse(packageJson);
|
|
190
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
191
|
+
res.end(JSON.stringify({ version }));
|
|
192
|
+
} else {
|
|
193
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
194
|
+
res.end("Not found");
|
|
195
|
+
}
|
|
196
|
+
} catch (err) {
|
|
197
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
198
|
+
res.end(err.message);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
server.listen(PORT, () => {
|
|
203
|
+
console.log(`🌐 Dev Workflow Dashboard running at http://localhost:${PORT}`);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
start();
|
package/workflow-state.js
CHANGED
|
@@ -398,40 +398,26 @@ export function resolveStateFile() {
|
|
|
398
398
|
return path.resolve(customPath);
|
|
399
399
|
}
|
|
400
400
|
|
|
401
|
-
const initCwd = process.env.INIT_CWD || process.cwd();
|
|
402
|
-
const resolvedInitCwd = path.resolve(initCwd);
|
|
403
401
|
const moduleRoot = path.resolve(__dirname, "..");
|
|
404
402
|
const cwdResolved = path.resolve(process.cwd());
|
|
403
|
+
const initCwd = process.env.INIT_CWD ? path.resolve(process.env.INIT_CWD) : null;
|
|
405
404
|
|
|
406
|
-
|
|
405
|
+
// 1. Prefer the project rooted at the current working directory
|
|
406
|
+
let projectRoot = findProjectRoot(cwdResolved);
|
|
407
407
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
normalizeAndStoreCandidate(candidateRoots, initProjectRoot);
|
|
413
|
-
normalizeAndStoreCandidate(candidateRoots, cwdProjectRoot);
|
|
414
|
-
if (!isRootPath(resolvedInitCwd)) {
|
|
415
|
-
normalizeAndStoreCandidate(candidateRoots, resolvedInitCwd);
|
|
416
|
-
addAncestorCandidates(candidateRoots, resolvedInitCwd);
|
|
417
|
-
}
|
|
418
|
-
if (!isRootPath(cwdResolved)) {
|
|
419
|
-
normalizeAndStoreCandidate(candidateRoots, cwdResolved);
|
|
420
|
-
addAncestorCandidates(candidateRoots, cwdResolved);
|
|
408
|
+
// 2. Fall back to the project rooted at INIT_CWD if different
|
|
409
|
+
if (!projectRoot && initCwd) {
|
|
410
|
+
projectRoot = findProjectRoot(initCwd);
|
|
421
411
|
}
|
|
422
412
|
|
|
423
|
-
|
|
424
|
-
if (!
|
|
425
|
-
|
|
426
|
-
}
|
|
427
|
-
if (!isRootPath(__dirname)) {
|
|
428
|
-
normalizeAndStoreCandidate(candidateRoots, __dirname);
|
|
413
|
+
// 3. Fall back to the project containing this module
|
|
414
|
+
if (!projectRoot) {
|
|
415
|
+
projectRoot = findProjectRoot(moduleRoot);
|
|
429
416
|
}
|
|
430
417
|
|
|
431
|
-
|
|
432
|
-
|
|
418
|
+
// 4. Final fallback: use a non-root working directory or the module root
|
|
433
419
|
if (!projectRoot) {
|
|
434
|
-
projectRoot =
|
|
420
|
+
projectRoot = !isRootPath(cwdResolved) ? cwdResolved : moduleRoot;
|
|
435
421
|
}
|
|
436
422
|
|
|
437
423
|
const stateDir = path.join(projectRoot, STATE_DIR);
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
<h1>Release Notes</h1>
|
|
2
|
-
<p>Authoritative history of user-visible changes for the Development Workflow MCP Server. Each entry highlights the improvements that shipped with the tagged version.</p>
|
|
3
|
-
<h2>Unreleased</h2>
|
|
4
|
-
<h2>1.3.0 — 2025-11-22</h2>
|
|
5
|
-
<ul>
|
|
6
|
-
<li>Added comprehensive Antigravity integration documentation and examples.</li>
|
|
7
|
-
<li>Fixed Windows shell escaping for commit messages.</li>
|
|
8
|
-
<li>Fixed release scripts to support ESM projects.</li>
|
|
9
|
-
<li>Release guard now delegates to <code>@programinglive/commiter</code> and verifies the package is installed before running.</li>
|
|
10
|
-
</ul>
|
|
11
|
-
<h2>1.2.7 — 2025-11-13</h2>
|
|
12
|
-
<ul>
|
|
13
|
-
<li>Delegated release process to <code>@programinglive/commiter</code>.</li>
|
|
14
|
-
</ul>
|
|
15
|
-
<h2>1.2.6 — 2025-11-11</h2>
|
|
16
|
-
<ul>
|
|
17
|
-
<li>Exposed primary branch helper in CLI.</li>
|
|
18
|
-
<li>Updated documentation regarding commiter delegation.</li>
|
|
19
|
-
</ul>
|
|
20
|
-
<blockquote>
|
|
21
|
-
<p><strong>Notice:</strong> Versions 1.2.2 through 1.2.5 were published briefly for packaging experiments and have been withdrawn.</p>
|
|
22
|
-
</blockquote>
|
|
23
|
-
<h2>1.2.1 — 2025-11-03</h2>
|
|
24
|
-
<ul>
|
|
25
|
-
<li>Packaging touch-up; functionality remains identical to 1.2.0.</li>
|
|
26
|
-
</ul>
|
|
27
|
-
<h2>1.2.0 — 2025-11-03</h2>
|
|
28
|
-
<ul>
|
|
29
|
-
<li>Reload the workflow state from disk for every tool call, preventing stale data when multiple clients manipulate the same project.</li>
|
|
30
|
-
</ul>
|
|
31
|
-
<h2>1.1.18 — 2025-11-03</h2>
|
|
32
|
-
<ul>
|
|
33
|
-
<li><code>commit_and_push</code> now auto-detects the primary branch (preferring <code>main</code>, then <code>master</code>) when none is supplied.</li>
|
|
34
|
-
</ul>
|
|
35
|
-
<h2>1.1.17 — 2025-10-31</h2>
|
|
36
|
-
<ul>
|
|
37
|
-
<li>Release bookkeeping only; no user-facing changes.</li>
|
|
38
|
-
</ul>
|
|
39
|
-
<h2>1.1.16 — 2025-10-31</h2>
|
|
40
|
-
<ul>
|
|
41
|
-
<li>Added npm provenance metadata so published packages include supply-chain attestations.</li>
|
|
42
|
-
</ul>
|
|
43
|
-
<h2>1.1.15 — 2025-10-31</h2>
|
|
44
|
-
<ul>
|
|
45
|
-
<li>Documented the automated npm publish workflow and ensured CI builds include provenance before publishing.</li>
|
|
46
|
-
</ul>
|
|
47
|
-
<h2>1.1.14 — 2025-10-31</h2>
|
|
48
|
-
<ul>
|
|
49
|
-
<li>Improved project-root detection for workflow state, fixing issues when the server runs from nested directories.</li>
|
|
50
|
-
</ul>
|
|
51
|
-
<h2>1.1.13 — 2025-10-30</h2>
|
|
52
|
-
<ul>
|
|
53
|
-
<li>Version bump to distribute refreshed dashboard assets; no new functionality beyond 1.1.12.</li>
|
|
54
|
-
</ul>
|
|
55
|
-
<h2>1.1.12 — 2025-10-30</h2>
|
|
56
|
-
<ul>
|
|
57
|
-
<li>Added a <code>node index.js call <tool></code> CLI helper to invoke MCP tools without a client integration.</li>
|
|
58
|
-
<li>Refreshed the web dashboard with a docs modal, dedicated docs API endpoints, and streamlined navigation.</li>
|
|
59
|
-
</ul>
|
|
60
|
-
<h2>1.1.11 — 2025-10-30</h2>
|
|
61
|
-
<ul>
|
|
62
|
-
<li>Introduced per-user workflow state stored under <code>.state/users/<id>/</code> to avoid collisions on shared repos.</li>
|
|
63
|
-
<li>Added a SQLite-backed project knowledge summary and the dashboard that visualizes history and trends.</li>
|
|
64
|
-
<li>Hardened resumable workflows by re-checking persisted summaries between steps.</li>
|
|
65
|
-
</ul>
|
|
66
|
-
<h2>1.1.10 — 2025-10-29</h2>
|
|
67
|
-
<ul>
|
|
68
|
-
<li>Shipped the initial project knowledge library with a persisted JSON summary for future database integrations.</li>
|
|
69
|
-
</ul>
|
|
70
|
-
<h2>1.1.9 — 2025-10-29</h2>
|
|
71
|
-
<ul>
|
|
72
|
-
<li>Made <code>run_full_workflow</code> resume intelligently from the current phase.</li>
|
|
73
|
-
<li>Expanded automated tests around README/exec updates and other workflow paths.</li>
|
|
74
|
-
</ul>
|
|
75
|
-
<h2>1.1.8 — 2025-10-27</h2>
|
|
76
|
-
<ul>
|
|
77
|
-
<li>Documented the <code>DEV_WORKFLOW_STATE_FILE</code> override for relocating workflow state outside the repository.</li>
|
|
78
|
-
</ul>
|
|
79
|
-
<h2>1.1.7 — 2025-10-26</h2>
|
|
80
|
-
<ul>
|
|
81
|
-
<li>Added prompts guiding developers to document changes immediately after tests pass.</li>
|
|
82
|
-
</ul>
|
|
83
|
-
<h2>1.1.6 — 2025-10-26</h2>
|
|
84
|
-
<ul>
|
|
85
|
-
<li>Prevented <code>.state</code> from being created at filesystem roots.</li>
|
|
86
|
-
<li>Enforced that commits must land before any release action can run.</li>
|
|
87
|
-
</ul>
|
|
88
|
-
<h2>1.1.5 — 2025-10-25</h2>
|
|
89
|
-
<ul>
|
|
90
|
-
<li>Introduced the release guard, blocking <code>npm run release:*</code> until every prerequisite tool has run.</li>
|
|
91
|
-
<li>Standardized per-project workflow state creation during installs.</li>
|
|
92
|
-
</ul>
|
|
93
|
-
<h2>1.1.4 — 2025-10-25</h2>
|
|
94
|
-
<ul>
|
|
95
|
-
<li>Ensured the install script always targets the project root when initializing <code>.state</code>.</li>
|
|
96
|
-
</ul>
|
|
97
|
-
<h2>1.1.3 — 2025-10-25</h2>
|
|
98
|
-
<ul>
|
|
99
|
-
<li>Packaged the MCP server for project-level installs with per-project workflow state isolation.</li>
|
|
100
|
-
</ul>
|
|
101
|
-
<h2>1.1.2 — 2025-10-25</h2>
|
|
102
|
-
<ul>
|
|
103
|
-
<li>Version alignment release with no additional changes versus 1.1.1.</li>
|
|
104
|
-
</ul>
|
|
105
|
-
<h2>1.1.1 — 2025-10-25</h2>
|
|
106
|
-
<ul>
|
|
107
|
-
<li>Added <code>force_complete_task</code>, letting teams close tasks early with an audit trail.</li>
|
|
108
|
-
</ul>
|
|
109
|
-
<h2>1.1.0 — 2025-10-25</h2>
|
|
110
|
-
<ul>
|
|
111
|
-
<li>Added smart staging checks before commit, and made <code>continue_workflow</code> auto-run the next action in the commit phase.</li>
|
|
112
|
-
<li>Enabled clean-tree commits to utilize <code>commit_and_push</code> and <code>perform_release</code> without manual staging.</li>
|
|
113
|
-
<li>Clarified documentation for the commit/push step.</li>
|
|
114
|
-
</ul>
|
|
115
|
-
<h2>1.0.11 — 2025-10-25</h2>
|
|
116
|
-
<ul>
|
|
117
|
-
<li>Added contextual "continue workflow" guidance describing the next recommended tool.</li>
|
|
118
|
-
<li>Blocked releases until commits are safely pushed.</li>
|
|
119
|
-
</ul>
|
|
120
|
-
<h2>1.0.10 — 2025-10-24</h2>
|
|
121
|
-
<ul>
|
|
122
|
-
<li>Modularized the workflow server internals for maintainability.</li>
|
|
123
|
-
<li>Expanded automated tests around the release push flow.</li>
|
|
124
|
-
</ul>
|
|
125
|
-
<h2>1.0.9 — 2025-10-23</h2>
|
|
126
|
-
<ul>
|
|
127
|
-
<li>Documented how local workflow state is managed across projects.</li>
|
|
128
|
-
</ul>
|
|
129
|
-
<h2>1.0.8 — 2025-10-21</h2>
|
|
130
|
-
<ul>
|
|
131
|
-
<li>Added explicit workflows for skipping tests with justification and dropping tasks mid-flight.</li>
|
|
132
|
-
</ul>
|
|
133
|
-
<h2>1.0.7 — 2025-10-20</h2>
|
|
134
|
-
<ul>
|
|
135
|
-
<li>Version alignment update; no new functionality recorded.</li>
|
|
136
|
-
</ul>
|
|
137
|
-
<h2>1.0.6 — 2025-10-20</h2>
|
|
138
|
-
<ul>
|
|
139
|
-
<li>Strengthened release tests to ensure prerequisites are met before tagging.</li>
|
|
140
|
-
</ul>
|
|
141
|
-
<h2>1.0.5 — 2025-10-20</h2>
|
|
142
|
-
<ul>
|
|
143
|
-
<li>Updated tests around <code>workflowState</code> persistence and validation.</li>
|
|
144
|
-
</ul>
|
|
145
|
-
<h2>1.0.4 — 2025-10-20</h2>
|
|
146
|
-
<ul>
|
|
147
|
-
<li>Added an enforced release step after the ready check to ensure workflow order.</li>
|
|
148
|
-
<li>Improved Windows compatibility by quoting commit messages safely.</li>
|
|
149
|
-
</ul>
|
|
150
|
-
<h2>1.0.3 — 2025-10-20</h2>
|
|
151
|
-
<ul>
|
|
152
|
-
<li>Added a project <code>.gitignore</code> and clarified cross-platform installation steps.</li>
|
|
153
|
-
</ul>
|
|
154
|
-
<h2>1.0.2 — 2025-10-19</h2>
|
|
155
|
-
<ul>
|
|
156
|
-
<li>Hardened <code>run_tests</code> argument validation and normalized tool call arguments.</li>
|
|
157
|
-
<li>Expanded documentation around tool payload requirements.</li>
|
|
158
|
-
</ul>
|
|
159
|
-
<h2>1.0.1 — 2025-10-18</h2>
|
|
160
|
-
<ul>
|
|
161
|
-
<li>Configured release tooling to support semantic version tagging moving forward.</li>
|
|
162
|
-
</ul>
|
|
163
|
-
<h2>1.0.0 — 2025-10-18</h2>
|
|
164
|
-
<ul>
|
|
165
|
-
<li>Initial public release with the full MCP workflow (start → fix → tests → docs → commit → release → complete).</li>
|
|
166
|
-
<li>Launched project governance, contribution guidelines, and tooling scaffolding.</li>
|
|
167
|
-
</ul>
|