dev3000 0.0.177 → 0.0.178
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/README.md +136 -154
- package/bin/dev3000 +30 -5
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.js +20 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/status.d.ts +21 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +44 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/components/PackageSelector.js +1 -1
- package/dist/constants/log-colors.d.ts.map +1 -1
- package/dist/dev-environment.d.ts +6 -4
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +42 -39
- package/dist/dev-environment.js.map +1 -1
- package/dist/portless.d.ts +15 -11
- package/dist/portless.d.ts.map +1 -1
- package/dist/portless.js +70 -81
- package/dist/portless.js.map +1 -1
- package/dist/screencast-manager.d.ts.map +1 -1
- package/dist/screencast-manager.js.map +1 -1
- package/dist/services/parsers/error-detectors/base.d.ts.map +1 -1
- package/dist/services/parsers/error-detectors/nextjs.d.ts.map +1 -1
- package/dist/services/parsers/log-parsers/standard.d.ts.map +1 -1
- package/dist/services/parsers/output-processor.d.ts.map +1 -1
- package/dist/services/parsers/output-processor.js.map +1 -1
- package/dist/skills/d3k/internal-skill.md +82 -115
- package/dist/tui-interface-impl.js +1 -1
- package/dist/tui-interface-opentui.js.map +1 -1
- package/dist/tui-interface.d.ts.map +1 -1
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/project-detector.js.map +1 -1
- package/dist/utils/project-metadata.js.map +1 -1
- package/dist/utils/project-name.js.map +1 -1
- package/dist/utils/session.d.ts +5 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +1 -1
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/skill-installer.js.map +1 -1
- package/dist/utils/timestamp.js.map +1 -1
- package/dist/utils/tmux-helpers.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/package.json +11 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,oBAAoB,IAAI,8BAA8B,EAAE,MAAM,8BAA8B,CAAA;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAQxD,SAAS,iBAAiB,CAAC,GAAsB;IAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,GAAG,gEAAgE,CAAA;IAC7E,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Session } from "../utils/session.js";
|
|
2
|
+
export interface D3kStatus {
|
|
3
|
+
running: boolean;
|
|
4
|
+
ready: boolean;
|
|
5
|
+
projectName?: string;
|
|
6
|
+
pid?: number;
|
|
7
|
+
appUrl?: string | null;
|
|
8
|
+
appPort?: string;
|
|
9
|
+
browserConnected?: boolean;
|
|
10
|
+
cdpUrl?: string | null;
|
|
11
|
+
logFilePath?: string;
|
|
12
|
+
serverCommand?: string | null;
|
|
13
|
+
serverPid?: number | null;
|
|
14
|
+
startedAt?: string;
|
|
15
|
+
routing?: "portless" | "direct";
|
|
16
|
+
}
|
|
17
|
+
export declare function getD3kStatus(session?: Session | null): D3kStatus;
|
|
18
|
+
export declare function printD3kStatus(options?: {
|
|
19
|
+
json?: boolean;
|
|
20
|
+
}): number;
|
|
21
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAEtE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;CAChC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,OAAO,GAAG,IAA2B,GAAG,SAAS,CAoBtF;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAqBvE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { findCurrentSession } from "../utils/session.js";
|
|
2
|
+
export function getD3kStatus(session = findCurrentSession()) {
|
|
3
|
+
if (!session) {
|
|
4
|
+
return { running: false, ready: false };
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
running: true,
|
|
8
|
+
ready: session.ready === true,
|
|
9
|
+
projectName: session.projectName,
|
|
10
|
+
pid: session.pid,
|
|
11
|
+
appUrl: session.publicUrl || (session.appPort ? `http://localhost:${session.appPort}` : null),
|
|
12
|
+
appPort: session.appPort,
|
|
13
|
+
browserConnected: Boolean(session.cdpUrl),
|
|
14
|
+
cdpUrl: session.cdpUrl || null,
|
|
15
|
+
logFilePath: session.logFilePath,
|
|
16
|
+
serverCommand: session.serverCommand || null,
|
|
17
|
+
serverPid: session.serverPid || null,
|
|
18
|
+
startedAt: session.startTime,
|
|
19
|
+
routing: session.portless ? "portless" : "direct"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function printD3kStatus(options = {}) {
|
|
23
|
+
const status = getD3kStatus();
|
|
24
|
+
if (options.json) {
|
|
25
|
+
console.log(JSON.stringify(status, null, 2));
|
|
26
|
+
// "not running" is expected control flow for agents deciding whether to
|
|
27
|
+
// start d3k, so machine-readable status should not surface as a tool error.
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
if (!status.running) {
|
|
31
|
+
console.log("d3k is not running for this project.");
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
console.log(`d3k is running for ${status.projectName} (PID ${status.pid})`);
|
|
35
|
+
if (status.appUrl)
|
|
36
|
+
console.log(`App: ${status.appUrl}`);
|
|
37
|
+
console.log(`Browser: ${status.browserConnected ? "connected" : "not connected"}`);
|
|
38
|
+
if (status.logFilePath)
|
|
39
|
+
console.log(`Logs: ${status.logFilePath}`);
|
|
40
|
+
if (status.serverCommand)
|
|
41
|
+
console.log(`Command: ${status.serverCommand}`);
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,qBAAqB,CAAA;AAkBtE,MAAM,UAAU,YAAY,CAAC,OAAO,GAAmB,kBAAkB,EAAE;IACzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;KAClD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAO,GAAuB,EAAE;IAC7D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAE7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5C,wEAAwE;QACxE,4EAA4E;QAC5E,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;QACnD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,WAAW,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC,CAAA;IAC3E,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;IAClF,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;IACzE,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { getSkillsPathForLocation } from "../utils/skill-installer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-colors.d.ts","sourceRoot":"","sources":["../../src/constants/log-colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"log-colors.d.ts","sourceRoot":"","sources":["../../src/constants/log-colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,UAAU;aAErB,OAAO,EAAE,SAAS;aAClB,MAAM,EAAE,SAAS;aAGjB,OAAO,EAAE,SAAS;aAClB,KAAK,EAAE,SAAS;aAChB,OAAO,EAAE,SAAS;aAClB,IAAI,EAAE,SAAS;aACf,GAAG,EAAE,SAAS;aACd,KAAK,EAAE,SAAS;aAChB,UAAU,EAAE,SAAS;aACrB,GAAG,EAAE,SAAS;aACd,GAAG,EAAE,SAAS;aACd,MAAM,EAAE,SAAS;aACjB,KAAK,EAAE,SAAS;aAChB,IAAI,EAAE,SAAS;aACf,MAAM,EAAE,SAAS;aACjB,UAAU,EAAE,SAAS;aACrB,WAAW,EAAE,SAAS;aACtB,OAAO,EAAE,SAAS;CACV,CAAA;AAGV,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYpD;AAGD,eAAO,MAAM,cAAc;aACzB,OAAO,EAAE,SAAS;aAClB,KAAK,EAAE,OAAO;aACd,OAAO,EAAE,SAAS;aAClB,IAAI,EAAE,MAAM;aACZ,GAAG,EAAE,KAAK;aACV,KAAK,EAAE,OAAO;aACd,UAAU,EAAE,YAAY;aACxB,GAAG,EAAE,KAAK;aACV,GAAG,EAAE,KAAK;aACV,MAAM,EAAE,QAAQ;aAChB,KAAK,EAAE,OAAO;aACd,IAAI,EAAE,MAAM;aACZ,MAAM,EAAE,QAAQ;aAChB,UAAU,EAAE,YAAY;aACxB,WAAW,EAAE,aAAa;CAClB,CAAA"}
|
|
@@ -55,6 +55,7 @@ interface DevEnvironmentOptions {
|
|
|
55
55
|
tail?: boolean;
|
|
56
56
|
tui?: boolean;
|
|
57
57
|
portless?: boolean;
|
|
58
|
+
customServerCommand?: boolean;
|
|
58
59
|
dateTimeFormat?: "local" | "utc";
|
|
59
60
|
pluginReactScan?: boolean;
|
|
60
61
|
debugPort?: number;
|
|
@@ -66,6 +67,7 @@ interface DevEnvironmentOptions {
|
|
|
66
67
|
installSkills?: boolean;
|
|
67
68
|
screenshotsDir?: string;
|
|
68
69
|
}
|
|
70
|
+
export declare function detectServerPortFromOutput(text: string): string | null;
|
|
69
71
|
/**
|
|
70
72
|
* Count active d3k instances by checking PID files in tmpdir.
|
|
71
73
|
* Returns the count of running d3k processes (excluding the current one if specified).
|
|
@@ -119,7 +121,7 @@ export declare function createPersistentLogFile(override?: string): string;
|
|
|
119
121
|
* processes belong to THIS d3k instance so we don't accidentally kill
|
|
120
122
|
* Chrome instances from other d3k sessions.
|
|
121
123
|
*/
|
|
122
|
-
export declare function writeSessionInfo(projectName: string, logFilePath: string, appPort: string, publicUrl?: string | null, cdpUrl?: string | null, chromePids?: number[], serverCommand?: string, framework?: "nextjs" | "svelte" | "other", serverPid?: number, skillsInstalled?: string[], skillsAgentId?: string | null, preferredBrowserTool?: "agent-browser", agentName?: string | null): void;
|
|
124
|
+
export declare function writeSessionInfo(projectName: string, logFilePath: string, appPort: string, publicUrl?: string | null, cdpUrl?: string | null, chromePids?: number[], serverCommand?: string, framework?: "nextjs" | "svelte" | "other", serverPid?: number, skillsInstalled?: string[], skillsAgentId?: string | null, preferredBrowserTool?: "agent-browser", agentName?: string | null, portless?: boolean, ready?: boolean): void;
|
|
123
125
|
export declare function getSessionChromePids(projectName: string): number[];
|
|
124
126
|
export declare class DevEnvironment {
|
|
125
127
|
private serverProcess;
|
|
@@ -141,7 +143,9 @@ export declare class DevEnvironment {
|
|
|
141
143
|
private portDetected;
|
|
142
144
|
private serverUsesHttps;
|
|
143
145
|
private publicAppUrl;
|
|
144
|
-
private
|
|
146
|
+
private portlessRuntime;
|
|
147
|
+
private portlessFallbackReason;
|
|
148
|
+
private runtimeReady;
|
|
145
149
|
/** Returns "https" or "http" based on detected server protocol */
|
|
146
150
|
private get serverProtocol();
|
|
147
151
|
private get localhostAppUrl();
|
|
@@ -161,8 +165,6 @@ export declare class DevEnvironment {
|
|
|
161
165
|
private cleanupOrphanedServer;
|
|
162
166
|
private acquireLock;
|
|
163
167
|
private releaseLock;
|
|
164
|
-
private syncPortlessAlias;
|
|
165
|
-
private clearPortlessAlias;
|
|
166
168
|
private writeCurrentSessionInfo;
|
|
167
169
|
private detectPortChange;
|
|
168
170
|
private debugLog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-environment.d.ts","sourceRoot":"","sources":["../src/dev-environment.ts"],"names":[],"mappings":"AA2DA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IAC/D,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAA;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAA;IACjB,8CAA8C;IAC9C,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0DnG;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,+BAA+B,EAAE,MAAM,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,eAAe,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;IACzC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAChC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"dev-environment.d.ts","sourceRoot":"","sources":["../src/dev-environment.ts"],"names":[],"mappings":"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"}
|
package/dist/dev-environment.js
CHANGED
|
@@ -9,7 +9,7 @@ import { dirname, join, resolve, sep } from "path";
|
|
|
9
9
|
import { fileURLToPath } from "url";
|
|
10
10
|
import { stripVTControlCharacters } from "util";
|
|
11
11
|
import { CDPMonitor } from "./cdp-monitor.js";
|
|
12
|
-
import {
|
|
12
|
+
import { buildPortlessServerCommand, preparePortlessRuntime } from "./portless.js";
|
|
13
13
|
import { ScreencastManager } from "./screencast-manager.js";
|
|
14
14
|
import { NextJsErrorDetector, OutputProcessor, StandardLogParser } from "./services/parsers/index.js";
|
|
15
15
|
import { getBundledD3kSkillPath, listAvailableSkills } from "./skills/index.js";
|
|
@@ -136,6 +136,12 @@ function parsePortNumber(port) {
|
|
|
136
136
|
}
|
|
137
137
|
return parsed;
|
|
138
138
|
}
|
|
139
|
+
export function detectServerPortFromOutput(text) {
|
|
140
|
+
return (text.match(/Running:\s+PORT=(\d+)/i)?.[1] ||
|
|
141
|
+
text.match(/using available port (\d+) instead/i)?.[1] ||
|
|
142
|
+
text.match(/Local:.*localhost:(\d+)/i)?.[1] ||
|
|
143
|
+
null);
|
|
144
|
+
}
|
|
139
145
|
function escapeRegexForPkill(value) {
|
|
140
146
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
141
147
|
}
|
|
@@ -575,7 +581,7 @@ export function createPersistentLogFile(override) {
|
|
|
575
581
|
* processes belong to THIS d3k instance so we don't accidentally kill
|
|
576
582
|
* Chrome instances from other d3k sessions.
|
|
577
583
|
*/
|
|
578
|
-
export function writeSessionInfo(projectName, logFilePath, appPort, publicUrl, cdpUrl, chromePids, serverCommand, framework, serverPid, skillsInstalled, skillsAgentId, preferredBrowserTool, agentName) {
|
|
584
|
+
export function writeSessionInfo(projectName, logFilePath, appPort, publicUrl, cdpUrl, chromePids, serverCommand, framework, serverPid, skillsInstalled, skillsAgentId, preferredBrowserTool, agentName, portless, ready) {
|
|
579
585
|
const projectDir = getProjectDir();
|
|
580
586
|
try {
|
|
581
587
|
// Create project directory if it doesn't exist
|
|
@@ -601,7 +607,9 @@ export function writeSessionInfo(projectName, logFilePath, appPort, publicUrl, c
|
|
|
601
607
|
skillsInstalled: skillsInstalled || [],
|
|
602
608
|
skillsAgentId: skillsAgentId || null,
|
|
603
609
|
preferredBrowserTool: preferredBrowserTool || "agent-browser",
|
|
604
|
-
agentName: agentName || persistedAgentName || null
|
|
610
|
+
agentName: agentName || persistedAgentName || null,
|
|
611
|
+
portless: portless === true,
|
|
612
|
+
ready: ready === true
|
|
605
613
|
};
|
|
606
614
|
// Write session file in project directory
|
|
607
615
|
writeFileSync(sessionFile, JSON.stringify(sessionInfo, null, 2));
|
|
@@ -702,7 +710,9 @@ export class DevEnvironment {
|
|
|
702
710
|
portDetected = false;
|
|
703
711
|
serverUsesHttps = false;
|
|
704
712
|
publicAppUrl = null;
|
|
705
|
-
|
|
713
|
+
portlessRuntime = null;
|
|
714
|
+
portlessFallbackReason = null;
|
|
715
|
+
runtimeReady = false;
|
|
706
716
|
/** Returns "https" or "http" based on detected server protocol */
|
|
707
717
|
get serverProtocol() {
|
|
708
718
|
return this.serverUsesHttps ? "https" : "http";
|
|
@@ -776,9 +786,15 @@ export class DevEnvironment {
|
|
|
776
786
|
spinner: "dots",
|
|
777
787
|
isEnabled: !options.tui && !options.tail // Disable spinner in TUI mode
|
|
778
788
|
});
|
|
779
|
-
if (options.portless
|
|
780
|
-
|
|
781
|
-
|
|
789
|
+
if (options.portless !== false) {
|
|
790
|
+
const portless = preparePortlessRuntime(getProjectDisplayName());
|
|
791
|
+
if (portless.success && portless.runtime) {
|
|
792
|
+
this.portlessRuntime = portless.runtime;
|
|
793
|
+
this.publicAppUrl = portless.runtime.url;
|
|
794
|
+
}
|
|
795
|
+
else {
|
|
796
|
+
this.portlessFallbackReason = portless.error || "Portless initialization failed";
|
|
797
|
+
}
|
|
782
798
|
}
|
|
783
799
|
// Ensure screenshot directory exists
|
|
784
800
|
try {
|
|
@@ -801,7 +817,7 @@ export class DevEnvironment {
|
|
|
801
817
|
// Check if user explicitly set ports via CLI flags
|
|
802
818
|
const userSetAppPort = this.options.userSetPort || false;
|
|
803
819
|
// If user didn't set ports, find available ones first (before checking)
|
|
804
|
-
if (!userSetAppPort) {
|
|
820
|
+
if (!userSetAppPort && !this.portlessRuntime) {
|
|
805
821
|
const startPort = parseInt(this.options.port, 10);
|
|
806
822
|
const availablePort = await findAvailablePort(startPort);
|
|
807
823
|
if (availablePort !== this.options.port) {
|
|
@@ -941,6 +957,12 @@ export class DevEnvironment {
|
|
|
941
957
|
this.cleanupOrphanedServer();
|
|
942
958
|
// Check if TUI mode is enabled (default) and stdin supports it
|
|
943
959
|
const canUseTUI = this.options.tui && process.stdin.isTTY;
|
|
960
|
+
if (this.portlessFallbackReason) {
|
|
961
|
+
this.debugLog(`Portless unavailable; using direct localhost: ${this.portlessFallbackReason}`);
|
|
962
|
+
if (!canUseTUI) {
|
|
963
|
+
console.warn(chalk.yellow("Portless unavailable; using direct localhost."));
|
|
964
|
+
}
|
|
965
|
+
}
|
|
944
966
|
if (!canUseTUI && this.options.tui) {
|
|
945
967
|
this.debugLog("TTY not available, falling back to non-TUI mode");
|
|
946
968
|
}
|
|
@@ -1062,7 +1084,6 @@ export class DevEnvironment {
|
|
|
1062
1084
|
}
|
|
1063
1085
|
// Update TUI with confirmed port (may have changed during server startup)
|
|
1064
1086
|
this.tui.updateAppPort(this.options.port);
|
|
1065
|
-
this.syncPortlessAlias();
|
|
1066
1087
|
this.tui.updateAppUrl(this.options.appUrl || this.publicAppUrl);
|
|
1067
1088
|
// Legacy tools server removed - using CLI commands instead
|
|
1068
1089
|
// await this.waitForMcpServer()
|
|
@@ -1078,6 +1099,7 @@ export class DevEnvironment {
|
|
|
1078
1099
|
this.debugLog("Browser monitoring disabled via --servers-only flag");
|
|
1079
1100
|
}
|
|
1080
1101
|
// Write session info for tooling discovery (include CDP URL if browser monitoring was started)
|
|
1102
|
+
this.runtimeReady = true;
|
|
1081
1103
|
this.writeCurrentSessionInfo(projectName);
|
|
1082
1104
|
// Clear status - ready!
|
|
1083
1105
|
await this.tui.updateStatus(null);
|
|
@@ -1122,7 +1144,6 @@ export class DevEnvironment {
|
|
|
1122
1144
|
}
|
|
1123
1145
|
// Legacy server removed - using CLI commands instead
|
|
1124
1146
|
// await this.waitForMcpServer()
|
|
1125
|
-
this.syncPortlessAlias();
|
|
1126
1147
|
// Start CDP monitoring only if server started successfully and not in servers-only mode
|
|
1127
1148
|
if (!this.options.serversOnly && serverStarted) {
|
|
1128
1149
|
this.spinner.text = `Starting ${this.options.commandName} browser...`;
|
|
@@ -1136,6 +1157,7 @@ export class DevEnvironment {
|
|
|
1136
1157
|
}
|
|
1137
1158
|
// Get project name for session info and Visual Timeline URL
|
|
1138
1159
|
const projectName = getProjectName();
|
|
1160
|
+
this.runtimeReady = true;
|
|
1139
1161
|
this.writeCurrentSessionInfo(projectName);
|
|
1140
1162
|
// Complete startup with success message only in non-TUI mode
|
|
1141
1163
|
this.spinner.succeed("Development environment ready!");
|
|
@@ -1173,7 +1195,13 @@ export class DevEnvironment {
|
|
|
1173
1195
|
this.startHealthCheck();
|
|
1174
1196
|
}
|
|
1175
1197
|
async startServer() {
|
|
1176
|
-
|
|
1198
|
+
const launchCommand = this.portlessRuntime
|
|
1199
|
+
? buildPortlessServerCommand(this.portlessRuntime, this.options.serverCommand, {
|
|
1200
|
+
appPort: this.options.userSetPort ? this.options.port : undefined,
|
|
1201
|
+
customCommand: this.options.customServerCommand
|
|
1202
|
+
})
|
|
1203
|
+
: this.options.serverCommand;
|
|
1204
|
+
this.debugLog(`Starting server process: ${launchCommand}`);
|
|
1177
1205
|
this.serverStartTime = Date.now();
|
|
1178
1206
|
const serverEnv = { ...process.env };
|
|
1179
1207
|
if (this.publicAppUrl) {
|
|
@@ -1181,7 +1209,7 @@ export class DevEnvironment {
|
|
|
1181
1209
|
serverEnv.__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS = ".localhost";
|
|
1182
1210
|
}
|
|
1183
1211
|
// Use the full command string with shell: true to properly handle complex commands
|
|
1184
|
-
this.serverProcess = spawn(
|
|
1212
|
+
this.serverProcess = spawn(launchCommand, {
|
|
1185
1213
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1186
1214
|
shell: true,
|
|
1187
1215
|
detached: true, // Run independently
|
|
@@ -1424,45 +1452,22 @@ export class DevEnvironment {
|
|
|
1424
1452
|
this.debugLog(`Failed to release lock: ${error}`);
|
|
1425
1453
|
}
|
|
1426
1454
|
}
|
|
1427
|
-
syncPortlessAlias() {
|
|
1428
|
-
if (!this.portlessAliasName) {
|
|
1429
|
-
return;
|
|
1430
|
-
}
|
|
1431
|
-
const result = ensurePortlessAlias(this.portlessAliasName, this.options.port);
|
|
1432
|
-
if (result.success) {
|
|
1433
|
-
this.publicAppUrl = result.url;
|
|
1434
|
-
this.debugLog(`Portless alias ready: ${this.portlessAliasName} -> ${this.options.port} (${result.url})`);
|
|
1435
|
-
}
|
|
1436
|
-
else {
|
|
1437
|
-
this.publicAppUrl = null;
|
|
1438
|
-
this.debugLog(`Portless alias setup failed: ${result.error}`);
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
|
-
clearPortlessAlias() {
|
|
1442
|
-
if (!this.portlessAliasName) {
|
|
1443
|
-
return;
|
|
1444
|
-
}
|
|
1445
|
-
removePortlessAlias(this.portlessAliasName);
|
|
1446
|
-
}
|
|
1447
1455
|
writeCurrentSessionInfo(projectName = getProjectName()) {
|
|
1448
1456
|
const cdpUrl = this.cdpMonitor?.getCdpUrl() || null;
|
|
1449
1457
|
const chromePids = this.cdpMonitor?.getChromePids() || [];
|
|
1450
1458
|
const skillsInstalled = listAvailableSkills(process.cwd());
|
|
1451
|
-
writeSessionInfo(projectName, this.options.logFile, this.options.port, this.options.appUrl || this.publicAppUrl, cdpUrl, chromePids, this.options.serverCommand, this.options.framework, this.serverProcess?.pid, skillsInstalled, this.options.skillsAgentId ?? null, this.options.browserTool, this.options.agentName ?? null);
|
|
1459
|
+
writeSessionInfo(projectName, this.options.logFile, this.options.port, this.options.appUrl || this.publicAppUrl, cdpUrl, chromePids, this.options.serverCommand, this.options.framework, this.serverProcess?.pid, skillsInstalled, this.options.skillsAgentId ?? null, this.options.browserTool, this.options.agentName ?? null, Boolean(this.portlessRuntime), this.runtimeReady);
|
|
1452
1460
|
}
|
|
1453
1461
|
detectPortChange(text) {
|
|
1454
1462
|
// Detect Next.js port switch: "⚠ Port 3000 is in use by process 39543, using available port 3001 instead."
|
|
1455
1463
|
// Also detect: "Local: http://localhost:3001"
|
|
1456
|
-
const
|
|
1457
|
-
const localUrlMatch = text.match(/Local:.*localhost:(\d+)/i);
|
|
1458
|
-
const detectedPort = nextJsPortSwitchMatch?.[1] || localUrlMatch?.[1];
|
|
1464
|
+
const detectedPort = detectServerPortFromOutput(text);
|
|
1459
1465
|
if (detectedPort && detectedPort !== this.options.port) {
|
|
1460
1466
|
const oldPort = this.options.port;
|
|
1461
1467
|
this.debugLog(`Detected server port change from ${oldPort} to ${detectedPort}`);
|
|
1462
1468
|
this.logger.log("server", `[PORT] Server switched from port ${oldPort} to ${detectedPort}`);
|
|
1463
1469
|
this.options.port = detectedPort;
|
|
1464
1470
|
this.portDetected = true;
|
|
1465
|
-
this.syncPortlessAlias();
|
|
1466
1471
|
// Update session info with new port
|
|
1467
1472
|
const projectName = getProjectName();
|
|
1468
1473
|
if (this.cdpMonitor || this.serverProcess?.pid) {
|
|
@@ -1829,7 +1834,6 @@ export class DevEnvironment {
|
|
|
1829
1834
|
catch (_error) {
|
|
1830
1835
|
// Non-fatal - ignore cleanup errors
|
|
1831
1836
|
}
|
|
1832
|
-
this.clearPortlessAlias();
|
|
1833
1837
|
// Check PID file ownership BEFORE deleting (needed for cleanup decisions)
|
|
1834
1838
|
let weOwnPidFile = false;
|
|
1835
1839
|
try {
|
|
@@ -1845,7 +1849,6 @@ export class DevEnvironment {
|
|
|
1845
1849
|
catch (_error) {
|
|
1846
1850
|
// Non-fatal - ignore cleanup errors
|
|
1847
1851
|
}
|
|
1848
|
-
this.clearPortlessAlias();
|
|
1849
1852
|
// Stop TUI if it's running
|
|
1850
1853
|
if (this.tui) {
|
|
1851
1854
|
await this.tui.shutdown();
|