ryugi-artifacts 1.44.1 → 1.45.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/cli.cjs +79 -38
- package/dist/server.cjs +15 -7
- package/dist/viewer/ArtboardLayout-CEMDFlf8.js +4 -0
- package/dist/viewer/{Canvas-BGsWPJ-x.js → Canvas-rA-WWhK0.js} +1 -1
- package/dist/viewer/{PreviewLayout-C8gcd1VB.js → PreviewLayout-D1TSafCI.js} +2 -2
- package/dist/viewer/index.js +2 -2
- package/dist/viewer/preview.html +2 -2
- package/dist/viewer/preview.js +1 -1
- package/dist/viewer/view-D7nULBen.js +1 -0
- package/dist/viewer-lib/{Canvas-CNqEckLj.js → Canvas-OcYUm3tP.js} +1 -1
- package/dist/viewer-lib/{PreviewView-BD64tt21.js → PreviewView-Clnb4pmR.js} +55 -45
- package/dist/viewer-lib/core.js +2 -2
- package/dist/viewer-lib/index.js +1259 -1229
- package/dist/viewer-lib/types/src/viewer/hooks/useBoardTiers.d.ts +2 -1
- package/dist/viewer-lib/types/src/viewer/layouts/PhoneArtboard.d.ts +2 -1
- package/dist/viewer-lib/types/src/viewer/lib/board-tiers.d.ts +5 -3
- package/dist/viewer-lib/types/src/viewer/lib/hover-dwell.d.ts +1 -1
- package/dist/viewer-lib/types/src/viewer/lib/live-limit.d.ts +33 -0
- package/dist/viewer-lib/types/src/viewer/lib/tier-controller.d.ts +1 -0
- package/package.json +1 -1
- package/dist/viewer/ArtboardLayout-1sSly5VR.js +0 -4
- package/dist/viewer/view-V7XcFKme.js +0 -1
package/dist/cli.cjs
CHANGED
|
@@ -15419,8 +15419,8 @@ ${value.url}`;
|
|
|
15419
15419
|
// src/cli/start.ts
|
|
15420
15420
|
var import_node_child_process4 = require("node:child_process");
|
|
15421
15421
|
var import_node_crypto3 = __toESM(require("node:crypto"), 1);
|
|
15422
|
-
var
|
|
15423
|
-
var
|
|
15422
|
+
var import_node_fs14 = __toESM(require("node:fs"), 1);
|
|
15423
|
+
var import_node_path12 = __toESM(require("node:path"), 1);
|
|
15424
15424
|
var import_node_readline2 = __toESM(require("node:readline"), 1);
|
|
15425
15425
|
|
|
15426
15426
|
// src/server/artifact-address.ts
|
|
@@ -15528,6 +15528,35 @@ async function openBrowser(url, aliases2 = []) {
|
|
|
15528
15528
|
if (launcher) await execute(launcher.bin, launcher.args);
|
|
15529
15529
|
}
|
|
15530
15530
|
|
|
15531
|
+
// src/cli/login-hint.ts
|
|
15532
|
+
var import_node_fs13 = __toESM(require("node:fs"), 1);
|
|
15533
|
+
var import_node_os7 = __toESM(require("node:os"), 1);
|
|
15534
|
+
var import_node_path11 = __toESM(require("node:path"), 1);
|
|
15535
|
+
function takeLoginHint(projectDir) {
|
|
15536
|
+
const file = credentialsFile(process.env, process.platform, import_node_os7.default.homedir());
|
|
15537
|
+
const origin = (process.env.RYUGI_CLOUD_ORIGIN || "https://ryugi.innei.dev").replace(/\/+$/, "");
|
|
15538
|
+
if (readCredentials(file, origin)) return;
|
|
15539
|
+
const marker = import_node_path11.default.join(import_node_path11.default.dirname(file), "login-hint-shown");
|
|
15540
|
+
try {
|
|
15541
|
+
import_node_fs13.default.mkdirSync(import_node_path11.default.dirname(marker), { recursive: true, mode: 448 });
|
|
15542
|
+
import_node_fs13.default.writeFileSync(marker, "1\n", { flag: "wx", mode: 384 });
|
|
15543
|
+
} catch (error) {
|
|
15544
|
+
if (error.code === "EEXIST") return;
|
|
15545
|
+
}
|
|
15546
|
+
return {
|
|
15547
|
+
message: "Recommended: sign in to Ryugi Cloud to share artifacts and review them from other devices. Sign-in is optional; local work can continue.",
|
|
15548
|
+
command: `${process.env.RYUGI_ARTIFACTS_COMMAND || "npx ryugi-artifacts"} publish --login`,
|
|
15549
|
+
projectDir,
|
|
15550
|
+
agentInstruction: "Briefly pass this recommendation to your human partner and offer to run command in projectDir to obtain the sign-in URL. Continue the current task without waiting for sign-in."
|
|
15551
|
+
};
|
|
15552
|
+
}
|
|
15553
|
+
function loginHintText(value) {
|
|
15554
|
+
if (!value) return;
|
|
15555
|
+
const hint = value;
|
|
15556
|
+
return `${hint.message}
|
|
15557
|
+
In ${hint.projectDir}, run \`${hint.command}\` to sign in.`;
|
|
15558
|
+
}
|
|
15559
|
+
|
|
15531
15560
|
// src/cli/start.ts
|
|
15532
15561
|
var windowsLike = () => process.platform === "win32";
|
|
15533
15562
|
function withLink(info, artifact, reused) {
|
|
@@ -15565,13 +15594,13 @@ async function withCloudLink(out, artifact) {
|
|
|
15565
15594
|
async function acquireLock(lock) {
|
|
15566
15595
|
for (let attempt = 0; attempt < 150; attempt++) {
|
|
15567
15596
|
try {
|
|
15568
|
-
|
|
15597
|
+
import_node_fs14.default.mkdirSync(lock);
|
|
15569
15598
|
return true;
|
|
15570
15599
|
} catch {
|
|
15571
15600
|
}
|
|
15572
15601
|
try {
|
|
15573
|
-
if (Date.now() -
|
|
15574
|
-
|
|
15602
|
+
if (Date.now() - import_node_fs14.default.statSync(lock).mtimeMs > 6e4) {
|
|
15603
|
+
import_node_fs14.default.rmdirSync(lock);
|
|
15575
15604
|
continue;
|
|
15576
15605
|
}
|
|
15577
15606
|
} catch {
|
|
@@ -15601,18 +15630,18 @@ function registerOwner(paths) {
|
|
|
15601
15630
|
const owner = ownerPid();
|
|
15602
15631
|
if (owner) owners.add(owner);
|
|
15603
15632
|
const tmp = `${paths.owners}.${process.pid}`;
|
|
15604
|
-
|
|
15633
|
+
import_node_fs14.default.writeFileSync(
|
|
15605
15634
|
tmp,
|
|
15606
15635
|
[...owners].sort((a, b) => a - b).map((pid) => `${pid}
|
|
15607
15636
|
`).join("")
|
|
15608
15637
|
);
|
|
15609
|
-
|
|
15638
|
+
import_node_fs14.default.renameSync(tmp, paths.owners);
|
|
15610
15639
|
}
|
|
15611
15640
|
function recordAgent(paths) {
|
|
15612
15641
|
const markers = Object.fromEntries(
|
|
15613
15642
|
AGENT_MARKERS.flatMap((key2) => process.env[key2] ? [[key2, process.env[key2]]] : [])
|
|
15614
15643
|
);
|
|
15615
|
-
if (Object.keys(markers).length)
|
|
15644
|
+
if (Object.keys(markers).length) import_node_fs14.default.writeFileSync(paths.agent, `${JSON.stringify(markers)}
|
|
15616
15645
|
`);
|
|
15617
15646
|
}
|
|
15618
15647
|
async function replace2(pid, paths) {
|
|
@@ -15655,10 +15684,14 @@ async function start(options, emit) {
|
|
|
15655
15684
|
const foreground = options.foreground || !options.background && (!!process.env.CODEX_CI || windowsLike());
|
|
15656
15685
|
process.umask(63);
|
|
15657
15686
|
const paths = projectPaths(options.projectDir);
|
|
15658
|
-
|
|
15659
|
-
|
|
15660
|
-
|
|
15661
|
-
|
|
15687
|
+
const emitStarted = (out) => {
|
|
15688
|
+
const loginHint = takeLoginHint(paths.project);
|
|
15689
|
+
emit(loginHint ? { ...out, loginHint } : out);
|
|
15690
|
+
};
|
|
15691
|
+
import_node_fs14.default.mkdirSync(paths.state, { recursive: true });
|
|
15692
|
+
if (!import_node_fs14.default.existsSync(import_node_path12.default.join(paths.state, ".gitignore")))
|
|
15693
|
+
import_node_fs14.default.writeFileSync(import_node_path12.default.join(paths.state, ".gitignore"), "*\n");
|
|
15694
|
+
const server = import_node_path12.default.join(__dirname, "server.cjs");
|
|
15662
15695
|
const version = process.env.RYUGI_ARTIFACTS_VERSION ?? "";
|
|
15663
15696
|
if (!await acquireLock(paths.lock))
|
|
15664
15697
|
throw new CliError("Another start for this project is still starting; retry in a moment");
|
|
@@ -15667,7 +15700,7 @@ async function start(options, emit) {
|
|
|
15667
15700
|
if (!locked) return;
|
|
15668
15701
|
locked = false;
|
|
15669
15702
|
try {
|
|
15670
|
-
|
|
15703
|
+
import_node_fs14.default.rmdirSync(paths.lock);
|
|
15671
15704
|
} catch {
|
|
15672
15705
|
}
|
|
15673
15706
|
};
|
|
@@ -15682,7 +15715,7 @@ async function start(options, emit) {
|
|
|
15682
15715
|
withLink(JSON.parse(info), options.artifact, true),
|
|
15683
15716
|
options.artifact
|
|
15684
15717
|
);
|
|
15685
|
-
|
|
15718
|
+
emitStarted(out);
|
|
15686
15719
|
if (process.platform === "darwin" && options.open && options.artifact && !process.env.ARTIFACTS_OPEN_CMD) {
|
|
15687
15720
|
const local = out.link;
|
|
15688
15721
|
await openBrowser(typeof out.cloudLink === "string" ? out.cloudLink : local, [
|
|
@@ -15697,17 +15730,17 @@ async function start(options, emit) {
|
|
|
15697
15730
|
}
|
|
15698
15731
|
registerOwner(paths);
|
|
15699
15732
|
recordAgent(paths);
|
|
15700
|
-
|
|
15733
|
+
import_node_fs14.default.rmSync(paths.info, { force: true });
|
|
15701
15734
|
const id = import_node_crypto3.default.randomBytes(24).toString("hex");
|
|
15702
|
-
|
|
15735
|
+
import_node_fs14.default.writeFileSync(paths.serverId, `${id}
|
|
15703
15736
|
`);
|
|
15704
|
-
|
|
15737
|
+
import_node_fs14.default.writeFileSync(paths.version, `${version}
|
|
15705
15738
|
`);
|
|
15706
15739
|
const env = serverEnv(paths, options);
|
|
15707
15740
|
const args = [server, `--artifacts-server-id=${id}`];
|
|
15708
15741
|
if (foreground) {
|
|
15709
15742
|
const child2 = (0, import_node_child_process4.spawn)(process.execPath, args, { env, stdio: ["ignore", "pipe", "inherit"] });
|
|
15710
|
-
|
|
15743
|
+
import_node_fs14.default.writeFileSync(paths.pid, `${child2.pid}
|
|
15711
15744
|
`);
|
|
15712
15745
|
for (const signal of ["SIGINT", "SIGTERM"])
|
|
15713
15746
|
process.on(signal, () => child2.kill("SIGTERM"));
|
|
@@ -15722,25 +15755,27 @@ async function start(options, emit) {
|
|
|
15722
15755
|
}
|
|
15723
15756
|
if (value.type !== "server-started") emit(value);
|
|
15724
15757
|
else
|
|
15725
|
-
void withCloudLink(withLink(value, options.artifact, false), options.artifact).then(
|
|
15758
|
+
void withCloudLink(withLink(value, options.artifact, false), options.artifact).then(
|
|
15759
|
+
emitStarted
|
|
15760
|
+
);
|
|
15726
15761
|
});
|
|
15727
15762
|
const exited = new Promise(
|
|
15728
15763
|
(resolve) => child2.on("close", (code) => resolve(code ?? 1))
|
|
15729
15764
|
);
|
|
15730
|
-
for (let waited = 0; waited < 5e3 && !
|
|
15765
|
+
for (let waited = 0; waited < 5e3 && !import_node_fs14.default.existsSync(paths.info); waited += 100)
|
|
15731
15766
|
await sleep(100);
|
|
15732
15767
|
unlock();
|
|
15733
15768
|
return await exited;
|
|
15734
15769
|
}
|
|
15735
|
-
const log =
|
|
15770
|
+
const log = import_node_fs14.default.openSync(paths.log, "w");
|
|
15736
15771
|
const child = (0, import_node_child_process4.spawn)(process.execPath, args, {
|
|
15737
15772
|
env,
|
|
15738
15773
|
detached: true,
|
|
15739
15774
|
stdio: ["ignore", log, log]
|
|
15740
15775
|
});
|
|
15741
|
-
|
|
15776
|
+
import_node_fs14.default.closeSync(log);
|
|
15742
15777
|
child.unref();
|
|
15743
|
-
|
|
15778
|
+
import_node_fs14.default.writeFileSync(paths.pid, `${child.pid}
|
|
15744
15779
|
`);
|
|
15745
15780
|
for (let waited = 0; waited < 5e3; waited += 100) {
|
|
15746
15781
|
const lines = (readText(paths.log) ?? "").split("\n");
|
|
@@ -15753,7 +15788,7 @@ async function start(options, emit) {
|
|
|
15753
15788
|
);
|
|
15754
15789
|
await sleep(100);
|
|
15755
15790
|
}
|
|
15756
|
-
|
|
15791
|
+
emitStarted(
|
|
15757
15792
|
await withCloudLink(
|
|
15758
15793
|
withLink(JSON.parse(started), options.artifact, false),
|
|
15759
15794
|
options.artifact
|
|
@@ -15825,13 +15860,13 @@ var startCommand = {
|
|
|
15825
15860
|
|
|
15826
15861
|
// src/cli/update.ts
|
|
15827
15862
|
var import_node_child_process6 = require("node:child_process");
|
|
15828
|
-
var
|
|
15863
|
+
var import_node_fs16 = __toESM(require("node:fs"), 1);
|
|
15829
15864
|
|
|
15830
15865
|
// src/cli/update-hint.ts
|
|
15831
15866
|
var import_node_child_process5 = require("node:child_process");
|
|
15832
|
-
var
|
|
15833
|
-
var
|
|
15834
|
-
var
|
|
15867
|
+
var import_node_fs15 = __toESM(require("node:fs"), 1);
|
|
15868
|
+
var import_node_os8 = __toESM(require("node:os"), 1);
|
|
15869
|
+
var import_node_path13 = __toESM(require("node:path"), 1);
|
|
15835
15870
|
var CHECK_MS = 24 * 60 * 60 * 1e3;
|
|
15836
15871
|
var RELEASE = /^\d+\.\d+\.\d+$/;
|
|
15837
15872
|
function newer(a, b) {
|
|
@@ -15848,15 +15883,15 @@ function updateCheck({ current, cached, now, env, tty, json, argv = [] }) {
|
|
|
15848
15883
|
const hint = !quiet && RELEASE.test(current) && RELEASE.test(latest) && newer(latest, current) ? `ryugi-artifacts ${latest} is available (you have ${current}). Run \`ryugi-artifacts update\` to install it.` : null;
|
|
15849
15884
|
return { hint, refresh: !cached || now - cached.checkedAt >= CHECK_MS };
|
|
15850
15885
|
}
|
|
15851
|
-
var latestFile = (env) =>
|
|
15852
|
-
env.XDG_CACHE_HOME ||
|
|
15886
|
+
var latestFile = (env) => import_node_path13.default.join(
|
|
15887
|
+
env.XDG_CACHE_HOME || import_node_path13.default.join(import_node_os8.default.homedir(), ".cache"),
|
|
15853
15888
|
"ryugi",
|
|
15854
15889
|
"artifacts",
|
|
15855
15890
|
"latest.json"
|
|
15856
15891
|
);
|
|
15857
15892
|
function readLatest(file) {
|
|
15858
15893
|
try {
|
|
15859
|
-
const { version, checkedAt } = JSON.parse(
|
|
15894
|
+
const { version, checkedAt } = JSON.parse(import_node_fs15.default.readFileSync(file, "utf8"));
|
|
15860
15895
|
return typeof version === "string" && typeof checkedAt === "number" ? { version, checkedAt } : null;
|
|
15861
15896
|
} catch {
|
|
15862
15897
|
return null;
|
|
@@ -15864,10 +15899,10 @@ function readLatest(file) {
|
|
|
15864
15899
|
}
|
|
15865
15900
|
function writeLatest(file, version, checkedAt) {
|
|
15866
15901
|
try {
|
|
15867
|
-
|
|
15902
|
+
import_node_fs15.default.mkdirSync(import_node_path13.default.dirname(file), { recursive: true });
|
|
15868
15903
|
const tmp = `${file}.${process.pid}`;
|
|
15869
|
-
|
|
15870
|
-
|
|
15904
|
+
import_node_fs15.default.writeFileSync(tmp, JSON.stringify({ version, checkedAt }));
|
|
15905
|
+
import_node_fs15.default.renameSync(tmp, file);
|
|
15871
15906
|
} catch {
|
|
15872
15907
|
}
|
|
15873
15908
|
}
|
|
@@ -15930,7 +15965,7 @@ function detectInstall(file, env) {
|
|
|
15930
15965
|
if (env.RYUGI_ARTIFACTS_COMMAND) return { kind: "launcher" };
|
|
15931
15966
|
let real = file;
|
|
15932
15967
|
try {
|
|
15933
|
-
real =
|
|
15968
|
+
real = import_node_fs16.default.realpathSync(file);
|
|
15934
15969
|
} catch {
|
|
15935
15970
|
}
|
|
15936
15971
|
const normalized = real.replaceAll("\\", "/").toLowerCase();
|
|
@@ -16025,7 +16060,7 @@ var updateCommand = {
|
|
|
16025
16060
|
},
|
|
16026
16061
|
run: ({ values }, emit) => update2(
|
|
16027
16062
|
{
|
|
16028
|
-
current: "1.
|
|
16063
|
+
current: "1.45.0",
|
|
16029
16064
|
file: __filename,
|
|
16030
16065
|
env: process.env,
|
|
16031
16066
|
registry: process.env.npm_config_registry || "https://registry.npmjs.org/",
|
|
@@ -16095,6 +16130,8 @@ async function browse(argv) {
|
|
|
16095
16130
|
}
|
|
16096
16131
|
if (value.type !== "server-started") return;
|
|
16097
16132
|
console.info(value.url);
|
|
16133
|
+
const hint = loginHintText(value.loginHint);
|
|
16134
|
+
if (hint) console.info(hint);
|
|
16098
16135
|
if (!value.reused) console.info("Press Ctrl+C to stop the server.");
|
|
16099
16136
|
if (!values["no-open"]) openBrowser2(value.url);
|
|
16100
16137
|
}
|
|
@@ -16104,11 +16141,15 @@ async function main(argv) {
|
|
|
16104
16141
|
const [name, ...rest] = argv;
|
|
16105
16142
|
const command = COMMANDS.find((candidate) => candidate.name === name);
|
|
16106
16143
|
const json = argv.includes("--json") || !command?.explicitJson && !process.stdout.isTTY;
|
|
16107
|
-
notifyUpdate("1.
|
|
16144
|
+
notifyUpdate("1.45.0", json, argv);
|
|
16108
16145
|
const emit = (value) => {
|
|
16109
16146
|
const line = json ? JSON.stringify(value) : text(value);
|
|
16110
16147
|
if (!json && typeof value.error === "string") console.error(line);
|
|
16111
16148
|
else console.info(line);
|
|
16149
|
+
if (!json) {
|
|
16150
|
+
const hint = loginHintText(value.loginHint);
|
|
16151
|
+
if (hint) console.info(hint);
|
|
16152
|
+
}
|
|
16112
16153
|
};
|
|
16113
16154
|
try {
|
|
16114
16155
|
if (command) {
|
|
@@ -16119,7 +16160,7 @@ async function main(argv) {
|
|
|
16119
16160
|
return await command.run(parse(rest, command.options, command.positionals), emit);
|
|
16120
16161
|
}
|
|
16121
16162
|
if (name === "--version" || name === "-v") {
|
|
16122
|
-
console.info("1.
|
|
16163
|
+
console.info("1.45.0");
|
|
16123
16164
|
return 0;
|
|
16124
16165
|
}
|
|
16125
16166
|
if (name === "--help" || name === "-h") {
|
package/dist/server.cjs
CHANGED
|
@@ -5176,7 +5176,7 @@ var import_node_os2 = __toESM(require("node:os"), 1);
|
|
|
5176
5176
|
var import_node_path23 = __toESM(require("node:path"), 1);
|
|
5177
5177
|
|
|
5178
5178
|
// package.json
|
|
5179
|
-
var version = "1.
|
|
5179
|
+
var version = "1.45.0";
|
|
5180
5180
|
|
|
5181
5181
|
// src/server/app.ts
|
|
5182
5182
|
var import_node_fs24 = __toESM(require("node:fs"), 1);
|
|
@@ -6314,10 +6314,14 @@ function installSnapshot(win, serialize) {
|
|
|
6314
6314
|
const post = (type, data = {}) => win.parent.postMessage({ type: `ryugi:board:${type}`, ...data }, "*");
|
|
6315
6315
|
const frame = () => new Promise((resolve) => win.requestAnimationFrame(() => resolve()));
|
|
6316
6316
|
const settle = async () => {
|
|
6317
|
-
|
|
6318
|
-
|
|
6319
|
-
|
|
6320
|
-
|
|
6317
|
+
const fonts = doc.fonts?.ready;
|
|
6318
|
+
if (fonts)
|
|
6319
|
+
await Promise.race([
|
|
6320
|
+
fonts.catch(() => void 0),
|
|
6321
|
+
new Promise((resolve) => {
|
|
6322
|
+
win.setTimeout(resolve, 800);
|
|
6323
|
+
})
|
|
6324
|
+
]);
|
|
6321
6325
|
for (let round = 0; round < 20; round++) {
|
|
6322
6326
|
const running = (doc.getAnimations?.() ?? []).filter(
|
|
6323
6327
|
(animation) => animation.playState === "running" && animation.effect?.getComputedTiming().endTime !== Infinity
|
|
@@ -6325,8 +6329,12 @@ function installSnapshot(win, serialize) {
|
|
|
6325
6329
|
if (!running.length) break;
|
|
6326
6330
|
await Promise.all(running.map((animation) => animation.finished.catch(() => void 0)));
|
|
6327
6331
|
}
|
|
6328
|
-
await
|
|
6329
|
-
|
|
6332
|
+
await Promise.race([
|
|
6333
|
+
Promise.all([frame(), frame()]),
|
|
6334
|
+
new Promise((resolve) => {
|
|
6335
|
+
win.setTimeout(resolve, 100);
|
|
6336
|
+
})
|
|
6337
|
+
]);
|
|
6330
6338
|
post("ready");
|
|
6331
6339
|
};
|
|
6332
6340
|
if (doc.readyState === "complete") void settle();
|