Skip to content

XBUJ · 项目文件

Profile document

v2 目标模型.xbuj 契约 + .xbu 完整文档、Open xbu ≠ Load data)见 xbuj-xbu-v2.md。下文描述的是当前仍在用的 .xbujd/ 兼容布局

打开单位是 .xbujd/ 目录包;包内的 .xbuj 是配置,数据与配置同目录。

形式角色打开后行为
Name.xbujd/活项目包(配置 + 数据)Open Folder 绑定该目录;读写回写包内
.xbuj仅配置Open File;不绑定数据目录;Save As 可另存为包
.xbudump一次性快照(ZIP)Import → 物化为新的 Name.xbujd/ 再打开

兼容读取:旧后缀 .xbujson / .xbu 仍可打开;旧旁路布局(a.xbuja.xbujd/ 同级)首次打开会迁入包内并提示 Migrated。

包内 .xbuj 只记录:

  • profile 名称
  • 要安装的 service 列表
  • 可选的 provider 面(如 billing → stripe | paddle)
  • 可选的 ports(proxy / mcp / pg / redis / smtp;缺省用内置默认值)

本地优先:目录即项目

text
my-app.xbujd/                 ← 打开单位
  my-app.xbuj                 ← 轻量配置(提交)
  handler.json                ← handler 状态(可 diff,提交)
  database/pg.dump            ← 二进制 dump(已被 .gitignore 排除,走网盘共享)
  database/meta.json          ← dump 引擎版本戳(自动,随 dump 一并忽略)
  README.md                   ← 自动生成的 git / 数据共享说明
  .gitignore  .gitattributes  ← git 卫生(自动生成,缺省才写)
  .xbuckle.lock               ← 运行期占用锁(勿提交;已被 .gitignore 覆盖)
文件角色
my-app.xbujd/项目包(Open Folder)
my-app.xbujd/my-app.xbuj轻量配置(services / providers / ports)
my-app.xbujd/database/pg.dumpPGlite 二进制 dump
my-app.xbujd/database/meta.json写 dump 的 PGlite 版本 + 时间;版本不匹配时打开会告警
my-app.xbujd/handler.jsonhandler 状态(不含 dump;缩进 JSON,可 diff)
my-app.xbujd/.xbuckle.lock绑定期间的进程占用锁(pid/host);退出自动清除,陈旧锁自动接管

磁盘写入有约 5s 防抖,且内容未变则跳过。完整可携快照仍用 Export .xbudump

时机行为
新建 profile默认 ~/Documents/XBuckle/<name>.xbujd/;Choose Folder… 选父目录
增删 service、切 provider约 600ms 防抖后自动写回包内 .xbuj
DB / handler 变更约 5s 防抖后写入包内
Save As…另存为新的 .xbujd
Export .xbudump…ZIP 根布局对齐活包(.xbuj + handler.json + database/pg.dump)+ v3 profile/
导入 .xbudump物化为 Name.xbujd/ 后打开
打开已绑定包直接切到该 profile 并从包内恢复数据
删除 profile一并删除托管目录里的包;自选位置的文件保留
关闭 profile只移出列表,包原样保留

文件被外部改动时会弹 Reload / Keep mine

文件格式

json
{
  "kind": "xbuckle.config",
  "version": 1,
  "name": "my-app",
  "services": ["auth", "database", "cache", "s3", "llm"],
  "providers": {
    "llm": "openai",
    "billing": "stripe"
  },
  "ports": {
    "proxy": 3200,
    "mcp": 3201,
    "pg": 5433,
    "redis": 6380,
    "smtp": 1026
  },
  "generatedAt": "2026-08-07T12:00:00.000Z"
}
字段必需说明
kind推荐固定 xbuckle.config
version可选当前 1
name推荐profile 名;缺省为 Untitled
servicescatalog service id 数组
providers可选serviceId → providerId
ports可选本项目监听端口
generatedAt可选ISO 时间戳

合法 service idsauth · database · cache · secrets · s3 · search · mail · smtp · queue · llm · edge-functions · billing · feature-flags

在 XBuckle 中使用

入口行为
空文档屏Open Folder…(主)/ Open File… / New Document
File → Open Folder…(⌘O)选择 .xbujd 目录
File → Open File…(⇧⌘O).xbuj / .xbudump
标题栏 Save As…另存为新包
标题栏 Export导出 .xbudump
Settings → ProfilesReveal Project Folder
双击裸 .xbuj打开为配置-only(若旁有旧 sidecar 则迁入包)
xbuckle:// 深链确认后创建新包

URL scheme

xbuckle://create?name=my-app&services=auth,database,cache
xbuckle://create?name=shop&services=auth,billing&providers=billing:paddle
xbuckle://create?config=<url-encoded JSON>

SDK:@xbuckle/config

bash
npm install @xbuckle/config
ts
import { buildFile, buildLink, type Plan } from "@xbuckle/config";

const plan: Plan = {
  name: "my-app",
  serviceIds: ["auth", "database", "cache"],
  providers: { llm: "openai" },
};

const xbujText = buildFile(plan); // 写入 my-app.xbujd/my-app.xbuj
const link = buildLink(plan);

Git 共享

共享时把 .xbujd/ 放进 git,用 Open Folder 打开——但 dump 不进 gitpg.dump 是 gzip 二进制,git 无法做增量压缩,每次提交数据变更都会让历史 整体膨胀一份 dump 的大小。因此包内自动生成的 .gitignore 默认排除 database/pg.dumpdatabase/meta.json

数据走带外共享:把 database/pg.dump(连同 meta.json)通过网盘 / AirDrop / 对象存储发给协作者,对方放进包内 database/ 再 Open Folder 即可; 或者用 Export .xbudump 发一次性快照(导入会物化为新包)。

绑定或首次写入时会在包内生成(已存在则不动):

  • .gitignore — 忽略 .xbuckle.lock*.tmpdatabase/pg.dumpdatabase/meta.json
  • .gitattributes — 将 database/pg.dump 标记为 binary(仅在你 force-add 或上 LFS 时生效)
  • README.md — 记录上述 git / 数据共享约定

注意事项:

  • 确实需要把数据纳入版本管理时才考虑 git LFS(历史不膨胀,但 LFS 存储同样逐版本累积,协作者都需装 LFS):
bash
git lfs install
git lfs track "*.xbujd/database/pg.dump"
git add .gitattributes
  • 引擎版本database/meta.json 记录写 dump 的 PGlite 版本;协作双方 XBuckle 版本差异过大时,打开会在日志中告警(restore 可能失败,需一方重新导出)。网盘共享时请连同该文件一起发。
  • 并发保护:包被某个 XBuckle 进程绑定时会持有 .xbuckle.lock(含 pid/host)。同机第二个实例打开同一包会唤起持有者窗口;跨机残留的锁(拷贝/克隆带来)会被自动接管。

源码:packages/config · shared/xbujson.ts · src/lib/xbujson.ts · src/runtime/profileDocument.ts · electron/project-data.ts · electron/project-package.ts