kandev 0.9.0 → 0.11.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 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 = 60000;
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, includeMcp: true, debug: true });
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(`[kandev] web ready at ${webUrl}`);
212
- (0, web_1.openBrowser)(webUrl);
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, includeMcp = false, production = false, debug = false } = options;
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: only pass ports, client builds URL from current hostname
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, includeMcp = false, logLevel } = options;
84
+ const { header, ports, dbPath, logLevel } = options;
90
85
  console.log(`[kandev] ${header}`);
91
- console.log("[kandev] backend port:", ports.backendPort);
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
- if (includeMcp) {
95
- console.log("[kandev] mcp port:", ports.mcpPort);
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, includeMcp: true, production: true, debug });
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(`[kandev] web ready at ${webUrl}`);
127
- (0, web_1.openBrowser)(webUrl);
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.9.0",
3
+ "version": "0.11.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.0",
17
+ "tar": "^7.5.10",
18
18
  "tree-kill": "^1.2.2"
19
19
  },
20
20
  "devDependencies": {