# locus-scope
**Repository Path**: CZXyee/locus-scope
## Basic Information
- **Project Name**: locus-scope
- **Description**: 可组合 Entity 图的 Scope 协议及轻量工具,定义了身份、关系、作用域和组合方式。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-03
- **Last Updated**: 2026-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# locus-scope
可组合 Entity 图的 Scope 协议及轻量工具,定义了身份、关系、作用域和组合方式。
Locus Scope 将具有身份的事物及其关系组织成有边界的图。Entity 可以表示环境、资源、能力、代码、知识、逻辑结构或其他领域对象,属性和关系不受预设模型限制。
Scope 提供 Entity 的命名空间、组合与引用边界,并可通过 Import / Export 组合其他 Scope。Scope 也可以作为 OCI Artifact 发布到 [OCI Registry](https://github.com/opencontainers/distribution-spec/blob/main/spec.md),从而在不同项目和环境之间分发与复用。
## Quick Start
### Window
- Windows 用户可直接运行 `locus-setup-windows-amd64.exe`,按需选择 `locus-scope`、`locus-pkg`、[Zot](https://zotregistry.dev/) 和当前用户 `PATH`。
- 安装根目录固定为 `%USERPROFILE%\.locus`;安装包包含全部组件。
- 安装 Zot 后可通过开始菜单启动、停止和查看状态,也可选择登录 Windows 后自动启动。卸载默认保留 Zot 仓库数据和 `%USERPROFILE%\.locus\oci` cache。
### Linux
TODO
从源码构建与本地部署
要求:
- Go 1.26 或更新版本(源码构建;最低版本以 `go.mod` 为准)
- PowerShell 7(仓库脚本)
- 可选:OCI Registry,例如 Zot、Harbor、GHCR
构建:
```powershell
pwsh -File scripts/build.ps1
```
部署到仓库工作区:
```powershell
pwsh -File scripts/deploy-local.ps1
```
产物位于 `temp/local/bin/`。只有显式传入 `-User` 才会部署到用户的 `~/.locus/bin/`:
```powershell
pwsh -File scripts/deploy-local.ps1 -User
```
追加 `-WithZot` 可同时安装对应 target 下的本地 Zot。清理或卸载使用匹配的 option:
```powershell
pwsh -File scripts/clean-local.ps1
pwsh -File scripts/clean-local.ps1 -User -WithZot
```
脚本不会修改 `PATH`,完整选项和数据删除边界见 [`scripts/README.md`](scripts/README.md)。
## example:创建、安装与发布 Scope
一个项目只有一个 root `locus.yaml` 和一份 `locus.lock`;普通子目录只组织 Definition documents。
### 1. 创建 Scope
创建 `app/locus.yaml`:
```yaml
id: app
exports:
- backend
```
在普通子目录中创建 `app/model/services.locus.yaml`:
```yaml
entities:
- id: database
type: postgres
host: db.internal
port: 5432
- id: backend
type: service
relations:
- [backend, uses, database]
```
目录不会产生隐式 Group;未声明 `group` 的 `database` 和 `backend` 都位于 Scope 根命名空间。Definition document 必须使用 `.locus.yaml`、`.locus.yml` 或 `.locus.json` 后缀,普通 YAML/JSON 不会被读取:
```text
app/
├── locus.yaml
├── docker-compose.yaml
└── model/
└── services.locus.yaml
```
Loader 递归普通子目录,但遇到包含 Scope manifest 的后代目录时停止;该 Scope 只有经 `imports` 才会加入 Workspace。可选的 `app/.locusignore` 用来排除无需遍历的路径:
```text
# Scope-relative paths
generated/
*.draft.locus.yaml
```
`.locusignore` 使用 `/` 分隔的 Scope 相对模式,支持单路径段内的 `*`、`?` 和字符类;不支持 `!` 与 `**`。匹配目录会跳过整棵子树;`.git` 和 `.locus` 始终跳过。
验证和查询:
```text
locus-scope --scope ./app validate
locus-scope --scope ./app entity list
locus-scope --scope ./app entity show database
locus-scope --scope ./app relation list
locus-scope --scope ./app resolve database
```
在 Scope 内部执行时可以省略 `--scope`,CLI 会从当前目录沿祖先链查找最近的 Scope manifest;找不到就直接失败,不做用户级 Scope 回退。
### 2. 安装 Package
项目通过 OCI reference 引用远程 Scope:
```yaml
id: app
imports:
infra: oci://registry.example.com/locus/infra:v1
exports:
- backend
```
在项目根执行一次安装:
```text
locus-pkg --scope ./app install
```
安装会解析完整 reachable graph,统一生成一份 lock 和项目物化状态:
```text
app/
├── locus.yaml
├── locus.lock
├── model/
│ └── services.locus.yaml
└── .locus/
└── packages/
└── sha256-abc.../
├── locus.yaml
└── ...
```
`locus.lock` 将可变 tag 固定到不可变 OCI digest。之后 `locus-scope` 只使用 `locus.lock` 和 `.locus/packages` 离线装配 Workspace,不访问 Registry:
```text
locus-scope --scope ./app validate
locus-scope --scope ./app resolve infra:database
```
严格复用现有 lock:
```text
locus-pkg --scope ./app install --frozen
```
### 3. Publish
待发布 Package 同样以单个 root `locus.yaml` 为入口:
```text
infra/
├── locus.yaml
└── resources.locus.yaml
```
发布:
```text
locus-pkg --scope ./infra publish oci://registry.example.com/locus/infra:v1
```
省略 `--scope` 时,从当前目录沿祖先链查找最近的 Scope manifest。Publish 检查并把 root Scope source tree 编码为 OCI 1.1 artifact,推送成功后输出目标 tag 和不可变 manifest digest。
相同内容重复发布得到相同 digest;内容变化后再次发布同一 tag,会让该 tag 指向新 digest。已有项目的 `locus.lock` 仍固定原 digest,不会自动漂移。
Registry、认证和传输由 OCI / ORAS 生态处理;Locus 没有实现 Registry Server 或独立的账号系统。
#### 使用本地 Zot
若安装时选择了 Zot ,可从开始菜单启动、停止和查看状态;若安装时选择了登录后自动启动,则无需手动启动。Zot 启动后监听 `127.0.0.1:18080`。
进入待发布的 Scope,将它发布到本机 Registry:
```text
locus-pkg --scope . publish oci://localhost:18080/locus/my-scope:v1
```
其他项目通过完整 OCI reference 引用该 Package:
```yaml
id: my-app
imports:
shared: oci://localhost:18080/locus/my-scope:v1
```
在引用项目中获取 Package、生成 `locus.lock` 并物化依赖:
```text
locus-pkg --scope . install
locus-scope --scope . validate
```
本地 Zot 不需要 `docker login`,只允许本机访问。`localhost:18080` 不能供其他电脑使用;跨机器共享应改用可访问的 OCI Registry,并在 publish 参数和 `locus.yaml` 中填写其地址。
## CLI
`locus-scope` 负责加载、验证和查询 Workspace;`locus-pkg` 负责发布和安装 OCI Package。
### `locus-scope`
| 命令 | 作用 |
| ------------------------------- | -------------------------------------------------------------------------- |
| `locus-scope validate` | 验证完整 Workspace,并输出 root identity 及 Scope、Entity、Relation 数量。 |
| `locus-scope scope show` | 显示 root Scope 的 manifest ID、source identity、Imports 和 Exports。 |
| `locus-scope scope list` | 列出所有可达 Scope,并标记 root Scope。 |
| `locus-scope entity list` | 列出所有可达 Entity 及其原始 owner。 |
| `locus-scope entity show [` | 从 root Scope 解析 Entity reference,并显示 owner、ID 和属性。 |
| `locus-scope relation list` | 列出验证后的 Relation 及两端 Entity 的原始 owner。 |
| `locus-scope resolve ][` | 只解析 Entity reference,返回最终 owner 和 ID,不返回属性。 |
| `locus-scope version` | 输出构建时注入的版本,不发现或加载 Scope。 |
通用参数:
| 参数 | 作用 |
| --------------- | -------------------------------------------------------------------- |
| `--scope ` | 指定 root Scope;省略时从当前目录向父目录查找最近的 Scope manifest。 |
| `--json` | 输出字段和顺序稳定的 JSON,供 Agent 和脚本消费。 |
| `--version` | 等价于 `version` 指令。 |
### `locus-pkg`
| 命令 | 作用 |
| ----------------------------- | ------------------------------------------------------------------------------------------------------- |
| `locus-pkg publish ` | 检查所选 Scope source tree,构建并发布 OCI artifact,成功后输出规范化 target 和不可变 manifest digest。 |
| `locus-pkg install` | 解析完整 Package 依赖闭包,获取并物化 artifact,验证 Workspace,成功后提交 `locus.lock`。 |
| `locus-pkg version` | 输出构建时注入的版本,不发现 Scope,也不读取凭据或 Registry。 |
参数:
| 参数 | 适用命令 | 作用 |
| --------------- | -------------------- | -------------------------------------------------------------------- |
| `--scope ` | `publish`、`install` | 指定 root Scope;省略时从当前目录向父目录查找最近的 Scope manifest。 |
| `--json` | `publish`、`install`、`version` | 输出稳定 JSON;错误也以 `{"error":"..."}` 输出。 |
| `--frozen` | `install` | 要求现有 lock 与完整依赖一致,且不修改 lock。 |
| `--version` | 全部 | 等价于 `version` 指令。 |
option 可以位于子命令前后;`version` 和 `--version` 无需 Scope。`publish` 的 `` 必须是无 fragment 的 OCI tag reference,不能使用 digest reference。
## 技术栈
- **Go 1.26+**:最低支持版本由 `go.mod` 的 `go` directive 定义。
- **OCI Image Spec 1.1 / Distribution API**
## License
[MIT](LICENSE)]