dev-prism 0.6.0 → 0.7.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/README.md +143 -286
- package/bin/dev-prism.js +65 -87
- package/dist/{chunk-7YGOMAJG.js → chunk-3CIXBEXK.js} +22 -28
- package/dist/chunk-AHC6CD7F.js +92 -0
- package/dist/chunk-FQTS57VO.js +64 -0
- package/dist/chunk-GWQPK7MZ.js +50 -0
- package/dist/chunk-HDGBJGIH.js +55 -0
- package/dist/chunk-ILICQAU7.js +60 -0
- package/dist/chunk-IWZN6P6M.js +155 -0
- package/dist/chunk-KP56QH72.js +133 -0
- package/dist/{chunk-3Q454U3I.js → chunk-NJAITOCG.js} +0 -10
- package/dist/{chunk-25WQHUYW.js → chunk-TSNFAXVQ.js} +5 -12
- package/dist/chunk-VAPRJUC7.js +67 -0
- package/dist/chunk-VL56YPMK.js +45 -0
- package/dist/commands/claude.js +1 -1
- package/dist/commands/create.d.ts +1 -5
- package/dist/commands/create.js +5 -8
- package/dist/commands/destroy.d.ts +1 -1
- package/dist/commands/destroy.js +4 -6
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.js +9 -0
- package/dist/commands/info.js +4 -3
- package/dist/commands/list.js +2 -3
- package/dist/commands/prune.js +2 -6
- package/dist/commands/with-env.d.ts +3 -0
- package/dist/commands/with-env.js +9 -0
- package/dist/index.d.ts +9 -14
- package/dist/index.js +57 -73
- package/dist/lib/config.d.ts +4 -11
- package/dist/lib/config.js +1 -3
- package/dist/lib/db.d.ts +26 -0
- package/dist/lib/db.js +28 -0
- package/dist/lib/env.d.ts +7 -5
- package/dist/lib/env.js +9 -9
- package/dist/lib/worktree.d.ts +1 -2
- package/dist/lib/worktree.js +1 -3
- package/package.json +9 -6
- package/dist/chunk-24OM3LGM.js +0 -35
- package/dist/chunk-35SHBLIZ.js +0 -69
- package/dist/chunk-3ATDGV4Y.js +0 -22
- package/dist/chunk-3FYEGH2G.js +0 -217
- package/dist/chunk-3MSC3CGG.js +0 -78
- package/dist/chunk-3NW2OWIU.js +0 -78
- package/dist/chunk-3TRRZEFR.js +0 -38
- package/dist/chunk-4UNCSJRM.js +0 -70
- package/dist/chunk-5KDDYO6Y.js +0 -168
- package/dist/chunk-63II3EL4.js +0 -98
- package/dist/chunk-6YMQTISJ.js +0 -84
- package/dist/chunk-76LSQIZI.js +0 -31
- package/dist/chunk-7OSTLJLO.js +0 -219
- package/dist/chunk-7YEZWM6Y.js +0 -97
- package/dist/chunk-AEVARZQ4.js +0 -203
- package/dist/chunk-AIVPJ467.js +0 -70
- package/dist/chunk-AOM6BONB.js +0 -98
- package/dist/chunk-AW2FJGXA.js +0 -38
- package/dist/chunk-BXYXWNGH.js +0 -30
- package/dist/chunk-C4WLIOBR.js +0 -67
- package/dist/chunk-CUQVGZBX.js +0 -44
- package/dist/chunk-D6QWWXZD.js +0 -49
- package/dist/chunk-DQER5GNG.js +0 -72
- package/dist/chunk-DTE5YQMI.js +0 -41
- package/dist/chunk-EXRHG5KQ.js +0 -60
- package/dist/chunk-FKTFCSU7.js +0 -78
- package/dist/chunk-GBN67HYD.js +0 -57
- package/dist/chunk-GKXXK2ZH.js +0 -203
- package/dist/chunk-GWDGC2OE.js +0 -116
- package/dist/chunk-H3L73URT.js +0 -65
- package/dist/chunk-H4HPDIY3.js +0 -95
- package/dist/chunk-HCCZKLC4.js +0 -64
- package/dist/chunk-HZBJF67X.js +0 -60
- package/dist/chunk-HZUN6NRB.js +0 -70
- package/dist/chunk-I3U6JK77.js +0 -66
- package/dist/chunk-J36LRUXM.js +0 -60
- package/dist/chunk-JHR4WADC.js +0 -200
- package/dist/chunk-JIU574KX.js +0 -41
- package/dist/chunk-JMKE3ZKI.js +0 -61
- package/dist/chunk-JZ2VPQXP.js +0 -132
- package/dist/chunk-KDYKLH6P.js +0 -40
- package/dist/chunk-KZJE62TK.js +0 -203
- package/dist/chunk-LAOWFCQL.js +0 -21
- package/dist/chunk-LDK6QMR6.js +0 -67
- package/dist/chunk-LEHA65A7.js +0 -59
- package/dist/chunk-LNIOSGC4.js +0 -78
- package/dist/chunk-LOVO4P3Y.js +0 -41
- package/dist/chunk-MRBTH5PL.js +0 -66
- package/dist/chunk-NNVP5F6I.js +0 -77
- package/dist/chunk-OL25TBYX.js +0 -67
- package/dist/chunk-OOJ6YOGS.js +0 -53
- package/dist/chunk-OPEZFBBI.js +0 -219
- package/dist/chunk-P3ETW2KK.js +0 -166
- package/dist/chunk-PJKUD2N2.js +0 -22
- package/dist/chunk-PKC2ZED2.js +0 -168
- package/dist/chunk-PS76Q3HD.js +0 -168
- package/dist/chunk-Q5DPX4WL.js +0 -219
- package/dist/chunk-QSG5CXPX.js +0 -171
- package/dist/chunk-QUMZI5KK.js +0 -98
- package/dist/chunk-RC2AUYZ7.js +0 -49
- package/dist/chunk-RQ245R7T.js +0 -67
- package/dist/chunk-SD3TON6N.js +0 -32
- package/dist/chunk-SEKH4ZV6.js +0 -60
- package/dist/chunk-SMFAL2VP.js +0 -69
- package/dist/chunk-SSQ7XBY2.js +0 -30
- package/dist/chunk-SUMJLXT7.js +0 -30
- package/dist/chunk-UHI2QJFI.js +0 -200
- package/dist/chunk-UKYQN4A3.js +0 -38
- package/dist/chunk-URGGS3XM.js +0 -95
- package/dist/chunk-VR3QWHHB.js +0 -57
- package/dist/chunk-VUNPVDSO.js +0 -74
- package/dist/chunk-VXP2SPRI.js +0 -51
- package/dist/chunk-W54CPPSK.js +0 -217
- package/dist/chunk-X2PXZRYU.js +0 -41
- package/dist/chunk-X5A6H4Q7.js +0 -70
- package/dist/chunk-X6FHBEAS.js +0 -200
- package/dist/chunk-XUWQUDLT.js +0 -67
- package/dist/chunk-Y3GR6XK7.js +0 -71
- package/dist/chunk-YSO3IDZZ.js +0 -40
- package/dist/chunk-YY5DA35Z.js +0 -40
- package/dist/chunk-Z2ISJMLW.js +0 -92
- package/dist/chunk-ZKHNUDSL.js +0 -119
- package/dist/commands/logs.d.ts +0 -8
- package/dist/commands/logs.js +0 -9
- package/dist/commands/start.d.ts +0 -7
- package/dist/commands/start.js +0 -10
- package/dist/commands/stop-all.d.ts +0 -3
- package/dist/commands/stop-all.js +0 -8
- package/dist/commands/stop.d.ts +0 -3
- package/dist/commands/stop.js +0 -8
- package/dist/lib/compose.d.ts +0 -12
- package/dist/lib/compose.js +0 -12
- package/dist/lib/config.test.d.ts +0 -1
- package/dist/lib/config.test.js +0 -32
- package/dist/lib/docker-inspect.d.ts +0 -24
- package/dist/lib/docker-inspect.js +0 -16
- package/dist/lib/docker.d.ts +0 -12
- package/dist/lib/docker.js +0 -14
- package/dist/lib/env.test.d.ts +0 -1
- package/dist/lib/env.test.js +0 -68
- package/dist/lib/ports.d.ts +0 -6
- package/dist/lib/ports.js +0 -8
- package/dist/lib/ports.test.d.ts +0 -1
- package/dist/lib/ports.test.js +0 -61
- package/dist/lib/session.d.ts +0 -16
- package/dist/lib/session.js +0 -13
- package/dist/lib/store.d.ts +0 -46
- package/dist/lib/store.js +0 -6
- package/dist/lib/store.test.d.ts +0 -1
- package/dist/lib/store.test.js +0 -205
- package/dist/lib/worktree.test.d.ts +0 -1
- package/dist/lib/worktree.test.js +0 -41
package/dist/chunk-63II3EL4.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
removeWorktree
|
|
3
|
-
} from "./chunk-Y3GR6XK7.js";
|
|
4
|
-
import {
|
|
5
|
-
down,
|
|
6
|
-
isRunning
|
|
7
|
-
} from "./chunk-GBN67HYD.js";
|
|
8
|
-
import {
|
|
9
|
-
loadConfig
|
|
10
|
-
} from "./chunk-25WQHUYW.js";
|
|
11
|
-
import {
|
|
12
|
-
SessionStore
|
|
13
|
-
} from "./chunk-H4HPDIY3.js";
|
|
14
|
-
|
|
15
|
-
// src/commands/prune.ts
|
|
16
|
-
import { existsSync } from "fs";
|
|
17
|
-
import { resolve } from "path";
|
|
18
|
-
import { createInterface } from "readline";
|
|
19
|
-
import chalk from "chalk";
|
|
20
|
-
async function pruneSessions(projectRoot, options) {
|
|
21
|
-
const config = await loadConfig(projectRoot);
|
|
22
|
-
const store = new SessionStore();
|
|
23
|
-
try {
|
|
24
|
-
const sessions = store.listByProject(projectRoot);
|
|
25
|
-
if (sessions.length === 0) {
|
|
26
|
-
console.log(chalk.gray("No sessions found."));
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const stoppedSessions = [];
|
|
30
|
-
for (const session of sessions) {
|
|
31
|
-
const envFile = resolve(session.session_dir, ".env.session");
|
|
32
|
-
let running = false;
|
|
33
|
-
if (existsSync(envFile)) {
|
|
34
|
-
running = await isRunning({ cwd: session.session_dir });
|
|
35
|
-
}
|
|
36
|
-
if (!running) {
|
|
37
|
-
stoppedSessions.push({
|
|
38
|
-
sessionId: session.session_id,
|
|
39
|
-
path: session.session_dir,
|
|
40
|
-
branch: session.branch,
|
|
41
|
-
inPlace: session.in_place === 1
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (stoppedSessions.length === 0) {
|
|
46
|
-
console.log(chalk.gray("No stopped sessions to prune."));
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
console.log(chalk.yellow(`
|
|
50
|
-
Found ${stoppedSessions.length} stopped session(s) to prune:`));
|
|
51
|
-
for (const session of stoppedSessions) {
|
|
52
|
-
console.log(chalk.gray(` - Session ${session.sessionId} (${session.branch})`));
|
|
53
|
-
}
|
|
54
|
-
console.log("");
|
|
55
|
-
if (!options.yes) {
|
|
56
|
-
const rl = createInterface({
|
|
57
|
-
input: process.stdin,
|
|
58
|
-
output: process.stdout
|
|
59
|
-
});
|
|
60
|
-
const answer = await new Promise((resolve2) => {
|
|
61
|
-
rl.question(chalk.red("Are you sure you want to delete these sessions? This cannot be undone. [y/N] "), resolve2);
|
|
62
|
-
});
|
|
63
|
-
rl.close();
|
|
64
|
-
if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
|
|
65
|
-
console.log(chalk.gray("Cancelled."));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
console.log(chalk.blue("\nPruning stopped sessions...\n"));
|
|
70
|
-
for (const session of stoppedSessions) {
|
|
71
|
-
console.log(chalk.gray(` Removing session ${session.sessionId}...`));
|
|
72
|
-
try {
|
|
73
|
-
const envFile = resolve(session.path, ".env.session");
|
|
74
|
-
if (existsSync(envFile)) {
|
|
75
|
-
try {
|
|
76
|
-
await down({ cwd: session.path });
|
|
77
|
-
} catch {
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
if (!session.inPlace) {
|
|
81
|
-
await removeWorktree(projectRoot, session.path, session.branch);
|
|
82
|
-
}
|
|
83
|
-
store.markDestroyed(projectRoot, session.sessionId);
|
|
84
|
-
console.log(chalk.green(` Session ${session.sessionId} removed.`));
|
|
85
|
-
} catch {
|
|
86
|
-
console.log(chalk.yellow(` Warning: Could not fully remove session ${session.sessionId}`));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
console.log(chalk.green(`
|
|
90
|
-
Pruned ${stoppedSessions.length} session(s).`));
|
|
91
|
-
} finally {
|
|
92
|
-
store.close();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export {
|
|
97
|
-
pruneSessions
|
|
98
|
-
};
|
package/dist/chunk-6YMQTISJ.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
// src/lib/store.ts
|
|
2
|
-
import Database from "better-sqlite3";
|
|
3
|
-
import { existsSync, mkdirSync } from "fs";
|
|
4
|
-
import { dirname, join } from "path";
|
|
5
|
-
import { homedir } from "os";
|
|
6
|
-
var SCHEMA = `
|
|
7
|
-
CREATE TABLE IF NOT EXISTS sessions (
|
|
8
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
9
|
-
session_id TEXT NOT NULL,
|
|
10
|
-
project_root TEXT NOT NULL,
|
|
11
|
-
session_dir TEXT NOT NULL,
|
|
12
|
-
branch TEXT NOT NULL DEFAULT '',
|
|
13
|
-
mode TEXT NOT NULL DEFAULT 'docker',
|
|
14
|
-
in_place INTEGER NOT NULL DEFAULT 0,
|
|
15
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
16
|
-
destroyed_at TEXT,
|
|
17
|
-
UNIQUE(session_id, project_root)
|
|
18
|
-
);
|
|
19
|
-
`;
|
|
20
|
-
function defaultDbPath() {
|
|
21
|
-
return join(homedir(), ".dev-prism", "sessions.db");
|
|
22
|
-
}
|
|
23
|
-
var SessionStore = class {
|
|
24
|
-
db;
|
|
25
|
-
constructor(dbPath) {
|
|
26
|
-
const path = dbPath ?? defaultDbPath();
|
|
27
|
-
if (path !== ":memory:") {
|
|
28
|
-
const dir = dirname(path);
|
|
29
|
-
if (!existsSync(dir)) {
|
|
30
|
-
mkdirSync(dir, { recursive: true });
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
this.db = new Database(path);
|
|
34
|
-
this.db.pragma("journal_mode = WAL");
|
|
35
|
-
this.db.pragma("busy_timeout = 3000");
|
|
36
|
-
this.db.exec(SCHEMA);
|
|
37
|
-
}
|
|
38
|
-
insert(row) {
|
|
39
|
-
const stmt = this.db.prepare(`
|
|
40
|
-
INSERT INTO sessions (session_id, project_root, session_dir, branch, mode, in_place)
|
|
41
|
-
VALUES (@session_id, @project_root, @session_dir, @branch, @mode, @in_place)
|
|
42
|
-
`);
|
|
43
|
-
const info = stmt.run({
|
|
44
|
-
session_id: row.sessionId,
|
|
45
|
-
project_root: row.projectRoot,
|
|
46
|
-
session_dir: row.sessionDir,
|
|
47
|
-
branch: row.branch ?? "",
|
|
48
|
-
mode: row.mode ?? "docker",
|
|
49
|
-
in_place: row.inPlace ? 1 : 0
|
|
50
|
-
});
|
|
51
|
-
return this.db.prepare("SELECT * FROM sessions WHERE id = ?").get(info.lastInsertRowid);
|
|
52
|
-
}
|
|
53
|
-
listByProject(projectRoot) {
|
|
54
|
-
return this.db.prepare("SELECT * FROM sessions WHERE project_root = ? AND destroyed_at IS NULL ORDER BY session_id").all(projectRoot);
|
|
55
|
-
}
|
|
56
|
-
listAll() {
|
|
57
|
-
return this.db.prepare("SELECT * FROM sessions WHERE destroyed_at IS NULL ORDER BY project_root, session_id").all();
|
|
58
|
-
}
|
|
59
|
-
findSession(projectRoot, sessionId) {
|
|
60
|
-
return this.db.prepare("SELECT * FROM sessions WHERE project_root = ? AND session_id = ? AND destroyed_at IS NULL").get(projectRoot, sessionId);
|
|
61
|
-
}
|
|
62
|
-
findByDir(sessionDir) {
|
|
63
|
-
return this.db.prepare("SELECT * FROM sessions WHERE session_dir = ? AND destroyed_at IS NULL").get(sessionDir);
|
|
64
|
-
}
|
|
65
|
-
getUsedSessionIds(projectRoot) {
|
|
66
|
-
const rows = this.db.prepare("SELECT session_id FROM sessions WHERE project_root = ? AND destroyed_at IS NULL").all(projectRoot);
|
|
67
|
-
return new Set(rows.map((r) => r.session_id));
|
|
68
|
-
}
|
|
69
|
-
markDestroyed(projectRoot, sessionId) {
|
|
70
|
-
const info = this.db.prepare("UPDATE sessions SET destroyed_at = datetime('now') WHERE project_root = ? AND session_id = ? AND destroyed_at IS NULL").run(projectRoot, sessionId);
|
|
71
|
-
return info.changes > 0;
|
|
72
|
-
}
|
|
73
|
-
remove(projectRoot, sessionId) {
|
|
74
|
-
const info = this.db.prepare("DELETE FROM sessions WHERE project_root = ? AND session_id = ?").run(projectRoot, sessionId);
|
|
75
|
-
return info.changes > 0;
|
|
76
|
-
}
|
|
77
|
-
close() {
|
|
78
|
-
this.db.close();
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
export {
|
|
83
|
-
SessionStore
|
|
84
|
-
};
|
package/dist/chunk-76LSQIZI.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getSession
|
|
3
|
-
} from "./chunk-DQER5GNG.js";
|
|
4
|
-
|
|
5
|
-
// src/commands/stop.ts
|
|
6
|
-
import { existsSync, unlinkSync } from "fs";
|
|
7
|
-
import { resolve } from "path";
|
|
8
|
-
import chalk from "chalk";
|
|
9
|
-
import { execa } from "execa";
|
|
10
|
-
async function stopSession(workingDir) {
|
|
11
|
-
const session = await getSession(workingDir);
|
|
12
|
-
if (!session) {
|
|
13
|
-
console.error(chalk.red(`Error: No session found in directory: ${workingDir}`));
|
|
14
|
-
process.exit(1);
|
|
15
|
-
}
|
|
16
|
-
console.log(chalk.blue(`Stopping session in ${workingDir}...`));
|
|
17
|
-
if (session.containers.length > 0) {
|
|
18
|
-
const containerIds = session.containers.map((c) => c.id);
|
|
19
|
-
await execa("docker", ["stop", ...containerIds], { stdio: "inherit" });
|
|
20
|
-
}
|
|
21
|
-
const envPath = resolve(workingDir, ".env.session");
|
|
22
|
-
if (existsSync(envPath)) {
|
|
23
|
-
unlinkSync(envPath);
|
|
24
|
-
console.log(chalk.gray(`Deleted: ${envPath}`));
|
|
25
|
-
}
|
|
26
|
-
console.log(chalk.green("Session stopped."));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
stopSession
|
|
31
|
-
};
|
package/dist/chunk-7OSTLJLO.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
extractPorts,
|
|
3
|
-
formatPortsTable
|
|
4
|
-
} from "./chunk-LAOWFCQL.js";
|
|
5
|
-
import {
|
|
6
|
-
generateEnvStub,
|
|
7
|
-
getComposeProjectName,
|
|
8
|
-
writeComposeFile
|
|
9
|
-
} from "./chunk-RQ245R7T.js";
|
|
10
|
-
import {
|
|
11
|
-
writeAppEnvFiles,
|
|
12
|
-
writeEnvFile
|
|
13
|
-
} from "./chunk-HZBJF67X.js";
|
|
14
|
-
import {
|
|
15
|
-
createWorktree,
|
|
16
|
-
generateDefaultBranchName,
|
|
17
|
-
removeWorktree
|
|
18
|
-
} from "./chunk-3Q454U3I.js";
|
|
19
|
-
import {
|
|
20
|
-
down,
|
|
21
|
-
logs,
|
|
22
|
-
up
|
|
23
|
-
} from "./chunk-GBN67HYD.js";
|
|
24
|
-
import {
|
|
25
|
-
getSessionsDir,
|
|
26
|
-
loadConfig
|
|
27
|
-
} from "./chunk-25WQHUYW.js";
|
|
28
|
-
import {
|
|
29
|
-
getPortMappings,
|
|
30
|
-
sessionExists
|
|
31
|
-
} from "./chunk-JZ2VPQXP.js";
|
|
32
|
-
|
|
33
|
-
// src/commands/create.ts
|
|
34
|
-
import { existsSync, mkdirSync, copyFileSync, readFileSync, writeFileSync } from "fs";
|
|
35
|
-
import { basename, join, resolve } from "path";
|
|
36
|
-
import chalk from "chalk";
|
|
37
|
-
import { execa } from "execa";
|
|
38
|
-
function updateEnvDatabaseUrl(envPath, newDbUrl) {
|
|
39
|
-
if (!existsSync(envPath)) return;
|
|
40
|
-
let content = readFileSync(envPath, "utf-8");
|
|
41
|
-
if (content.includes("DATABASE_URL=")) {
|
|
42
|
-
content = content.replace(/^DATABASE_URL=.*/m, `DATABASE_URL=${newDbUrl}`);
|
|
43
|
-
} else {
|
|
44
|
-
content += `
|
|
45
|
-
DATABASE_URL=${newDbUrl}
|
|
46
|
-
`;
|
|
47
|
-
}
|
|
48
|
-
writeFileSync(envPath, content);
|
|
49
|
-
}
|
|
50
|
-
async function createSession(projectRoot, _sessionId, options) {
|
|
51
|
-
const config = await loadConfig(projectRoot);
|
|
52
|
-
const sessionsDir = getSessionsDir(config, projectRoot);
|
|
53
|
-
const inPlace = options.inPlace ?? false;
|
|
54
|
-
const mode = options.mode || "docker";
|
|
55
|
-
let workingDir;
|
|
56
|
-
let branchName = "";
|
|
57
|
-
if (inPlace) {
|
|
58
|
-
workingDir = projectRoot;
|
|
59
|
-
console.log(chalk.blue(`Creating session in current directory (${mode} mode)...`));
|
|
60
|
-
} else {
|
|
61
|
-
branchName = options.branch || generateDefaultBranchName();
|
|
62
|
-
workingDir = resolve(sessionsDir, branchName);
|
|
63
|
-
console.log(chalk.blue(`Creating session (${mode} mode)...`));
|
|
64
|
-
console.log(chalk.gray(`Branch: ${branchName}`));
|
|
65
|
-
console.log(chalk.gray(`Directory: ${workingDir}`));
|
|
66
|
-
}
|
|
67
|
-
if (await sessionExists(workingDir)) {
|
|
68
|
-
console.error(chalk.red(`
|
|
69
|
-
Error: Session already running in this directory.`));
|
|
70
|
-
console.error(chalk.gray(`Stop it first with: dev-prism stop`));
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
let profiles;
|
|
74
|
-
try {
|
|
75
|
-
if (!inPlace) {
|
|
76
|
-
if (!existsSync(sessionsDir)) {
|
|
77
|
-
mkdirSync(sessionsDir, { recursive: true });
|
|
78
|
-
}
|
|
79
|
-
console.log(chalk.blue("\nCreating git worktree..."));
|
|
80
|
-
await createWorktree(projectRoot, workingDir, branchName);
|
|
81
|
-
console.log(chalk.green(` Created: ${workingDir}`));
|
|
82
|
-
}
|
|
83
|
-
const projectName = config.projectName ?? basename(projectRoot);
|
|
84
|
-
const services = config.services ?? [
|
|
85
|
-
{ name: "postgres", internalPort: 5432 },
|
|
86
|
-
{ name: "app", internalPort: 3e3 }
|
|
87
|
-
];
|
|
88
|
-
console.log(chalk.blue("\nGenerating docker-compose.session.yml..."));
|
|
89
|
-
const composePath = writeComposeFile(workingDir, projectName, services);
|
|
90
|
-
console.log(chalk.green(` Written: ${composePath}`));
|
|
91
|
-
console.log(chalk.blue("\nGenerating .env.session stub..."));
|
|
92
|
-
const envStub = generateEnvStub(workingDir, projectName);
|
|
93
|
-
const envPath = resolve(workingDir, ".env.session");
|
|
94
|
-
writeFileSync(envPath, envStub, "utf-8");
|
|
95
|
-
console.log(chalk.green(` Written: ${envPath}`));
|
|
96
|
-
if (!inPlace) {
|
|
97
|
-
const envFilesToCopy = config.envFiles ?? [];
|
|
98
|
-
for (const envFile of envFilesToCopy) {
|
|
99
|
-
const srcPath = join(projectRoot, envFile);
|
|
100
|
-
const destPath = join(workingDir, envFile);
|
|
101
|
-
if (existsSync(srcPath)) {
|
|
102
|
-
copyFileSync(srcPath, destPath);
|
|
103
|
-
console.log(chalk.green(` Copied: ${envFile}`));
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
console.log(chalk.blue("\nStarting Docker services..."));
|
|
108
|
-
if (mode === "docker") {
|
|
109
|
-
const allApps = config.apps ?? [];
|
|
110
|
-
const excludeApps = options.without ?? [];
|
|
111
|
-
profiles = allApps.filter((app) => !excludeApps.includes(app));
|
|
112
|
-
if (excludeApps.length > 0) {
|
|
113
|
-
console.log(chalk.gray(` Excluding apps: ${excludeApps.join(", ")}`));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
await up({ cwd: workingDir, profiles, detach: true });
|
|
117
|
-
console.log(chalk.blue("Waiting for services to be ready..."));
|
|
118
|
-
await new Promise((resolve2) => setTimeout(resolve2, 3e3));
|
|
119
|
-
console.log(chalk.blue("\nDiscovering ports from containers..."));
|
|
120
|
-
const portMappings = await getPortMappings(workingDir);
|
|
121
|
-
const ports = extractPorts(portMappings);
|
|
122
|
-
console.log(chalk.gray("Discovered ports:"));
|
|
123
|
-
console.log(chalk.gray(formatPortsTable(ports)));
|
|
124
|
-
const composeProjectName = getComposeProjectName(workingDir, projectName);
|
|
125
|
-
const finalEnvContent = writeEnvFile(workingDir, ports, composeProjectName);
|
|
126
|
-
console.log(chalk.green(` Updated: ${finalEnvContent}`));
|
|
127
|
-
const appEnvFiles = writeAppEnvFiles(config, workingDir, ports);
|
|
128
|
-
for (const file of appEnvFiles) {
|
|
129
|
-
console.log(chalk.green(` Written: ${file}`));
|
|
130
|
-
}
|
|
131
|
-
if (!inPlace && ports.POSTGRES_PORT) {
|
|
132
|
-
const sessionDbUrl = `postgresql://postgres:postgres@localhost:${ports.POSTGRES_PORT}/postgres`;
|
|
133
|
-
const envFilesToCopy = config.envFiles ?? [];
|
|
134
|
-
for (const envFile of envFilesToCopy) {
|
|
135
|
-
const destPath = join(workingDir, envFile);
|
|
136
|
-
if (existsSync(destPath)) {
|
|
137
|
-
updateEnvDatabaseUrl(destPath, sessionDbUrl);
|
|
138
|
-
console.log(chalk.green(` Updated DATABASE_URL in: ${envFile}`));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (config.setup.length > 0) {
|
|
143
|
-
console.log(chalk.blue("\nRunning setup commands..."));
|
|
144
|
-
const setupEnv = {
|
|
145
|
-
...process.env,
|
|
146
|
-
SESSION_DIR: workingDir
|
|
147
|
-
};
|
|
148
|
-
for (const [name, port] of Object.entries(ports)) {
|
|
149
|
-
setupEnv[name] = String(port);
|
|
150
|
-
}
|
|
151
|
-
if (ports.POSTGRES_PORT) {
|
|
152
|
-
setupEnv.DATABASE_URL = `postgresql://postgres:postgres@localhost:${ports.POSTGRES_PORT}/postgres`;
|
|
153
|
-
}
|
|
154
|
-
for (const cmd of config.setup) {
|
|
155
|
-
console.log(chalk.gray(` Running: ${cmd}`));
|
|
156
|
-
const [command, ...args] = cmd.split(" ");
|
|
157
|
-
try {
|
|
158
|
-
await execa(command, args, {
|
|
159
|
-
cwd: workingDir,
|
|
160
|
-
stdio: "inherit",
|
|
161
|
-
env: setupEnv
|
|
162
|
-
});
|
|
163
|
-
} catch {
|
|
164
|
-
console.warn(chalk.yellow(` Warning: Command failed: ${cmd}`));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
console.log(chalk.green(`
|
|
169
|
-
Session ready!`));
|
|
170
|
-
console.log(chalk.gray(`Directory: ${workingDir}`));
|
|
171
|
-
if (mode === "docker") {
|
|
172
|
-
console.log(chalk.gray("\nDocker mode - all services in containers."));
|
|
173
|
-
console.log(chalk.gray("View logs: docker compose -f docker-compose.session.yml logs -f"));
|
|
174
|
-
} else {
|
|
175
|
-
console.log(chalk.gray("\nNative mode - run apps with: pnpm dev"));
|
|
176
|
-
}
|
|
177
|
-
console.log(chalk.gray("\nPorts:"));
|
|
178
|
-
for (const [name, port] of Object.entries(ports)) {
|
|
179
|
-
console.log(chalk.cyan(` ${name}: http://localhost:${port}`));
|
|
180
|
-
}
|
|
181
|
-
if (options.detach === false) {
|
|
182
|
-
console.log(chalk.blue("\nStreaming logs (Ctrl+C to stop)..."));
|
|
183
|
-
console.log(chalk.gray("\u2500".repeat(60)));
|
|
184
|
-
try {
|
|
185
|
-
await logs({ cwd: workingDir, profiles });
|
|
186
|
-
} catch (error) {
|
|
187
|
-
const execaError = error;
|
|
188
|
-
if (execaError.signal === "SIGINT") {
|
|
189
|
-
console.log(chalk.gray("\n\u2500".repeat(60)));
|
|
190
|
-
console.log(chalk.yellow("\nLog streaming stopped. Services are still running."));
|
|
191
|
-
console.log(
|
|
192
|
-
chalk.gray(
|
|
193
|
-
`Resume logs: cd ${workingDir} && docker compose -f docker-compose.session.yml --env-file .env.session logs -f`
|
|
194
|
-
)
|
|
195
|
-
);
|
|
196
|
-
} else {
|
|
197
|
-
throw error;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
} catch (error) {
|
|
202
|
-
console.error(chalk.red("Session creation failed. Cleaning up..."));
|
|
203
|
-
try {
|
|
204
|
-
await down({ cwd: workingDir });
|
|
205
|
-
} catch {
|
|
206
|
-
}
|
|
207
|
-
if (!inPlace && branchName) {
|
|
208
|
-
try {
|
|
209
|
-
await removeWorktree(projectRoot, workingDir, branchName);
|
|
210
|
-
} catch {
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
throw error;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export {
|
|
218
|
-
createSession
|
|
219
|
-
};
|
package/dist/chunk-7YEZWM6Y.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
removeWorktree
|
|
3
|
-
} from "./chunk-3Q454U3I.js";
|
|
4
|
-
import {
|
|
5
|
-
down
|
|
6
|
-
} from "./chunk-GBN67HYD.js";
|
|
7
|
-
import {
|
|
8
|
-
getSessionsDir,
|
|
9
|
-
loadConfig
|
|
10
|
-
} from "./chunk-25WQHUYW.js";
|
|
11
|
-
import {
|
|
12
|
-
getSession,
|
|
13
|
-
listActiveSessions
|
|
14
|
-
} from "./chunk-DQER5GNG.js";
|
|
15
|
-
|
|
16
|
-
// src/commands/destroy.ts
|
|
17
|
-
import { existsSync } from "fs";
|
|
18
|
-
import { resolve, basename } from "path";
|
|
19
|
-
import chalk from "chalk";
|
|
20
|
-
async function destroySession(workingDirOrProjectRoot, options) {
|
|
21
|
-
if (options.all) {
|
|
22
|
-
console.log(chalk.blue("Destroying all sessions..."));
|
|
23
|
-
const sessions = await listActiveSessions();
|
|
24
|
-
if (sessions.length === 0) {
|
|
25
|
-
console.log(chalk.gray("No active sessions found."));
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
for (const session2 of sessions) {
|
|
29
|
-
await destroySingleSession(session2.workingDir);
|
|
30
|
-
}
|
|
31
|
-
console.log(chalk.green(`
|
|
32
|
-
Destroyed ${sessions.length} session(s).`));
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (!workingDirOrProjectRoot) {
|
|
36
|
-
console.error(chalk.red("Error: Working directory required. Use --all to destroy all sessions."));
|
|
37
|
-
process.exit(1);
|
|
38
|
-
}
|
|
39
|
-
const session = await getSession(workingDirOrProjectRoot);
|
|
40
|
-
if (!session) {
|
|
41
|
-
console.error(chalk.red(`Error: No session found in ${workingDirOrProjectRoot}`));
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
await destroySingleSession(workingDirOrProjectRoot);
|
|
45
|
-
console.log(chalk.green(`
|
|
46
|
-
Session destroyed.`));
|
|
47
|
-
}
|
|
48
|
-
async function destroySingleSession(workingDir) {
|
|
49
|
-
console.log(chalk.blue(`
|
|
50
|
-
Destroying session in ${workingDir}...`));
|
|
51
|
-
const envFile = resolve(workingDir, ".env.session");
|
|
52
|
-
if (existsSync(envFile)) {
|
|
53
|
-
console.log(chalk.gray(" Stopping and removing Docker containers..."));
|
|
54
|
-
try {
|
|
55
|
-
await down({ cwd: workingDir });
|
|
56
|
-
} catch {
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
const parentDir = resolve(workingDir, "..");
|
|
60
|
-
let isWorktree = false;
|
|
61
|
-
let projectRoot = "";
|
|
62
|
-
let branchName = "";
|
|
63
|
-
try {
|
|
64
|
-
let currentDir = workingDir;
|
|
65
|
-
for (let i = 0; i < 5; i++) {
|
|
66
|
-
currentDir = resolve(currentDir, "..");
|
|
67
|
-
const configPath = resolve(currentDir, "session.config.mjs");
|
|
68
|
-
const altConfigPath = resolve(currentDir, "session.config.js");
|
|
69
|
-
if (existsSync(configPath) || existsSync(altConfigPath)) {
|
|
70
|
-
projectRoot = currentDir;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (projectRoot) {
|
|
75
|
-
const config = await loadConfig(projectRoot);
|
|
76
|
-
const sessionsDir = getSessionsDir(config, projectRoot);
|
|
77
|
-
if (workingDir.startsWith(sessionsDir)) {
|
|
78
|
-
isWorktree = true;
|
|
79
|
-
branchName = basename(workingDir);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
} catch {
|
|
83
|
-
}
|
|
84
|
-
if (isWorktree && projectRoot && branchName) {
|
|
85
|
-
console.log(chalk.gray(" Removing git worktree..."));
|
|
86
|
-
try {
|
|
87
|
-
await removeWorktree(projectRoot, workingDir, branchName);
|
|
88
|
-
} catch (error) {
|
|
89
|
-
console.warn(chalk.yellow(` Warning: Could not remove worktree: ${error}`));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
console.log(chalk.green(` Session destroyed.`));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export {
|
|
96
|
-
destroySession
|
|
97
|
-
};
|