@blackbelt-technology/pi-agent-dashboard 0.2.9 → 0.4.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/AGENTS.md +64 -8
- package/README.md +308 -101
- package/docs/architecture.md +515 -16
- package/package.json +14 -7
- package/packages/extension/package.json +11 -3
- package/packages/extension/src/__tests__/ask-user-tool.test.ts +300 -3
- package/packages/extension/src/__tests__/enrich-model-metadata.test.ts +201 -0
- package/packages/extension/src/__tests__/fork-entryid-timing.test.ts +100 -0
- package/packages/extension/src/__tests__/git-info.test.ts +67 -55
- package/packages/extension/src/__tests__/openspec-poller.test.ts +101 -96
- package/packages/extension/src/__tests__/process-scanner-kill.test.ts +61 -0
- package/packages/extension/src/__tests__/provider-register-reload.test.ts +394 -0
- package/packages/extension/src/__tests__/server-auto-start.test.ts +95 -4
- package/packages/extension/src/__tests__/server-launcher.test.ts +16 -0
- package/packages/extension/src/ask-user-tool.ts +289 -20
- package/packages/extension/src/bridge.ts +107 -6
- package/packages/extension/src/command-handler.ts +34 -39
- package/packages/extension/src/dev-build.ts +1 -1
- package/packages/extension/src/git-info.ts +9 -19
- package/packages/extension/src/pi-env.d.ts +1 -0
- package/packages/extension/src/process-scanner.ts +72 -38
- package/packages/extension/src/prompt-expander.ts +25 -4
- package/packages/extension/src/provider-register.ts +304 -16
- package/packages/extension/src/server-auto-start.ts +27 -1
- package/packages/extension/src/server-launcher.ts +71 -27
- package/packages/server/package.json +17 -2
- package/packages/server/src/__tests__/auto-attach.test.ts +10 -1
- package/packages/server/src/__tests__/auto-shutdown.test.ts +8 -2
- package/packages/server/src/__tests__/bootstrap-queue.test.ts +120 -0
- package/packages/server/src/__tests__/bootstrap-routes.test.ts +125 -0
- package/packages/server/src/__tests__/bootstrap-state.test.ts +119 -0
- package/packages/server/src/__tests__/browse-endpoint.test.ts +246 -10
- package/packages/server/src/__tests__/browser-gateway-handler-errors.test.ts +129 -0
- package/packages/server/src/__tests__/cli-parse.test.ts +11 -0
- package/packages/server/src/__tests__/concurrent-launch.test.ts +110 -0
- package/packages/server/src/__tests__/config-api.test.ts +68 -0
- package/packages/server/src/__tests__/cors.test.ts +34 -2
- package/packages/server/src/__tests__/crash-recovery.test.ts +88 -0
- package/packages/server/src/__tests__/directory-service.test.ts +234 -8
- package/packages/server/src/__tests__/editor-manager-pid-registry.test.ts +168 -0
- package/packages/server/src/__tests__/editor-manager.test.ts +33 -0
- package/packages/server/src/__tests__/editor-pid-registry.test.ts +191 -0
- package/packages/server/src/__tests__/editor-registry.test.ts +29 -15
- package/packages/server/src/__tests__/extension-register-appimage.test.ts +5 -1
- package/packages/server/src/__tests__/extension-register.test.ts +3 -1
- package/packages/server/src/__tests__/find-port-holders.test.ts +94 -0
- package/packages/server/src/__tests__/fix-pty-permissions.test.ts +59 -0
- package/packages/server/src/__tests__/force-kill-handler.test.ts +57 -8
- package/packages/server/src/__tests__/git-operations.test.ts +9 -7
- package/packages/server/src/__tests__/health-endpoint.test.ts +11 -13
- package/packages/server/src/__tests__/home-lock-escape-hatch.test.ts +60 -0
- package/packages/server/src/__tests__/home-lock-release.test.ts +85 -0
- package/packages/server/src/__tests__/home-lock.test.ts +308 -0
- package/packages/server/src/__tests__/is-pi-process.test.ts +36 -0
- package/packages/server/src/__tests__/node-guard.test.ts +85 -0
- package/packages/server/src/__tests__/openspec-tasks-parser.test.ts +178 -0
- package/packages/server/src/__tests__/openspec-tasks-routes.test.ts +180 -0
- package/packages/server/src/__tests__/package-manager-wrapper-resolve.test.ts +126 -0
- package/packages/server/src/__tests__/package-manager-wrapper.test.ts +45 -10
- package/packages/server/src/__tests__/pi-core-checker.test.ts +195 -0
- package/packages/server/src/__tests__/pi-core-routes.test.ts +184 -0
- package/packages/server/src/__tests__/pi-core-updater.test.ts +214 -0
- package/packages/server/src/__tests__/pi-version-skew.test.ts +165 -0
- package/packages/server/src/__tests__/preferences-store.test.ts +73 -4
- package/packages/server/src/__tests__/process-manager.test.ts +45 -18
- package/packages/server/src/__tests__/provider-auth-routes.test.ts +13 -3
- package/packages/server/src/__tests__/provider-probe.test.ts +287 -0
- package/packages/server/src/__tests__/provider-test-route.test.ts +149 -0
- package/packages/server/src/__tests__/recommended-routes.test.ts +389 -0
- package/packages/server/src/__tests__/restart-helper.test.ts +83 -0
- package/packages/server/src/__tests__/session-action-handler-headless-reload.test.ts +467 -0
- package/packages/server/src/__tests__/session-action-handler-reload-predicate.test.ts +73 -0
- package/packages/server/src/__tests__/session-action-handler-spawn-error.test.ts +74 -0
- package/packages/server/src/__tests__/session-file-dedup.test.ts +10 -10
- package/packages/server/src/__tests__/session-lifecycle-logging.test.ts +8 -2
- package/packages/server/src/__tests__/sleep-aware-heartbeat.test.ts +3 -1
- package/packages/server/src/__tests__/smoke-integration.test.ts +10 -10
- package/packages/server/src/__tests__/terminal-manager.test.ts +41 -1
- package/packages/server/src/__tests__/test-server-canary.test.ts +31 -0
- package/packages/server/src/__tests__/tool-routes.test.ts +277 -0
- package/packages/server/src/__tests__/trusted-networks-config.test.ts +19 -0
- package/packages/server/src/__tests__/trusted-networks-no-oauth-roundtrip.test.ts +126 -0
- package/packages/server/src/__tests__/tunnel-cleanup.test.ts +90 -0
- package/packages/server/src/__tests__/tunnel.test.ts +103 -6
- package/packages/server/src/__tests__/ws-ping-pong.test.ts +10 -2
- package/packages/server/src/__tests__/wsl-tmux-probe-cache.test.ts +44 -0
- package/packages/server/src/bootstrap-queue.ts +130 -0
- package/packages/server/src/bootstrap-state.ts +131 -0
- package/packages/server/src/browse.ts +108 -9
- package/packages/server/src/browser-gateway.ts +16 -3
- package/packages/server/src/browser-handlers/directory-handler.ts +23 -8
- package/packages/server/src/browser-handlers/session-action-handler.ts +213 -79
- package/packages/server/src/browser-handlers/session-action-helpers.ts +36 -0
- package/packages/server/src/cli.ts +256 -32
- package/packages/server/src/config-api.ts +16 -0
- package/packages/server/src/directory-service.ts +270 -39
- package/packages/server/src/editor-detection.ts +12 -9
- package/packages/server/src/editor-manager.ts +39 -5
- package/packages/server/src/editor-pid-registry.ts +199 -0
- package/packages/server/src/editor-registry.ts +22 -25
- package/packages/server/src/fix-pty-permissions.ts +44 -0
- package/packages/server/src/git-operations.ts +1 -1
- package/packages/server/src/headless-pid-registry.ts +16 -20
- package/packages/server/src/home-lock-release.ts +72 -0
- package/packages/server/src/home-lock.ts +389 -0
- package/packages/server/src/node-guard.ts +52 -0
- package/packages/server/src/npm-search-proxy.ts +71 -0
- package/packages/server/src/openspec-tasks.ts +158 -0
- package/packages/server/src/package-manager-wrapper.ts +225 -34
- package/packages/server/src/pi-core-checker.ts +290 -0
- package/packages/server/src/pi-core-updater.ts +172 -0
- package/packages/server/src/pi-gateway.ts +7 -0
- package/packages/server/src/pi-resource-scanner.ts +5 -8
- package/packages/server/src/pi-version-skew.ts +196 -0
- package/packages/server/src/preferences-store.ts +17 -3
- package/packages/server/src/process-manager.ts +403 -222
- package/packages/server/src/provider-probe.ts +234 -0
- package/packages/server/src/restart-helper.ts +130 -0
- package/packages/server/src/routes/bootstrap-routes.ts +88 -0
- package/packages/server/src/routes/file-routes.ts +30 -3
- package/packages/server/src/routes/openspec-routes.ts +107 -1
- package/packages/server/src/routes/pi-core-routes.ts +140 -0
- package/packages/server/src/routes/provider-auth-routes.ts +12 -10
- package/packages/server/src/routes/provider-routes.ts +55 -2
- package/packages/server/src/routes/recommended-routes.ts +225 -0
- package/packages/server/src/routes/system-routes.ts +30 -34
- package/packages/server/src/routes/tool-routes.ts +153 -0
- package/packages/server/src/server-pid.ts +5 -9
- package/packages/server/src/server.ts +363 -26
- package/packages/server/src/session-api.ts +77 -8
- package/packages/server/src/session-bootstrap.ts +17 -3
- package/packages/server/src/session-diff.ts +21 -21
- package/packages/server/src/terminal-manager.ts +65 -20
- package/packages/server/src/test-env-guard.ts +26 -0
- package/packages/server/src/test-support/test-server.ts +63 -0
- package/packages/server/src/tunnel.ts +172 -34
- package/packages/shared/package.json +10 -3
- package/packages/shared/src/__tests__/{tool-resolver.test.ts → binary-lookup.test.ts} +32 -12
- package/packages/shared/src/__tests__/bootstrap/README.md +133 -0
- package/packages/shared/src/__tests__/bootstrap/__snapshots__/cube.test.ts.snap +370 -0
- package/packages/shared/src/__tests__/bootstrap/assertions.ts +136 -0
- package/packages/shared/src/__tests__/bootstrap/cube.test.ts +47 -0
- package/packages/shared/src/__tests__/bootstrap/cube.ts +66 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap +83 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap +89 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/c-dev-monorepo.test.ts.snap +33 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/d-overrides.test.ts.snap +20 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap +61 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap +33 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/g-windows-specifics.test.ts.snap +46 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/j-path-gui-minimal.test.ts.snap +12 -0
- package/packages/shared/src/__tests__/bootstrap/families/a-electron.test.ts +156 -0
- package/packages/shared/src/__tests__/bootstrap/families/b-npm-global.test.ts +157 -0
- package/packages/shared/src/__tests__/bootstrap/families/c-dev-monorepo.test.ts +102 -0
- package/packages/shared/src/__tests__/bootstrap/families/d-overrides.test.ts +76 -0
- package/packages/shared/src/__tests__/bootstrap/families/e-stale-partial.test.ts +94 -0
- package/packages/shared/src/__tests__/bootstrap/families/f-cwd-variants.test.ts +87 -0
- package/packages/shared/src/__tests__/bootstrap/families/g-windows-specifics.test.ts +143 -0
- package/packages/shared/src/__tests__/bootstrap/families/h-home-drift.test.ts +64 -0
- package/packages/shared/src/__tests__/bootstrap/families/i-malformed-settings.test.ts +77 -0
- package/packages/shared/src/__tests__/bootstrap/families/index.ts +19 -0
- package/packages/shared/src/__tests__/bootstrap/families/j-path-gui-minimal.test.ts +61 -0
- package/packages/shared/src/__tests__/bootstrap/families/k-dashboard-absent.test.ts +50 -0
- package/packages/shared/src/__tests__/bootstrap/families/l-instance-coordination.test.ts +272 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/dev-monorepo.ts +58 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/electron-layout.ts +84 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/index.ts +9 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/managed-install.ts +85 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/npm-global-layout.ts +122 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/pi-versions.ts +36 -0
- package/packages/shared/src/__tests__/bootstrap/fixtures/settings-json.ts +39 -0
- package/packages/shared/src/__tests__/bootstrap/harness.smoke.test.ts +220 -0
- package/packages/shared/src/__tests__/bootstrap/harness.ts +413 -0
- package/packages/shared/src/__tests__/bootstrap/scenarios-skipped.ts +125 -0
- package/packages/shared/src/__tests__/bootstrap/scenarios.ts +132 -0
- package/packages/shared/src/__tests__/bridge-register.test.ts +29 -6
- package/packages/shared/src/__tests__/config-openspec.test.ts +106 -0
- package/packages/shared/src/__tests__/config.test.ts +59 -3
- package/packages/shared/src/__tests__/detached-spawn.test.ts +243 -0
- package/packages/shared/src/__tests__/managed-paths.test.ts +60 -0
- package/packages/shared/src/__tests__/no-direct-child-process.test.ts +112 -0
- package/packages/shared/src/__tests__/no-direct-platform-branch.test.ts +174 -0
- package/packages/shared/src/__tests__/no-direct-process-kill.test.ts +105 -0
- package/packages/shared/src/__tests__/openspec-poller.test.ts +44 -0
- package/packages/shared/src/__tests__/platform-commands.test.ts +108 -0
- package/packages/shared/src/__tests__/platform-exec.test.ts +103 -0
- package/packages/shared/src/__tests__/platform-git.test.ts +194 -0
- package/packages/shared/src/__tests__/platform-npm.test.ts +137 -0
- package/packages/shared/src/__tests__/platform-openspec.test.ts +92 -0
- package/packages/shared/src/__tests__/platform-paths.test.ts +284 -0
- package/packages/shared/src/__tests__/platform-process-scan.test.ts +55 -0
- package/packages/shared/src/__tests__/platform-process.test.ts +160 -0
- package/packages/shared/src/__tests__/platform-runner.test.ts +173 -0
- package/packages/shared/src/__tests__/platform-shell.test.ts +74 -0
- package/packages/shared/src/__tests__/process-identify.test.ts +113 -0
- package/packages/shared/src/__tests__/recommended-extensions.test.ts +156 -0
- package/packages/shared/src/__tests__/resolve-jiti.test.ts +43 -7
- package/packages/shared/src/__tests__/semaphore.test.ts +119 -0
- package/packages/shared/src/__tests__/source-matching.test.ts +143 -0
- package/packages/shared/src/__tests__/spawn-mechanism.test.ts +131 -0
- package/packages/shared/src/__tests__/tool-registry-definitions.test.ts +239 -0
- package/packages/shared/src/__tests__/tool-registry-overrides.test.ts +137 -0
- package/packages/shared/src/__tests__/tool-registry-registry.test.ts +343 -0
- package/packages/shared/src/bootstrap-install.ts +212 -0
- package/packages/shared/src/bridge-register.ts +87 -20
- package/packages/shared/src/browser-protocol.ts +93 -1
- package/packages/shared/src/config.ts +87 -15
- package/packages/shared/src/managed-paths.ts +31 -4
- package/packages/shared/src/openspec-poller.ts +71 -49
- package/packages/shared/src/{tool-resolver.ts → platform/binary-lookup.ts} +125 -25
- package/packages/shared/src/platform/commands.ts +100 -0
- package/packages/shared/src/platform/detached-spawn.ts +305 -0
- package/packages/shared/src/platform/exec.ts +220 -0
- package/packages/shared/src/platform/git.ts +155 -0
- package/packages/shared/src/platform/index.ts +15 -0
- package/packages/shared/src/platform/npm.ts +162 -0
- package/packages/shared/src/platform/openspec.ts +91 -0
- package/packages/shared/src/platform/paths.ts +276 -0
- package/packages/shared/src/platform/process-identify.ts +126 -0
- package/packages/shared/src/platform/process-scan.ts +94 -0
- package/packages/shared/src/platform/process.ts +168 -0
- package/packages/shared/src/platform/runner.ts +369 -0
- package/packages/shared/src/platform/shell.ts +44 -0
- package/packages/shared/src/platform/spawn-mechanism.ts +124 -0
- package/packages/shared/src/platform/subprocess-adapter.ts +124 -0
- package/packages/shared/src/recommended-extensions.ts +196 -0
- package/packages/shared/src/resolve-jiti.ts +62 -3
- package/packages/shared/src/rest-api.ts +97 -0
- package/packages/shared/src/semaphore.ts +83 -0
- package/packages/shared/src/source-matching.ts +126 -0
- package/packages/shared/src/test-support/setup-home.ts +74 -0
- package/packages/shared/src/tool-registry/definitions.ts +342 -0
- package/packages/shared/src/tool-registry/index.ts +56 -0
- package/packages/shared/src/tool-registry/overrides.ts +118 -0
- package/packages/shared/src/tool-registry/registry.ts +262 -0
- package/packages/shared/src/tool-registry/strategies.ts +198 -0
- package/packages/shared/src/tool-registry/types.ts +180 -0
- package/packages/shared/src/types.ts +7 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot helpers — normalize environment-specific paths so snapshots
|
|
3
|
+
* are stable across OS/CI runs.
|
|
4
|
+
*
|
|
5
|
+
* See openspec/changes/bootstrap-resolution-harness/design.md §8, §9.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutorResolution, Resolution } from "../../tool-registry/types.js";
|
|
8
|
+
import type { HarnessContext } from "./harness.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A resolution that may carry executor argv. Trail snapshots accept
|
|
12
|
+
* both plain `Resolution` (from `registry.resolve()`) and
|
|
13
|
+
* `ExecutorResolution` (from `registry.resolveExecutor()`) — when argv
|
|
14
|
+
* is present, it's rendered in the snapshot to lock in the
|
|
15
|
+
* no-cmd-flash / node-prepend invariant on Windows.
|
|
16
|
+
*/
|
|
17
|
+
type MaybeExecutor = Resolution | ExecutorResolution;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Normalize a path for snapshot stability:
|
|
21
|
+
* - replace homedir with `<HOME>`
|
|
22
|
+
* - replace npm-root with `<NPM_ROOT>`
|
|
23
|
+
* - flip backslashes to forward slashes
|
|
24
|
+
* - collapse duplicate slashes
|
|
25
|
+
*/
|
|
26
|
+
export function normalizePath(
|
|
27
|
+
p: string | null | undefined,
|
|
28
|
+
ctx: Pick<HarnessContext, "homedir" | "npmRootGlobal">,
|
|
29
|
+
): string | null {
|
|
30
|
+
if (p == null) return null;
|
|
31
|
+
let out = p;
|
|
32
|
+
// Order matters: replace longer prefixes first.
|
|
33
|
+
const homeVariants = [ctx.homedir, ctx.homedir.replace(/\\/g, "/")];
|
|
34
|
+
const npmVariants = [ctx.npmRootGlobal, ctx.npmRootGlobal.replace(/\\/g, "/")];
|
|
35
|
+
for (const v of npmVariants) {
|
|
36
|
+
if (v) out = out.split(v).join("<NPM_ROOT>");
|
|
37
|
+
}
|
|
38
|
+
for (const v of homeVariants) {
|
|
39
|
+
if (v) out = out.split(v).join("<HOME>");
|
|
40
|
+
}
|
|
41
|
+
out = out.replace(/\\/g, "/");
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Trail snapshot. Primary assertion for ToolRegistry resolution tests.
|
|
47
|
+
* Output is a multiline string ready for `toMatchSnapshot()`.
|
|
48
|
+
*
|
|
49
|
+
* When passed an `ExecutorResolution` (from `registry.resolveExecutor`),
|
|
50
|
+
* renders an `argv:` section proving the `toArgv` transform. On
|
|
51
|
+
* Windows this locks in the no-cmd-flash invariant — argv for a
|
|
52
|
+
* resolved `.js` target MUST be `[<node.exe>, <cli.js>]`, not the
|
|
53
|
+
* `.cmd` shim that would allocate a console.
|
|
54
|
+
*/
|
|
55
|
+
export function snapshotTrail(
|
|
56
|
+
resolution: MaybeExecutor,
|
|
57
|
+
ctx: Pick<HarnessContext, "homedir" | "npmRootGlobal">,
|
|
58
|
+
): string {
|
|
59
|
+
const lines: string[] = [];
|
|
60
|
+
lines.push(`name: ${resolution.name}`);
|
|
61
|
+
lines.push(`ok: ${resolution.ok}`);
|
|
62
|
+
lines.push(`source: ${resolution.source ?? "—"}`);
|
|
63
|
+
lines.push(`path: ${normalizePath(resolution.path, ctx) ?? "—"}`);
|
|
64
|
+
lines.push("tried:");
|
|
65
|
+
for (const entry of resolution.tried) {
|
|
66
|
+
// Normalize paths embedded in the reason string too (e.g.
|
|
67
|
+
// "missing: <HOME>/.pi-dashboard/...") so snapshots are
|
|
68
|
+
// stable across OS CI runners.
|
|
69
|
+
const result = normalizePath(entry.result, ctx) ?? entry.result;
|
|
70
|
+
lines.push(` ${entry.strategy.padEnd(12)} ${result}`);
|
|
71
|
+
}
|
|
72
|
+
// argv section — present only when the caller invoked
|
|
73
|
+
// registry.resolveExecutor() (ExecutorResolution has `argv`).
|
|
74
|
+
const argv = (resolution as ExecutorResolution).argv;
|
|
75
|
+
if (Array.isArray(argv) && argv.length > 0) {
|
|
76
|
+
lines.push("argv:");
|
|
77
|
+
for (const a of argv) {
|
|
78
|
+
lines.push(` - ${normalizePath(a, ctx) ?? a}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return lines.join("\n");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Diff two settings-json snapshots: which entries were added, removed,
|
|
86
|
+
* or preserved.
|
|
87
|
+
*/
|
|
88
|
+
export function snapshotSettingsDelta(
|
|
89
|
+
before: { packages?: readonly string[] } | null,
|
|
90
|
+
after: { packages?: readonly string[] } | null,
|
|
91
|
+
ctx: Pick<HarnessContext, "homedir" | "npmRootGlobal">,
|
|
92
|
+
): string {
|
|
93
|
+
const beforeSet = new Set(before?.packages ?? []);
|
|
94
|
+
const afterSet = new Set(after?.packages ?? []);
|
|
95
|
+
const added = [...afterSet].filter((p) => !beforeSet.has(p));
|
|
96
|
+
const removed = [...beforeSet].filter((p) => !afterSet.has(p));
|
|
97
|
+
const preserved = [...beforeSet].filter((p) => afterSet.has(p));
|
|
98
|
+
|
|
99
|
+
const norm = (arr: string[]) =>
|
|
100
|
+
arr
|
|
101
|
+
.map((p) => normalizePath(p, ctx))
|
|
102
|
+
.filter((p): p is string => p !== null)
|
|
103
|
+
.sort();
|
|
104
|
+
|
|
105
|
+
const lines: string[] = [];
|
|
106
|
+
lines.push("settings-delta:");
|
|
107
|
+
lines.push(` added:`);
|
|
108
|
+
for (const p of norm(added)) lines.push(` + ${p}`);
|
|
109
|
+
if (added.length === 0) lines.push(" (none)");
|
|
110
|
+
lines.push(` removed:`);
|
|
111
|
+
for (const p of norm(removed)) lines.push(` - ${p}`);
|
|
112
|
+
if (removed.length === 0) lines.push(" (none)");
|
|
113
|
+
lines.push(` preserved:`);
|
|
114
|
+
for (const p of norm(preserved)) lines.push(` = ${p}`);
|
|
115
|
+
if (preserved.length === 0) lines.push(" (none)");
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Simple snapshot of a settings.json object as a sorted list. Used when
|
|
121
|
+
* only the "after" state matters.
|
|
122
|
+
*/
|
|
123
|
+
export function snapshotSettings(
|
|
124
|
+
settings: { packages?: readonly string[] } | null,
|
|
125
|
+
ctx: Pick<HarnessContext, "homedir" | "npmRootGlobal">,
|
|
126
|
+
): string {
|
|
127
|
+
if (!settings) return "settings.json: (absent)";
|
|
128
|
+
const packages = (settings.packages ?? [])
|
|
129
|
+
.map((p) => normalizePath(p, ctx))
|
|
130
|
+
.filter((p): p is string => p !== null)
|
|
131
|
+
.sort();
|
|
132
|
+
const lines: string[] = ["settings.json:", " packages:"];
|
|
133
|
+
for (const p of packages) lines.push(` - ${p}`);
|
|
134
|
+
if (packages.length === 0) lines.push(" (empty)");
|
|
135
|
+
return lines.join("\n");
|
|
136
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cube sweep — the fail-closed invariant. Every cell must be either
|
|
3
|
+
* registered (by a family-test file) or explicitly skipped (in
|
|
4
|
+
* `scenarios-skipped.ts`).
|
|
5
|
+
*
|
|
6
|
+
* New cells added to the enumeration — by extending PLATFORMS,
|
|
7
|
+
* DASH_LOCATIONS, PI_STATES, SETTINGS_STATES, or ENV_STATES in
|
|
8
|
+
* `scenarios.ts` — will break this test until a decision is made.
|
|
9
|
+
* This is intentional: the test forces every install mechanic to
|
|
10
|
+
* be categorized.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
import { sweepCube, formatUnclassifiedError } from "./cube.js";
|
|
14
|
+
// IMPORTANT: import the skip manifest BEFORE any family-test file, so
|
|
15
|
+
// the bulk skips are applied first and families override them via
|
|
16
|
+
// `register()`.
|
|
17
|
+
import "./scenarios-skipped.js";
|
|
18
|
+
// Then import family files so their top-level `register(cell, tag)`
|
|
19
|
+
// calls execute. Each family file clears the corresponding skip entry.
|
|
20
|
+
import "./families/index.js";
|
|
21
|
+
|
|
22
|
+
describe("bootstrap scenario cube", () => {
|
|
23
|
+
it("every cell is either registered or skipped (fail-closed)", () => {
|
|
24
|
+
const report = sweepCube();
|
|
25
|
+
if (report.unclassified.length > 0) {
|
|
26
|
+
throw new Error(formatUnclassifiedError(report));
|
|
27
|
+
}
|
|
28
|
+
expect(report.unclassified.length).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("cube has the expected shape (3 × 5 × 6 × 4 × 3 = 1080 cells)", () => {
|
|
32
|
+
const report = sweepCube();
|
|
33
|
+
expect(report.total).toBe(1080);
|
|
34
|
+
expect(report.registered + report.skipped).toBe(report.total);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("at least one family registered a cell (smoke)", () => {
|
|
38
|
+
const report = sweepCube();
|
|
39
|
+
expect(report.registered).toBeGreaterThan(0);
|
|
40
|
+
// Visible in test output so cube growth is trackable without
|
|
41
|
+
// digging into internals.
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.log(
|
|
44
|
+
`[cube] registered=${report.registered} skipped=${report.skipped} total=${report.total}`,
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cube sweep — fail-closed check that every cell is either registered
|
|
3
|
+
* or explicitly skipped with a reason.
|
|
4
|
+
*
|
|
5
|
+
* See openspec/changes/bootstrap-resolution-harness/design.md §5.
|
|
6
|
+
*/
|
|
7
|
+
import {
|
|
8
|
+
REGISTERED_SCENARIOS,
|
|
9
|
+
SKIPPED_SCENARIOS,
|
|
10
|
+
cellKey,
|
|
11
|
+
enumerateCube,
|
|
12
|
+
type ScenarioCell,
|
|
13
|
+
} from "./scenarios.js";
|
|
14
|
+
|
|
15
|
+
export interface CubeReport {
|
|
16
|
+
total: number;
|
|
17
|
+
registered: number;
|
|
18
|
+
skipped: number;
|
|
19
|
+
unclassified: ScenarioCell[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Sweep the cube. Returns a report with the list of cells that have
|
|
24
|
+
* no test and no skip marker.
|
|
25
|
+
*/
|
|
26
|
+
export function sweepCube(): CubeReport {
|
|
27
|
+
const all = enumerateCube();
|
|
28
|
+
const unclassified: ScenarioCell[] = [];
|
|
29
|
+
let registered = 0;
|
|
30
|
+
let skipped = 0;
|
|
31
|
+
for (const cell of all) {
|
|
32
|
+
const key = cellKey(cell);
|
|
33
|
+
if (REGISTERED_SCENARIOS.has(key)) {
|
|
34
|
+
registered++;
|
|
35
|
+
} else if (SKIPPED_SCENARIOS.has(key)) {
|
|
36
|
+
skipped++;
|
|
37
|
+
} else {
|
|
38
|
+
unclassified.push(cell);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { total: all.length, registered, skipped, unclassified };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Build a human-readable error message for unclassified cells.
|
|
46
|
+
* Truncates at a sensible length; full list printed to stderr.
|
|
47
|
+
*/
|
|
48
|
+
export function formatUnclassifiedError(report: CubeReport): string {
|
|
49
|
+
const lines: string[] = [];
|
|
50
|
+
lines.push(
|
|
51
|
+
`Cube sweep: ${report.unclassified.length} unclassified cell(s) ` +
|
|
52
|
+
`(${report.registered} registered, ${report.skipped} skipped, ${report.total} total).`,
|
|
53
|
+
);
|
|
54
|
+
lines.push("");
|
|
55
|
+
lines.push("Add each to either REGISTERED_SCENARIOS (via a family-test file) or");
|
|
56
|
+
lines.push('SKIPPED_SCENARIOS with a reason (via scenarios-skipped.ts).');
|
|
57
|
+
lines.push("");
|
|
58
|
+
const preview = report.unclassified.slice(0, 20);
|
|
59
|
+
for (const cell of preview) {
|
|
60
|
+
lines.push(` ${cellKey(cell)}`);
|
|
61
|
+
}
|
|
62
|
+
if (report.unclassified.length > preview.length) {
|
|
63
|
+
lines.push(` ... and ${report.unclassified.length - preview.length} more`);
|
|
64
|
+
}
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family A — electron-packaged > A1 — electron-fresh (bundled dashboard, no pi) > resolves nothing for pi (darwin) 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: false
|
|
6
|
+
source: —
|
|
7
|
+
path: —
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
11
|
+
where not found on PATH"
|
|
12
|
+
`;
|
|
13
|
+
|
|
14
|
+
exports[`Family A — electron-packaged > A1 — electron-fresh (bundled dashboard, no pi) > resolves nothing for pi (linux) 1`] = `
|
|
15
|
+
"name: pi
|
|
16
|
+
ok: false
|
|
17
|
+
source: —
|
|
18
|
+
path: —
|
|
19
|
+
tried:
|
|
20
|
+
override no override set
|
|
21
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
22
|
+
where not found on PATH"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
exports[`Family A — electron-packaged > A1 — electron-fresh (bundled dashboard, no pi) > resolves nothing for pi (win32) 1`] = `
|
|
26
|
+
"name: pi
|
|
27
|
+
ok: false
|
|
28
|
+
source: —
|
|
29
|
+
path: —
|
|
30
|
+
tried:
|
|
31
|
+
override no override set
|
|
32
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
33
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
34
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
35
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
36
|
+
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
37
|
+
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
38
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
39
|
+
where not found on PATH"
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
exports[`Family A — electron-packaged > A2 — electron-prewarmed (bundled + managed pi) > resolves pi via managed (darwin) 1`] = `
|
|
43
|
+
"name: pi
|
|
44
|
+
ok: true
|
|
45
|
+
source: managed
|
|
46
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
47
|
+
tried:
|
|
48
|
+
override no override set
|
|
49
|
+
managed ok"
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
exports[`Family A — electron-packaged > A2 — electron-prewarmed (bundled + managed pi) > resolves pi via managed (linux) 1`] = `
|
|
53
|
+
"name: pi
|
|
54
|
+
ok: true
|
|
55
|
+
source: managed
|
|
56
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
57
|
+
tried:
|
|
58
|
+
override no override set
|
|
59
|
+
managed ok"
|
|
60
|
+
`;
|
|
61
|
+
|
|
62
|
+
exports[`Family A — electron-packaged > A2 — electron-prewarmed (bundled + managed pi) > resolves pi via managed (win32) 1`] = `
|
|
63
|
+
"name: pi
|
|
64
|
+
ok: true
|
|
65
|
+
source: managed
|
|
66
|
+
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
67
|
+
tried:
|
|
68
|
+
override no override set
|
|
69
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
70
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
71
|
+
managed ok"
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
exports[`Family A — electron-packaged > A3 — electron + pre-existing global pi > global npm pi takes precedence over managed-bin fallback (linux) 1`] = `
|
|
75
|
+
"name: pi
|
|
76
|
+
ok: true
|
|
77
|
+
source: system
|
|
78
|
+
path: /usr/local/bin/pi
|
|
79
|
+
tried:
|
|
80
|
+
override no override set
|
|
81
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
82
|
+
where ok"
|
|
83
|
+
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family B — npm-global > B1 — npm-g dash-only (⚠ captures current Windows bug) > pi unresolved on darwin 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: false
|
|
6
|
+
source: —
|
|
7
|
+
path: —
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
11
|
+
where not found on PATH"
|
|
12
|
+
`;
|
|
13
|
+
|
|
14
|
+
exports[`Family B — npm-global > B1 — npm-g dash-only (⚠ captures current Windows bug) > pi unresolved on linux 1`] = `
|
|
15
|
+
"name: pi
|
|
16
|
+
ok: false
|
|
17
|
+
source: —
|
|
18
|
+
path: —
|
|
19
|
+
tried:
|
|
20
|
+
override no override set
|
|
21
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
22
|
+
where not found on PATH"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
exports[`Family B — npm-global > B1 — npm-g dash-only (⚠ captures current Windows bug) > pi unresolved on win32 1`] = `
|
|
26
|
+
"name: pi
|
|
27
|
+
ok: false
|
|
28
|
+
source: —
|
|
29
|
+
path: —
|
|
30
|
+
tried:
|
|
31
|
+
override no override set
|
|
32
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
33
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
34
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
35
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
36
|
+
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
37
|
+
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
38
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
39
|
+
where not found on PATH"
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
exports[`Family B — npm-global > B2 — npm-g full (pi + openspec via global npm) > pi resolves via npm-global on darwin 1`] = `
|
|
43
|
+
"name: pi
|
|
44
|
+
ok: true
|
|
45
|
+
source: system
|
|
46
|
+
path: /usr/local/bin/pi
|
|
47
|
+
tried:
|
|
48
|
+
override no override set
|
|
49
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
50
|
+
where ok"
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
exports[`Family B — npm-global > B2 — npm-g full (pi + openspec via global npm) > pi resolves via npm-global on linux 1`] = `
|
|
54
|
+
"name: pi
|
|
55
|
+
ok: true
|
|
56
|
+
source: system
|
|
57
|
+
path: /usr/local/bin/pi
|
|
58
|
+
tried:
|
|
59
|
+
override no override set
|
|
60
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
61
|
+
where ok"
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
exports[`Family B — npm-global > B2 — npm-g full (pi + openspec via global npm) > pi resolves via npm-global on win32 (with node.exe toArgv) 1`] = `
|
|
65
|
+
"name: pi
|
|
66
|
+
ok: true
|
|
67
|
+
source: npm-global
|
|
68
|
+
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
69
|
+
tried:
|
|
70
|
+
override no override set
|
|
71
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
72
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
73
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
74
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
75
|
+
npm-global ok
|
|
76
|
+
argv:
|
|
77
|
+
- C:/Program Files/nodejs/node.exe
|
|
78
|
+
- <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js"
|
|
79
|
+
`;
|
|
80
|
+
|
|
81
|
+
exports[`Family B — npm-global > B3 — npm-g pi-installed-first (bridge needs registration) > settings.json present but lacks bridge entry (linux) 1`] = `
|
|
82
|
+
"settings-delta:
|
|
83
|
+
added:
|
|
84
|
+
(none)
|
|
85
|
+
removed:
|
|
86
|
+
(none)
|
|
87
|
+
preserved:
|
|
88
|
+
(none)"
|
|
89
|
+
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/c-dev-monorepo.test.ts.snap
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family C — dev monorepo > C1 — posix (managed/where chain, no bare-import for pi) > pi chain runs on darwin 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: false
|
|
6
|
+
source: —
|
|
7
|
+
path: —
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
11
|
+
where not found on PATH"
|
|
12
|
+
`;
|
|
13
|
+
|
|
14
|
+
exports[`Family C — dev monorepo > C1 — posix (managed/where chain, no bare-import for pi) > pi chain runs on linux 1`] = `
|
|
15
|
+
"name: pi
|
|
16
|
+
ok: false
|
|
17
|
+
source: —
|
|
18
|
+
path: —
|
|
19
|
+
tried:
|
|
20
|
+
override no override set
|
|
21
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
22
|
+
where not found on PATH"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
exports[`Family C — dev monorepo > C2 — win32 (bare-import from workspace) > resolves pi via workspace bare-import 1`] = `
|
|
26
|
+
"name: pi
|
|
27
|
+
ok: true
|
|
28
|
+
source: bare-import
|
|
29
|
+
path: dist/cli.js
|
|
30
|
+
tried:
|
|
31
|
+
override no override set
|
|
32
|
+
bare-import ok"
|
|
33
|
+
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/d-overrides.test.ts.snap
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family D — overrides > D1 — override-valid: pi resolves via override 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: true
|
|
6
|
+
source: override
|
|
7
|
+
path: /opt/custom/bin/pi
|
|
8
|
+
tried:
|
|
9
|
+
override ok"
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
exports[`Family D — overrides > D2 — override-invalid: path doesn't exist, chain falls through 1`] = `
|
|
13
|
+
"name: pi
|
|
14
|
+
ok: true
|
|
15
|
+
source: managed
|
|
16
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
17
|
+
tried:
|
|
18
|
+
override invalid: path does not exist: /nonexistent/broken/pi
|
|
19
|
+
managed ok"
|
|
20
|
+
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family E — stale / partial > E1 — stale managed pi (old version) > current strategies resolve without version gating (darwin) 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: true
|
|
6
|
+
source: managed
|
|
7
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
managed ok"
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
exports[`Family E — stale / partial > E1 — stale managed pi (old version) > current strategies resolve without version gating (linux) 1`] = `
|
|
14
|
+
"name: pi
|
|
15
|
+
ok: true
|
|
16
|
+
source: managed
|
|
17
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
18
|
+
tried:
|
|
19
|
+
override no override set
|
|
20
|
+
managed ok"
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
exports[`Family E — stale / partial > E1 — stale managed pi (old version) > current strategies resolve without version gating (win32) 1`] = `
|
|
24
|
+
"name: pi
|
|
25
|
+
ok: true
|
|
26
|
+
source: managed
|
|
27
|
+
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
28
|
+
tried:
|
|
29
|
+
override no override set
|
|
30
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
31
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
32
|
+
managed ok"
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
exports[`Family E — stale / partial > E2 — partial managed install (package.json, no dist) > strategy skips when entry file absent (linux) 1`] = `
|
|
36
|
+
"name: pi
|
|
37
|
+
ok: false
|
|
38
|
+
source: —
|
|
39
|
+
path: —
|
|
40
|
+
tried:
|
|
41
|
+
override no override set
|
|
42
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
43
|
+
where not found on PATH"
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
exports[`Family E — stale / partial > E2 — partial managed install (package.json, no dist) > strategy skips when entry file absent (win32) 1`] = `
|
|
47
|
+
"name: pi
|
|
48
|
+
ok: false
|
|
49
|
+
source: —
|
|
50
|
+
path: —
|
|
51
|
+
tried:
|
|
52
|
+
override no override set
|
|
53
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
54
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
55
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
56
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
57
|
+
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
58
|
+
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
59
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
60
|
+
where not found on PATH"
|
|
61
|
+
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family F — cwd variants > F1 — resolves normally with Program Files (x86) cwd (win32) 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: true
|
|
6
|
+
source: managed
|
|
7
|
+
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
11
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
12
|
+
managed ok"
|
|
13
|
+
`;
|
|
14
|
+
|
|
15
|
+
exports[`Family F — cwd variants > F1 — resolves normally with spaces in cwd (linux) 1`] = `
|
|
16
|
+
"name: pi
|
|
17
|
+
ok: true
|
|
18
|
+
source: managed
|
|
19
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
20
|
+
tried:
|
|
21
|
+
override no override set
|
|
22
|
+
managed ok"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
exports[`Family F — cwd variants > F2 — resolves with Greek/Cyrillic/emoji in cwd 1`] = `
|
|
26
|
+
"name: pi
|
|
27
|
+
ok: true
|
|
28
|
+
source: managed
|
|
29
|
+
path: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
30
|
+
tried:
|
|
31
|
+
override no override set
|
|
32
|
+
managed ok"
|
|
33
|
+
`;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family G — Windows specifics > G1 — pi.cmd resolved + toArgv prepends node.exe (no-cmd-flash) 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: true
|
|
6
|
+
source: managed
|
|
7
|
+
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
11
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
12
|
+
managed ok
|
|
13
|
+
argv:
|
|
14
|
+
- C:/Program Files/nodejs/node.exe
|
|
15
|
+
- <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js"
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
exports[`Family G — Windows specifics > G2 — npm-g at %APPDATA%\\Roaming\\npm (argv prepends node.exe) 1`] = `
|
|
19
|
+
"name: pi
|
|
20
|
+
ok: true
|
|
21
|
+
source: npm-global
|
|
22
|
+
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
23
|
+
tried:
|
|
24
|
+
override no override set
|
|
25
|
+
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
26
|
+
bare-import cannot resolve @oh-my-pi/pi-coding-agent/package.json
|
|
27
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
28
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
29
|
+
npm-global ok
|
|
30
|
+
argv:
|
|
31
|
+
- C:/Program Files/nodejs/node.exe
|
|
32
|
+
- <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js"
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
exports[`Family G — Windows specifics > G4 — node.exe at C:\\Program Files\\nodejs\\node.exe 1`] = `
|
|
36
|
+
"name: node
|
|
37
|
+
ok: true
|
|
38
|
+
source: system
|
|
39
|
+
path: C:/Program Files/nodejs/node.exe
|
|
40
|
+
tried:
|
|
41
|
+
override no override set
|
|
42
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/node.cmd
|
|
43
|
+
where ok
|
|
44
|
+
argv:
|
|
45
|
+
- C:/Program Files/nodejs/node.exe"
|
|
46
|
+
`;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Family J — minimal PATH > J1 — GUI-launched minimal PATH: pi does NOT resolve on posix (limitation) 1`] = `
|
|
4
|
+
"name: pi
|
|
5
|
+
ok: false
|
|
6
|
+
source: —
|
|
7
|
+
path: —
|
|
8
|
+
tried:
|
|
9
|
+
override no override set
|
|
10
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi
|
|
11
|
+
where not found on PATH"
|
|
12
|
+
`;
|