* fix(app): reorder settings sections for better grouping * feat(app): add setup hint and paseo.sh link on mobile welcome screen New app store users land on the welcome screen with no context. Show a brief explanation that the desktop app or server is needed, plus a link to paseo.sh — only on mobile (iOS/Android), hidden on web/desktop. * docs(release): add pre-release sanity check and clarify changelog scope Add a Codex 5.4 review step before cutting releases to catch breaking changes and backward-compatibility issues (mobile apps lag behind desktop/daemon updates). Clarify that the changelog always covers the delta from the previous stable release, not from the last RC. * feat(cli): support `paseo .` to open desktop app with project directory Similar to VS Code's `code .`, users can now type `paseo .` or `paseo <path>` to open the Paseo desktop app with that directory as the active project. - Desktop shims detect path-like first args and launch Electron in GUI mode with --open-project instead of CLI passthrough mode - Electron main process parses --open-project, sends IPC event to renderer, and forwards via second-instance for the already-running case - Renderer OpenProjectListener reuses existing openProject() RPC flow - Standalone CLI discovers the desktop app per platform and spawns it
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
#!/usr/bin/env npx zx
|
|
|
|
import assert from "node:assert/strict";
|
|
import { join } from "node:path";
|
|
import { tmpdir } from "node:os";
|
|
import { isPathLikeArg, openDesktopWithProject } from "../src/commands/open.ts";
|
|
|
|
console.log("📋 Phase 32: Open Project CLI Tests\n");
|
|
|
|
console.log(" Testing path-like detection exports...");
|
|
assert.equal(isPathLikeArg("."), true);
|
|
assert.equal(isPathLikeArg("./app"), true);
|
|
assert.equal(isPathLikeArg("/tmp/app"), true);
|
|
assert.equal(isPathLikeArg("~/app"), true);
|
|
assert.equal(isPathLikeArg("run"), false);
|
|
assert.equal(isPathLikeArg("foo"), false);
|
|
console.log(" ✅ path-like detection matches the expected prefixes");
|
|
|
|
console.log(" Testing nonexistent project path errors...");
|
|
const missingProject = join(tmpdir(), "paseo-open-project-missing");
|
|
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
const stderrChunks: string[] = [];
|
|
process.stderr.write = ((chunk: string | Uint8Array) => {
|
|
stderrChunks.push(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8"));
|
|
return true;
|
|
}) as typeof process.stderr.write;
|
|
|
|
const previousExitCode = process.exitCode;
|
|
process.exitCode = undefined;
|
|
|
|
await openDesktopWithProject(missingProject);
|
|
|
|
process.stderr.write = originalWrite;
|
|
assert.equal(process.exitCode, 1);
|
|
assert.match(stderrChunks.join(""), /Path does not exist:/);
|
|
process.exitCode = previousExitCode;
|
|
console.log(" ✅ nonexistent paths fail with a helpful error");
|
|
|
|
console.log("\n✅ Phase 32: Open Project CLI Tests PASSED");
|