openxiangda 1.0.188 → 1.0.190

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.
@@ -363,6 +363,16 @@ function releaseExecutionPath(changeId, deploymentId, cwd = process.cwd()) {
363
363
 
364
364
  function withManagedReleaseForwardedFlags(stepId, args = [], flags = {}) {
365
365
  const forwarded = [...args];
366
+ const immutableResourceStages = new Set([
367
+ 'backend-stage',
368
+ 'workflow-stage',
369
+ ]);
370
+ if (
371
+ immutableResourceStages.has(stepId) &&
372
+ !forwarded.includes('--include-noop')
373
+ ) {
374
+ forwarded.push('--include-noop');
375
+ }
366
376
  const baselineAdoptionStages = new Set([
367
377
  'form-stage',
368
378
  'backend-stage',
package/lib/cli.js CHANGED
@@ -11438,6 +11438,7 @@ async function resource(args) {
11438
11438
  ' - publish 默认跳过 plan 判定为 noop 的资源,避免无意义 upsert;需要强制写入时加 --force。',
11439
11439
  ' - Form settings bundle 默认只 stage,不推进线上 Form head;只有显式 --activate 才 CAS 激活。',
11440
11440
  ' - Function/Automation/Workflow 可用 --stage-only 只 prepare + verify immutable child;随后由 release app-finalize 一次原子激活。',
11441
+ ' - --include-noop 仅可与 --stage-only 一起使用,用于受管候选为内容未变的目标生成带当前来源的不可变子版本。',
11441
11442
  ' - publish --dry-run 等价于发布前计划,不会写平台资源。',
11442
11443
  ' - 在线 publish 必须用 --only/--code 精确选择;真正全量发布必须显式 --all --reason,SDD bypass 不能绕过此范围门。',
11443
11444
  ' - 历史代码已先合入主线、线上又来自多次分批发布时,可显式使用 --adopt-online-baseline --adoption-reason "...";仅允许绑定同一 change/lease 的精确非删除范围,仍保留 lease、冻结 head 检查与写入 CAS。',
@@ -11476,6 +11477,9 @@ async function resource(args) {
11476
11477
  const typeFilters = getResourceTypeFilters(positional, flags);
11477
11478
  const codeFilters = getResourceCodeFilters(flags);
11478
11479
  assertBackendStageOnlyScope(subcommand, flags, typeFilters);
11480
+ if (flags['include-noop'] && !flags['stage-only']) {
11481
+ fail('--include-noop 仅允许与 --stage-only 一起使用');
11482
+ }
11479
11483
  assertExplicitResourcePublishScope(subcommand, flags, codeFilters);
11480
11484
  assertExplicitManifestReplacement(flags);
11481
11485
  if (codeFilters && flags.prune) {
@@ -11644,7 +11648,7 @@ async function resource(args) {
11644
11648
  async () =>
11645
11649
  publishResourceManifest(config, target, manifest, {
11646
11650
  planActions: publishPlan.actions,
11647
- skipNoop: !Boolean(flags.force),
11651
+ skipNoop: !Boolean(flags.force || flags['include-noop']),
11648
11652
  prune: Boolean(flags.prune),
11649
11653
  pruneCandidates,
11650
11654
  publishLeaseId: publishLease?.leaseId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda",
3
- "version": "1.0.188",
3
+ "version": "1.0.190",
4
4
  "description": "OpenXiangda CLI, workspace build tools, runtime SDK, and form components.",
5
5
  "private": false,
6
6
  "bin": {
@@ -0,0 +1,24 @@
1
+ ---
2
+ description: src/forms/** — Use openxiangda-form skill
3
+ globs: src/forms/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Form Files
8
+
9
+ Editing `src/forms/<formCode>/`. Use the **`openxiangda-form`** skill.
10
+
11
+ - Keep field/schema rules in `schema.ts` and presentation in `page.tsx`.
12
+ - Prefer OpenXiangda platform fields, then `antd` / `antd-mobile`; do not use native inputs, hand-written uploaders, pickers, or user/department selectors.
13
+ - Option fields require non-empty `options`; linked data uses `SelectField` with `optionSource.type: "linkedForm"`.
14
+ - Top-level `schema.rules` is only for `FormEffect[]`; validation belongs to field `rules`.
15
+ - Do not recreate platform system fields. Use `behavior: "HIDDEN"` + `valueSync` for derived or permission keys.
16
+
17
+ Release with exact scope:
18
+
19
+ ```bash
20
+ openxiangda resource plan form-setting --only <formCode> --profile <name>
21
+ openxiangda resource publish form-setting --only <formCode> --change <change> --profile <name>
22
+ ```
23
+
24
+ Managed production activation only occurs through candidate → preproduction deploy/test → promotion of the same candidate.
@@ -0,0 +1,25 @@
1
+ ---
2
+ description: src/pages/** — Use openxiangda-page skill
3
+ globs: src/pages/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Page Files
8
+
9
+ Editing `src/pages/`. Use the **`openxiangda-page`** skill.
10
+
11
+ - Keep routes in `src/app/router.tsx` and navigation in `src/app/navigation.ts`.
12
+ - Split complex pages into thin views, `domain/`, `shared/{services,hooks}/`, `components/`, and styles.
13
+ - Use server pagination and structured `filterGroup`; never fetch an oversized page and filter in the browser.
14
+ - Prefer OpenXiangda platform components for platform data fields and `antd` / `antd-mobile` for ordinary UI.
15
+ - Do not use native form controls, hand-written pickers/uploaders, or frontend-only authorization.
16
+
17
+ Build and stage:
18
+
19
+ ```bash
20
+ pnpm typecheck
21
+ pnpm build
22
+ openxiangda runtime deploy --no-activate --change <change> --profile <name>
23
+ ```
24
+
25
+ Managed production activation only occurs through candidate → preproduction deploy/test → promotion of the same candidate.
@@ -0,0 +1,26 @@
1
+ ---
2
+ description: src/{workflows,automations,js-code-nodes,functions}/** — Use openxiangda-workflow-automation skill
3
+ globs: src/{workflows,automations,js-code-nodes,functions}/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Workflow / Automation / Function Files
8
+
9
+ Use the **`openxiangda-workflow-automation`** skill for workflows, automations, JS_CODE, and App Functions.
10
+
11
+ - Ordinary lifecycle state changes use a status field, domain state machine, and automation; create workflows only for real approval semantics.
12
+ - Prefer App Functions for reusable backend logic. JS_CODE is for cross-form, batch, process, platform API, external HTTP, and complex orchestration.
13
+ - Keep UI interactions, normal validation, and display logic in React.
14
+ - Log important backend steps with `ctx.logger`; obtain third-party credentials only through declared `secretRefs`.
15
+ - Never copy workflow, automation, or function IDs across profiles.
16
+
17
+ Build and release with exact scope:
18
+
19
+ ```bash
20
+ pnpm typecheck:js-code
21
+ pnpm build-js-code --script <code>
22
+ openxiangda resource plan <workflow|automation|function> --only <code> --profile <name>
23
+ openxiangda resource publish <workflow|automation|function> --only <code> --change <change> --profile <name>
24
+ ```
25
+
26
+ Managed production activation only occurs through candidate → preproduction deploy/test → promotion of the same candidate.
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: src/forms/** glob — 精准引导到 openxiangda-form skill
3
+ glob: src/forms/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Form Files
8
+
9
+ You are editing files under `src/forms/<formCode>/`. Use the **`openxiangda-form`** skill.
10
+
11
+ ## Required structure
12
+
13
+ ```text
14
+ src/forms/<formCode>/
15
+ ├── schema.ts # defineFormSchema() default export
16
+ └── page.tsx # presentation only
17
+ ```
18
+
19
+ ## Common pitfalls
20
+
21
+ - 平台字段组件优先于 `antd` / `antd-mobile` 包装和自定义业务组件。
22
+ - `schema.ts` 定义字段、选项、规则与行为;`page.tsx` 只负责展示。
23
+ - 禁止直接写原生 `<input>` / `<select>` / `<textarea>` / file input,禁止手写人员、部门、上传和 picker 组件。
24
+ - 选项字段必须提供非空 `options`;跨表数据使用 `SelectField` + `optionSource.type: "linkedForm"`。
25
+ - 顶层 `schema.rules` 只用于 `FormEffect[]`;字段校验放字段自己的 `rules`。
26
+ - 平台系统字段由平台维护,不要重复创建。
27
+ - 派生键和隐式权限键使用 `behavior: "HIDDEN"` + `valueSync`。
28
+
29
+ ## Release
30
+
31
+ ```bash
32
+ openxiangda resource validate form-setting --only <formCode> --profile <name>
33
+ openxiangda resource plan form-setting --only <formCode> --profile <name>
34
+ openxiangda resource publish form-setting --only <formCode> --change <change> --profile <name>
35
+ ```
36
+
37
+ 正式环境托管发布仍必须走 candidate → preproduction deploy/test → 同 candidate promotion,禁止直接激活生产资源。
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: src/pages/** glob — 精准引导到 openxiangda-page skill
3
+ glob: src/pages/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Page Files
8
+
9
+ You are editing files under `src/pages/`. Use the **`openxiangda-page`** skill.
10
+
11
+ ## Strong defaults
12
+
13
+ - 路由集中维护在 `src/app/router.tsx`,应用导航维护在 `src/app/navigation.ts`。
14
+ - 复杂页面拆分为薄视图、`domain/`、`shared/{services,hooks}/`、`components/` 和样式文件。
15
+ - 默认使用原生 Tailwind utilities,不使用未配置的 shadcn token。
16
+ - 列表必须服务端分页并使用结构化 `filterGroup`;禁止抓取超大页后在浏览器过滤。
17
+ - 平台数据字段优先使用 OpenXiangda 平台组件;普通 UI 使用 `antd` / `antd-mobile`。
18
+ - 禁止原生表单控件、手写 picker/uploader/人员部门选择器。
19
+ - 后端权限、公开访问 grants 与 App Function 检查才是授权依据;前端只做展示保护。
20
+
21
+ ## Release
22
+
23
+ ```bash
24
+ pnpm typecheck
25
+ pnpm build
26
+ openxiangda runtime deploy --no-activate --change <change> --profile <name>
27
+ ```
28
+
29
+ Runtime 只暂存到候选发布;正式环境托管发布必须走 candidate → preproduction deploy/test → 同 candidate promotion。
@@ -0,0 +1,34 @@
1
+ ---
2
+ description: src/{workflows,automations,js-code-nodes,functions}/** glob — 精准引导到 openxiangda-workflow-automation skill
3
+ glob: src/{workflows,automations,js-code-nodes,functions}/**/*
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenXiangda React SPA Workflow / Automation / Function Files
8
+
9
+ Use the **`openxiangda-workflow-automation`** skill when editing:
10
+
11
+ - `src/workflows/<code>/workflow.ts`
12
+ - `src/automations/<code>/index.ts`
13
+ - `src/js-code-nodes/<code>/index.ts`
14
+ - `src/functions/<code>/index.ts`
15
+
16
+ ## Boundaries
17
+
18
+ - 普通 `pending → processing → resolved → closed` 使用状态字段、领域状态机与 automation;只有真实审批语义才创建 workflow。
19
+ - 复用后端业务逻辑优先 App Function;JS_CODE 用于跨表、批量、流程、平台 API、外部 HTTP 与复杂编排。
20
+ - UI 交互、普通表单校验和展示逻辑留在 React 代码,不放进 JS_CODE。
21
+ - 每个关键步骤使用 `ctx.logger.debug/info/warn/error`;第三方凭据只通过 `secretRefs` 与 `ctx.secrets.get()` 获取。
22
+ - workflowId / automationId / functionId 不得跨 profile 复制。
23
+
24
+ ## Build and release
25
+
26
+ ```bash
27
+ pnpm typecheck:js-code
28
+ pnpm build-js-code --script <code>
29
+ openxiangda resource validate <workflow|automation|function> --only <code> --profile <name>
30
+ openxiangda resource plan <workflow|automation|function> --only <code> --profile <name>
31
+ openxiangda resource publish <workflow|automation|function> --only <code> --change <change> --profile <name>
32
+ ```
33
+
34
+ 资源发布只生成候选子版本;正式环境托管发布必须走 candidate → preproduction deploy/test → 同 candidate promotion。
@@ -9,7 +9,7 @@ const lines = [
9
9
  ' openxiangda resource publish <type> --only <codes> --change <change> --profile <name>',
10
10
  ' openxiangda runtime deploy --no-activate --change <change> --profile <name>',
11
11
  '',
12
- '正式激活后还必须 merge/push 冻结 SHA,再执行 release integration-status 与 release end。',
12
+ '发布前必须先把批准的提交合并并 push 到权威主线;激活后直接执行 release integration-status 与 release end。',
13
13
  '',
14
14
  'legacy lowcode-workspace publish-all 只用于旧 classic workspace 的兼容流程。',
15
15
  '',