kandev 0.8.0 → 0.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/dist/cli.js +8 -4
- package/dist/constants.js +1 -1
- package/dist/dev.js +1 -2
- package/dist/run.js +3 -3
- package/dist/shared.js +9 -17
- package/dist/start.js +4 -5
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -36,8 +36,8 @@ Options:
|
|
|
36
36
|
run Use release bundles (default).
|
|
37
37
|
--dev Alias for "dev".
|
|
38
38
|
--version Release tag to install (default: latest).
|
|
39
|
-
--backend-port Override backend port.
|
|
40
|
-
--web-port Override web port.
|
|
39
|
+
--backend-port Override backend port (or KANDEV_BACKEND_PORT env var).
|
|
40
|
+
--web-port Override web port (or KANDEV_WEB_PORT env var).
|
|
41
41
|
--verbose, -v Show info logs from backend + web (start mode only).
|
|
42
42
|
--debug Show debug logs + agent message dumps (start mode only).
|
|
43
43
|
--help, -h Show help.
|
|
@@ -97,6 +97,10 @@ function parseArgs(argv) {
|
|
|
97
97
|
}
|
|
98
98
|
return opts;
|
|
99
99
|
}
|
|
100
|
+
function envPort(name) {
|
|
101
|
+
const val = process.env[name];
|
|
102
|
+
return val ? Number(val) : undefined;
|
|
103
|
+
}
|
|
100
104
|
function findRepoRoot(startDir) {
|
|
101
105
|
let current = node_path_1.default.resolve(startDir);
|
|
102
106
|
while (true) {
|
|
@@ -121,8 +125,8 @@ function findRepoRoot(startDir) {
|
|
|
121
125
|
}
|
|
122
126
|
async function main() {
|
|
123
127
|
const raw = parseArgs(process.argv.slice(2));
|
|
124
|
-
const backendPort = (0, ports_1.ensureValidPort)(raw.backendPort, "backend port");
|
|
125
|
-
const webPort = (0, ports_1.ensureValidPort)(raw.webPort, "web port");
|
|
128
|
+
const backendPort = (0, ports_1.ensureValidPort)(raw.backendPort ?? envPort("KANDEV_BACKEND_PORT"), "backend port");
|
|
129
|
+
const webPort = (0, ports_1.ensureValidPort)(raw.webPort ?? envPort("KANDEV_WEB_PORT"), "web port");
|
|
126
130
|
if (raw.command === "dev") {
|
|
127
131
|
const repoRoot = findRepoRoot(process.cwd());
|
|
128
132
|
if (!repoRoot) {
|
package/dist/constants.js
CHANGED
|
@@ -17,7 +17,7 @@ exports.RANDOM_PORT_MAX = 60000;
|
|
|
17
17
|
exports.RANDOM_PORT_RETRIES = 10;
|
|
18
18
|
// Backend healthcheck timeout during startup.
|
|
19
19
|
exports.HEALTH_TIMEOUT_MS_RELEASE = 15000;
|
|
20
|
-
exports.HEALTH_TIMEOUT_MS_DEV =
|
|
20
|
+
exports.HEALTH_TIMEOUT_MS_DEV = 600000;
|
|
21
21
|
// Local user cache/data directories for release bundles and DB.
|
|
22
22
|
exports.CACHE_DIR = node_path_1.default.join(node_os_1.default.homedir(), ".kandev", "bin");
|
|
23
23
|
exports.DATA_DIR = node_path_1.default.join(node_os_1.default.homedir(), ".kandev", "data");
|
package/dist/dev.js
CHANGED
|
@@ -19,13 +19,12 @@ async function runDev({ repoRoot, backendPort, webPort }) {
|
|
|
19
19
|
KANDEV_MOCK_AGENT: process.env.KANDEV_MOCK_AGENT || "true",
|
|
20
20
|
};
|
|
21
21
|
const backendEnv = (0, shared_1.buildBackendEnv)({ ports, extra });
|
|
22
|
-
const webEnv = (0, shared_1.buildWebEnv)({ ports,
|
|
22
|
+
const webEnv = (0, shared_1.buildWebEnv)({ ports, debug: true });
|
|
23
23
|
const logLevel = process.env.KANDEV_LOGGING_LEVEL?.trim() || process.env.KANDEV_LOG_LEVEL?.trim() || "info";
|
|
24
24
|
(0, shared_1.logStartupInfo)({
|
|
25
25
|
header: "dev mode: using local repo",
|
|
26
26
|
ports,
|
|
27
27
|
dbPath,
|
|
28
|
-
includeMcp: true,
|
|
29
28
|
logLevel,
|
|
30
29
|
});
|
|
31
30
|
const supervisor = (0, process_1.createProcessSupervisor)();
|
package/dist/run.js
CHANGED
|
@@ -132,6 +132,7 @@ async function prepareReleaseBundle({ version, backendPort, webPort, }) {
|
|
|
132
132
|
const backendEnv = {
|
|
133
133
|
...process.env,
|
|
134
134
|
KANDEV_SERVER_PORT: String(actualBackendPort),
|
|
135
|
+
KANDEV_WEB_INTERNAL_URL: `http://localhost:${actualWebPort}`,
|
|
135
136
|
KANDEV_AGENT_STANDALONE_PORT: String(agentctlPort),
|
|
136
137
|
KANDEV_DATABASE_PATH: dbPath,
|
|
137
138
|
KANDEV_LOG_LEVEL: logLevel,
|
|
@@ -139,7 +140,6 @@ async function prepareReleaseBundle({ version, backendPort, webPort, }) {
|
|
|
139
140
|
const webEnv = {
|
|
140
141
|
...process.env,
|
|
141
142
|
KANDEV_API_BASE_URL: backendUrl,
|
|
142
|
-
NEXT_PUBLIC_KANDEV_API_BASE_URL: backendUrl,
|
|
143
143
|
PORT: String(actualWebPort),
|
|
144
144
|
};
|
|
145
145
|
webEnv.NODE_ENV = "production";
|
|
@@ -208,6 +208,6 @@ async function runRelease({ version, backendPort, webPort }) {
|
|
|
208
208
|
quiet: true,
|
|
209
209
|
});
|
|
210
210
|
await (0, health_1.waitForUrlReady)(webUrl, webProc, healthTimeoutMs);
|
|
211
|
-
console.log(
|
|
212
|
-
(0, web_1.openBrowser)(
|
|
211
|
+
console.log("[kandev] ready at " + prepared.backendUrl);
|
|
212
|
+
(0, web_1.openBrowser)(prepared.backendUrl);
|
|
213
213
|
}
|
package/dist/shared.js
CHANGED
|
@@ -45,6 +45,7 @@ function buildBackendEnv(options) {
|
|
|
45
45
|
return {
|
|
46
46
|
...process.env,
|
|
47
47
|
KANDEV_SERVER_PORT: String(ports.backendPort),
|
|
48
|
+
KANDEV_WEB_INTERNAL_URL: `http://localhost:${ports.webPort}`,
|
|
48
49
|
KANDEV_AGENT_STANDALONE_PORT: String(ports.agentctlPort),
|
|
49
50
|
KANDEV_AGENT_MCP_SERVER_PORT: String(ports.mcpPort),
|
|
50
51
|
...(logLevel ? { KANDEV_LOG_LEVEL: logLevel } : {}),
|
|
@@ -58,22 +59,16 @@ function buildBackendEnv(options) {
|
|
|
58
59
|
* @returns Environment object for the web process
|
|
59
60
|
*/
|
|
60
61
|
function buildWebEnv(options) {
|
|
61
|
-
const { ports,
|
|
62
|
-
// Server-side env vars use localhost (SSR runs on same machine as backend)
|
|
63
|
-
// Client-side uses NEXT_PUBLIC_*_PORT to build URLs dynamically from window.location.hostname
|
|
64
|
-
// This allows accessing the app from any device (iPhone, Tailscale, etc.)
|
|
62
|
+
const { ports, production = false, debug = false } = options;
|
|
65
63
|
const env = {
|
|
66
64
|
...process.env,
|
|
67
|
-
// Server-side: full localhost URL for SSR
|
|
65
|
+
// Server-side: full localhost URL for SSR fetches (Next.js SSR → Go backend)
|
|
68
66
|
KANDEV_API_BASE_URL: ports.backendUrl,
|
|
69
|
-
// Client-side:
|
|
67
|
+
// Client-side: port injection for dev mode (browser on :3000, API on :8080).
|
|
68
|
+
// In production, the backend reverse-proxies Next.js so the client uses same-origin.
|
|
70
69
|
NEXT_PUBLIC_KANDEV_API_PORT: String(ports.backendPort),
|
|
71
70
|
PORT: String(ports.webPort),
|
|
72
71
|
};
|
|
73
|
-
if (includeMcp) {
|
|
74
|
-
env.KANDEV_MCP_SERVER_URL = ports.mcpUrl;
|
|
75
|
-
env.NEXT_PUBLIC_KANDEV_MCP_PORT = String(ports.mcpPort);
|
|
76
|
-
}
|
|
77
72
|
if (production) {
|
|
78
73
|
env.NODE_ENV = "production";
|
|
79
74
|
}
|
|
@@ -86,15 +81,12 @@ function buildWebEnv(options) {
|
|
|
86
81
|
* Logs a unified startup info block to the console.
|
|
87
82
|
*/
|
|
88
83
|
function logStartupInfo(options) {
|
|
89
|
-
const { header, ports, dbPath,
|
|
84
|
+
const { header, ports, dbPath, logLevel } = options;
|
|
90
85
|
console.log(`[kandev] ${header}`);
|
|
91
|
-
console.log("[kandev]
|
|
92
|
-
console.log("[kandev] web port:", ports.webPort);
|
|
86
|
+
console.log("[kandev] url: http://localhost:" + ports.backendPort);
|
|
93
87
|
console.log("[kandev] agentctl port:", ports.agentctlPort);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
console.log("[kandev] mcp url:", ports.mcpUrl);
|
|
97
|
-
}
|
|
88
|
+
console.log("[kandev] mcp port:", ports.mcpPort);
|
|
89
|
+
console.log("[kandev] mcp url:", ports.mcpUrl);
|
|
98
90
|
if (dbPath) {
|
|
99
91
|
console.log("[kandev] db path:", dbPath);
|
|
100
92
|
}
|
package/dist/start.js
CHANGED
|
@@ -75,7 +75,7 @@ async function runStart({ repoRoot, backendPort, webPort, verbose = false, debug
|
|
|
75
75
|
// Production mode: use warn log level for clean output unless verbose/debug
|
|
76
76
|
const showOutput = verbose || debug;
|
|
77
77
|
const dbPath = process.env.KANDEV_DATABASE_PATH || node_path_1.default.join(constants_1.DATA_DIR, "kandev.db");
|
|
78
|
-
const logLevel = debug ? "debug" : verbose ? "info" : "warn";
|
|
78
|
+
const logLevel = process.env.KANDEV_LOG_LEVEL?.trim() || (debug ? "debug" : verbose ? "info" : "warn");
|
|
79
79
|
const backendEnv = (0, shared_1.buildBackendEnv)({
|
|
80
80
|
ports,
|
|
81
81
|
logLevel,
|
|
@@ -84,12 +84,11 @@ async function runStart({ repoRoot, backendPort, webPort, verbose = false, debug
|
|
|
84
84
|
...(debug ? { KANDEV_DEBUG_AGENT_MESSAGES: "true" } : {}),
|
|
85
85
|
},
|
|
86
86
|
});
|
|
87
|
-
const webEnv = (0, shared_1.buildWebEnv)({ ports,
|
|
87
|
+
const webEnv = (0, shared_1.buildWebEnv)({ ports, production: true, debug });
|
|
88
88
|
(0, shared_1.logStartupInfo)({
|
|
89
89
|
header: "start mode: using local build",
|
|
90
90
|
ports,
|
|
91
91
|
dbPath,
|
|
92
|
-
includeMcp: true,
|
|
93
92
|
logLevel,
|
|
94
93
|
});
|
|
95
94
|
const supervisor = (0, process_1.createProcessSupervisor)();
|
|
@@ -123,6 +122,6 @@ async function runStart({ repoRoot, backendPort, webPort, verbose = false, debug
|
|
|
123
122
|
quiet: !showOutput,
|
|
124
123
|
});
|
|
125
124
|
await (0, health_1.waitForUrlReady)(webUrl, webProc, healthTimeoutMs);
|
|
126
|
-
console.log(
|
|
127
|
-
(0, web_1.openBrowser)(
|
|
125
|
+
console.log("[kandev] ready at " + ports.backendUrl);
|
|
126
|
+
(0, web_1.openBrowser)(ports.backendUrl);
|
|
128
127
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kandev",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "NPX launcher for Kandev",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"dist"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"tar": "^7.5.
|
|
17
|
+
"tar": "^7.5.10",
|
|
18
18
|
"tree-kill": "^1.2.2"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|