refactor: single-package workspace with root esbuild build
Merge workflow and sense devDependencies into root, remove per-package package.json and workflow tsconfigs, add scripts/build.mjs for consistent outputs. Fixes #22
This commit is contained in:
parent
e4fd5d6ba4
commit
f7cf1a1cb2
@ -4,7 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "pnpm -r build"
|
"build": "node scripts/build.mjs"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@uncaged/nerve-adapter-cursor": "link:../repos/nerve/packages/adapter-cursor",
|
"@uncaged/nerve-adapter-cursor": "link:../repos/nerve/packages/adapter-cursor",
|
||||||
@ -19,7 +19,10 @@
|
|||||||
"zod": "^4.3.6"
|
"zod": "^4.3.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"drizzle-kit": "latest"
|
"@types/node": "^22.0.0",
|
||||||
|
"drizzle-kit": "latest",
|
||||||
|
"esbuild": "^0.27.0",
|
||||||
|
"typescript": "^5.7.0"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
|
|||||||
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@ -48,9 +48,18 @@ importers:
|
|||||||
specifier: ^4.3.6
|
specifier: ^4.3.6
|
||||||
version: 4.3.6
|
version: 4.3.6
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^22.0.0
|
||||||
|
version: 22.19.17
|
||||||
drizzle-kit:
|
drizzle-kit:
|
||||||
specifier: latest
|
specifier: latest
|
||||||
version: 0.31.10
|
version: 0.31.10
|
||||||
|
esbuild:
|
||||||
|
specifier: ^0.27.0
|
||||||
|
version: 0.27.7
|
||||||
|
typescript:
|
||||||
|
specifier: ^5.7.0
|
||||||
|
version: 5.9.3
|
||||||
|
|
||||||
senses/git-workspace-status:
|
senses/git-workspace-status:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
packages:
|
|
||||||
- "workflows/*"
|
|
||||||
- "senses/*"
|
|
||||||
50
scripts/build.mjs
Normal file
50
scripts/build.mjs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import * as esbuild from "esbuild";
|
||||||
|
import fs from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "..");
|
||||||
|
|
||||||
|
const opts = {
|
||||||
|
bundle: true,
|
||||||
|
platform: "node",
|
||||||
|
format: "esm",
|
||||||
|
packages: "external",
|
||||||
|
};
|
||||||
|
|
||||||
|
function listDirs(dir) {
|
||||||
|
if (!fs.existsSync(dir)) return [];
|
||||||
|
return fs
|
||||||
|
.readdirSync(dir)
|
||||||
|
.filter((name) => !name.startsWith("."))
|
||||||
|
.map((name) => path.join(dir, name))
|
||||||
|
.filter((p) => fs.statSync(p).isDirectory());
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
for (const dir of listDirs(path.join(root, "senses"))) {
|
||||||
|
const entry = path.join(dir, "src", "index.ts");
|
||||||
|
if (!fs.existsSync(entry)) continue;
|
||||||
|
await esbuild.build({
|
||||||
|
...opts,
|
||||||
|
entryPoints: [entry],
|
||||||
|
outfile: path.join(dir, "index.js"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const dir of listDirs(path.join(root, "workflows"))) {
|
||||||
|
const base = path.basename(dir);
|
||||||
|
if (base.startsWith("_")) continue;
|
||||||
|
const entry = path.join(dir, "index.ts");
|
||||||
|
if (!fs.existsSync(entry)) continue;
|
||||||
|
const outDir = path.join(dir, "dist");
|
||||||
|
fs.mkdirSync(outDir, { recursive: true });
|
||||||
|
await esbuild.build({
|
||||||
|
...opts,
|
||||||
|
entryPoints: [entry],
|
||||||
|
outfile: path.join(outDir, "index.js"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await main();
|
||||||
@ -1,8 +1,8 @@
|
|||||||
// src/index.ts
|
// senses/git-workspace-status/src/index.ts
|
||||||
import { execFileSync } from "node:child_process";
|
import { execFileSync } from "node:child_process";
|
||||||
import { resolve } from "node:path";
|
import { resolve } from "node:path";
|
||||||
|
|
||||||
// src/schema.ts
|
// senses/git-workspace-status/src/schema.ts
|
||||||
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
||||||
var snapshots = sqliteTable("snapshots", {
|
var snapshots = sqliteTable("snapshots", {
|
||||||
ts: integer("ts").primaryKey(),
|
ts: integer("ts").primaryKey(),
|
||||||
@ -16,7 +16,7 @@ var snapshots = sqliteTable("snapshots", {
|
|||||||
gitError: text("git_error").notNull()
|
gitError: text("git_error").notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// senses/git-workspace-status/src/index.ts
|
||||||
var GIT_TIMEOUT_MS = 15e3;
|
var GIT_TIMEOUT_MS = 15e3;
|
||||||
function workspaceRoot() {
|
function workspaceRoot() {
|
||||||
const raw = process.env.GIT_WORKSPACE_ROOT;
|
const raw = process.env.GIT_WORKSPACE_ROOT;
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "sense-git-workspace-status",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
// src/index.ts
|
// senses/hermes-gateway-health/src/index.ts
|
||||||
import { execFile } from "node:child_process";
|
import { execFile } from "node:child_process";
|
||||||
|
|
||||||
// src/schema.ts
|
// senses/hermes-gateway-health/src/schema.ts
|
||||||
import { integer, real, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
import { integer, real, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
||||||
var hermesGatewayHealth = sqliteTable("hermes_gateway_health", {
|
var hermesGatewayHealth = sqliteTable("hermes_gateway_health", {
|
||||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
@ -19,7 +19,7 @@ var hermesGatewayHealth = sqliteTable("hermes_gateway_health", {
|
|||||||
httpError: text("http_error").notNull()
|
httpError: text("http_error").notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// senses/hermes-gateway-health/src/index.ts
|
||||||
var EXEC_TIMEOUT_MS = 25e3;
|
var EXEC_TIMEOUT_MS = 25e3;
|
||||||
var HTTP_TIMEOUT_MS = Math.min(23e3, EXEC_TIMEOUT_MS - 2e3);
|
var HTTP_TIMEOUT_MS = Math.min(23e3, EXEC_TIMEOUT_MS - 2e3);
|
||||||
var HTTP_ERROR_MAX_LEN = 256;
|
var HTTP_ERROR_MAX_LEN = 256;
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "sense-hermes-gateway-health",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +1,11 @@
|
|||||||
// src/index.ts
|
// senses/hermes-session-message-stats/src/index.ts
|
||||||
import { createReadStream } from "node:fs";
|
import { createReadStream } from "node:fs";
|
||||||
import { readdir } from "node:fs/promises";
|
import { readdir } from "node:fs/promises";
|
||||||
import { homedir } from "node:os";
|
import { homedir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { createInterface } from "node:readline";
|
import { createInterface } from "node:readline";
|
||||||
|
|
||||||
// src/schema.ts
|
// senses/hermes-session-message-stats/src/schema.ts
|
||||||
import { integer, sqliteTable } from "drizzle-orm/sqlite-core";
|
import { integer, sqliteTable } from "drizzle-orm/sqlite-core";
|
||||||
var hermesSessionMessageStats = sqliteTable("hermes_session_message_stats", {
|
var hermesSessionMessageStats = sqliteTable("hermes_session_message_stats", {
|
||||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
@ -18,7 +18,7 @@ var hermesSessionMessageStats = sqliteTable("hermes_session_message_stats", {
|
|||||||
measurementWindowSeconds: integer("measurement_window_seconds").notNull()
|
measurementWindowSeconds: integer("measurement_window_seconds").notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// senses/hermes-session-message-stats/src/index.ts
|
||||||
var MEASUREMENT_WINDOW_MS = 9e5;
|
var MEASUREMENT_WINDOW_MS = 9e5;
|
||||||
var MEASUREMENT_WINDOW_SECONDS = 900;
|
var MEASUREMENT_WINDOW_SECONDS = 900;
|
||||||
async function aggregateJsonlFile(filePath, cutoffMs, nowMs) {
|
async function aggregateJsonlFile(filePath, cutoffMs, nowMs) {
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "sense-hermes-session-message-stats",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
// src/index.ts
|
// senses/linux-system-health/src/index.ts
|
||||||
import { loadavg, totalmem, freemem, uptime } from "node:os";
|
import { loadavg, totalmem, freemem, uptime } from "node:os";
|
||||||
import { execSync } from "node:child_process";
|
import { execSync } from "node:child_process";
|
||||||
import { readFile } from "node:fs/promises";
|
import { readFile } from "node:fs/promises";
|
||||||
|
|
||||||
// src/schema.ts
|
// senses/linux-system-health/src/schema.ts
|
||||||
import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core";
|
import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core";
|
||||||
var snapshots = sqliteTable("snapshots", {
|
var snapshots = sqliteTable("snapshots", {
|
||||||
ts: integer("ts").primaryKey(),
|
ts: integer("ts").primaryKey(),
|
||||||
@ -26,7 +26,7 @@ var snapshots = sqliteTable("snapshots", {
|
|||||||
tcpMemPages: integer("tcp_mem_pages")
|
tcpMemPages: integer("tcp_mem_pages")
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// senses/linux-system-health/src/index.ts
|
||||||
var SOCKSTAT_PATH = "/proc/net/sockstat";
|
var SOCKSTAT_PATH = "/proc/net/sockstat";
|
||||||
function parseSockstat(content) {
|
function parseSockstat(content) {
|
||||||
let socketsUsed = 0, tcpInuse = 0, tcpOrphan = 0, tcpTw = 0, tcpAlloc = 0, tcpMemPages = 0;
|
let socketsUsed = 0, tcpInuse = 0, tcpOrphan = 0, tcpTw = 0, tcpAlloc = 0, tcpMemPages = 0;
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "sense-linux-system-health",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// src/schema.ts
|
// senses/worker-process-metrics/src/schema.ts
|
||||||
import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core";
|
import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core";
|
||||||
var workerProcessMetrics = sqliteTable("worker_process_metrics", {
|
var workerProcessMetrics = sqliteTable("worker_process_metrics", {
|
||||||
ts: integer("ts").primaryKey(),
|
ts: integer("ts").primaryKey(),
|
||||||
@ -9,7 +9,7 @@ var workerProcessMetrics = sqliteTable("worker_process_metrics", {
|
|||||||
externalMB: real("external_mb").notNull()
|
externalMB: real("external_mb").notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// senses/worker-process-metrics/src/index.ts
|
||||||
function round2(n) {
|
function round2(n) {
|
||||||
return Math.round(n * 100) / 100;
|
return Math.round(n * 100) / 100;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "sense-worker-process-metrics",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -7,7 +7,13 @@
|
|||||||
"strict": true,
|
"strict": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
"types": ["node"]
|
"types": ["node"]
|
||||||
},
|
},
|
||||||
"include": ["./**/*.ts", "../_shared/**/*.ts"]
|
"include": [
|
||||||
|
"senses/**/*.ts",
|
||||||
|
"workflows/**/*.ts",
|
||||||
|
"scripts/**/*.ts",
|
||||||
|
"workflows/_shared/**/*.ts"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "generate-sense-workflow",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@uncaged/nerve-adapter-cursor": "latest",
|
|
||||||
"@uncaged/nerve-adapter-hermes": "latest",
|
|
||||||
"@uncaged/nerve-core": "latest",
|
|
||||||
"@uncaged/nerve-workflow-meta": "link:../../../repos/nerve/packages/workflow-meta",
|
|
||||||
"@uncaged/nerve-workflow-utils": "latest",
|
|
||||||
"zod": "^4.3.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "ES2022",
|
|
||||||
"lib": ["ES2022"],
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"strict": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"noEmit": false,
|
|
||||||
"declaration": false,
|
|
||||||
"types": ["node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts", "../_shared/**/*.ts"]
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "generate-workflow-workflow",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@uncaged/nerve-adapter-cursor": "latest",
|
|
||||||
"@uncaged/nerve-adapter-hermes": "latest",
|
|
||||||
"@uncaged/nerve-core": "latest",
|
|
||||||
"@uncaged/nerve-workflow-meta": "link:../../../repos/nerve/packages/workflow-meta",
|
|
||||||
"@uncaged/nerve-workflow-utils": "latest",
|
|
||||||
"zod": "^4.3.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "knowledge-extraction-workflow",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@uncaged/nerve-adapter-cursor": "latest",
|
|
||||||
"@uncaged/nerve-adapter-hermes": "latest",
|
|
||||||
"@uncaged/nerve-core": "latest",
|
|
||||||
"@uncaged/nerve-workflow-utils": "latest",
|
|
||||||
"zod": "^4.3.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "ES2022",
|
|
||||||
"lib": ["ES2022"],
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"strict": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"types": ["node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts"]
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "solve-issue-workflow",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@uncaged/nerve-adapter-cursor": "latest",
|
|
||||||
"@uncaged/nerve-adapter-hermes": "latest",
|
|
||||||
"@uncaged/nerve-core": "latest",
|
|
||||||
"@uncaged/nerve-workflow-utils": "latest",
|
|
||||||
"zod": "^4.3.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^22.0.0",
|
|
||||||
"esbuild": "^0.27.0",
|
|
||||||
"typescript": "^5.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "ES2022",
|
|
||||||
"lib": ["ES2022"],
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"strict": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"types": ["node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts"]
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user