@devflow-tools/cli 0.8.3 → 0.8.7
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/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +13 -10
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +9 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +42 -70
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/dashboard-cache.d.ts +2 -12
- package/dist/lib/dashboard-cache.d.ts.map +1 -1
- package/dist/lib/dashboard-cache.js +69 -127
- package/dist/lib/dashboard-cache.js.map +1 -1
- package/dist/plugin-files/package.json +4 -1
- package/package.json +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,gBAAgB,SAoDzB,CAAC"}
|
|
@@ -1,25 +1,28 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { join } from "path";
|
|
3
|
-
import { existsSync } from "fs";
|
|
3
|
+
import { existsSync, unlinkSync } from "fs";
|
|
4
4
|
import { spawn } from "child_process";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
-
import {
|
|
6
|
+
import { ensureDashboardExtracted } from "../lib/dashboard-cache.js";
|
|
7
7
|
export const dashboardCommand = new Command("dashboard")
|
|
8
8
|
.description("Start DevFlow Dashboard")
|
|
9
9
|
.option("-p, --port <port>", "Port to run on", "17788")
|
|
10
|
-
.option("--force", "Force re-
|
|
10
|
+
.option("--force", "Force re-extract Dashboard from npm package")
|
|
11
11
|
.action(async (options) => {
|
|
12
12
|
try {
|
|
13
|
+
if (options.force) {
|
|
14
|
+
const versionFile = join(process.cwd(), ".devflow", "dashboard", "version.txt");
|
|
15
|
+
try {
|
|
16
|
+
unlinkSync(versionFile);
|
|
17
|
+
}
|
|
18
|
+
catch { /* ok if missing */ }
|
|
19
|
+
}
|
|
13
20
|
console.log(chalk.blue("Preparing Dashboard..."));
|
|
14
|
-
const dashboardPath =
|
|
15
|
-
|
|
16
|
-
});
|
|
17
|
-
// Monorepo standalone: server.js is at apps/dashboard/server.js
|
|
18
|
-
const nestedPath = join(dashboardPath, "apps", "dashboard", "server.js");
|
|
19
|
-
const serverPath = existsSync(nestedPath) ? nestedPath : join(dashboardPath, "server.js");
|
|
21
|
+
const dashboardPath = ensureDashboardExtracted(process.cwd());
|
|
22
|
+
const serverPath = join(dashboardPath, "apps", "dashboard", "server.js");
|
|
20
23
|
if (!existsSync(serverPath)) {
|
|
21
24
|
console.error(chalk.red(`Dashboard server.js not found at: ${serverPath}\n` +
|
|
22
|
-
"The
|
|
25
|
+
"The archive may be corrupted. Try: devflow dashboard --force"));
|
|
23
26
|
process.exit(1);
|
|
24
27
|
}
|
|
25
28
|
console.log(chalk.green(`\nStarting Dashboard: http://localhost:${options.port}\n`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,OAAO,CAAC;KACtD,MAAM,CAAC,SAAS,EAAE,6CAA6C,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAChF,IAAI,CAAC;gBAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,qCAAqC,UAAU,IAAI;gBACjD,8DAA8D,CACjE,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,0CAA0C,OAAO,CAAC,IAAI,IAAI,CAAC,CACxE,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;YACxC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EACtC,KAAe,CAAC,OAAO,CACzB,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhD;AAED,iBAAS,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/C;AAED,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC;AAEpE,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAelF;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAYnD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAW/F"}
|
package/dist/commands/server.js
CHANGED
|
@@ -10,11 +10,18 @@ function getPidFile(projectRoot) {
|
|
|
10
10
|
return join(dotdev, "server.pid");
|
|
11
11
|
}
|
|
12
12
|
function getServerScript() {
|
|
13
|
+
// Prefer bundled server.js distributed alongside the CLI
|
|
13
14
|
try {
|
|
14
|
-
return require.resolve("
|
|
15
|
+
return require.resolve("./server.js");
|
|
15
16
|
}
|
|
16
17
|
catch {
|
|
17
|
-
|
|
18
|
+
// Fallback: separate npm package
|
|
19
|
+
try {
|
|
20
|
+
return require.resolve("@devflow-tools/server/dist/main.js");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return join(process.cwd(), "apps", "server", "dist", "main.js");
|
|
24
|
+
}
|
|
18
25
|
}
|
|
19
26
|
}
|
|
20
27
|
export const DEFAULT_SERVER_PORT = 13337;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,SAAS,UAAU,CAAC,WAAmB;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAsBA,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FhB"}
|
package/dist/commands/start.js
CHANGED
|
@@ -1,41 +1,15 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
2
|
import { readFileSync, existsSync, writeFileSync, unlinkSync, mkdirSync } from "fs";
|
|
3
|
-
import { join
|
|
4
|
-
import { createServer } from "http";
|
|
3
|
+
import { join } from "path";
|
|
5
4
|
import chalk from "chalk";
|
|
6
|
-
import { startServer, stopServer } from "./server.js";
|
|
7
|
-
import {
|
|
5
|
+
import { startServer, stopServer, readPidFromFile } from "./server.js";
|
|
6
|
+
import { ensureDashboardExtracted } from "../lib/dashboard-cache.js";
|
|
8
7
|
import { getDashboardPidFile } from "../lib/paths.js";
|
|
9
|
-
function startFallbackServer(port) {
|
|
10
|
-
let fallbackHtml = "<html><body><h1>DevFlow</h1><p>Dashboard is being downloaded...</p></body></html>";
|
|
11
|
-
try {
|
|
12
|
-
const candidates = [
|
|
13
|
-
resolve(process.cwd(), "node_modules", "@devflow-tools", "devflow", "dist", "fallback.html"),
|
|
14
|
-
resolve(process.cwd(), "apps", "server", "public", "fallback.html"),
|
|
15
|
-
];
|
|
16
|
-
for (const candidate of candidates) {
|
|
17
|
-
if (existsSync(candidate)) {
|
|
18
|
-
fallbackHtml = readFileSync(candidate, "utf-8");
|
|
19
|
-
break;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
catch { /* use inline fallback */ }
|
|
24
|
-
const server = createServer((_req, res) => {
|
|
25
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
26
|
-
res.end(fallbackHtml);
|
|
27
|
-
});
|
|
28
|
-
server.listen(port, () => {
|
|
29
|
-
console.log(chalk.yellow(` Fallback page served on port ${port} (dashboard downloading...)`));
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
8
|
async function waitForServer(port, timeoutMs = 15000) {
|
|
33
9
|
const start = Date.now();
|
|
34
10
|
while (Date.now() - start < timeoutMs) {
|
|
35
11
|
try {
|
|
36
|
-
const res = await fetch(`http://localhost:${port}/api/
|
|
37
|
-
headers: { "x-api-key": "dev-key-000000" },
|
|
38
|
-
});
|
|
12
|
+
const res = await fetch(`http://localhost:${port}/api/health`);
|
|
39
13
|
if (res.ok)
|
|
40
14
|
return true;
|
|
41
15
|
}
|
|
@@ -47,6 +21,24 @@ async function waitForServer(port, timeoutMs = 15000) {
|
|
|
47
21
|
return false;
|
|
48
22
|
}
|
|
49
23
|
export async function startAll(opts) {
|
|
24
|
+
// 0. Clean up stale dashboard process
|
|
25
|
+
const dashPidFile = getDashboardPidFile();
|
|
26
|
+
if (existsSync(dashPidFile)) {
|
|
27
|
+
try {
|
|
28
|
+
const pid = readPidFromFile(dashPidFile);
|
|
29
|
+
if (pid !== null) {
|
|
30
|
+
try {
|
|
31
|
+
process.kill(pid);
|
|
32
|
+
}
|
|
33
|
+
catch { /* already gone */ }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch { /* ignore */ }
|
|
37
|
+
try {
|
|
38
|
+
unlinkSync(dashPidFile);
|
|
39
|
+
}
|
|
40
|
+
catch { /* ignore */ }
|
|
41
|
+
}
|
|
50
42
|
// 1. Start server
|
|
51
43
|
console.log(chalk.blue("Starting DevFlow server..."));
|
|
52
44
|
const { pid: serverPid } = await startServer({ port: opts.port });
|
|
@@ -63,48 +55,28 @@ export async function startAll(opts) {
|
|
|
63
55
|
// 3. Start dashboard (unless --no-dashboard)
|
|
64
56
|
if (!opts.noDashboard) {
|
|
65
57
|
console.log(chalk.blue("Preparing Dashboard..."));
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
58
|
+
try {
|
|
59
|
+
const dashboardDir = ensureDashboardExtracted(process.cwd());
|
|
60
|
+
const serverPath = join(dashboardDir, "apps", "dashboard", "server.js");
|
|
61
|
+
const child = spawn("node", [serverPath], {
|
|
62
|
+
env: { ...process.env, PORT: String(opts.dashboardPort) },
|
|
63
|
+
cwd: dashboardDir,
|
|
64
|
+
stdio: "ignore",
|
|
65
|
+
detached: true,
|
|
66
|
+
});
|
|
67
|
+
if (child.pid) {
|
|
68
|
+
const dashPidFile = getDashboardPidFile();
|
|
69
|
+
const dotdev = join(process.cwd(), ".devflow");
|
|
70
|
+
if (!existsSync(dotdev))
|
|
71
|
+
mkdirSync(dotdev, { recursive: true });
|
|
72
|
+
writeFileSync(dashPidFile, `${opts.dashboardPort}\n${child.pid}`);
|
|
73
|
+
child.unref();
|
|
74
|
+
console.log(chalk.green(` Dashboard started (PID: ${child.pid})`));
|
|
80
75
|
}
|
|
81
76
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const serverPath = join(dashboardPath, "server.js");
|
|
86
|
-
if (existsSync(serverPath)) {
|
|
87
|
-
const child = spawn("node", [serverPath], {
|
|
88
|
-
env: { ...process.env, PORT: String(opts.dashboardPort) },
|
|
89
|
-
cwd: dashboardPath,
|
|
90
|
-
stdio: "ignore",
|
|
91
|
-
detached: true,
|
|
92
|
-
});
|
|
93
|
-
if (child.pid) {
|
|
94
|
-
const dashPidFile = getDashboardPidFile();
|
|
95
|
-
const dotdev = join(process.cwd(), ".devflow");
|
|
96
|
-
if (!existsSync(dotdev))
|
|
97
|
-
mkdirSync(dotdev, { recursive: true });
|
|
98
|
-
writeFileSync(dashPidFile, `${opts.dashboardPort}\n${child.pid}`);
|
|
99
|
-
child.unref();
|
|
100
|
-
console.log(chalk.green(` Dashboard started (PID: ${child.pid})`));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// Dashboard binary exists but failed to spawn — serve fallback page
|
|
106
|
-
startFallbackServer(opts.dashboardPort);
|
|
107
|
-
}
|
|
77
|
+
catch {
|
|
78
|
+
console.log(chalk.red(" Dashboard failed to start"));
|
|
79
|
+
console.log(chalk.yellow(` You can still use the API at http://localhost:${opts.port}`));
|
|
108
80
|
}
|
|
109
81
|
}
|
|
110
82
|
// 4. Print status box
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,SAAS,GAAG,KAAK;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,aAAa,CAAC,CAAC;YAC/D,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAK9B;IACC,sCAAsC;IACtC,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,IAAI,CAAC;YAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,SAAS,GAAG,CAAC,CAAC,CAAC;IAEjE,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,KAAK,GAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;gBACtD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;gBACzD,GAAG,EAAE,YAAY;gBACjB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,aAAa,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClE,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,yDAAyD,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sCAAsC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAChH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oCAAoC,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,6DAA6D,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2DAA2D,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAE1F,wCAAwC;IACxC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,uEAAuE;YACvE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;gBACzB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;gBAC1C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACpE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAClB,UAAU,CAAC,WAAW,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM,UAAU,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAClD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
path: string;
|
|
4
|
-
downloadedAt: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function getDashboardCacheDir(): string;
|
|
7
|
-
export declare function isDashboardInstalled(): DashboardCache | null;
|
|
8
|
-
export declare function downloadDashboard(version: string, onProgress?: (message: string) => void): Promise<string>;
|
|
9
|
-
export declare function ensureDashboardInstalled(opts?: {
|
|
10
|
-
force?: boolean;
|
|
11
|
-
}): Promise<string>;
|
|
12
|
-
export {};
|
|
1
|
+
export declare function isDashboardInstalled(projectRoot: string): boolean;
|
|
2
|
+
export declare function ensureDashboardExtracted(projectRoot: string): string;
|
|
13
3
|
//# sourceMappingURL=dashboard-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-cache.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard-cache.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-cache.ts"],"names":[],"mappings":"AAiCA,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CASjE;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA6DpE"}
|
|
@@ -1,155 +1,97 @@
|
|
|
1
|
-
import { homedir } from "os";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync, symlinkSync, lstatSync, } from "fs";
|
|
4
1
|
import { execSync } from "child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "fs";
|
|
3
|
+
import { join, dirname } from "path";
|
|
5
4
|
import { createRequire } from "module";
|
|
6
5
|
const require = createRequire(import.meta.url);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return join(homedir(), ".devflow", "dashboard");
|
|
6
|
+
function getDashboardDir(projectRoot) {
|
|
7
|
+
return join(projectRoot, ".devflow", "dashboard");
|
|
10
8
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
9
|
+
function getVersionFile(projectRoot) {
|
|
10
|
+
return join(getDashboardDir(projectRoot), "version.txt");
|
|
11
|
+
}
|
|
12
|
+
function getCliVersion() {
|
|
13
13
|
try {
|
|
14
|
-
const pkg = require("
|
|
14
|
+
const pkg = require("../package.json");
|
|
15
15
|
return pkg.version ?? "0.0.0";
|
|
16
16
|
}
|
|
17
17
|
catch {
|
|
18
18
|
return "0.0.0";
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
const cacheDir = getDashboardCacheDir();
|
|
23
|
-
const cacheFile = join(cacheDir, "cache.json");
|
|
24
|
-
if (!existsSync(cacheFile)) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
21
|
+
function getTarGzPath() {
|
|
27
22
|
try {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// corrupted cache file, ignore
|
|
23
|
+
const pkgJson = require.resolve("@devflow-tools/devflow/package.json");
|
|
24
|
+
const tarGz = join(dirname(pkgJson), "dist", "dashboard-standalone.tar.gz");
|
|
25
|
+
if (existsSync(tarGz))
|
|
26
|
+
return tarGz;
|
|
35
27
|
}
|
|
28
|
+
catch { }
|
|
36
29
|
return null;
|
|
37
30
|
}
|
|
38
|
-
export
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// Monorepo standalone: server.js is at apps/dashboard/server.js
|
|
43
|
-
const hasFlatServer = existsSync(join(versionDir, "server.js"));
|
|
44
|
-
const hasNestedServer = existsSync(join(versionDir, "apps", "dashboard", "server.js"));
|
|
45
|
-
if (existsSync(versionDir) && (hasFlatServer || hasNestedServer)) {
|
|
46
|
-
linkCurrentVersion(cacheDir, versionDir, version);
|
|
47
|
-
return join(cacheDir, "current");
|
|
48
|
-
}
|
|
49
|
-
const url = `https://github.com/${GITHUB_REPO}/releases/download/v${version}/dashboard-standalone.tar.gz`;
|
|
50
|
-
onProgress?.(`Downloading Dashboard v${version} ...`);
|
|
51
|
-
// Create temp directory
|
|
52
|
-
const tempDir = join(cacheDir, "temp");
|
|
53
|
-
mkdirSync(tempDir, { recursive: true });
|
|
31
|
+
export function isDashboardInstalled(projectRoot) {
|
|
32
|
+
const versionFile = getVersionFile(projectRoot);
|
|
33
|
+
if (!existsSync(versionFile))
|
|
34
|
+
return false;
|
|
54
35
|
try {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const response = await fetch(url);
|
|
58
|
-
if (!response.ok) {
|
|
59
|
-
throw new Error(`Download failed: HTTP ${response.status} ${response.statusText}\n` +
|
|
60
|
-
`URL: ${url}\n` +
|
|
61
|
-
`The Dashboard asset may not have been published for v${version}.`);
|
|
62
|
-
}
|
|
63
|
-
if (!response.body) {
|
|
64
|
-
throw new Error("Download failed: empty response body");
|
|
65
|
-
}
|
|
66
|
-
// Stream response to file
|
|
67
|
-
const reader = response.body.getReader();
|
|
68
|
-
const chunks = [];
|
|
69
|
-
while (true) {
|
|
70
|
-
const { done, value } = await reader.read();
|
|
71
|
-
if (done)
|
|
72
|
-
break;
|
|
73
|
-
chunks.push(value);
|
|
74
|
-
}
|
|
75
|
-
const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
|
|
76
|
-
const merged = new Uint8Array(totalLength);
|
|
77
|
-
let offset = 0;
|
|
78
|
-
for (const chunk of chunks) {
|
|
79
|
-
merged.set(chunk, offset);
|
|
80
|
-
offset += chunk.length;
|
|
81
|
-
}
|
|
82
|
-
writeFileSync(tarPath, merged);
|
|
83
|
-
// Extract
|
|
84
|
-
mkdirSync(versionDir, { recursive: true });
|
|
85
|
-
try {
|
|
86
|
-
execSync(`tar -xzf "${tarPath}" -C "${versionDir}"`, { stdio: "pipe" });
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
throw new Error(`Failed to extract Dashboard archive: ${err.message}\n` +
|
|
90
|
-
`Ensure 'tar' is available on your system.`);
|
|
91
|
-
}
|
|
92
|
-
// Update 'current' symlink/directory
|
|
93
|
-
linkCurrentVersion(cacheDir, versionDir, version);
|
|
94
|
-
// Update cache.json
|
|
95
|
-
const cache = {
|
|
96
|
-
version,
|
|
97
|
-
path: join(cacheDir, "current"),
|
|
98
|
-
downloadedAt: new Date().toISOString(),
|
|
99
|
-
};
|
|
100
|
-
writeFileSync(join(cacheDir, "cache.json"), JSON.stringify(cache, null, 2));
|
|
101
|
-
onProgress?.(`Dashboard v${version} installed`);
|
|
102
|
-
return cache.path;
|
|
36
|
+
const cachedVersion = readFileSync(versionFile, "utf-8").trim();
|
|
37
|
+
return cachedVersion === getCliVersion() && existsSync(join(getDashboardDir(projectRoot), "apps", "dashboard", "server.js"));
|
|
103
38
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
107
41
|
}
|
|
108
42
|
}
|
|
109
|
-
function
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
43
|
+
export function ensureDashboardExtracted(projectRoot) {
|
|
44
|
+
const dashDir = getDashboardDir(projectRoot);
|
|
45
|
+
const versionFile = getVersionFile(projectRoot);
|
|
46
|
+
const cliVersion = getCliVersion();
|
|
47
|
+
if (isDashboardInstalled(projectRoot)) {
|
|
48
|
+
return dashDir;
|
|
113
49
|
}
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const cacheFile = join(cacheDir, "cache.json");
|
|
118
|
-
let cache;
|
|
119
|
-
try {
|
|
120
|
-
cache = JSON.parse(readFileSync(cacheFile, "utf-8"));
|
|
50
|
+
// Clean old cache
|
|
51
|
+
if (existsSync(dashDir)) {
|
|
52
|
+
rmSync(dashDir, { recursive: true, force: true });
|
|
121
53
|
}
|
|
122
|
-
|
|
123
|
-
|
|
54
|
+
mkdirSync(dashDir, { recursive: true });
|
|
55
|
+
// Try to extract from npm package tar.gz
|
|
56
|
+
const tarGz = getTarGzPath();
|
|
57
|
+
if (tarGz) {
|
|
58
|
+
execSync(`tar -xzf "${tarGz}" -C "${dashDir}"`, { stdio: "pipe" });
|
|
59
|
+
writeFileSync(versionFile, cliVersion);
|
|
60
|
+
return dashDir;
|
|
124
61
|
}
|
|
125
|
-
|
|
126
|
-
cache.path = currentLink;
|
|
127
|
-
cache.downloadedAt = new Date().toISOString();
|
|
128
|
-
writeFileSync(cacheFile, JSON.stringify(cache, null, 2));
|
|
129
|
-
}
|
|
130
|
-
function isSymlink(p) {
|
|
62
|
+
// Monorepo dev fallback: symlink next.js standalone build output
|
|
131
63
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
64
|
+
const pkgJson = require.resolve("@devflow-tools/devflow/package.json");
|
|
65
|
+
const repoRoot = join(dirname(pkgJson), "..", "..");
|
|
66
|
+
const standaloneDir = join(repoRoot, "apps", "dashboard", ".next", "standalone");
|
|
67
|
+
const staticDir = join(repoRoot, "apps", "dashboard", ".next", "static");
|
|
68
|
+
const publicDir = join(repoRoot, "apps", "dashboard", "public");
|
|
69
|
+
const serverPath = join(standaloneDir, "apps", "dashboard", "server.js");
|
|
70
|
+
if (!existsSync(serverPath)) {
|
|
71
|
+
throw new Error(`Dashboard build not found.\n` +
|
|
72
|
+
` Expected: ${serverPath}\n` +
|
|
73
|
+
` Run: npm run build:dist (requires Node >= 18)\n` +
|
|
74
|
+
` Or install from npm: npm install @devflow-tools/devflow@${cliVersion}`);
|
|
75
|
+
}
|
|
76
|
+
// Copy standalone output to cache
|
|
77
|
+
execSync(`cp -r "${standaloneDir}/"* "${dashDir}/"`, { stdio: "pipe" });
|
|
78
|
+
if (existsSync(staticDir)) {
|
|
79
|
+
const destStatic = join(dashDir, "apps", "dashboard", ".next");
|
|
80
|
+
mkdirSync(destStatic, { recursive: true });
|
|
81
|
+
execSync(`cp -r "${staticDir}" "${destStatic}/"`, { stdio: "pipe" });
|
|
82
|
+
}
|
|
83
|
+
if (existsSync(publicDir)) {
|
|
84
|
+
execSync(`cp -r "${publicDir}" "${dashDir}/"`, { stdio: "pipe" });
|
|
85
|
+
}
|
|
86
|
+
writeFileSync(versionFile, cliVersion);
|
|
87
|
+
return dashDir;
|
|
143
88
|
}
|
|
144
|
-
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
rmSync(oldVersionDir, { recursive: true, force: true });
|
|
89
|
+
catch (e) {
|
|
90
|
+
// Clean up partial cache
|
|
91
|
+
if (existsSync(dashDir)) {
|
|
92
|
+
rmSync(dashDir, { recursive: true, force: true });
|
|
149
93
|
}
|
|
94
|
+
throw e;
|
|
150
95
|
}
|
|
151
|
-
return downloadDashboard(currentVersion, (msg) => {
|
|
152
|
-
console.log(msg);
|
|
153
|
-
});
|
|
154
96
|
}
|
|
155
97
|
//# sourceMappingURL=dashboard-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-cache.js","sourceRoot":"","sources":["../../src/lib/dashboard-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dashboard-cache.js","sourceRoot":"","sources":["../../src/lib/dashboard-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "DevFlow — Developer Intelligence Platform for Claude Code",
|
|
6
6
|
"type": "module",
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
"build": "npx tsx scripts/inject-gates.ts",
|
|
9
9
|
"deploy": "npx tsx scripts/inject-gates.ts --deploy"
|
|
10
10
|
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@devflow-tools/mcp-server": "^0.8.6"
|
|
13
|
+
},
|
|
11
14
|
"keywords": [
|
|
12
15
|
"pi-package",
|
|
13
16
|
"skills",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -12,31 +12,31 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@colbymchenry/codegraph": "^1.1.1",
|
|
15
|
-
"@devflow-tools/adapters": "^0.8.
|
|
16
|
-
"@devflow-tools/benchmark": "^0.8.
|
|
17
|
-
"@devflow-tools/context-engine": "^0.8.
|
|
18
|
-
"@devflow-tools/database": "^0.8.
|
|
19
|
-
"@devflow-tools/knowledge-engine": "^0.8.
|
|
20
|
-
"@devflow-tools/mcp-server": "^0.8.
|
|
21
|
-
"@devflow-tools/memory-engine": "^0.8.
|
|
22
|
-
"@devflow-tools/plugin-animation": "^0.8.
|
|
23
|
-
"@devflow-tools/plugin-css": "^0.8.
|
|
24
|
-
"@devflow-tools/plugin-docker": "^0.8.
|
|
25
|
-
"@devflow-tools/plugin-electron": "^0.8.
|
|
26
|
-
"@devflow-tools/plugin-git": "^0.8.
|
|
27
|
-
"@devflow-tools/plugin-graphql": "^0.8.
|
|
28
|
-
"@devflow-tools/plugin-nest": "^0.8.
|
|
29
|
-
"@devflow-tools/plugin-nextjs": "^0.8.
|
|
30
|
-
"@devflow-tools/plugin-performance": "^0.8.
|
|
31
|
-
"@devflow-tools/plugin-react": "^0.8.
|
|
32
|
-
"@devflow-tools/plugin-tailwind": "^0.8.
|
|
33
|
-
"@devflow-tools/plugin-taro": "^0.8.
|
|
34
|
-
"@devflow-tools/plugin-ui-layout": "^0.8.
|
|
35
|
-
"@devflow-tools/plugin-vue": "^0.8.
|
|
36
|
-
"@devflow-tools/sdk": "^0.8.
|
|
37
|
-
"@devflow-tools/server": "^0.8.
|
|
38
|
-
"@devflow-tools/telemetry": "^0.8.
|
|
39
|
-
"@devflow-tools/workflow-engine": "^0.8.
|
|
15
|
+
"@devflow-tools/adapters": "^0.8.6",
|
|
16
|
+
"@devflow-tools/benchmark": "^0.8.6",
|
|
17
|
+
"@devflow-tools/context-engine": "^0.8.6",
|
|
18
|
+
"@devflow-tools/database": "^0.8.6",
|
|
19
|
+
"@devflow-tools/knowledge-engine": "^0.8.6",
|
|
20
|
+
"@devflow-tools/mcp-server": "^0.8.6",
|
|
21
|
+
"@devflow-tools/memory-engine": "^0.8.6",
|
|
22
|
+
"@devflow-tools/plugin-animation": "^0.8.6",
|
|
23
|
+
"@devflow-tools/plugin-css": "^0.8.6",
|
|
24
|
+
"@devflow-tools/plugin-docker": "^0.8.6",
|
|
25
|
+
"@devflow-tools/plugin-electron": "^0.8.6",
|
|
26
|
+
"@devflow-tools/plugin-git": "^0.8.6",
|
|
27
|
+
"@devflow-tools/plugin-graphql": "^0.8.6",
|
|
28
|
+
"@devflow-tools/plugin-nest": "^0.8.6",
|
|
29
|
+
"@devflow-tools/plugin-nextjs": "^0.8.6",
|
|
30
|
+
"@devflow-tools/plugin-performance": "^0.8.6",
|
|
31
|
+
"@devflow-tools/plugin-react": "^0.8.6",
|
|
32
|
+
"@devflow-tools/plugin-tailwind": "^0.8.6",
|
|
33
|
+
"@devflow-tools/plugin-taro": "^0.8.6",
|
|
34
|
+
"@devflow-tools/plugin-ui-layout": "^0.8.6",
|
|
35
|
+
"@devflow-tools/plugin-vue": "^0.8.6",
|
|
36
|
+
"@devflow-tools/sdk": "^0.8.6",
|
|
37
|
+
"@devflow-tools/server": "^0.8.7",
|
|
38
|
+
"@devflow-tools/telemetry": "^0.8.6",
|
|
39
|
+
"@devflow-tools/workflow-engine": "^0.8.6",
|
|
40
40
|
"@inquirer/prompts": "^7.10.1",
|
|
41
41
|
"chalk": "^5.3.0",
|
|
42
42
|
"commander": "^12.0.0"
|