contactsheet 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -54,6 +54,14 @@ npx contactsheet
54
54
  flags:`--port`(外壳端口,默认 5199)、`--target`(你的 dev server,默认 `http://localhost:3000`)、
55
55
  `--design-dir`(画板目录,默认 `design`)。命令也可以简写成 `csheet`。
56
56
 
57
+ **端口被占了怎么办**(都不用你手动排查):
58
+
59
+ - `init` 会读你 package.json 的 dev script——`next dev -p 3100` 这种写法会被认出来,target 自动写成 3100;
60
+ - 5199 被**别的进程**占着:自动顺延到下一个空闲端口(最多 +20)并醒目提示。注意顺延 = 换浏览器源,
61
+ 画板位置这些本机记忆按源隔离,`.mcp.json`/hook 也仍指向原端口——想固定就改 config 的 port 再跑一次 `init`;
62
+ - 5199 上跑的是**本项目的另一个 contactsheet**(最常见:忘了已经起过):直接提示地址退出,不再起第二个;
63
+ - 显式传了 `--port` 时不猜你的意图:被占就报错,附排查命令。
64
+
57
65
  **只监听 127.0.0.1。** 画布没有登录,而 `p` 推送能以你的名义往 Claude Code 会话里说话 ——
58
66
  所以默认只有本机能连。非 GET 请求还会校验 Origin,推送另外要一枚每次启动随机生成的 token
59
67
  (只发给画布页,你 app 里的第三方脚本拿不到)。真要局域网访问,改 config 里的 `host`,
@@ -2571,8 +2571,17 @@ ${board.entry.kind} \xB7 ${board.entry.id}`);
2571
2571
  const boot2 = qs("#cs-boot");
2572
2572
  boot2.textContent = "";
2573
2573
  const card = h("div", "cs-card");
2574
- const compileErr = /HTTP 5\d\d/.test(String(err));
2575
- if (compileErr) {
2574
+ const msg = String(err);
2575
+ const target = state.info?.target ?? "http://localhost:3000";
2576
+ if (/HTTP 50[24]/.test(msg)) {
2577
+ card.appendChild(h("h2", void 0, "\u8FDE\u4E0D\u4E0A\u4F60\u7684 dev server"));
2578
+ card.appendChild(
2579
+ h("p", void 0, `\u5916\u58F3\u6B63\u628A\u8BF7\u6C42\u4EE3\u7406\u5230 ${target},\u4F46\u90A3\u91CC\u6CA1\u6709\u54CD\u5E94\u3002\u4E24\u79CD\u53EF\u80FD:dev server \u8FD8\u6CA1\u8D77;\u6216\u5B83\u8DD1\u5728\u522B\u7684\u7AEF\u53E3(\u53BB package.json \u7684 dev script \u770B\u771F\u5B9E\u7AEF\u53E3,\u6539 contactsheet.config.json \u7684 target,\u6216\u91CD\u542F\u65F6\u52A0 --target)\u3002`)
2580
+ );
2581
+ const p = h("p");
2582
+ p.appendChild(h("code", void 0, "pnpm dev"));
2583
+ card.appendChild(p);
2584
+ } else if (/HTTP 5\d\d/.test(msg)) {
2576
2585
  card.appendChild(h("h2", void 0, "\u753B\u677F\u6587\u4EF6\u7F16\u8BD1\u9519\u8BEF"));
2577
2586
  card.appendChild(
2578
2587
  h("p", void 0, "next dev \u5728\u8DD1,\u4F46\u753B\u677F\u6CE8\u518C\u8868\u6A21\u5757\u6E32\u67D3\u5931\u8D25 \u2014\u2014 \u901A\u5E38\u662F\u67D0\u4E2A *.artboard.tsx \u6709\u8BED\u6CD5\u6216 import \u9519\u8BEF\u3002\u53BB next dev \u7684\u7EC8\u7AEF\u770B\u5177\u4F53\u62A5\u9519,\u4FEE\u597D\u540E\u8FD9\u9762\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002")