@itznexus/itznexus-cli 1.142.0 → 1.144.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/commands/agents/project-stack.d.ts +2 -0
- package/dist/commands/agents/project-stack.js +101 -0
- package/dist/commands/agents/project-stack.js.map +1 -0
- package/dist/commands/api/outreach-catalog.d.ts +2 -0
- package/dist/commands/api/outreach-catalog.js +167 -0
- package/dist/commands/api/outreach-catalog.js.map +1 -0
- package/dist/commands/api/outreach-companies.d.ts +2 -0
- package/dist/commands/api/outreach-companies.js +93 -0
- package/dist/commands/api/outreach-companies.js.map +1 -0
- package/dist/commands/api/outreach-company-writes.d.ts +2 -0
- package/dist/commands/api/outreach-company-writes.js +101 -0
- package/dist/commands/api/outreach-company-writes.js.map +1 -0
- package/dist/commands/api/outreach-enrollment-writes.d.ts +2 -0
- package/dist/commands/api/outreach-enrollment-writes.js +144 -0
- package/dist/commands/api/outreach-enrollment-writes.js.map +1 -0
- package/dist/commands/api/outreach-enrollments.d.ts +2 -0
- package/dist/commands/api/outreach-enrollments.js +92 -0
- package/dist/commands/api/outreach-enrollments.js.map +1 -0
- package/dist/commands/api/outreach-prospect-writes.d.ts +2 -0
- package/dist/commands/api/outreach-prospect-writes.js +139 -0
- package/dist/commands/api/outreach-prospect-writes.js.map +1 -0
- package/dist/commands/api/outreach-prospects.d.ts +2 -0
- package/dist/commands/api/outreach-prospects.js +96 -0
- package/dist/commands/api/outreach-prospects.js.map +1 -0
- package/dist/commands/api/outreach-settings.d.ts +2 -0
- package/dist/commands/api/outreach-settings.js +193 -0
- package/dist/commands/api/outreach-settings.js.map +1 -0
- package/dist/commands/api/outreach-shared.d.ts +24 -0
- package/dist/commands/api/outreach-shared.js +34 -0
- package/dist/commands/api/outreach-shared.js.map +1 -0
- package/dist/commands/api/outreach-signals.d.ts +2 -0
- package/dist/commands/api/outreach-signals.js +80 -0
- package/dist/commands/api/outreach-signals.js.map +1 -0
- package/dist/commands/api/outreach.d.ts +2 -0
- package/dist/commands/api/outreach.js +21 -0
- package/dist/commands/api/outreach.js.map +1 -0
- package/dist/commands/api/projects.js +2 -0
- package/dist/commands/api/projects.js.map +1 -1
- package/dist/commands/api/seo-backlinks.js +1 -1
- package/dist/commands/api/seo-backlinks.js.map +1 -1
- package/dist/commands/api/seo-catalog.js +1 -1
- package/dist/commands/api/seo-catalog.js.map +1 -1
- package/dist/commands/api/seo-changes.js +1 -1
- package/dist/commands/api/seo-changes.js.map +1 -1
- package/dist/commands/api/seo-data.js +1 -1
- package/dist/commands/api/seo-data.js.map +1 -1
- package/dist/commands/api/seo-keyword-writes.js +1 -1
- package/dist/commands/api/seo-keyword-writes.js.map +1 -1
- package/dist/commands/api/seo-keywords.js +1 -1
- package/dist/commands/api/seo-keywords.js.map +1 -1
- package/dist/commands/api/seo-offers.js +1 -1
- package/dist/commands/api/seo-offers.js.map +1 -1
- package/dist/commands/api/seo-page-writes.js +1 -1
- package/dist/commands/api/seo-page-writes.js.map +1 -1
- package/dist/commands/api/seo-pages.js +1 -1
- package/dist/commands/api/seo-pages.js.map +1 -1
- package/dist/commands/api/seo-settings.js +1 -1
- package/dist/commands/api/seo-settings.js.map +1 -1
- package/dist/commands/api/seo-site.js +1 -1
- package/dist/commands/api/seo-site.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/{commands/api/seo-shared.d.ts → lib/command-helpers.d.ts} +1 -1
- package/dist/{commands/api/seo-shared.js → lib/command-helpers.js} +8 -8
- package/dist/lib/command-helpers.js.map +1 -0
- package/dist/lib/stack/driver.d.ts +14 -0
- package/dist/lib/stack/driver.js +228 -0
- package/dist/lib/stack/driver.js.map +1 -0
- package/dist/lib/stack/manifest.d.ts +28 -0
- package/dist/lib/stack/manifest.js +182 -0
- package/dist/lib/stack/manifest.js.map +1 -0
- package/dist/lib/stack/processes.d.ts +11 -0
- package/dist/lib/stack/processes.js +139 -0
- package/dist/lib/stack/processes.js.map +1 -0
- package/dist/lib/stack/registry.d.ts +24 -0
- package/dist/lib/stack/registry.js +37 -0
- package/dist/lib/stack/registry.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/api/seo-shared.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { Command } from "commander";
|
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { api } from "../../lib/api.js";
|
|
4
4
|
import { handleError, printList } from "../../lib/format.js";
|
|
5
|
-
import { compact, done, printJson, toInt } from "
|
|
5
|
+
import { compact, done, printJson, toInt, } from "../../lib/command-helpers.js";
|
|
6
6
|
function printSettings(data) {
|
|
7
7
|
for (const [key, value] of Object.entries(data.thresholds)) {
|
|
8
8
|
const changed = data.defaults[key] !== value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seo-settings.js","sourceRoot":"","sources":["../../../src/commands/api/seo-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"seo-settings.js","sourceRoot":"","sources":["../../../src/commands/api/seo-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Command } from "commander";
|
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { api } from "../../lib/api.js";
|
|
4
4
|
import { handleError } from "../../lib/format.js";
|
|
5
|
-
import { done, printJson, qs } from "
|
|
5
|
+
import { done, printJson, qs, } from "../../lib/command-helpers.js";
|
|
6
6
|
const sectionList = new Command("list")
|
|
7
7
|
.description("List shared sections (reusable blocks such as process or FAQ)")
|
|
8
8
|
.option("--language <lang>", "en | fr")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seo-site.js","sourceRoot":"","sources":["../../../src/commands/api/seo-site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"seo-site.js","sourceRoot":"","sources":["../../../src/commands/api/seo-site.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -47,6 +47,7 @@ import { sprintCommand } from "./commands/api/sprints.js";
|
|
|
47
47
|
import { taskCommand } from "./commands/api/tasks.js";
|
|
48
48
|
import { taskTagsCommand } from "./commands/api/task-tags.js";
|
|
49
49
|
import { seoCommand } from "./commands/api/seo.js";
|
|
50
|
+
import { outreachCommand } from "./commands/api/outreach.js";
|
|
50
51
|
import { upworkJobNotificationCommand } from "./commands/api/upwork-job-notifications.js";
|
|
51
52
|
import { upworkProposalSubmissionCommand } from "./commands/api/upwork-proposal-submissions.js";
|
|
52
53
|
import { upworkDemoCommand } from "./commands/api/upwork-demos.js";
|
|
@@ -100,6 +101,9 @@ CORE
|
|
|
100
101
|
SEO
|
|
101
102
|
seo SEO section: settings, offers, keywords, pages, rankings, change log, backlinks
|
|
102
103
|
|
|
104
|
+
OUTREACH
|
|
105
|
+
outreach Outreach section: settings, sequences, signals, companies, prospects, enrollments
|
|
106
|
+
|
|
103
107
|
CONTENT
|
|
104
108
|
page Manage pages (docs/notes)
|
|
105
109
|
file Manage files
|
|
@@ -187,6 +191,7 @@ program.addCommand(sprintCommand);
|
|
|
187
191
|
program.addCommand(taskCommand);
|
|
188
192
|
program.addCommand(taskTagsCommand);
|
|
189
193
|
program.addCommand(seoCommand);
|
|
194
|
+
program.addCommand(outreachCommand);
|
|
190
195
|
program.addCommand(interactionCommand);
|
|
191
196
|
program.addCommand(interactionGroupCommand);
|
|
192
197
|
program.addCommand(slackAccountCommand);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ export type JsonOpt = {
|
|
|
3
3
|
};
|
|
4
4
|
export declare function readJsonFile(path: string): unknown;
|
|
5
5
|
export declare function readJsonObject(path: string): Record<string, unknown>;
|
|
6
|
-
export declare function readJsonRows(path: string): unknown[];
|
|
6
|
+
export declare function readJsonRows(path: string, key?: string): unknown[];
|
|
7
7
|
export declare function qs(params: Record<string, string | number | undefined>): string;
|
|
8
8
|
export declare function nullable(value: string | undefined): string | null | undefined;
|
|
9
9
|
export declare function toInt(value: string, name: string): number;
|
|
@@ -10,17 +10,17 @@ export function readJsonObject(path) {
|
|
|
10
10
|
}
|
|
11
11
|
return value;
|
|
12
12
|
}
|
|
13
|
-
// Accepts a bare array or an object carrying it under `
|
|
14
|
-
export function readJsonRows(path) {
|
|
13
|
+
// Accepts a bare array or an object carrying it under `key`.
|
|
14
|
+
export function readJsonRows(path, key = "rows") {
|
|
15
15
|
const value = readJsonFile(path);
|
|
16
16
|
if (Array.isArray(value))
|
|
17
17
|
return value;
|
|
18
|
-
if (typeof value === "object" &&
|
|
19
|
-
|
|
20
|
-
Array.isArray(
|
|
21
|
-
|
|
18
|
+
if (typeof value === "object" && value !== null) {
|
|
19
|
+
const rows = value[key];
|
|
20
|
+
if (Array.isArray(rows))
|
|
21
|
+
return rows;
|
|
22
22
|
}
|
|
23
|
-
throw new Error(`${path} must hold a JSON array or { "
|
|
23
|
+
throw new Error(`${path} must hold a JSON array or { "${key}": [...] }`);
|
|
24
24
|
}
|
|
25
25
|
export function qs(params) {
|
|
26
26
|
const search = new URLSearchParams();
|
|
@@ -74,4 +74,4 @@ export function done(data, opts, message) {
|
|
|
74
74
|
export function printJson(data) {
|
|
75
75
|
console.log(JSON.stringify(data, null, 2));
|
|
76
76
|
}
|
|
77
|
-
//# sourceMappingURL=
|
|
77
|
+
//# sourceMappingURL=command-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/lib/command-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type StackService } from "./manifest.js";
|
|
2
|
+
export type StatusRow = {
|
|
3
|
+
name: string;
|
|
4
|
+
kind: StackService["kind"];
|
|
5
|
+
pid: number | null;
|
|
6
|
+
alive: boolean;
|
|
7
|
+
ready: boolean | null;
|
|
8
|
+
log: string | null;
|
|
9
|
+
};
|
|
10
|
+
export declare function upStack(root: string): Promise<StatusRow[]>;
|
|
11
|
+
export declare function downStack(root: string, wipe: boolean): Promise<boolean>;
|
|
12
|
+
export declare function stackStatus(root: string): Promise<StatusRow[]>;
|
|
13
|
+
export declare function restartService(root: string, name: string): Promise<void>;
|
|
14
|
+
export declare function serviceLog(root: string, name: string, lines: number): string;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
3
|
+
import { readStackManifest, } from "./manifest.js";
|
|
4
|
+
import { alive, composeProjects, gitBranch, hashFile, killGroup, logTail, probeOnce, runStep, spawnDetached, waitReady, } from "./processes.js";
|
|
5
|
+
import { listRecords, logPath, readRecord, removeRecord, writeRecord, } from "./registry.js";
|
|
6
|
+
const now = () => new Date().toISOString();
|
|
7
|
+
// Branch of the first service folder that is a git clone; every clone of a
|
|
8
|
+
// project sits on the same branch during a batch, so one is enough.
|
|
9
|
+
function stackBranch(manifest) {
|
|
10
|
+
for (const s of manifest.services) {
|
|
11
|
+
const branch = gitBranch(s.cwd);
|
|
12
|
+
if (branch)
|
|
13
|
+
return branch;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
// Installs run first, once per folder and lockfile, only when the lockfile
|
|
18
|
+
// moved since the last install; a folder installed this way gets its start
|
|
19
|
+
// services restarted below, since the running process holds the old modules.
|
|
20
|
+
function runInstalls(manifest, rec) {
|
|
21
|
+
const refreshed = new Set();
|
|
22
|
+
const seen = new Set();
|
|
23
|
+
for (const s of manifest.services) {
|
|
24
|
+
if (!s.install || !s.lockfile)
|
|
25
|
+
continue;
|
|
26
|
+
const key = `${s.cwd}::${s.lockfile}`;
|
|
27
|
+
if (seen.has(key))
|
|
28
|
+
continue;
|
|
29
|
+
seen.add(key);
|
|
30
|
+
const hash = hashFile(s.lockfile);
|
|
31
|
+
if (rec.installs[key] === hash)
|
|
32
|
+
continue;
|
|
33
|
+
console.log(`[stack] ${s.name}: lockfile moved, installing in ${path.basename(s.cwd)}`);
|
|
34
|
+
runStep(s.install, s.cwd, manifest.env);
|
|
35
|
+
rec.installs[key] = hash;
|
|
36
|
+
refreshed.add(s.cwd);
|
|
37
|
+
writeRecord(rec);
|
|
38
|
+
}
|
|
39
|
+
return refreshed;
|
|
40
|
+
}
|
|
41
|
+
function tryReadManifest(root) {
|
|
42
|
+
try {
|
|
43
|
+
return readStackManifest(root);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// A live process that misses one probe is not dead (a dev server recompiling,
|
|
50
|
+
// a listener mid-restart): three misses in a row are.
|
|
51
|
+
async function stillAnswers(probe) {
|
|
52
|
+
for (let i = 0; i < 3; i++) {
|
|
53
|
+
if (await probeOnce(probe))
|
|
54
|
+
return true;
|
|
55
|
+
await sleep(500);
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
async function startService(s, rec, env, restart) {
|
|
60
|
+
if (!s.ready)
|
|
61
|
+
throw new Error(`${s.name}: a start service needs a ready probe`);
|
|
62
|
+
const cur = rec.services[s.name];
|
|
63
|
+
const running = cur?.pid !== null && cur?.pid !== undefined && alive(cur.pid);
|
|
64
|
+
if (running && !restart && (await stillAnswers(s.ready)))
|
|
65
|
+
return;
|
|
66
|
+
if (running && cur.pid !== null)
|
|
67
|
+
await killGroup(cur.pid);
|
|
68
|
+
// A probe that already answers with no live pid of ours is a copy running
|
|
69
|
+
// outside the driver (an operator's terminal): never start a second one.
|
|
70
|
+
if (await probeOnce(s.ready)) {
|
|
71
|
+
throw new Error(`${s.name}: already answering on its port from a process the driver did not start; use it or stop it`);
|
|
72
|
+
}
|
|
73
|
+
const log = logPath(rec.slug, s.name);
|
|
74
|
+
const pid = spawnDetached(s.command, s.cwd, log, env);
|
|
75
|
+
rec.services[s.name] = { pid, startedAt: now() };
|
|
76
|
+
// Recorded before the wait, so a crash of the driver mid-up still leaves
|
|
77
|
+
// the pid known to a later down.
|
|
78
|
+
writeRecord(rec);
|
|
79
|
+
try {
|
|
80
|
+
await waitReady(s.ready, s.readyTimeoutMs, s.name, log, pid);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
await killGroup(pid);
|
|
84
|
+
rec.services[s.name] = { pid: null, startedAt: now() };
|
|
85
|
+
writeRecord(rec);
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
console.log(`[stack] ${s.name}: up (pid ${pid})`);
|
|
89
|
+
}
|
|
90
|
+
export async function upStack(root) {
|
|
91
|
+
const manifest = readStackManifest(root);
|
|
92
|
+
// One stack per machine: another project's stack goes down first.
|
|
93
|
+
for (const other of listRecords()) {
|
|
94
|
+
if (other.slug !== manifest.slug)
|
|
95
|
+
await downRecord(other, true);
|
|
96
|
+
}
|
|
97
|
+
const branch = stackBranch(manifest);
|
|
98
|
+
let rec = readRecord(manifest.slug);
|
|
99
|
+
if (rec && rec.branch !== branch) {
|
|
100
|
+
console.log(`[stack] branch moved from ${rec.branch} to ${branch}: wiping the data`);
|
|
101
|
+
await downRecord(rec, true);
|
|
102
|
+
rec = null;
|
|
103
|
+
}
|
|
104
|
+
rec ??= {
|
|
105
|
+
slug: manifest.slug,
|
|
106
|
+
root,
|
|
107
|
+
branch,
|
|
108
|
+
startedAt: now(),
|
|
109
|
+
lastUsedAt: now(),
|
|
110
|
+
services: {},
|
|
111
|
+
ups: {},
|
|
112
|
+
installs: {},
|
|
113
|
+
composeProjects: [],
|
|
114
|
+
};
|
|
115
|
+
writeRecord(rec);
|
|
116
|
+
const refreshed = runInstalls(manifest, rec);
|
|
117
|
+
for (const s of manifest.services) {
|
|
118
|
+
if (s.kind === "up") {
|
|
119
|
+
const before = composeProjects();
|
|
120
|
+
runStep(s.command, s.cwd, manifest.env);
|
|
121
|
+
const after = composeProjects();
|
|
122
|
+
const added = before && after ? [...after].filter((p) => !before.has(p)) : [];
|
|
123
|
+
for (const p of added) {
|
|
124
|
+
if (!rec.composeProjects.includes(p))
|
|
125
|
+
rec.composeProjects.push(p);
|
|
126
|
+
}
|
|
127
|
+
// Owned when this up made resources appear, or when Docker could not
|
|
128
|
+
// say; a resource that was already there belongs to whoever started it
|
|
129
|
+
// and is left as found on down.
|
|
130
|
+
if (!(s.name in rec.ups)) {
|
|
131
|
+
rec.ups[s.name] = { owned: added.length > 0 || before === null };
|
|
132
|
+
}
|
|
133
|
+
writeRecord(rec);
|
|
134
|
+
if (s.ready)
|
|
135
|
+
await waitReady(s.ready, s.readyTimeoutMs, s.name);
|
|
136
|
+
}
|
|
137
|
+
else if (s.kind === "run") {
|
|
138
|
+
runStep(s.command, s.cwd, manifest.env);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
await startService(s, rec, manifest.env, refreshed.has(s.cwd));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
rec.lastUsedAt = now();
|
|
145
|
+
writeRecord(rec);
|
|
146
|
+
return stackStatus(root);
|
|
147
|
+
}
|
|
148
|
+
// Takes a recorded stack down from its own manifest when it still reads;
|
|
149
|
+
// without one (folder gone, block removed) only the recorded pids are ended.
|
|
150
|
+
async function downRecord(rec, wipe) {
|
|
151
|
+
const manifest = tryReadManifest(rec.root);
|
|
152
|
+
const ordered = manifest ? [...manifest.services].reverse() : [];
|
|
153
|
+
const env = manifest?.env ?? {};
|
|
154
|
+
for (const s of ordered) {
|
|
155
|
+
if (s.kind === "start") {
|
|
156
|
+
const pid = rec.services[s.name]?.pid;
|
|
157
|
+
if (pid && alive(pid))
|
|
158
|
+
await killGroup(pid);
|
|
159
|
+
rec.services[s.name] = { pid: null, startedAt: now() };
|
|
160
|
+
}
|
|
161
|
+
else if (s.kind === "up") {
|
|
162
|
+
const command = wipe ? (s.wipe ?? s.down) : s.down;
|
|
163
|
+
if (!command || !rec.ups[s.name]?.owned)
|
|
164
|
+
continue;
|
|
165
|
+
try {
|
|
166
|
+
runStep(command, s.cwd, env);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.error(`[stack] ${s.name}: ${command} failed:`, err);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Services the manifest no longer names still hold a pid here.
|
|
174
|
+
for (const r of Object.values(rec.services)) {
|
|
175
|
+
if (r.pid && alive(r.pid))
|
|
176
|
+
await killGroup(r.pid);
|
|
177
|
+
}
|
|
178
|
+
removeRecord(rec.slug);
|
|
179
|
+
console.log(`[stack] ${rec.slug}: down${wipe ? " (data wiped)" : ""}`);
|
|
180
|
+
}
|
|
181
|
+
export async function downStack(root, wipe) {
|
|
182
|
+
const rec = readRecord(path.basename(root));
|
|
183
|
+
if (!rec)
|
|
184
|
+
return false;
|
|
185
|
+
await downRecord(rec, wipe);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
export async function stackStatus(root) {
|
|
189
|
+
const manifest = readStackManifest(root);
|
|
190
|
+
const rec = readRecord(manifest.slug);
|
|
191
|
+
const rows = [];
|
|
192
|
+
for (const s of manifest.services) {
|
|
193
|
+
const pid = rec?.services[s.name]?.pid ?? null;
|
|
194
|
+
rows.push({
|
|
195
|
+
name: s.name,
|
|
196
|
+
kind: s.kind,
|
|
197
|
+
pid,
|
|
198
|
+
alive: pid !== null && alive(pid),
|
|
199
|
+
ready: s.ready ? await probeOnce(s.ready) : null,
|
|
200
|
+
log: s.kind === "start" ? logPath(manifest.slug, s.name) : null,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return rows;
|
|
204
|
+
}
|
|
205
|
+
export async function restartService(root, name) {
|
|
206
|
+
const manifest = readStackManifest(root);
|
|
207
|
+
const rec = readRecord(manifest.slug);
|
|
208
|
+
if (!rec)
|
|
209
|
+
throw new Error(`${manifest.slug}: the stack is not up`);
|
|
210
|
+
const s = manifest.services.find((x) => x.name === name);
|
|
211
|
+
if (!s)
|
|
212
|
+
throw new Error(`unknown service "${name}"`);
|
|
213
|
+
if (s.kind !== "start")
|
|
214
|
+
throw new Error(`${name} is a ${s.kind} step, not a service to restart`);
|
|
215
|
+
await startService(s, rec, manifest.env, true);
|
|
216
|
+
rec.lastUsedAt = now();
|
|
217
|
+
writeRecord(rec);
|
|
218
|
+
}
|
|
219
|
+
export function serviceLog(root, name, lines) {
|
|
220
|
+
const manifest = readStackManifest(root);
|
|
221
|
+
const s = manifest.services.find((x) => x.name === name);
|
|
222
|
+
if (!s)
|
|
223
|
+
throw new Error(`unknown service "${name}"`);
|
|
224
|
+
if (s.kind !== "start")
|
|
225
|
+
throw new Error(`${name} is a ${s.kind} step and keeps no log`);
|
|
226
|
+
return logTail(logPath(manifest.slug, name), lines);
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/lib/stack/driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const PROCESS_FILE = "DEVELOPMENT.md";
|
|
2
|
+
export type ReadyProbe = {
|
|
3
|
+
kind: "tcp";
|
|
4
|
+
port: number;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "http";
|
|
7
|
+
url: string;
|
|
8
|
+
};
|
|
9
|
+
export type StackService = {
|
|
10
|
+
name: string;
|
|
11
|
+
cwd: string;
|
|
12
|
+
after: string[];
|
|
13
|
+
kind: "up" | "run" | "start";
|
|
14
|
+
command: string;
|
|
15
|
+
down?: string;
|
|
16
|
+
wipe?: string;
|
|
17
|
+
install?: string;
|
|
18
|
+
lockfile?: string;
|
|
19
|
+
ready?: ReadyProbe;
|
|
20
|
+
readyTimeoutMs: number;
|
|
21
|
+
};
|
|
22
|
+
export type StackManifest = {
|
|
23
|
+
root: string;
|
|
24
|
+
slug: string;
|
|
25
|
+
env: Record<string, string>;
|
|
26
|
+
services: StackService[];
|
|
27
|
+
};
|
|
28
|
+
export declare function readStackManifest(root: string): StackManifest;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse } from "yaml";
|
|
4
|
+
// The stack manifest is the fenced ```yaml stack block of the project's
|
|
5
|
+
// DEVELOPMENT.md: the dev process already lives there, so no second file kind
|
|
6
|
+
// reaches the project folder. A project without the block has no managed
|
|
7
|
+
// stack, and sessions keep booting and tearing down per run.
|
|
8
|
+
export const PROCESS_FILE = "DEVELOPMENT.md";
|
|
9
|
+
const BLOCK = /```(?:yaml|yml)[ \t]+stack[ \t]*\r?\n([\s\S]*?)```/;
|
|
10
|
+
const SERVICE_KEYS = new Set([
|
|
11
|
+
"name",
|
|
12
|
+
"cwd",
|
|
13
|
+
"after",
|
|
14
|
+
"up",
|
|
15
|
+
"down",
|
|
16
|
+
"wipe",
|
|
17
|
+
"run",
|
|
18
|
+
"start",
|
|
19
|
+
"install",
|
|
20
|
+
"lockfile",
|
|
21
|
+
"ready",
|
|
22
|
+
"readyTimeoutMs",
|
|
23
|
+
]);
|
|
24
|
+
const NAME = /^[a-z0-9][a-z0-9-]*$/;
|
|
25
|
+
// A cold Vite start after an install can sit silent for a couple of minutes
|
|
26
|
+
// before its banner; three minutes covers it without hiding a real hang.
|
|
27
|
+
const DEFAULT_READY_TIMEOUT_MS = 180_000;
|
|
28
|
+
export function readStackManifest(root) {
|
|
29
|
+
const file = path.join(root, PROCESS_FILE);
|
|
30
|
+
if (!fs.existsSync(file)) {
|
|
31
|
+
throw new Error(`${PROCESS_FILE} not found in ${root}: run inside a project folder`);
|
|
32
|
+
}
|
|
33
|
+
const match = BLOCK.exec(fs.readFileSync(file, "utf8"));
|
|
34
|
+
if (!match) {
|
|
35
|
+
throw new Error(`${PROCESS_FILE} carries no \`\`\`yaml stack block: this project has no managed stack`);
|
|
36
|
+
}
|
|
37
|
+
const doc = parse(match[1]);
|
|
38
|
+
return {
|
|
39
|
+
root,
|
|
40
|
+
slug: path.basename(root),
|
|
41
|
+
env: parseEnv(doc),
|
|
42
|
+
services: order(parseServices(doc, root)),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function isRecord(v) {
|
|
46
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
47
|
+
}
|
|
48
|
+
function str(obj, key, where) {
|
|
49
|
+
const v = obj[key];
|
|
50
|
+
if (v === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (typeof v !== "string" || v.trim() === "") {
|
|
53
|
+
throw new Error(`${where}: ${key} must be a non-empty string`);
|
|
54
|
+
}
|
|
55
|
+
return v.trim();
|
|
56
|
+
}
|
|
57
|
+
function parseReady(raw, where) {
|
|
58
|
+
const tcp = /^tcp:(\d{1,5})$/.exec(raw);
|
|
59
|
+
if (tcp)
|
|
60
|
+
return { kind: "tcp", port: Number(tcp[1]) };
|
|
61
|
+
if (/^https?:\/\//.test(raw))
|
|
62
|
+
return { kind: "http", url: raw };
|
|
63
|
+
throw new Error(`${where}: ready must be tcp:<port> or an http(s) url`);
|
|
64
|
+
}
|
|
65
|
+
function parseService(raw, root, index) {
|
|
66
|
+
const where = `services[${index}]`;
|
|
67
|
+
if (!isRecord(raw))
|
|
68
|
+
throw new Error(`${where}: must be a mapping`);
|
|
69
|
+
for (const key of Object.keys(raw)) {
|
|
70
|
+
if (!SERVICE_KEYS.has(key))
|
|
71
|
+
throw new Error(`${where}: unknown key "${key}"`);
|
|
72
|
+
}
|
|
73
|
+
const name = str(raw, "name", where);
|
|
74
|
+
if (!name || !NAME.test(name))
|
|
75
|
+
throw new Error(`${where}: name must be kebab-case`);
|
|
76
|
+
const cwd = str(raw, "cwd", `${name}`);
|
|
77
|
+
if (!cwd)
|
|
78
|
+
throw new Error(`${name}: cwd is required`);
|
|
79
|
+
const commands = ["up", "run", "start"].filter((k) => raw[k] !== undefined);
|
|
80
|
+
if (commands.length !== 1) {
|
|
81
|
+
throw new Error(`${name}: exactly one of up, run, start is required`);
|
|
82
|
+
}
|
|
83
|
+
const kind = commands[0];
|
|
84
|
+
const command = str(raw, kind, name);
|
|
85
|
+
const down = str(raw, "down", name);
|
|
86
|
+
const wipe = str(raw, "wipe", name);
|
|
87
|
+
if ((down || wipe) && kind !== "up")
|
|
88
|
+
throw new Error(`${name}: down and wipe only go with up`);
|
|
89
|
+
const install = str(raw, "install", name);
|
|
90
|
+
const lockfile = str(raw, "lockfile", name);
|
|
91
|
+
if ((install === undefined) !== (lockfile === undefined)) {
|
|
92
|
+
throw new Error(`${name}: install and lockfile go together`);
|
|
93
|
+
}
|
|
94
|
+
if (install && kind === "up")
|
|
95
|
+
throw new Error(`${name}: install does not go with up`);
|
|
96
|
+
const readyRaw = str(raw, "ready", name);
|
|
97
|
+
if (kind === "start" && !readyRaw)
|
|
98
|
+
throw new Error(`${name}: a start service needs a ready probe`);
|
|
99
|
+
if (kind === "run" && readyRaw)
|
|
100
|
+
throw new Error(`${name}: a run step takes no ready probe`);
|
|
101
|
+
const after = raw.after === undefined ? [] : raw.after;
|
|
102
|
+
if (!Array.isArray(after) || !after.every((a) => typeof a === "string")) {
|
|
103
|
+
throw new Error(`${name}: after must be a list of service names`);
|
|
104
|
+
}
|
|
105
|
+
const timeout = raw.readyTimeoutMs;
|
|
106
|
+
if (timeout !== undefined && (typeof timeout !== "number" || timeout <= 0)) {
|
|
107
|
+
throw new Error(`${name}: readyTimeoutMs must be a positive number`);
|
|
108
|
+
}
|
|
109
|
+
const absCwd = path.resolve(root, cwd);
|
|
110
|
+
return {
|
|
111
|
+
name,
|
|
112
|
+
cwd: absCwd,
|
|
113
|
+
after: after,
|
|
114
|
+
kind,
|
|
115
|
+
command,
|
|
116
|
+
...(down ? { down } : {}),
|
|
117
|
+
...(wipe ? { wipe } : {}),
|
|
118
|
+
...(install ? { install } : {}),
|
|
119
|
+
...(lockfile ? { lockfile: path.resolve(absCwd, lockfile) } : {}),
|
|
120
|
+
...(readyRaw ? { ready: parseReady(readyRaw, name) } : {}),
|
|
121
|
+
readyTimeoutMs: typeof timeout === "number" ? timeout : DEFAULT_READY_TIMEOUT_MS,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function parseEnv(doc) {
|
|
125
|
+
if (!isRecord(doc) || doc.env === undefined)
|
|
126
|
+
return {};
|
|
127
|
+
if (!isRecord(doc.env))
|
|
128
|
+
throw new Error("stack manifest: env must be a mapping");
|
|
129
|
+
const out = {};
|
|
130
|
+
for (const [k, v] of Object.entries(doc.env)) {
|
|
131
|
+
if (!/^[A-Z][A-Z0-9_]*$/.test(k) || typeof v !== "string") {
|
|
132
|
+
throw new Error(`stack manifest: env.${k} must be an UPPER_SNAKE key with a string value`);
|
|
133
|
+
}
|
|
134
|
+
out[k] = v;
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
function parseServices(doc, root) {
|
|
139
|
+
if (!isRecord(doc) ||
|
|
140
|
+
!Array.isArray(doc.services) ||
|
|
141
|
+
doc.services.length === 0) {
|
|
142
|
+
throw new Error("stack manifest must be a mapping with a non-empty services list");
|
|
143
|
+
}
|
|
144
|
+
for (const key of Object.keys(doc)) {
|
|
145
|
+
if (key !== "services" && key !== "env") {
|
|
146
|
+
throw new Error(`stack manifest: unknown key "${key}"`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const services = doc.services.map((s, i) => parseService(s, root, i));
|
|
150
|
+
const names = new Set();
|
|
151
|
+
for (const s of services) {
|
|
152
|
+
if (names.has(s.name))
|
|
153
|
+
throw new Error(`duplicate service name "${s.name}"`);
|
|
154
|
+
names.add(s.name);
|
|
155
|
+
}
|
|
156
|
+
for (const s of services) {
|
|
157
|
+
for (const dep of s.after) {
|
|
158
|
+
if (!names.has(dep))
|
|
159
|
+
throw new Error(`${s.name}: after names unknown service "${dep}"`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return services;
|
|
163
|
+
}
|
|
164
|
+
// Stable topological order: the first service in list order whose `after`
|
|
165
|
+
// are all placed goes next, one at a time, so the list order is kept wherever
|
|
166
|
+
// the dependencies allow it.
|
|
167
|
+
function order(services) {
|
|
168
|
+
const out = [];
|
|
169
|
+
const placed = new Set();
|
|
170
|
+
let remaining = services;
|
|
171
|
+
while (remaining.length > 0) {
|
|
172
|
+
const next = remaining.find((s) => s.after.every((a) => placed.has(a)));
|
|
173
|
+
if (!next) {
|
|
174
|
+
throw new Error(`cycle in after: ${remaining.map((s) => s.name).join(", ")}`);
|
|
175
|
+
}
|
|
176
|
+
out.push(next);
|
|
177
|
+
placed.add(next.name);
|
|
178
|
+
remaining = remaining.filter((s) => s.name !== next.name);
|
|
179
|
+
}
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=manifest.js.map
|