@danypops/pi-packed 0.27.11 → 0.27.13
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/adoption/check.d.ts +54 -0
- package/dist/adoption/check.d.ts.map +1 -0
- package/dist/adoption/duplicate-dependency-doctor.d.ts +17 -0
- package/dist/adoption/duplicate-dependency-doctor.d.ts.map +1 -0
- package/dist/adoption/install-validation.d.ts +63 -0
- package/dist/adoption/install-validation.d.ts.map +1 -0
- package/dist/adoption/module-freshness.d.ts +39 -0
- package/dist/adoption/module-freshness.d.ts.map +1 -0
- package/dist/adoption/service-doctor.d.ts +21 -0
- package/dist/adoption/service-doctor.d.ts.map +1 -0
- package/dist/adoption/smoke.d.ts +39 -0
- package/dist/adoption/smoke.d.ts.map +1 -0
- package/dist/daemon/daemon-service.d.ts +281 -0
- package/dist/daemon/daemon-service.d.ts.map +1 -0
- package/dist/doctor-format.js +16 -0
- package/dist/packages/installed.d.ts +32 -0
- package/dist/packages/installed.d.ts.map +1 -0
- package/dist/packages/package.d.ts +272 -0
- package/dist/packages/package.d.ts.map +1 -0
- package/dist/public/client.d.ts.map +1 -0
- package/dist/public/doctor-format.d.ts +57 -0
- package/dist/public/doctor-format.d.ts.map +1 -0
- package/dist/public/protocol.d.ts.map +1 -0
- package/dist/publish/publish.d.ts +120 -0
- package/dist/publish/publish.d.ts.map +1 -0
- package/dist/shared/constants.d.ts +51 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/extension/src/doctor-render.ts +32 -0
- package/extension/src/vehicle-tools.ts +16 -0
- package/package.json +8 -4
- package/service/src/adoption/doctor.ts +20 -78
- package/service/src/adoption/service-doctor.ts +30 -2
- package/service/src/public/doctor-format.ts +89 -0
- package/service/test/public-boundary.test.ts +5 -1
- package/service/test/service-doctor.test.ts +54 -0
- package/service/tsconfig.public.json +11 -2
- package/dist/client.d.ts.map +0 -1
- package/dist/protocol.d.ts.map +0 -1
- /package/dist/{client.d.ts → public/client.d.ts} +0 -0
- /package/dist/{protocol.d.ts → public/protocol.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@danypops/pi-packed",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.13",
|
|
4
4
|
"description": "Pi package lifecycle, validation, daemon, tools, profiles, and TUI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
|
-
"build": "rm -rf dist && bun build service/src/public/client.ts service/src/public/protocol.ts --outdir dist --target node --format esm --minify && bunx tsc -p service/tsconfig.public.json",
|
|
25
|
+
"build": "rm -rf dist && bun build service/src/public/client.ts service/src/public/protocol.ts service/src/public/doctor-format.ts --outdir dist --target node --format esm --minify && bunx tsc -p service/tsconfig.public.json",
|
|
26
26
|
"test": "bun run build && bun test service/test test",
|
|
27
27
|
"typecheck": "bunx tsc --noEmit"
|
|
28
28
|
},
|
|
@@ -57,12 +57,16 @@
|
|
|
57
57
|
},
|
|
58
58
|
"exports": {
|
|
59
59
|
"./client": {
|
|
60
|
-
"types": "./dist/client.d.ts",
|
|
60
|
+
"types": "./dist/public/client.d.ts",
|
|
61
61
|
"import": "./dist/client.js"
|
|
62
62
|
},
|
|
63
63
|
"./protocol": {
|
|
64
|
-
"types": "./dist/protocol.d.ts",
|
|
64
|
+
"types": "./dist/public/protocol.d.ts",
|
|
65
65
|
"import": "./dist/protocol.js"
|
|
66
|
+
},
|
|
67
|
+
"./doctor-format": {
|
|
68
|
+
"types": "./dist/public/doctor-format.d.ts",
|
|
69
|
+
"import": "./dist/doctor-format.js"
|
|
66
70
|
}
|
|
67
71
|
},
|
|
68
72
|
"files": ["extension", "service", "dist", "README.md"]
|
|
@@ -6,14 +6,22 @@
|
|
|
6
6
|
* kind of collision at actual startup, one package at a time; doctor
|
|
7
7
|
* answers the same question proactively, before pi ever runs.
|
|
8
8
|
*/
|
|
9
|
-
import { existsSync } from "node:fs";
|
|
9
|
+
import { existsSync, statSync } from "node:fs";
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { createNodeServiceInstallDeps } from "@danypops/vehicle-server/service";
|
|
12
12
|
import { listPackageResources, type PackageResources, resolveInstalledDir } from "../packages/resources.ts";
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
import {
|
|
14
|
+
type DoctorClaim,
|
|
15
|
+
type DoctorConflict,
|
|
16
|
+
type DoctorExtensionResult,
|
|
17
|
+
type DoctorReport,
|
|
18
|
+
formatDoctorReport,
|
|
19
|
+
} from "../public/doctor-format.ts";
|
|
20
|
+
import { findDuplicateDependencyVersions } from "./duplicate-dependency-doctor.ts";
|
|
21
|
+
import { checkServiceUnitPaths } from "./service-doctor.ts";
|
|
22
|
+
import { runExtensionSmoke, type SmokeOptions } from "./smoke.ts";
|
|
23
|
+
|
|
24
|
+
export { type DoctorClaim, type DoctorConflict, type DoctorExtensionResult, type DoctorReport, formatDoctorReport } from "../public/doctor-format.ts";
|
|
17
25
|
|
|
18
26
|
const REGISTRATION_KINDS = ["tools", "commands", "shortcuts", "flags"] as const;
|
|
19
27
|
type RegistrationKind = (typeof REGISTRATION_KINDS)[number];
|
|
@@ -26,51 +34,6 @@ const CONFLICT_KIND: Record<RegistrationKind, "tool" | "command" | "shortcut" |
|
|
|
26
34
|
|
|
27
35
|
const MAX_EXTENSIONS_SCANNED = 50;
|
|
28
36
|
|
|
29
|
-
export interface DoctorClaim {
|
|
30
|
-
name: string;
|
|
31
|
-
source: string;
|
|
32
|
-
scope: "global" | "project";
|
|
33
|
-
extension: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface DoctorConflict {
|
|
37
|
-
kind: "tool" | "command" | "shortcut" | "flag";
|
|
38
|
-
name: string;
|
|
39
|
-
claimants: DoctorClaim[];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface DoctorExtensionResult {
|
|
43
|
-
name: string;
|
|
44
|
-
source: string;
|
|
45
|
-
scope: "global" | "project";
|
|
46
|
-
extension: string;
|
|
47
|
-
status: string;
|
|
48
|
-
registrations: SmokeRegistrations;
|
|
49
|
-
message?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface DoctorReport {
|
|
53
|
-
ok: boolean;
|
|
54
|
-
conflicts: DoctorConflict[];
|
|
55
|
-
extensions: DoctorExtensionResult[];
|
|
56
|
-
scanned: number;
|
|
57
|
-
truncated: boolean;
|
|
58
|
-
/** A daemon-backed package's systemd --user unit referencing a path that no longer exists on disk -- see service-doctor.ts. Empty (not omitted) on a platform without systemd --user coverage. */
|
|
59
|
-
serviceUnits: ServiceUnitDiagnostic[];
|
|
60
|
-
/** Any @danypops/* package resolved to more than one distinct version anywhere in piHome's own npm tree -- see duplicate-dependency-doctor.ts's own doc comment for why this stays out of `ok`. */
|
|
61
|
-
duplicateDependencies: DuplicateDependencyDiagnostic[];
|
|
62
|
-
/**
|
|
63
|
-
* Whether THIS running process still holds a stale in-memory copy of one
|
|
64
|
-
* of its own runtime dependencies, loaded once at startup -- see
|
|
65
|
-
* module-freshness.ts. Only meaningful for a long-running daemon process
|
|
66
|
-
* (the one thing that can actually go stale); omitted entirely for a
|
|
67
|
-
* standalone `packed doctor` invocation (a fresh CLI process has nothing
|
|
68
|
-
* of its own to compare against). Populated by the daemon's own
|
|
69
|
-
* doctor.run route, never by runDoctor() itself.
|
|
70
|
-
*/
|
|
71
|
-
moduleFreshness?: ModuleFreshnessDiagnostic[];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
37
|
interface ScanJob {
|
|
75
38
|
group: PackageResources;
|
|
76
39
|
dir: string;
|
|
@@ -134,6 +97,13 @@ export async function runDoctor(piHome: string, projectRoot?: string, options: S
|
|
|
134
97
|
const serviceReport = checkServiceUnitPaths(piHome, projectRoot, {
|
|
135
98
|
...createNodeServiceInstallDeps(),
|
|
136
99
|
fileExists: existsSync,
|
|
100
|
+
getMtimeMs: (path) => {
|
|
101
|
+
try {
|
|
102
|
+
return statSync(path).mtimeMs;
|
|
103
|
+
} catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
137
107
|
});
|
|
138
108
|
|
|
139
109
|
return {
|
|
@@ -147,32 +117,4 @@ export async function runDoctor(piHome: string, projectRoot?: string, options: S
|
|
|
147
117
|
};
|
|
148
118
|
}
|
|
149
119
|
|
|
150
|
-
function formatClaimant(claim: DoctorClaim): string {
|
|
151
|
-
return `${claim.name} (${claim.source}) [${claim.scope}] ${claim.extension}`;
|
|
152
|
-
}
|
|
153
120
|
|
|
154
|
-
export function formatDoctorReport(report: DoctorReport, json: boolean): string {
|
|
155
|
-
if (json) return `${JSON.stringify(report)}\n`;
|
|
156
|
-
let out = `${report.ok ? "PASS" : "FAIL"} — ${report.scanned} extension(s) scanned, ${report.conflicts.length} conflict(s)\n`;
|
|
157
|
-
for (const conflict of report.conflicts) {
|
|
158
|
-
out += `\nCONFLICT ${conflict.kind} "${conflict.name}" claimed by:\n`;
|
|
159
|
-
for (const claimant of conflict.claimants) out += ` - ${formatClaimant(claimant)}\n`;
|
|
160
|
-
}
|
|
161
|
-
for (const extension of report.extensions) {
|
|
162
|
-
if (extension.status === "ok") continue;
|
|
163
|
-
out += `\n${extension.status.toUpperCase()} ${formatClaimant({ name: extension.name, source: extension.source, scope: extension.scope, extension: extension.extension })}${extension.message ? `: ${extension.message}` : ""}\n`;
|
|
164
|
-
}
|
|
165
|
-
for (const diagnostic of report.serviceUnits) {
|
|
166
|
-
out += `\n${diagnostic.severity.toUpperCase()} ${diagnostic.code} ${diagnostic.package} (${diagnostic.unitName}.service): ${diagnostic.message}\n`;
|
|
167
|
-
}
|
|
168
|
-
for (const duplicate of report.duplicateDependencies) {
|
|
169
|
-
const versions = duplicate.locations.map((location) => `${location.version} (${location.path})`).join(", ");
|
|
170
|
-
out += `\nDUPLICATE_DEPENDENCY_VERSION ${duplicate.name}: ${versions}\n`;
|
|
171
|
-
}
|
|
172
|
-
for (const module of report.moduleFreshness ?? []) {
|
|
173
|
-
if (!module.stale) continue;
|
|
174
|
-
out += `\nSTALE_MODULE_CACHE ${module.name}: the daemon loaded ${module.loadedVersion ?? "an unknown version"} at startup, but ${module.currentVersion ?? "a different version"} is now on disk -- restart the daemon (systemctl --user restart pi-packed.service) to pick it up.\n`;
|
|
175
|
-
}
|
|
176
|
-
if (report.truncated) out += "\nOutput truncated: more enabled extensions exist than this run's bound.\n";
|
|
177
|
-
return out;
|
|
178
|
-
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
1
2
|
import type { ServiceInstallDeps } from "@danypops/vehicle-server/service";
|
|
2
3
|
import { readInstalledPackagesAcrossScopes } from "../packages/installed.ts";
|
|
3
4
|
import { resolveDaemonServiceSpec } from "../daemon/daemon-service.ts";
|
|
4
5
|
|
|
5
6
|
export interface ServiceUnitDiagnostic {
|
|
6
|
-
code: "SERVICE_EXEC_PATH_MISSING" | "SERVICE_NOT_RUNNING" | "SERVICE_STATUS_UNAVAILABLE";
|
|
7
|
+
code: "SERVICE_EXEC_PATH_MISSING" | "SERVICE_NOT_RUNNING" | "SERVICE_STATUS_UNAVAILABLE" | "SERVICE_STALE_CODE";
|
|
7
8
|
severity: "error" | "warning";
|
|
8
9
|
package: string;
|
|
9
10
|
unitName: string;
|
|
@@ -18,10 +19,23 @@ export interface ServiceDoctorReport {
|
|
|
18
19
|
|
|
19
20
|
export interface ServiceDoctorDeps extends ServiceInstallDeps {
|
|
20
21
|
fileExists(path: string): boolean;
|
|
22
|
+
/** Undefined (never throws) when the path doesn't exist or can't be stat'd. */
|
|
23
|
+
getMtimeMs(path: string): number | undefined;
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
interface ArmadaStatus {
|
|
24
|
-
vehicles?: Array<{ name?: string; executable?: string; nativeStatus?: string; ready?: boolean }>;
|
|
27
|
+
vehicles?: Array<{ name?: string; executable?: string; nativeStatus?: string; ready?: boolean; nativePid?: number }>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A boot/registration race can leave a process's own start time a few seconds behind its package.json's write; only a gap past this is treated as a genuinely stale running daemon. */
|
|
31
|
+
const STALE_CODE_GRACE_MS = 15_000;
|
|
32
|
+
|
|
33
|
+
/** Undefined (never throws) when `pid` isn't a running process this host can inspect, or `ps` isn't available. */
|
|
34
|
+
function processStartTimeMs(pid: number, deps: ServiceDoctorDeps): number | undefined {
|
|
35
|
+
const result = deps.runCommand("ps", ["-o", "lstart=", "-p", String(pid)]);
|
|
36
|
+
if (!result.ok) return undefined;
|
|
37
|
+
const parsed = Date.parse(result.output.trim());
|
|
38
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
25
39
|
}
|
|
26
40
|
|
|
27
41
|
export function checkServiceUnitPaths(
|
|
@@ -96,6 +110,20 @@ export function checkServiceUnitPaths(
|
|
|
96
110
|
unitName: managedPackage.spec.name,
|
|
97
111
|
message: `${managedPackage.spec.name}'s Armada service is ${vehicle.nativeStatus}; start it through Armada before connecting`,
|
|
98
112
|
});
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (vehicle.nativePid !== undefined) {
|
|
116
|
+
const packageJsonMtime = deps.getMtimeMs(join(piHome, "npm", "node_modules", managedPackage.packageName, "package.json"));
|
|
117
|
+
const startedAt = processStartTimeMs(vehicle.nativePid, deps);
|
|
118
|
+
if (packageJsonMtime !== undefined && startedAt !== undefined && startedAt < packageJsonMtime - STALE_CODE_GRACE_MS) {
|
|
119
|
+
diagnostics.push({
|
|
120
|
+
code: "SERVICE_STALE_CODE",
|
|
121
|
+
severity: "warning",
|
|
122
|
+
package: managedPackage.packageName,
|
|
123
|
+
unitName: managedPackage.spec.name,
|
|
124
|
+
message: `${managedPackage.spec.name}'s process (pid ${vehicle.nativePid}) started before its own package.json was last written -- it is very likely still running old in-memory code; restart it through Armada`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
99
127
|
}
|
|
100
128
|
}
|
|
101
129
|
return { ok: diagnostics.length === 0, diagnostics, checked };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor.run's report shape and its own human-readable formatter (the CLI's `packed doctor`
|
|
3
|
+
* non-JSON path) -- kept as its own leaf module, imported back by adoption/doctor.ts rather than
|
|
4
|
+
* defined there and re-exported, specifically so this file's only real (non-type) dependency is
|
|
5
|
+
* its own formatDoctorReport/formatClaimant bodies. Every field type below crosses module
|
|
6
|
+
* boundaries as `import type` only (fully erased at compile time), so a consumer needing just the
|
|
7
|
+
* formatter -- e.g. pi-packed's own extension, rendering a Pi tool result -- never pulls in
|
|
8
|
+
* runDoctor's own real runtime dependencies (subprocess-based extension smoke-testing, npm-tree
|
|
9
|
+
* scanning, systemd status shell-outs, ...) just to format a report it already has.
|
|
10
|
+
*/
|
|
11
|
+
import type { DuplicateDependencyDiagnostic } from "../adoption/duplicate-dependency-doctor.ts";
|
|
12
|
+
import type { ModuleFreshnessDiagnostic } from "../adoption/module-freshness.ts";
|
|
13
|
+
import type { ServiceUnitDiagnostic } from "../adoption/service-doctor.ts";
|
|
14
|
+
import type { SmokeRegistrations } from "../adoption/smoke.ts";
|
|
15
|
+
|
|
16
|
+
export interface DoctorClaim {
|
|
17
|
+
name: string;
|
|
18
|
+
source: string;
|
|
19
|
+
scope: "global" | "project";
|
|
20
|
+
extension: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface DoctorConflict {
|
|
24
|
+
kind: "tool" | "command" | "shortcut" | "flag";
|
|
25
|
+
name: string;
|
|
26
|
+
claimants: DoctorClaim[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface DoctorExtensionResult {
|
|
30
|
+
name: string;
|
|
31
|
+
source: string;
|
|
32
|
+
scope: "global" | "project";
|
|
33
|
+
extension: string;
|
|
34
|
+
status: string;
|
|
35
|
+
registrations: SmokeRegistrations;
|
|
36
|
+
message?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface DoctorReport {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
conflicts: DoctorConflict[];
|
|
42
|
+
extensions: DoctorExtensionResult[];
|
|
43
|
+
scanned: number;
|
|
44
|
+
truncated: boolean;
|
|
45
|
+
/** A daemon-backed package's systemd --user unit referencing a path that no longer exists on disk -- see service-doctor.ts. Empty (not omitted) on a platform without systemd --user coverage. */
|
|
46
|
+
serviceUnits: ServiceUnitDiagnostic[];
|
|
47
|
+
/** Any @danypops/* package resolved to more than one distinct version anywhere in piHome's own npm tree -- see duplicate-dependency-doctor.ts's own doc comment for why this stays out of `ok`. */
|
|
48
|
+
duplicateDependencies: DuplicateDependencyDiagnostic[];
|
|
49
|
+
/**
|
|
50
|
+
* Whether THIS running process still holds a stale in-memory copy of one
|
|
51
|
+
* of its own runtime dependencies, loaded once at startup -- see
|
|
52
|
+
* module-freshness.ts. Only meaningful for a long-running daemon process
|
|
53
|
+
* (the one thing that can actually go stale); omitted entirely for a
|
|
54
|
+
* standalone `packed doctor` invocation (a fresh CLI process has nothing
|
|
55
|
+
* of its own to compare against). Populated by the daemon's own
|
|
56
|
+
* doctor.run route, never by runDoctor() itself.
|
|
57
|
+
*/
|
|
58
|
+
moduleFreshness?: ModuleFreshnessDiagnostic[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function formatClaimant(claim: DoctorClaim): string {
|
|
62
|
+
return `${claim.name} (${claim.source}) [${claim.scope}] ${claim.extension}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function formatDoctorReport(report: DoctorReport, json: boolean): string {
|
|
66
|
+
if (json) return `${JSON.stringify(report)}\n`;
|
|
67
|
+
let out = `${report.ok ? "PASS" : "FAIL"} — ${report.scanned} extension(s) scanned, ${report.conflicts.length} conflict(s)\n`;
|
|
68
|
+
for (const conflict of report.conflicts) {
|
|
69
|
+
out += `\nCONFLICT ${conflict.kind} "${conflict.name}" claimed by:\n`;
|
|
70
|
+
for (const claimant of conflict.claimants) out += ` - ${formatClaimant(claimant)}\n`;
|
|
71
|
+
}
|
|
72
|
+
for (const extension of report.extensions) {
|
|
73
|
+
if (extension.status === "ok") continue;
|
|
74
|
+
out += `\n${extension.status.toUpperCase()} ${formatClaimant({ name: extension.name, source: extension.source, scope: extension.scope, extension: extension.extension })}${extension.message ? `: ${extension.message}` : ""}\n`;
|
|
75
|
+
}
|
|
76
|
+
for (const diagnostic of report.serviceUnits) {
|
|
77
|
+
out += `\n${diagnostic.severity.toUpperCase()} ${diagnostic.code} ${diagnostic.package} (${diagnostic.unitName}.service): ${diagnostic.message}\n`;
|
|
78
|
+
}
|
|
79
|
+
for (const duplicate of report.duplicateDependencies) {
|
|
80
|
+
const versions = duplicate.locations.map((location) => `${location.version} (${location.path})`).join(", ");
|
|
81
|
+
out += `\nDUPLICATE_DEPENDENCY_VERSION ${duplicate.name}: ${versions}\n`;
|
|
82
|
+
}
|
|
83
|
+
for (const module of report.moduleFreshness ?? []) {
|
|
84
|
+
if (!module.stale) continue;
|
|
85
|
+
out += `\nSTALE_MODULE_CACHE ${module.name}: the daemon loaded ${module.loadedVersion ?? "an unknown version"} at startup, but ${module.currentVersion ?? "a different version"} is now on disk -- restart the daemon (systemctl --user restart pi-packed.service) to pick it up.\n`;
|
|
86
|
+
}
|
|
87
|
+
if (report.truncated) out += "\nOutput truncated: more enabled extensions exist than this run's bound.\n";
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
@@ -46,7 +46,11 @@ describe("compiled public boundary", () => {
|
|
|
46
46
|
]);
|
|
47
47
|
expect({ code, stderr }).toEqual({ code: 0, stderr: "" });
|
|
48
48
|
expect(stdout.trim()).toBe("function");
|
|
49
|
-
|
|
49
|
+
// client.js/protocol.js stay flat (bun build's own entry-point-basename output), but their
|
|
50
|
+
// .d.ts siblings nest under dist/public/ -- tsconfig.public.json's rootDir covers the whole
|
|
51
|
+
// service tree now (doctor-format.ts's type-only cross-references require it), which changes
|
|
52
|
+
// where tsc emits declarations without touching the flat JS bundle layout at all.
|
|
53
|
+
const publicFiles = ["client.js", "public/client.d.ts", "public/protocol.d.ts"]
|
|
50
54
|
.map((name) => readFileSync(join(root, "dist", name), "utf8"))
|
|
51
55
|
.join("\n");
|
|
52
56
|
expect(publicFiles).not.toMatch(/\bBun\b|bun:sqlite|\.\.\/(?:daemon|db|check)/);
|
|
@@ -37,6 +37,7 @@ function fakeDeps(status: unknown, fileExists = true): ServiceDoctorDeps {
|
|
|
37
37
|
return {
|
|
38
38
|
armadaCliPath: "/armada/cli.js",
|
|
39
39
|
fileExists: () => fileExists,
|
|
40
|
+
getMtimeMs: () => undefined,
|
|
40
41
|
runCommand: () => ({ ok: true, output: JSON.stringify(status) }),
|
|
41
42
|
};
|
|
42
43
|
}
|
|
@@ -125,6 +126,59 @@ describe("checkServiceUnitPaths", () => {
|
|
|
125
126
|
});
|
|
126
127
|
});
|
|
127
128
|
|
|
129
|
+
it("reports a running Vehicle whose process predates its own package.json as stale code, not an error", () => {
|
|
130
|
+
const home = piHome(["npm:fakedaemon"]);
|
|
131
|
+
const dir = installDaemonPackage(home, "fakedaemon");
|
|
132
|
+
const deps: ServiceDoctorDeps = {
|
|
133
|
+
armadaCliPath: "/armada/cli.js",
|
|
134
|
+
fileExists: () => true,
|
|
135
|
+
getMtimeMs: () => Date.now(),
|
|
136
|
+
runCommand: (command) =>
|
|
137
|
+
command === "ps"
|
|
138
|
+
? { ok: true, output: new Date(Date.now() - 60_000).toString() }
|
|
139
|
+
: {
|
|
140
|
+
ok: true,
|
|
141
|
+
output: JSON.stringify({
|
|
142
|
+
vehicles: [{ name: "fakedaemon", executable: join(dir, "cli.ts"), nativeStatus: "running", nativePid: 4242 }],
|
|
143
|
+
}),
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
const report = checkServiceUnitPaths(home, undefined, deps);
|
|
147
|
+
expect(report).toEqual({
|
|
148
|
+
ok: false,
|
|
149
|
+
checked: 1,
|
|
150
|
+
diagnostics: [
|
|
151
|
+
{
|
|
152
|
+
code: "SERVICE_STALE_CODE",
|
|
153
|
+
severity: "warning",
|
|
154
|
+
package: "fakedaemon",
|
|
155
|
+
unitName: "fakedaemon",
|
|
156
|
+
message: expect.stringContaining("pid 4242"),
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("never flags a running Vehicle whose process started after its own package.json was last written", () => {
|
|
163
|
+
const home = piHome(["npm:fakedaemon"]);
|
|
164
|
+
const dir = installDaemonPackage(home, "fakedaemon");
|
|
165
|
+
const deps: ServiceDoctorDeps = {
|
|
166
|
+
armadaCliPath: "/armada/cli.js",
|
|
167
|
+
fileExists: () => true,
|
|
168
|
+
getMtimeMs: () => Date.now() - 60_000,
|
|
169
|
+
runCommand: (command) =>
|
|
170
|
+
command === "ps"
|
|
171
|
+
? { ok: true, output: new Date().toString() }
|
|
172
|
+
: {
|
|
173
|
+
ok: true,
|
|
174
|
+
output: JSON.stringify({
|
|
175
|
+
vehicles: [{ name: "fakedaemon", executable: join(dir, "cli.ts"), nativeStatus: "running", nativePid: 4242 }],
|
|
176
|
+
}),
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
expect(checkServiceUnitPaths(home, undefined, deps)).toEqual({ ok: true, diagnostics: [], checked: 1 });
|
|
180
|
+
});
|
|
181
|
+
|
|
128
182
|
it("reports Armada status failure without guessing from native descriptors", () => {
|
|
129
183
|
const home = piHome(["npm:fakedaemon"]);
|
|
130
184
|
installDaemonPackage(home, "fakedaemon");
|
|
@@ -6,7 +6,16 @@
|
|
|
6
6
|
"declaration": true,
|
|
7
7
|
"declarationMap": true,
|
|
8
8
|
"declarationDir": "../dist",
|
|
9
|
-
|
|
9
|
+
// doctor-format.ts's type-only cross-references (DuplicateDependencyDiagnostic,
|
|
10
|
+
// ModuleFreshnessDiagnostic, ServiceUnitDiagnostic, SmokeRegistrations) still pull their
|
|
11
|
+
// declaring files into tsc's program for declaration emission even though bun build's own
|
|
12
|
+
// JS bundle erases them entirely -- rootDir must cover the whole service tree for that, not
|
|
13
|
+
// just this entrypoint's own directory. The resulting nested .d.ts paths (dist/public/*.d.ts,
|
|
14
|
+
// dist/adoption/*.d.ts, ...) are an internal build-output detail: package.json's own
|
|
15
|
+
// `exports` map is what consumers actually resolve against, and its `types` paths are kept
|
|
16
|
+
// in sync with this layout independently of `import` (still flat, from bun build's own
|
|
17
|
+
// entry-point-basename output).
|
|
18
|
+
"rootDir": "src"
|
|
10
19
|
},
|
|
11
|
-
"include": ["src/public/client.ts", "src/public/protocol.ts"]
|
|
20
|
+
"include": ["src/public/client.ts", "src/public/protocol.ts", "src/public/doctor-format.ts"]
|
|
12
21
|
}
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../service/src/public/client.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../service/src/public/protocol.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|