openxiangda 2.10.0 → 2.11.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/bin/distribution/commands.js +4 -0
- package/bin/distribution/launcher.js +6 -1
- package/bin/distribution/migration-advice.js +17 -0
- package/bin/distribution/support-commands.json +1 -1
- package/bin/distribution/workspace.js +10 -1
- package/documentation/getting-started.md +71 -8
- package/documentation/manifest.json +3 -3
- package/documentation/workflow-events.md +16 -0
- package/package.json +31 -32
- package/releases/2.11.0.json +41 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +5 -5
- package/skills/openxiangda-v2/references/getting-started.md +71 -8
- package/skills/openxiangda-v2/references/workflow-events.md +16 -0
|
@@ -4,6 +4,7 @@ import { update } from './update.js';
|
|
|
4
4
|
import { assessMigration } from './migrate.js';
|
|
5
5
|
import { installDistributionSkills } from './skills.js';
|
|
6
6
|
import { supportOperation } from './support.js';
|
|
7
|
+
import { migrationAdvice, printMigrationAdvice } from './migration-advice.js';
|
|
7
8
|
|
|
8
9
|
export async function distributionCommand(context, args) {
|
|
9
10
|
const command = args[0];
|
|
@@ -34,8 +35,11 @@ export async function distributionCommand(context, args) {
|
|
|
34
35
|
data = manifest.openxiangdaRelease || data;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
38
|
+
const advice = ['version', 'update'].includes(command) || skillInstall ? migrationAdvice(context) : undefined;
|
|
39
|
+
if (advice) data = { ...data, migrationAdvice: advice };
|
|
37
40
|
const result = { schemaVersion: skillInstall ? 'openxiangda.cli-result/v2' : 'openxiangda.distribution/v1', ok: true, operation: skillInstall ? 'skill install' : command, data };
|
|
38
41
|
process.stdout.write(`${args.includes('--json') ? JSON.stringify(result) : JSON.stringify(data, null, 2)}\n`);
|
|
42
|
+
if (advice && !args.includes('--json')) printMigrationAdvice(advice);
|
|
39
43
|
return true;
|
|
40
44
|
}
|
|
41
45
|
|
|
@@ -11,7 +11,12 @@ export async function launch(packageRoot, args = process.argv.slice(2)) {
|
|
|
11
11
|
await distributionCommand({ manifest, packageRoot }, args);
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
|
-
const
|
|
14
|
+
const explicitCwd = flagValue(args, '--cwd');
|
|
15
|
+
const authorization = args[0] === 'login' || args[0] === 'auth';
|
|
16
|
+
const workspace = discoverWorkspace(explicitCwd || (args[0] === 'skill' ? flagValue(args, '--workspace') : null) || process.cwd(), {
|
|
17
|
+
allowMissing: authorization,
|
|
18
|
+
exact: authorization && Boolean(explicitCwd),
|
|
19
|
+
});
|
|
15
20
|
// Launcher-only updates must also work when a project's dependencies are not yet installed.
|
|
16
21
|
const launcherUpdate = args[0] === 'update' && flagValue(args, '--target') === 'launcher';
|
|
17
22
|
const engine = resolveEngine(launcherUpdate ? null : workspace, packageRoot);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// The distribution layer owns guidance for V1 engines; V2 services stay isolated.
|
|
2
|
+
export function migrationAdvice(context) {
|
|
3
|
+
if (context.workspace?.generation !== 'v1') return undefined;
|
|
4
|
+
return {
|
|
5
|
+
generation: 'v1',
|
|
6
|
+
message: '建议评估升级到 OpenXiangda 2.0;新应用优先使用 V2,现有应用先核实能力覆盖、迁移成本与验收方案。',
|
|
7
|
+
launcherUpdateCommand: 'openxiangda update install --target launcher',
|
|
8
|
+
nodeRequirement: '>=24',
|
|
9
|
+
assessCommand: 'openxiangda migrate assess --to v2',
|
|
10
|
+
guide: 'https://github.com/1377385356/openxiangda/blob/master/docs/getting-started.md#upgrade',
|
|
11
|
+
workspacePolicy: '更新统一入口后旧项目仍使用 V1;不会自动转换应用、数据或流程。',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function printMigrationAdvice(advice) {
|
|
16
|
+
process.stderr.write(`\n${advice.message}\n更新统一入口(Node.js 24+):${advice.launcherUpdateCommand}\n迁移评估:${advice.assessCommand}\n${advice.workspacePolicy}\nCLI / Skill / MCP 安装升级说明:${advice.guide}\n`);
|
|
17
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "openxiangda.distribution-commands/v1",
|
|
3
|
-
"commands": ["support:status", "support:bootstrap", "support:login", "support:join"]
|
|
3
|
+
"commands": ["version", "update:check", "update:install", "changelog", "migrate:assess", "skill:install", "support:status", "support:bootstrap", "support:login", "support:join"]
|
|
4
4
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, resolve } from 'node:path';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
4
5
|
|
|
5
6
|
export function fail(code, message) {
|
|
6
7
|
throw Object.assign(new Error(`${code}: ${message}`), { code });
|
|
@@ -25,8 +26,10 @@ export function flagValue(args, name) {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
// Discovery reads markers only. Loading either generation's executable config belongs to its engine.
|
|
28
|
-
export function discoverWorkspace(cwd) {
|
|
29
|
+
export function discoverWorkspace(cwd, { allowMissing = false, exact = false } = {}) {
|
|
30
|
+
if (allowMissing && !existsSync(resolve(cwd))) return null;
|
|
29
31
|
let root = realpathSync(resolve(cwd));
|
|
32
|
+
const userHome = existsSync(homedir()) ? realpathSync(homedir()) : resolve(homedir());
|
|
30
33
|
if (!statSync(root).isDirectory()) fail('WORKSPACE_DIRECTORY_REQUIRED', root);
|
|
31
34
|
while (true) {
|
|
32
35
|
const v2 = ['openxiangda.config.ts', 'openxiangda-app.config.ts'].filter(file => existsSync(join(root, file)));
|
|
@@ -36,8 +39,14 @@ export function discoverWorkspace(cwd) {
|
|
|
36
39
|
const state = readJson(binding);
|
|
37
40
|
if (state.version === 1 && state.profiles && typeof state.profiles === 'object') v1.push('.openxiangda/state.json');
|
|
38
41
|
}
|
|
42
|
+
// Auth-only directories are workspace boundaries. Discover filenames, never credentials.
|
|
43
|
+
if (root !== userHome && !v1.length && !v2.length) {
|
|
44
|
+
if (existsSync(join(root, '.openxiangda/session.json'))) v2.push('.openxiangda/session.json');
|
|
45
|
+
if (existsSync(join(root, '.openxiangda/profiles.json'))) v1.push('.openxiangda/profiles.json');
|
|
46
|
+
}
|
|
39
47
|
if (v1.length && v2.length || v2.length > 1) fail('WORKSPACE_GENERATION_CONFLICT', `${root} 同时存在冲突的工作区标记:${[...v1, ...v2].join(', ')}`);
|
|
40
48
|
if (v1.length || v2.length) return { root, generation: v1.length ? 'v1' : 'v2', markers: [...v1, ...v2] };
|
|
49
|
+
if (exact) return null;
|
|
41
50
|
const parent = dirname(root);
|
|
42
51
|
if (parent === root) return null;
|
|
43
52
|
root = parent;
|
|
@@ -4,17 +4,72 @@ OpenXiangda 2.0 默认生成 React 应用和共享契约。普通 CRUD、标准
|
|
|
4
4
|
|
|
5
5
|
## 准备 {#prerequisites}
|
|
6
6
|
|
|
7
|
-
准备平台地址、具有应用开发权限的账号、Node.js 24 和 pnpm 10.15.1
|
|
7
|
+
准备平台地址、具有应用开发权限的账号、Node.js 24 和 pnpm 10.15.1。`openxiangda@latest` 与 `openxiangda@stable-v2` 指向 V2 稳定版,`openxiangda@legacy-v1` 指向 V1 维护版。安装后核对实际精确版本和目标平台能力;项目依赖与锁文件决定应用使用的工具链。
|
|
8
|
+
|
|
9
|
+
<a id="upgrade"></a>
|
|
10
|
+
|
|
11
|
+
## CLI、Skill、MCP 安装与升级 {#upgrade}
|
|
12
|
+
|
|
13
|
+
全局统一入口适合新用户和原 V1 用户安装;Node.js 需要 24 或更高版本:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g openxiangda@latest --registry=https://registry.npmjs.org
|
|
17
|
+
openxiangda version --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`openxiangda` 根包已经依赖配套 CLI、MCP 和 Skill 资料,无需逐个全局安装 `openxiangda-cli`、`openxiangda-mcp` 或 `openxiangda-skill-kit`。全局入口根据当前目录识别代际,进入已有项目时优先使用该项目锁定的引擎;更新全局入口不升级项目依赖。
|
|
21
|
+
|
|
22
|
+
### 原 V1 用户
|
|
23
|
+
|
|
24
|
+
建议评估升级到 OpenXiangda 2.0。新应用优先使用 V2;已有应用先核实能力覆盖、迁移成本及数据、在途流程、权限的验收与回滚方案。在已安装新版全局入口后,进入原项目运行:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
openxiangda version --json
|
|
28
|
+
openxiangda migrate assess --to v2 --json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
这里使用全局 `openxiangda`,不要用会优先调用旧项目 V1 CLI 的 `pnpm exec openxiangda` 或 `npx openxiangda` 来执行迁移评估。评估只读取本地源码指针,不读取远端数据、不自动转换应用。原项目仍按 V1 维护;同代更新通过 `legacy-v1` 获取维护版,不把 V2 包直接替换进 V1 项目。
|
|
32
|
+
|
|
33
|
+
### 更新入口与项目
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 更新全局统一入口
|
|
37
|
+
openxiangda update check --target launcher --json
|
|
38
|
+
openxiangda update install --target launcher
|
|
39
|
+
|
|
40
|
+
# 在项目目录,更新本项目同代依赖与锁文件
|
|
41
|
+
openxiangda update check --target workspace --json
|
|
42
|
+
openxiangda update install --target workspace
|
|
43
|
+
openxiangda version --json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
更新完成后审查依赖、锁文件差异并运行项目检查与业务验收。统一入口不会后台自动升级工具或转换项目。V1 独立 CLI 的 `update install` 会尝试刷新 V1 Skill(可用 `--no-skills` 跳过);统一入口的更新完成后按下面命令显式刷新 Skill。
|
|
47
|
+
|
|
48
|
+
### 安装或刷新 Skill
|
|
49
|
+
|
|
50
|
+
在项目目录刷新匹配该项目版本的技能,并更新 V2 项目的 AGENTS 平台区块:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
openxiangda skill install --workspace . --force
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
安装到用户级 Codex 或其他 AI 工具可用 `skill install --agent codex|claude|qoder|dual --force`(实际执行时选一个值),或 `--destination <Skill根目录>`。在 V1 项目内会安装 V1 技能与统一入口技能;要先安装 V2 用户级技能,使用 `openxiangda skill install --cwd <不属于任何应用的空目录> --force`。支持协作的自动准备与 `--skip-support` 见下文。
|
|
57
|
+
|
|
58
|
+
创建 V2 应用会准备匹配版本的项目指引。后续更新依赖后再次刷新技能;不要把不同代际或旧版本的技能正文复制进新项目。
|
|
59
|
+
|
|
60
|
+
### 接入及更新 MCP
|
|
61
|
+
|
|
62
|
+
MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置一次。使用[项目路径配置示例](./reference/mcp.md#连接项目),由客户端启动项目锁定版本的 `openxiangda --mcp-stdio`。CLI 更新不会自动修改客户端配置,也不会重启已有 MCP 进程;项目依赖升级后在客户端重启 MCP,然后读取 `workspace_context` 核对版本。长期开发进程使用 CLI 终端管理。
|
|
8
63
|
|
|
9
64
|
## 安装与创建 {#create}
|
|
10
65
|
|
|
11
66
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
12
67
|
|
|
13
68
|
```bash
|
|
14
|
-
pnpm dlx openxiangda@2.
|
|
15
|
-
pnpm dlx openxiangda@2.
|
|
16
|
-
pnpm dlx openxiangda@2.
|
|
17
|
-
pnpm dlx openxiangda@2.
|
|
69
|
+
pnpm dlx openxiangda@2.11.0 skill install --force
|
|
70
|
+
pnpm dlx openxiangda@2.11.0 auth status --base-url <平台地址> --json
|
|
71
|
+
pnpm dlx openxiangda@2.11.0 login --cwd my-app --base-url https://platform.example.com
|
|
72
|
+
pnpm dlx openxiangda@2.11.0 create my-app --base-url https://platform.example.com
|
|
18
73
|
cd my-app
|
|
19
74
|
pnpm openxiangda context --json
|
|
20
75
|
pnpm openxiangda dev
|
|
@@ -116,9 +171,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
|
|
|
116
171
|
无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
|
|
117
172
|
|
|
118
173
|
```bash
|
|
119
|
-
pnpm dlx openxiangda@2.
|
|
120
|
-
pnpm dlx openxiangda@2.
|
|
121
|
-
pnpm dlx openxiangda@2.
|
|
174
|
+
pnpm dlx openxiangda@2.11.0 auth status --base-url <平台> --json
|
|
175
|
+
pnpm dlx openxiangda@2.11.0 source resolve <仓库URL> --base-url <平台> --json
|
|
176
|
+
pnpm dlx openxiangda@2.11.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
122
177
|
```
|
|
123
178
|
|
|
124
179
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|
|
@@ -160,3 +215,11 @@ pnpm exec openxiangda --mcp-stdio --cwd <应用绝对路径>
|
|
|
160
215
|
先调用 `workspace_context`,再按任务读取 `docs_read` 和当前契约。配置示例与工具参数见[MCP 参考](./reference/mcp.md)。登录、创建和长期 dev 进程继续由 CLI/终端管理。
|
|
161
216
|
|
|
162
217
|
指定站点授权可用 `auth status --base-url <平台地址> --json` 或 MCP `authorization_status` 只读核验,无需工作区。状态为 `authorized` 才证明当前 access 被平台接受;`missing`/`platform_mismatch`/`refresh_required` 需处理会话,`unauthorized` 表示平台拒绝,`unavailable` 表示暂时无法核验,不能当成过期。查询不刷新、不打开浏览器、不修改绑定;应用管理权限需另行核验。
|
|
218
|
+
|
|
219
|
+
## 工作区登录态
|
|
220
|
+
|
|
221
|
+
平台授权保存到所选工作区的 `.openxiangda/session.json`,CLI、MCP、刷新与退出共用该文件。不再读取或迁移旧全局会话;升级后需在每个项目重新登录。已有项目可在根目录或子目录运行 `openxiangda login --base-url <platform>`;`login --cwd <directory>` 和 `auth --cwd <directory>` 明确选定工作区。嵌套应用不会继承父应用会话。
|
|
222
|
+
|
|
223
|
+
创建应用前先执行 `openxiangda login --cwd my-app --base-url <platform>`,再执行 `openxiangda create my-app --base-url <platform>`。仅含受管登录文件的目录允许初始化,凭据会保留并自动加入 Git 忽略规则。
|
|
224
|
+
|
|
225
|
+
本地文件优先;仅在文件缺失时使用成对的 `OPENXIANGDA_BASE_URL` 与 `OPENXIANGDA_TOKEN` CI 环境凭据。损坏、过期或平台不符的文件不会触发其他身份回退。请勿提交或打包登录文件。钉钉支持由 DWS 管理自己的授权,不与平台会话混用。
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "openxiangda.documentation/v1",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"topics": [
|
|
5
5
|
{
|
|
6
6
|
"id": "getting-started",
|
|
7
7
|
"title": "安装与开始开发",
|
|
8
8
|
"file": "getting-started.md",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "02586472f3816ec9719e40130bdf15309045e38fbe1c3ea824f66863e16c39ef"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"id": "product-design",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"id": "workflow-events",
|
|
73
73
|
"title": "审批、事件与通知",
|
|
74
74
|
"file": "workflow-events.md",
|
|
75
|
-
"sha256": "
|
|
75
|
+
"sha256": "20b08f364e59de3a9d3e9506c37843df1aefd435fc6a1bf373deb6fe76cd0cf4"
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"id": "backend",
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
标准 Workflow 与 Notification Hub 已作为 OpenXiangda 2.0 可选平台模块重新开放。它们不属于默认 CRUD 模板,也不兼容或复用 1.x 工作流、消息中心、模板、卡片、回调、表和 API。
|
|
4
4
|
|
|
5
|
+
## 数据事件捕获与历史
|
|
6
|
+
|
|
7
|
+
默认保存全部数据增删改事件。没有完整事件审计或历史回放要求的资源,可在
|
|
8
|
+
`events.capturePolicies` 声明 `{ resourceCode: 'items', mode: 'subscribed' }`。
|
|
9
|
+
共享编译器据发布版本中的订阅声明生成固定计划,仅捕获需要的操作事件;没有
|
|
10
|
+
`resourceCodes` 限制的订阅覆盖全部资源,暂时禁用的订阅仍计入需求。该策略需要
|
|
11
|
+
平台 `events.capture-policy` 能力,不能只升级本地 SDK。
|
|
12
|
+
|
|
13
|
+
未声明策略或使用 `mode: 'all'` 保持原行为。`subscribed` 不提供完整变更事件
|
|
14
|
+
历史,回放只针对实际保存的事实;改回 `all` 只恢复今后的捕获。需要完整事件
|
|
15
|
+
审计或未来任意历史回放时保留 `all`。数据库审计字段与事件历史是不同的契约。
|
|
16
|
+
|
|
17
|
+
必要事件仍与数据同事务提交;没有必要事件时不写事件事实、outbox 或唤醒投递。
|
|
18
|
+
权限、记录修订约束、文件引用、日期触发和流程命令继续生效,自定义 `emitEvent`
|
|
19
|
+
也不受该策略影响。策略通过正常应用版本发布、测试和生产晋级生效。
|
|
20
|
+
|
|
5
21
|
## 标准详情与当前用户入口
|
|
6
22
|
|
|
7
23
|
普通记录、流程记录、任务和实例复用同一详情框架。流程详情提供申请内容、审批历史和变更记录三个标签页;管理员在当前抽屉或页面中切换到普通表单编辑,直接保存并自动留下变更记录,审批结果保持不变。PC 子表在表格内编辑,父表提交时统一校验。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -60,13 +60,13 @@
|
|
|
60
60
|
"antd-mobile": "5.42.3",
|
|
61
61
|
"dayjs": "1.11.18",
|
|
62
62
|
"docx-preview": "0.3.7",
|
|
63
|
-
"openxiangda-cli": "2.
|
|
64
|
-
"openxiangda-contracts": "2.
|
|
65
|
-
"openxiangda-devkit-core": "2.
|
|
66
|
-
"openxiangda-legacy": "npm:openxiangda@1.0.
|
|
67
|
-
"openxiangda-mcp": "2.0.
|
|
68
|
-
"openxiangda-nest": "2.3.
|
|
69
|
-
"openxiangda-skill-kit": "2.0.
|
|
63
|
+
"openxiangda-cli": "2.3.0",
|
|
64
|
+
"openxiangda-contracts": "2.10.0",
|
|
65
|
+
"openxiangda-devkit-core": "2.7.0",
|
|
66
|
+
"openxiangda-legacy": "npm:openxiangda@1.0.269",
|
|
67
|
+
"openxiangda-mcp": "2.0.15",
|
|
68
|
+
"openxiangda-nest": "2.3.1",
|
|
69
|
+
"openxiangda-skill-kit": "2.0.19",
|
|
70
70
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
@@ -132,45 +132,44 @@
|
|
|
132
132
|
},
|
|
133
133
|
"openxiangdaRelease": {
|
|
134
134
|
"schemaVersion": "openxiangda.release-notes/v1",
|
|
135
|
-
"version": "2.
|
|
135
|
+
"version": "2.11.0",
|
|
136
136
|
"status": "reviewed",
|
|
137
|
-
"title": "
|
|
138
|
-
"summary": "
|
|
137
|
+
"title": "工作区登录隔离与工具链升级指引",
|
|
138
|
+
"summary": "平台开发者会话按工作区隔离,CLI、MCP 与自动刷新共用本地会话;补齐 V1 采用 V2 的建议及 CLI、Skill、MCP 升级步骤。本版也包含主线已审查的数据事件捕获策略。",
|
|
139
139
|
"newFeatures": [
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"
|
|
140
|
+
"login --cwd 与 auth --cwd 明确选择工作区;创建应用前可在目标目录登录,初始化保留受管会话文件。",
|
|
141
|
+
"V1 入口展示 V2 采用建议及迁移评估指引,文档说明 CLI、Skill 与 MCP 的版本刷新。",
|
|
142
|
+
"应用可用 events.capturePolicies 按资源声明 all 或 subscribed,编译为不可变的操作事件捕获计划。"
|
|
143
143
|
],
|
|
144
144
|
"fixes": [
|
|
145
|
-
"
|
|
145
|
+
"默认登录态改为工作区 .openxiangda/session.json,停止读取旧全局会话;本地文件优先于 CI 环境凭据。",
|
|
146
|
+
"刷新、退出与 MCP 授权检查固定工作区来源,嵌套应用不会继承父应用账号,损坏或平台不符的文件不会换用其他身份。",
|
|
147
|
+
"登录文件使用原子写入、0600 权限及自动 Git 忽略,初始化不替换凭据内容。"
|
|
146
148
|
],
|
|
147
149
|
"affectedUsers": [
|
|
148
|
-
"
|
|
150
|
+
"使用 CLI、MCP 或多个应用工作区的开发者。",
|
|
151
|
+
"从 V1 评估 V2 的用户,以及需要减少无消费者事件写入的 Native 应用开发者。"
|
|
149
152
|
],
|
|
150
153
|
"compatibility": {
|
|
151
154
|
"node": ">=24",
|
|
152
|
-
"
|
|
153
|
-
|
|
154
|
-
"v2"
|
|
155
|
-
],
|
|
156
|
-
"v1Policy": "V1 引擎和已有应用不变。",
|
|
157
|
-
"platformPolicy": "已读接口需要匹配的平台后端、通知回执追加迁移,以及通知读取和内容读取权限。",
|
|
158
|
-
"releaseChannels": "latest / stable-v2:V2 正式版;legacy-v1:V1 维护版;alpha:预发布。"
|
|
155
|
+
"workspacePolicy": "升级后在每个工作区重新登录;不自动复制旧全局或其他工作区的令牌。",
|
|
156
|
+
"platformPolicy": "平台登录与授权协议不变;远端检查和部署需要平台的 Native configurationCompatibility 校验器摘要与本版工具链匹配。采用 events.capturePolicies 还需要 events.capture-policy 1.0.0。"
|
|
159
157
|
},
|
|
160
158
|
"upgradeSteps": [
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
"
|
|
164
|
-
"
|
|
159
|
+
"使用项目包管理器更新并锁定 OpenXiangda 依赖,刷新 Skill 并重启 MCP 客户端。",
|
|
160
|
+
"远端检查和部署前确认工具链与平台为配套版本;出现 OPENXIANGDA_CONFIGURATION_VALIDATOR_MISMATCH 时先升级不匹配的一端,保留当前源码和候选。",
|
|
161
|
+
"已有项目在根目录运行 `openxiangda login --base-url <platform>`,再运行 `openxiangda auth status` 检查授权。",
|
|
162
|
+
"新项目先运行 `openxiangda login --cwd my-app --base-url <platform>`,然后 `openxiangda create my-app --base-url <platform>`。",
|
|
163
|
+
"CI 仅在没有本地会话文件时使用成对 OPENXIANGDA_BASE_URL 与 OPENXIANGDA_TOKEN。",
|
|
164
|
+
"采用事件捕获策略前先升级支持该能力的平台,确认事件历史要求,并完成测试环境验收后晋级同一应用版本。"
|
|
165
165
|
],
|
|
166
166
|
"knownLimitations": [
|
|
167
|
-
"
|
|
168
|
-
"
|
|
169
|
-
"包发布、平台部署与真实消息验收分别记录;本版本不会自动补发历史失败或未知通知。"
|
|
167
|
+
"钉钉支持的 DWS 授权仍由 DWS 自己管理,不与平台会话混用。",
|
|
168
|
+
"V1 业务不会自动迁移到 V2。subscribed 不保留未声明操作的历史,恢复 all 不能补造历史事件。"
|
|
170
169
|
],
|
|
171
170
|
"issues": [],
|
|
172
|
-
"sha256": "
|
|
173
|
-
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.
|
|
171
|
+
"sha256": "a6383deacc92dc3e058909c7db537e1a1bf29fc00fbb04345225c1f4f70f23c3",
|
|
172
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.11.0"
|
|
174
173
|
},
|
|
175
174
|
"scripts": {
|
|
176
175
|
"build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
+
"version": "2.11.0",
|
|
4
|
+
"status": "reviewed",
|
|
5
|
+
"title": "工作区登录隔离与工具链升级指引",
|
|
6
|
+
"summary": "平台开发者会话按工作区隔离,CLI、MCP 与自动刷新共用本地会话;补齐 V1 采用 V2 的建议及 CLI、Skill、MCP 升级步骤。本版也包含主线已审查的数据事件捕获策略。",
|
|
7
|
+
"newFeatures": [
|
|
8
|
+
"login --cwd 与 auth --cwd 明确选择工作区;创建应用前可在目标目录登录,初始化保留受管会话文件。",
|
|
9
|
+
"V1 入口展示 V2 采用建议及迁移评估指引,文档说明 CLI、Skill 与 MCP 的版本刷新。",
|
|
10
|
+
"应用可用 events.capturePolicies 按资源声明 all 或 subscribed,编译为不可变的操作事件捕获计划。"
|
|
11
|
+
],
|
|
12
|
+
"fixes": [
|
|
13
|
+
"默认登录态改为工作区 .openxiangda/session.json,停止读取旧全局会话;本地文件优先于 CI 环境凭据。",
|
|
14
|
+
"刷新、退出与 MCP 授权检查固定工作区来源,嵌套应用不会继承父应用账号,损坏或平台不符的文件不会换用其他身份。",
|
|
15
|
+
"登录文件使用原子写入、0600 权限及自动 Git 忽略,初始化不替换凭据内容。"
|
|
16
|
+
],
|
|
17
|
+
"affectedUsers": [
|
|
18
|
+
"使用 CLI、MCP 或多个应用工作区的开发者。",
|
|
19
|
+
"从 V1 评估 V2 的用户,以及需要减少无消费者事件写入的 Native 应用开发者。"
|
|
20
|
+
],
|
|
21
|
+
"compatibility": {
|
|
22
|
+
"node": ">=24",
|
|
23
|
+
"workspacePolicy": "升级后在每个工作区重新登录;不自动复制旧全局或其他工作区的令牌。",
|
|
24
|
+
"platformPolicy": "平台登录与授权协议不变;远端检查和部署需要平台的 Native configurationCompatibility 校验器摘要与本版工具链匹配。采用 events.capturePolicies 还需要 events.capture-policy 1.0.0。"
|
|
25
|
+
},
|
|
26
|
+
"upgradeSteps": [
|
|
27
|
+
"使用项目包管理器更新并锁定 OpenXiangda 依赖,刷新 Skill 并重启 MCP 客户端。",
|
|
28
|
+
"远端检查和部署前确认工具链与平台为配套版本;出现 OPENXIANGDA_CONFIGURATION_VALIDATOR_MISMATCH 时先升级不匹配的一端,保留当前源码和候选。",
|
|
29
|
+
"已有项目在根目录运行 `openxiangda login --base-url <platform>`,再运行 `openxiangda auth status` 检查授权。",
|
|
30
|
+
"新项目先运行 `openxiangda login --cwd my-app --base-url <platform>`,然后 `openxiangda create my-app --base-url <platform>`。",
|
|
31
|
+
"CI 仅在没有本地会话文件时使用成对 OPENXIANGDA_BASE_URL 与 OPENXIANGDA_TOKEN。",
|
|
32
|
+
"采用事件捕获策略前先升级支持该能力的平台,确认事件历史要求,并完成测试环境验收后晋级同一应用版本。"
|
|
33
|
+
],
|
|
34
|
+
"knownLimitations": [
|
|
35
|
+
"钉钉支持的 DWS 授权仍由 DWS 自己管理,不与平台会话混用。",
|
|
36
|
+
"V1 业务不会自动迁移到 V2。subscribed 不保留未声明操作的历史,恢复 all 不能补造历史事件。"
|
|
37
|
+
],
|
|
38
|
+
"issues": [],
|
|
39
|
+
"sha256": "a6383deacc92dc3e058909c7db537e1a1bf29fc00fbb04345225c1f4f70f23c3",
|
|
40
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.11.0"
|
|
41
|
+
}
|
package/skills/manifest.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
{
|
|
5
5
|
"name": "openxiangda-v2",
|
|
6
6
|
"description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,再开发、检查和交付应用。维护 1.x 应用时使用对应的 1.x 技能。",
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "f24c14f9da6913d42dd2fe45bb12d7c74fd6f49196e44d525730025bfb392d2d"
|
|
8
8
|
}
|
|
9
9
|
]
|
|
10
10
|
}
|
|
@@ -18,10 +18,10 @@ description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具
|
|
|
18
18
|
未创建工作区时使用本 Skill 随根包发布的精确版本:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
pnpm dlx openxiangda@2.
|
|
22
|
-
pnpm dlx openxiangda@2.
|
|
23
|
-
pnpm dlx openxiangda@2.
|
|
24
|
-
pnpm dlx openxiangda@2.
|
|
21
|
+
pnpm dlx openxiangda@2.11.0 auth status --cwd <应用目录> --base-url <平台地址> --json
|
|
22
|
+
pnpm dlx openxiangda@2.11.0 login --cwd <应用目录> --base-url <平台地址>
|
|
23
|
+
pnpm dlx openxiangda@2.11.0 create <应用目录> --base-url <同一平台地址>
|
|
24
|
+
pnpm dlx openxiangda@2.11.0 skill install --force
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
|
|
@@ -90,4 +90,4 @@ pnpm exec openxiangda --mcp-stdio --cwd <workspace>
|
|
|
90
90
|
|
|
91
91
|
失败保留错误码、指针与原候选。结果不确定先查平台,不生成新的随机幂等键掩盖原运行;仅执行平台允许的恢复。升级项目后刷新资料并重启旧 MCP 连接。
|
|
92
92
|
|
|
93
|
-
指定站点授权可用 `auth status --base-url <平台地址> --json` 或 MCP `authorization_status` 只读核验,无需工作区。状态为 `authorized` 才证明当前 access 被平台接受;`missing`/`platform_mismatch`/`refresh_required` 需处理会话,`unauthorized` 表示平台拒绝,`unavailable` 表示暂时无法核验,不能当成过期。查询不刷新、不打开浏览器、不修改绑定;应用管理权限需另行核验。
|
|
93
|
+
指定站点授权可用 `auth status --cwd <应用目录> --base-url <平台地址> --json` 或 MCP `authorization_status` 只读核验,无需工作区。状态为 `authorized` 才证明当前 access 被平台接受;`missing`/`platform_mismatch`/`refresh_required` 需处理会话,`unauthorized` 表示平台拒绝,`unavailable` 表示暂时无法核验,不能当成过期。查询不刷新、不打开浏览器、不修改绑定;应用管理权限需另行核验。
|
|
@@ -4,17 +4,72 @@ OpenXiangda 2.0 默认生成 React 应用和共享契约。普通 CRUD、标准
|
|
|
4
4
|
|
|
5
5
|
## 准备 {#prerequisites}
|
|
6
6
|
|
|
7
|
-
准备平台地址、具有应用开发权限的账号、Node.js 24 和 pnpm 10.15.1
|
|
7
|
+
准备平台地址、具有应用开发权限的账号、Node.js 24 和 pnpm 10.15.1。`openxiangda@latest` 与 `openxiangda@stable-v2` 指向 V2 稳定版,`openxiangda@legacy-v1` 指向 V1 维护版。安装后核对实际精确版本和目标平台能力;项目依赖与锁文件决定应用使用的工具链。
|
|
8
|
+
|
|
9
|
+
<a id="upgrade"></a>
|
|
10
|
+
|
|
11
|
+
## CLI、Skill、MCP 安装与升级 {#upgrade}
|
|
12
|
+
|
|
13
|
+
全局统一入口适合新用户和原 V1 用户安装;Node.js 需要 24 或更高版本:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g openxiangda@latest --registry=https://registry.npmjs.org
|
|
17
|
+
openxiangda version --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`openxiangda` 根包已经依赖配套 CLI、MCP 和 Skill 资料,无需逐个全局安装 `openxiangda-cli`、`openxiangda-mcp` 或 `openxiangda-skill-kit`。全局入口根据当前目录识别代际,进入已有项目时优先使用该项目锁定的引擎;更新全局入口不升级项目依赖。
|
|
21
|
+
|
|
22
|
+
### 原 V1 用户
|
|
23
|
+
|
|
24
|
+
建议评估升级到 OpenXiangda 2.0。新应用优先使用 V2;已有应用先核实能力覆盖、迁移成本及数据、在途流程、权限的验收与回滚方案。在已安装新版全局入口后,进入原项目运行:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
openxiangda version --json
|
|
28
|
+
openxiangda migrate assess --to v2 --json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
这里使用全局 `openxiangda`,不要用会优先调用旧项目 V1 CLI 的 `pnpm exec openxiangda` 或 `npx openxiangda` 来执行迁移评估。评估只读取本地源码指针,不读取远端数据、不自动转换应用。原项目仍按 V1 维护;同代更新通过 `legacy-v1` 获取维护版,不把 V2 包直接替换进 V1 项目。
|
|
32
|
+
|
|
33
|
+
### 更新入口与项目
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 更新全局统一入口
|
|
37
|
+
openxiangda update check --target launcher --json
|
|
38
|
+
openxiangda update install --target launcher
|
|
39
|
+
|
|
40
|
+
# 在项目目录,更新本项目同代依赖与锁文件
|
|
41
|
+
openxiangda update check --target workspace --json
|
|
42
|
+
openxiangda update install --target workspace
|
|
43
|
+
openxiangda version --json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
更新完成后审查依赖、锁文件差异并运行项目检查与业务验收。统一入口不会后台自动升级工具或转换项目。V1 独立 CLI 的 `update install` 会尝试刷新 V1 Skill(可用 `--no-skills` 跳过);统一入口的更新完成后按下面命令显式刷新 Skill。
|
|
47
|
+
|
|
48
|
+
### 安装或刷新 Skill
|
|
49
|
+
|
|
50
|
+
在项目目录刷新匹配该项目版本的技能,并更新 V2 项目的 AGENTS 平台区块:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
openxiangda skill install --workspace . --force
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
安装到用户级 Codex 或其他 AI 工具可用 `skill install --agent codex|claude|qoder|dual --force`(实际执行时选一个值),或 `--destination <Skill根目录>`。在 V1 项目内会安装 V1 技能与统一入口技能;要先安装 V2 用户级技能,使用 `openxiangda skill install --cwd <不属于任何应用的空目录> --force`。支持协作的自动准备与 `--skip-support` 见下文。
|
|
57
|
+
|
|
58
|
+
创建 V2 应用会准备匹配版本的项目指引。后续更新依赖后再次刷新技能;不要把不同代际或旧版本的技能正文复制进新项目。
|
|
59
|
+
|
|
60
|
+
### 接入及更新 MCP
|
|
61
|
+
|
|
62
|
+
MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置一次。使用[项目路径配置示例](mcp.md#连接项目),由客户端启动项目锁定版本的 `openxiangda --mcp-stdio`。CLI 更新不会自动修改客户端配置,也不会重启已有 MCP 进程;项目依赖升级后在客户端重启 MCP,然后读取 `workspace_context` 核对版本。长期开发进程使用 CLI 终端管理。
|
|
8
63
|
|
|
9
64
|
## 安装与创建 {#create}
|
|
10
65
|
|
|
11
66
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
12
67
|
|
|
13
68
|
```bash
|
|
14
|
-
pnpm dlx openxiangda@2.
|
|
15
|
-
pnpm dlx openxiangda@2.
|
|
16
|
-
pnpm dlx openxiangda@2.
|
|
17
|
-
pnpm dlx openxiangda@2.
|
|
69
|
+
pnpm dlx openxiangda@2.11.0 skill install --force
|
|
70
|
+
pnpm dlx openxiangda@2.11.0 auth status --base-url <平台地址> --json
|
|
71
|
+
pnpm dlx openxiangda@2.11.0 login --cwd my-app --base-url https://platform.example.com
|
|
72
|
+
pnpm dlx openxiangda@2.11.0 create my-app --base-url https://platform.example.com
|
|
18
73
|
cd my-app
|
|
19
74
|
pnpm openxiangda context --json
|
|
20
75
|
pnpm openxiangda dev
|
|
@@ -116,9 +171,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
|
|
|
116
171
|
无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
|
|
117
172
|
|
|
118
173
|
```bash
|
|
119
|
-
pnpm dlx openxiangda@2.
|
|
120
|
-
pnpm dlx openxiangda@2.
|
|
121
|
-
pnpm dlx openxiangda@2.
|
|
174
|
+
pnpm dlx openxiangda@2.11.0 auth status --base-url <平台> --json
|
|
175
|
+
pnpm dlx openxiangda@2.11.0 source resolve <仓库URL> --base-url <平台> --json
|
|
176
|
+
pnpm dlx openxiangda@2.11.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
122
177
|
```
|
|
123
178
|
|
|
124
179
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|
|
@@ -160,3 +215,11 @@ pnpm exec openxiangda --mcp-stdio --cwd <应用绝对路径>
|
|
|
160
215
|
先调用 `workspace_context`,再按任务读取 `docs_read` 和当前契约。配置示例与工具参数见[MCP 参考](mcp.md)。登录、创建和长期 dev 进程继续由 CLI/终端管理。
|
|
161
216
|
|
|
162
217
|
指定站点授权可用 `auth status --base-url <平台地址> --json` 或 MCP `authorization_status` 只读核验,无需工作区。状态为 `authorized` 才证明当前 access 被平台接受;`missing`/`platform_mismatch`/`refresh_required` 需处理会话,`unauthorized` 表示平台拒绝,`unavailable` 表示暂时无法核验,不能当成过期。查询不刷新、不打开浏览器、不修改绑定;应用管理权限需另行核验。
|
|
218
|
+
|
|
219
|
+
## 工作区登录态
|
|
220
|
+
|
|
221
|
+
平台授权保存到所选工作区的 `.openxiangda/session.json`,CLI、MCP、刷新与退出共用该文件。不再读取或迁移旧全局会话;升级后需在每个项目重新登录。已有项目可在根目录或子目录运行 `openxiangda login --base-url <platform>`;`login --cwd <directory>` 和 `auth --cwd <directory>` 明确选定工作区。嵌套应用不会继承父应用会话。
|
|
222
|
+
|
|
223
|
+
创建应用前先执行 `openxiangda login --cwd my-app --base-url <platform>`,再执行 `openxiangda create my-app --base-url <platform>`。仅含受管登录文件的目录允许初始化,凭据会保留并自动加入 Git 忽略规则。
|
|
224
|
+
|
|
225
|
+
本地文件优先;仅在文件缺失时使用成对的 `OPENXIANGDA_BASE_URL` 与 `OPENXIANGDA_TOKEN` CI 环境凭据。损坏、过期或平台不符的文件不会触发其他身份回退。请勿提交或打包登录文件。钉钉支持由 DWS 管理自己的授权,不与平台会话混用。
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
标准 Workflow 与 Notification Hub 已作为 OpenXiangda 2.0 可选平台模块重新开放。它们不属于默认 CRUD 模板,也不兼容或复用 1.x 工作流、消息中心、模板、卡片、回调、表和 API。
|
|
4
4
|
|
|
5
|
+
## 数据事件捕获与历史
|
|
6
|
+
|
|
7
|
+
默认保存全部数据增删改事件。没有完整事件审计或历史回放要求的资源,可在
|
|
8
|
+
`events.capturePolicies` 声明 `{ resourceCode: 'items', mode: 'subscribed' }`。
|
|
9
|
+
共享编译器据发布版本中的订阅声明生成固定计划,仅捕获需要的操作事件;没有
|
|
10
|
+
`resourceCodes` 限制的订阅覆盖全部资源,暂时禁用的订阅仍计入需求。该策略需要
|
|
11
|
+
平台 `events.capture-policy` 能力,不能只升级本地 SDK。
|
|
12
|
+
|
|
13
|
+
未声明策略或使用 `mode: 'all'` 保持原行为。`subscribed` 不提供完整变更事件
|
|
14
|
+
历史,回放只针对实际保存的事实;改回 `all` 只恢复今后的捕获。需要完整事件
|
|
15
|
+
审计或未来任意历史回放时保留 `all`。数据库审计字段与事件历史是不同的契约。
|
|
16
|
+
|
|
17
|
+
必要事件仍与数据同事务提交;没有必要事件时不写事件事实、outbox 或唤醒投递。
|
|
18
|
+
权限、记录修订约束、文件引用、日期触发和流程命令继续生效,自定义 `emitEvent`
|
|
19
|
+
也不受该策略影响。策略通过正常应用版本发布、测试和生产晋级生效。
|
|
20
|
+
|
|
5
21
|
## 标准详情与当前用户入口
|
|
6
22
|
|
|
7
23
|
普通记录、流程记录、任务和实例复用同一详情框架。流程详情提供申请内容、审批历史和变更记录三个标签页;管理员在当前抽屉或页面中切换到普通表单编辑,直接保存并自动留下变更记录,审批结果保持不变。PC 子表在表格内编辑,父表提交时统一校验。
|