dx-devkit 0.0.0-stage → 1.1.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/CHANGELOG.md +81 -0
- package/LICENSE +21 -0
- package/README.md +475 -2
- package/bin/dx-mcp.js +2 -0
- package/dist/command.d.ts +9 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +2 -0
- package/dist/command.js.map +1 -0
- package/dist/commands/ai.d.ts +7 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +148 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/clean.d.ts +3 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +72 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/deps.d.ts +3 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +98 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/go.d.ts +3 -0
- package/dist/commands/go.d.ts.map +1 -0
- package/dist/commands/go.js +202 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +51 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +117 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/port.d.ts +4 -0
- package/dist/commands/port.d.ts.map +1 -0
- package/dist/commands/port.js +106 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/projects.d.ts +5 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +46 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/stack.d.ts +34 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +140 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/summary.d.ts +3 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +88 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/system.d.ts +5 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +104 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +96 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.d.ts +27 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +104 -0
- package/dist/ui.js.map +1 -0
- package/node_modules/@dx/core/dist/config.d.ts +46 -0
- package/node_modules/@dx/core/dist/config.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/config.js +131 -0
- package/node_modules/@dx/core/dist/config.js.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts +15 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.js +63 -0
- package/node_modules/@dx/core/dist/fuzzy.js.map +1 -0
- package/node_modules/@dx/core/dist/index.d.ts +17 -0
- package/node_modules/@dx/core/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/index.js +19 -0
- package/node_modules/@dx/core/dist/index.js.map +1 -0
- package/node_modules/@dx/core/dist/runs.d.ts +19 -0
- package/node_modules/@dx/core/dist/runs.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/runs.js +41 -0
- package/node_modules/@dx/core/dist/runs.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js +243 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts +61 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js +171 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts +57 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.js +151 -0
- package/node_modules/@dx/core/dist/tools/deps.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts +74 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js +261 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts +12 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.js +176 -0
- package/node_modules/@dx/core/dist/tools/doctor.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts +31 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.js +80 -0
- package/node_modules/@dx/core/dist/tools/github.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts +23 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.js +80 -0
- package/node_modules/@dx/core/dist/tools/journal.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts +24 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.js +137 -0
- package/node_modules/@dx/core/dist/tools/launch.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts +42 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.js +220 -0
- package/node_modules/@dx/core/dist/tools/ports.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.js +208 -0
- package/node_modules/@dx/core/dist/tools/projects.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts +40 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js +188 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts +119 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.js +386 -0
- package/node_modules/@dx/core/dist/tools/stacks.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts +87 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.js +331 -0
- package/node_modules/@dx/core/dist/tools/summary.js.map +1 -0
- package/node_modules/@dx/core/package.json +20 -0
- package/node_modules/@dx/mcp/dist/index.d.ts +3 -0
- package/node_modules/@dx/mcp/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/mcp/dist/index.js +540 -0
- package/node_modules/@dx/mcp/dist/index.js.map +1 -0
- package/node_modules/@dx/mcp/package.json +8 -0
- package/node_modules/@dx/web/dist/api.d.ts +13 -0
- package/node_modules/@dx/web/dist/api.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/api.js +351 -0
- package/node_modules/@dx/web/dist/api.js.map +1 -0
- package/node_modules/@dx/web/dist/background.d.ts +2 -0
- package/node_modules/@dx/web/dist/background.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/background.js +24 -0
- package/node_modules/@dx/web/dist/background.js.map +1 -0
- package/node_modules/@dx/web/dist/check.d.ts +39 -0
- package/node_modules/@dx/web/dist/check.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/check.js +97 -0
- package/node_modules/@dx/web/dist/check.js.map +1 -0
- package/node_modules/@dx/web/dist/dev.d.ts +109 -0
- package/node_modules/@dx/web/dist/dev.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/dev.js +645 -0
- package/node_modules/@dx/web/dist/dev.js.map +1 -0
- package/node_modules/@dx/web/dist/link.d.ts +45 -0
- package/node_modules/@dx/web/dist/link.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/link.js +150 -0
- package/node_modules/@dx/web/dist/link.js.map +1 -0
- package/node_modules/@dx/web/dist/proxy.d.ts +21 -0
- package/node_modules/@dx/web/dist/proxy.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/proxy.js +140 -0
- package/node_modules/@dx/web/dist/proxy.js.map +1 -0
- package/node_modules/@dx/web/dist/server.d.ts +33 -0
- package/node_modules/@dx/web/dist/server.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/server.js +184 -0
- package/node_modules/@dx/web/dist/server.js.map +1 -0
- package/node_modules/@dx/web/package.json +26 -0
- package/node_modules/@dx/web/public/app.js +1553 -0
- package/node_modules/@dx/web/public/icon.svg +1 -0
- package/node_modules/@dx/web/public/index.html +47 -0
- package/node_modules/@dx/web/public/styles.css +1124 -0
- package/package.json +52 -4
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { dxPath, expandHome, loadConfig, stripBom } from "../config.js";
|
|
5
|
+
import { findProjects, scanProjects } from "./projects.js";
|
|
6
|
+
/** Folders and files never copied. */
|
|
7
|
+
const SKIP_DIRS = new Set([
|
|
8
|
+
".git",
|
|
9
|
+
"node_modules",
|
|
10
|
+
".next",
|
|
11
|
+
".nuxt",
|
|
12
|
+
".svelte-kit",
|
|
13
|
+
".turbo",
|
|
14
|
+
".parcel-cache",
|
|
15
|
+
".cache",
|
|
16
|
+
".vercel",
|
|
17
|
+
".output",
|
|
18
|
+
"dist",
|
|
19
|
+
"build",
|
|
20
|
+
"out",
|
|
21
|
+
"coverage",
|
|
22
|
+
"__pycache__",
|
|
23
|
+
".venv",
|
|
24
|
+
"venv",
|
|
25
|
+
"target",
|
|
26
|
+
]);
|
|
27
|
+
const SKIP_FILES = /^(\.env(\..+)?|.*\.log|\.DS_Store|Thumbs\.db|.*\.tsbuildinfo)$/i;
|
|
28
|
+
const KEEP_FILES = /^\.env\.(example|sample|template)$/i;
|
|
29
|
+
/** Placeholder replaced with the new project's name in template files and file names. */
|
|
30
|
+
export const NAME_PLACEHOLDER = "{{name}}";
|
|
31
|
+
const MAX_TEXT_BYTES = 1024 * 1024;
|
|
32
|
+
export function templatesDir(config = loadConfig()) {
|
|
33
|
+
return config.templatesDir ? expandHome(config.templatesDir) : dxPath("templates");
|
|
34
|
+
}
|
|
35
|
+
export function listTemplates(config = loadConfig()) {
|
|
36
|
+
const dir = templatesDir(config);
|
|
37
|
+
try {
|
|
38
|
+
return fs
|
|
39
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
40
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith("."))
|
|
41
|
+
.map((e) => ({ name: e.name, dir: path.join(dir, e.name) }))
|
|
42
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** A template by exact name, else a folder path, else a project with a clear name match. */
|
|
49
|
+
export function resolveSource(input, config = loadConfig()) {
|
|
50
|
+
const template = listTemplates(config).find((t) => t.name.toLowerCase() === input.toLowerCase());
|
|
51
|
+
if (template)
|
|
52
|
+
return { kind: "template", ...template };
|
|
53
|
+
const asPath = path.resolve(expandHome(input));
|
|
54
|
+
if (/[\\/]/.test(input) && isDir(asPath))
|
|
55
|
+
return { kind: "folder", name: path.basename(asPath), dir: asPath };
|
|
56
|
+
const { match, candidates } = findProjects(input, scanProjects(config));
|
|
57
|
+
if (match)
|
|
58
|
+
return { kind: "project", name: match.name, dir: match.dir };
|
|
59
|
+
return { candidates: candidates.slice(0, 8).map((p) => p.name) };
|
|
60
|
+
}
|
|
61
|
+
/** Lowercase letters, digits, dots, dashes and underscores: valid as a folder and an npm package name. */
|
|
62
|
+
export function isValidProjectName(name) {
|
|
63
|
+
return /^[a-z0-9][a-z0-9._-]{0,213}$/.test(name);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Copies `source` to `dest` (which must not exist yet) and gives the copy its new name:
|
|
67
|
+
* package.json and .devrc.json get `name`, and template files get {{name}} filled in.
|
|
68
|
+
*/
|
|
69
|
+
export function copyProject(source, dest, name) {
|
|
70
|
+
if (fs.existsSync(dest))
|
|
71
|
+
throw new Error(`${dest} already exists.`);
|
|
72
|
+
const destParent = path.dirname(dest);
|
|
73
|
+
const rel = path.relative(source.dir, dest);
|
|
74
|
+
if (!rel.startsWith("..") && !path.isAbsolute(rel))
|
|
75
|
+
throw new Error("The new project can't be inside the one it's copied from.");
|
|
76
|
+
fs.mkdirSync(destParent, { recursive: true });
|
|
77
|
+
const fill = source.kind === "template";
|
|
78
|
+
let files = 0;
|
|
79
|
+
let filled = 0;
|
|
80
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
81
|
+
for (const rel of filesToCopy(source.dir)) {
|
|
82
|
+
const parts = rel.split("/");
|
|
83
|
+
if (parts.slice(0, -1).some((p) => SKIP_DIRS.has(p)))
|
|
84
|
+
continue;
|
|
85
|
+
const base = parts[parts.length - 1];
|
|
86
|
+
if (SKIP_FILES.test(base) && !KEEP_FILES.test(base))
|
|
87
|
+
continue;
|
|
88
|
+
const src = path.join(source.dir, ...parts);
|
|
89
|
+
let stat;
|
|
90
|
+
try {
|
|
91
|
+
stat = fs.lstatSync(src);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
continue; // listed by git but deleted on disk
|
|
95
|
+
}
|
|
96
|
+
if (!stat.isFile())
|
|
97
|
+
continue; // symlinks are left out rather than pointing back into the source
|
|
98
|
+
const dst = path.join(dest, ...(fill ? parts.map((p) => p.split(NAME_PLACEHOLDER).join(name)) : parts));
|
|
99
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
100
|
+
if (fill && fillPlaceholder(src, dst, name))
|
|
101
|
+
filled++;
|
|
102
|
+
else
|
|
103
|
+
fs.copyFileSync(src, dst);
|
|
104
|
+
files++;
|
|
105
|
+
}
|
|
106
|
+
renameManifest(path.join(dest, "package.json"), name);
|
|
107
|
+
renameManifest(path.join(dest, ".devrc.json"), name, true);
|
|
108
|
+
return { dir: dest, files, filled };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The files that make up a project, as "/"-separated paths. In a git repo that's what git tracks
|
|
112
|
+
* plus new files it doesn't ignore, so local reports, uploads and caches stay behind. Elsewhere,
|
|
113
|
+
* every file except the skipped folders.
|
|
114
|
+
*/
|
|
115
|
+
function filesToCopy(dir) {
|
|
116
|
+
if (fs.existsSync(path.join(dir, ".git"))) {
|
|
117
|
+
try {
|
|
118
|
+
const out = execFileSync("git", ["-C", dir, "ls-files", "-z", "--cached", "--others", "--exclude-standard"], {
|
|
119
|
+
windowsHide: true,
|
|
120
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
121
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
122
|
+
});
|
|
123
|
+
return [...new Set(out.toString("utf8").split("\0").filter(Boolean))];
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// git not available: fall back to walking the folder
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const out = [];
|
|
130
|
+
const walk = (abs, rel) => {
|
|
131
|
+
for (const e of fs.readdirSync(abs, { withFileTypes: true })) {
|
|
132
|
+
const childRel = rel ? `${rel}/${e.name}` : e.name;
|
|
133
|
+
if (e.isDirectory()) {
|
|
134
|
+
if (!SKIP_DIRS.has(e.name))
|
|
135
|
+
walk(path.join(abs, e.name), childRel);
|
|
136
|
+
}
|
|
137
|
+
else if (e.isFile())
|
|
138
|
+
out.push(childRel);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
walk(dir, "");
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** Writes a copy of a text file with {{name}} replaced. False when it isn't text or has no placeholder. */
|
|
145
|
+
function fillPlaceholder(src, dst, name) {
|
|
146
|
+
if (fs.statSync(src).size > MAX_TEXT_BYTES)
|
|
147
|
+
return false;
|
|
148
|
+
const buf = fs.readFileSync(src);
|
|
149
|
+
if (buf.includes(0))
|
|
150
|
+
return false; // binary
|
|
151
|
+
const text = buf.toString("utf8");
|
|
152
|
+
if (!text.includes(NAME_PLACEHOLDER))
|
|
153
|
+
return false;
|
|
154
|
+
fs.writeFileSync(dst, text.split(NAME_PLACEHOLDER).join(name), "utf8");
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/** Sets "name" in a JSON manifest, keeping its formatting style (2-space or tab). */
|
|
158
|
+
function renameManifest(file, name, onlyIfSet = false) {
|
|
159
|
+
if (!fs.existsSync(file))
|
|
160
|
+
return;
|
|
161
|
+
try {
|
|
162
|
+
const text = stripBom(fs.readFileSync(file, "utf8"));
|
|
163
|
+
const json = JSON.parse(text);
|
|
164
|
+
if (onlyIfSet && json.name === undefined)
|
|
165
|
+
return;
|
|
166
|
+
json.name = name;
|
|
167
|
+
const indent = /^\t/m.test(text) ? "\t" : 2;
|
|
168
|
+
fs.writeFileSync(file, JSON.stringify(json, null, indent) + (text.endsWith("\n") ? "\n" : ""), "utf8");
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// not valid JSON: leave it as copied
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Saves a copy of a project as a template, leaving out the same things a copy does. */
|
|
175
|
+
export function saveAsTemplate(source, templateName, config = loadConfig()) {
|
|
176
|
+
if (!isValidProjectName(templateName))
|
|
177
|
+
throw new Error(`"${templateName}" isn't a valid template name (lowercase, digits, - _ .).`);
|
|
178
|
+
return copyProject({ ...source, kind: "project" }, path.join(templatesDir(config), templateName), templateName);
|
|
179
|
+
}
|
|
180
|
+
function isDir(p) {
|
|
181
|
+
try {
|
|
182
|
+
return fs.statSync(p).isDirectory();
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { type Project } from "./projects.js";
|
|
2
|
+
/**
|
|
3
|
+
* A stack is the set of processes an app needs to run locally: a front end, an API, a worker, a
|
|
4
|
+
* database. dx finds it from what the project already has, in this order:
|
|
5
|
+
*
|
|
6
|
+
* 1. "stack" in .devrc.json, written by you or by your AI agent (set_stack);
|
|
7
|
+
* 2. Procfile.dev or Procfile;
|
|
8
|
+
* 3. a root "dev" script that runs turbo, nx, concurrently, npm-run-all or lerna: that one
|
|
9
|
+
* command, its output split back into services by the prefixes those tools print;
|
|
10
|
+
* 4. root scripts named dev:web, dev:api, …;
|
|
11
|
+
* 5. workspaces (npm, yarn or pnpm) whose packages have a "dev" script;
|
|
12
|
+
* 6. docker-compose.yml services that are infrastructure (postgres, redis, …), added to any
|
|
13
|
+
* of the above and started first with `docker compose up -d`.
|
|
14
|
+
*
|
|
15
|
+
* A project with only one thing to run has no stack; it runs as before.
|
|
16
|
+
*/
|
|
17
|
+
export type ServiceRole = "data" | "backend" | "frontend" | "other";
|
|
18
|
+
export interface StackService {
|
|
19
|
+
/** Short name, unique in the stack: web, api, postgres. Lowercase letters, digits and dashes. */
|
|
20
|
+
name: string;
|
|
21
|
+
role: ServiceRole;
|
|
22
|
+
/** "process" runs `command` in `dir`; "docker" is a docker compose service. */
|
|
23
|
+
kind: "process" | "docker";
|
|
24
|
+
dir: string;
|
|
25
|
+
command: string;
|
|
26
|
+
/** Where it will listen, when known or guessed. */
|
|
27
|
+
url?: string;
|
|
28
|
+
/** Services that must be ready before this one starts. */
|
|
29
|
+
dependsOn: string[];
|
|
30
|
+
/** Extra environment, e.g. PORT for Procfile services. */
|
|
31
|
+
env?: Record<string, string>;
|
|
32
|
+
/** For docker services: the compose service name, and the host port it publishes. */
|
|
33
|
+
composeService?: string;
|
|
34
|
+
hostPort?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface Stack {
|
|
37
|
+
source: "devrc" | "procfile" | "runner" | "scripts" | "workspaces" | "compose";
|
|
38
|
+
/** The project folder the stack belongs to. */
|
|
39
|
+
dir: string;
|
|
40
|
+
services: StackService[];
|
|
41
|
+
/**
|
|
42
|
+
* For "runner" stacks: the one command that starts every app service. Its output lines carry a
|
|
43
|
+
* prefix naming the service ("web:dev: …" from turbo, "[api] …" from concurrently).
|
|
44
|
+
*/
|
|
45
|
+
runner?: {
|
|
46
|
+
command: string;
|
|
47
|
+
};
|
|
48
|
+
/** The compose file docker services come from. */
|
|
49
|
+
composeFile?: string;
|
|
50
|
+
}
|
|
51
|
+
/** What .devrc.json's "stack" may hold, per service name. */
|
|
52
|
+
export interface DevRcService {
|
|
53
|
+
/** Command to run. */
|
|
54
|
+
dev?: string;
|
|
55
|
+
/** Folder to run it in, relative to the project (may be outside it, e.g. ../shop-api). */
|
|
56
|
+
dir?: string;
|
|
57
|
+
/** Another project dx knows, by folder (relative or absolute): its own dev command and URL are used. */
|
|
58
|
+
project?: string;
|
|
59
|
+
url?: string;
|
|
60
|
+
dependsOn?: string[];
|
|
61
|
+
/** A docker compose service of this project to start. */
|
|
62
|
+
docker?: string;
|
|
63
|
+
role?: ServiceRole;
|
|
64
|
+
}
|
|
65
|
+
export declare function detectStack(project: Project): Stack | undefined;
|
|
66
|
+
/** Guesses what a service is from its name and command. */
|
|
67
|
+
export declare function roleOf(name: string, command?: string): ServiceRole;
|
|
68
|
+
/** Groups services into the order they start in: each group only after the one before is ready. */
|
|
69
|
+
export declare function startOrder(stack: Stack): StackService[][];
|
|
70
|
+
/** The service a browser should open: the first front end, else the first app service. */
|
|
71
|
+
export declare function mainService(stack: Stack): StackService | undefined;
|
|
72
|
+
/** "@acme/Web App" → "web-app" */
|
|
73
|
+
export declare function serviceName(raw: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Which service a line from a runner belongs to, and the line without its prefix.
|
|
76
|
+
* turbo: "web:dev: ready" or "@acme/web:dev: ready"; concurrently and npm-run-all: "[api] listening".
|
|
77
|
+
*/
|
|
78
|
+
export declare function splitRunnerLine(text: string, services: StackService[]): {
|
|
79
|
+
service?: string;
|
|
80
|
+
text: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Writes (or with no services, removes) the "stack" in a project's .devrc.json, keeping the rest
|
|
84
|
+
* of the file. This is how an AI agent sets up a stack dx can't guess, such as two repositories.
|
|
85
|
+
*/
|
|
86
|
+
export declare function saveStackSpec(dir: string, spec: Record<string, DevRcService> | undefined): string;
|
|
87
|
+
interface PackageJson {
|
|
88
|
+
name?: string;
|
|
89
|
+
scripts?: Record<string, string>;
|
|
90
|
+
workspaces?: string[] | {
|
|
91
|
+
packages?: string[];
|
|
92
|
+
};
|
|
93
|
+
packageManager?: string;
|
|
94
|
+
}
|
|
95
|
+
interface Workspace {
|
|
96
|
+
dir: string;
|
|
97
|
+
folder: string;
|
|
98
|
+
name: string;
|
|
99
|
+
scripts: Record<string, string>;
|
|
100
|
+
}
|
|
101
|
+
/** The packages listed in package.json "workspaces" or pnpm-workspace.yaml. Patterns: "apps/*", "packages/**", or a folder. */
|
|
102
|
+
export declare function workspacePackages(dir: string, pkg?: PackageJson | undefined): Workspace[];
|
|
103
|
+
interface ComposeService {
|
|
104
|
+
name: string;
|
|
105
|
+
image?: string;
|
|
106
|
+
build?: boolean;
|
|
107
|
+
hostPort?: number;
|
|
108
|
+
}
|
|
109
|
+
interface Compose {
|
|
110
|
+
file: string;
|
|
111
|
+
services: ComposeService[];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Reads the services of a compose file: just enough YAML for names, image, build and the first
|
|
115
|
+
* published port. Anything it can't read is skipped, never guessed.
|
|
116
|
+
*/
|
|
117
|
+
export declare function readCompose(dir: string): Compose | undefined;
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=stacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../src/tools/stacks.ts"],"names":[],"mappings":"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"}
|