kcode-pi 0.1.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/README.md +358 -0
- package/dist/cli/kcode.d.ts +15 -0
- package/dist/cli/kcode.js +153 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +7 -0
- package/docs/KCODE_DISTRIBUTION.md +91 -0
- package/extensions/kingdee-harness.ts +180 -0
- package/extensions/kingdee-header.ts +122 -0
- package/extensions/kingdee-tools.ts +379 -0
- package/knowledge/.backup/v1.0.0/version.json +10 -0
- package/knowledge/cangqiong/product-notes.md +15 -0
- package/knowledge/common/business-flows.md +115 -0
- package/knowledge/common/config-guides.md +110 -0
- package/knowledge/common/error-patterns.md +170 -0
- package/knowledge/common/implementation.md +144 -0
- package/knowledge/cosmic/hard-constraints.md +38 -0
- package/knowledge/cosmic/ksql-datafix.md +34 -0
- package/knowledge/cosmic/platform-baseline.md +32 -0
- package/knowledge/cosmic/plugin-decision-matrix.md +40 -0
- package/knowledge/cosmic/review-checklist.md +40 -0
- package/knowledge/cosmic/unittest.md +35 -0
- package/knowledge/enterprise/api-reference.md +186 -0
- package/knowledge/enterprise/code-patterns.md +217 -0
- package/knowledge/enterprise/plugin-lifecycle.md +188 -0
- package/knowledge/enterprise/tables.json +159 -0
- package/knowledge/flagship/api-reference.md +237 -0
- package/knowledge/flagship/code-patterns.md +246 -0
- package/knowledge/flagship/cosmic-platform-note.md +15 -0
- package/knowledge/flagship/plugin-lifecycle.md +248 -0
- package/knowledge/flagship/tables.json +159 -0
- package/knowledge/version.json +10 -0
- package/knowledge/xinghan/product-notes.md +15 -0
- package/package.json +71 -0
- package/prompts/kd-discuss.md +11 -0
- package/prompts/kd-execute.md +12 -0
- package/prompts/kd-plan.md +12 -0
- package/prompts/kd-ship.md +12 -0
- package/prompts/kd-spec.md +12 -0
- package/prompts/kd-verify.md +12 -0
- package/skills/kd-check/SKILL.md +26 -0
- package/skills/kd-cosmic-dev/SKILL.md +82 -0
- package/skills/kd-cosmic-review/SKILL.md +90 -0
- package/skills/kd-cosmic-unittest/SKILL.md +92 -0
- package/skills/kd-debug/SKILL.md +30 -0
- package/skills/kd-discuss/SKILL.md +24 -0
- package/skills/kd-execute/SKILL.md +22 -0
- package/skills/kd-gen/SKILL.md +34 -0
- package/skills/kd-ksql/SKILL.md +86 -0
- package/skills/kd-plan/SKILL.md +24 -0
- package/skills/kd-ship/SKILL.md +22 -0
- package/skills/kd-spec/SKILL.md +24 -0
- package/skills/kd-verify/SKILL.md +22 -0
- package/themes/kcode-dark.json +81 -0
- package/vendor/kingdee-skills/cosmic-unittest/SKILL.md +788 -0
- package/vendor/kingdee-skills/cosmic-unittest/author-cache.json +5 -0
- package/vendor/kingdee-skills/cosmic-unittest/cosmic-unittest-skill-overview.html +746 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/business-test.md +205 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/common-test.md +257 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/formplugin-test.md +560 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/op-plugin-test.md +231 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/validator-test.md +232 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/business-helper.md +184 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/common-module.md +355 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/convert-plugin.md +130 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/formplugin.md +235 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/op-plugin.md +226 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/validator.md +206 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/SKILL.md +674 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/advanced-scenario-checklist.md +307 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/algox-performance-checklist.md +129 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/coding-standard-checklist.md +491 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/cosmic-api-checklist.md +285 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-access-checklist.md +261 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-transaction-checklist.md +390 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/domain-logic-checklist.md +295 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/form-plugin-checklist.md +508 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/infra-checklist.md +254 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ksql-checklist.md +305 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/lifecycle-checklist.md +298 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/operation-plugin-checklist.md +442 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/test-mock-checklist.md +120 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ui-performance-checklist.md +320 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/pattern-matcher.py +336 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/review-score-calculator.py +121 -0
- package/vendor/kingdee-skills/ok-cosmic/CHANGELOG.md +295 -0
- package/vendor/kingdee-skills/ok-cosmic/README.md +460 -0
- package/vendor/kingdee-skills/ok-cosmic/SKILL.md +287 -0
- package/vendor/kingdee-skills/ok-cosmic/agents/openai.yaml +17 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BatchImportPluginTemplate.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BillPlugInTemplate.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ConvertPlugInTemplate.java +255 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/FormPluginTemplate.java +597 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/IWorkflowPluginTemplate.java +91 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ListPluginTemplate.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpPluginTemplate.java +201 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpenApiControllerTemplate.java +103 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/PrintPluginTemplate.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportFormPluginTemplate.java +257 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportListDataPluginTemplate.java +70 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/StandardTreeListPluginTemplate.java +130 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TaskTemplate.java +80 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TreeListPluginTemplate.java +152 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/WriteBackPlugInTemplate.java +286 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/attachment/AttachmentUploadBindSample.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/BotpTracePushSample.java +168 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/SampleConvertPlugin.java +223 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/cache/SampleCacheUsage.java +218 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/concurrent/SampleThreadPoolBatch.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectCrudSample.java +205 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectOpsSample.java +100 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/BeforeOperationConfirmSample.java +217 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ConfirmDialogSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/EntryRowCalculateSample.java +116 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/F7FilterSample.java +134 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/GetAndSetValueSample.java +176 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/HyperlinkJumpSample.java +124 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/OpenBillModalSample.java +253 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ReturnParentDataSample.java +295 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/TreeControlSample.java +140 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ViewControlOpsSample.java +132 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPluginBasicSample.java +170 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPreOpenFilterSample.java +68 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/message/MessageNotifySample.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/SampleMQConsumer.java +198 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/sample_mq.xml +15 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OpAddValidatorsSample.java +137 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OperationOptionBridgeSample.java +228 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/package-info.java +19 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BaseDataQuerySample.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BatchQuerySample.java +368 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/DataSetQueryStatSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportFormPlugin.java +179 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportListDataPlugin.java +616 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/snippets-guide.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/task/ScheduleTaskSample.java +160 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/workflow/SampleWorkflowPlugin.java +302 -0
- package/vendor/kingdee-skills/ok-cosmic/manifest.json +78 -0
- package/vendor/kingdee-skills/ok-cosmic/ok-cosmic-intro.html +903 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/attachment-api.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/botp-convert.md +98 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/dynamic-object.md +113 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/entity-metadata.md +123 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/event-lifecycle.md +184 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/flex-prop.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/form-utils.md +133 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/operate-chain.md +159 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/plugin-base.md +218 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/query-dataset.md +149 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/request-context.md +88 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/view-handler.md +157 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-bill.md +76 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-botp.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-form.md +165 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-import.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-list.md +227 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-openapi.md +112 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-operation.md +135 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-print.md +65 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-data.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-form.md +90 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-task.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-tree-list.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-workflow.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-writeback.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-algo.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-cache.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-model-svc.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-object.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-entity-model.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-exception.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-file.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-id.md +47 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-lock.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-log.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-network-control.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-orm-access.md +78 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-request-context.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-threadpool.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-tx.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-utils.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/requirements.txt +2 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/a-layer-rules.json +24 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/anti-patterns.md +48 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/cheat-sheet.md +256 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/coding-preferences.md +140 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/constraints.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/decision-matrix.md +222 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/intent-routing.md +94 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/platform-baseline.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/post-check.md +109 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/config_loader.py +204 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-api-knowledge.py +910 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-basedata-query.py +359 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-config-check.py +181 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-extpoints-query.py +389 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-form-metadata.py +856 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-check.py +262 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-lint.py +293 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/__init__.py +2 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/base.py +393 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/resource_check.py +176 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/scene_check.py +375 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/style_check.py +434 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/verify_check.py +36 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/route_client.py +186 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/script_utils.py +40 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/sqlite_cache.py +142 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-commons.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-features.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic-docs.db +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic.json +13 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-mac.sh +18 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-windows.bat +53 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup.jar +0 -0
- package/vendor/kingdee-skills/ok-ksql/SKILL.md +81 -0
- package/vendor/kingdee-skills/ok-ksql/agents/openai.yaml +7 -0
- package/vendor/kingdee-skills/ok-ksql/manifest.json +14 -0
- package/vendor/kingdee-skills/ok-ksql/references/ksql-datafix.md +452 -0
- package/vendor/kingdee-skills/ok-ksql/scripts/ksql_lint.py +363 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "ok-cosmic"
|
|
3
|
+
description: "金蝶云苍穹开发主 Skill,优先复用 kd-cd-cosmic-commons 封装。适用于插件开发、单据/列表/表单逻辑、操作服务、BOTP 转换、后台视图打开、附件处理、DynamicObject 与元数据处理、弹性域解析及 OpenAPI 集成。默认优先使用仓库封装;在涉及原生插件事件、SDK API、方法签名或封装未覆盖场景时,使用内置脚本进行查询。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 苍穹开发
|
|
7
|
+
|
|
8
|
+
默认按"封装优先,原生兜底"工作,避免在仓库已封装的场景里退回到 BOS 原生低层 API。
|
|
9
|
+
|
|
10
|
+
## 路径约定
|
|
11
|
+
|
|
12
|
+
- `<SKILL_ROOT>` = 当前 `SKILL.md` 所在的目录(即 `skills/ok-cosmic/`)
|
|
13
|
+
|
|
14
|
+
## Step 0. 配置预检(先于一切)
|
|
15
|
+
|
|
16
|
+
1. Step 0 的第一个动作必须直接执行:
|
|
17
|
+
`python3 <SKILL_ROOT>/scripts/cosmic-config-check.py`
|
|
18
|
+
2. 默认在当前项目工作目录直接执行;不要先询问或搜索 `ok-cosmic.json` 的位置。
|
|
19
|
+
3. 只有用户明确提供了其他配置路径,或当前工作目录不是目标项目根目录时,才改用:
|
|
20
|
+
`python3 <SKILL_ROOT>/scripts/cosmic-config-check.py --config <显式路径>`
|
|
21
|
+
4. 若脚本返回非 0 或输出含 `ERROR`:停止生成代码,明确提示用户补齐缺失项。
|
|
22
|
+
5. 若仅有 `WARNING`:先告知用户哪些在线能力不可用,再决定是否继续当前任务。后续脚本调用受以下限制:
|
|
23
|
+
|
|
24
|
+
| WARNING 类型 | 限制 |
|
|
25
|
+
|---|---|
|
|
26
|
+
| "API 不可达" 或 "在线服务不可用" | **禁止调用** `cosmic-basedata-query.py`;`cosmic-form-metadata.py` 仅允许使用本地缓存,**禁止 `--refresh` 刷新** |
|
|
27
|
+
| "知识库不存在" | `cosmic-api-knowledge.py` 不可用,改为仅依赖 `cheat-sheet.md` 和模板中的方法签名 |
|
|
28
|
+
|
|
29
|
+
## 自然语言意图路由(首读)
|
|
30
|
+
|
|
31
|
+
先把用户原话翻译成"**时机 + 载体 + 能力**",再进入统一决策矩阵。
|
|
32
|
+
|
|
33
|
+
> 详细自然语言映射、例句和误判修正见 [rules/intent-routing.md](rules/intent-routing.md)。
|
|
34
|
+
|
|
35
|
+
## 统一决策矩阵(精简索引)
|
|
36
|
+
|
|
37
|
+
使用方式:
|
|
38
|
+
- 先命中 **1 行主场景**(通常是插件行),再按需补 **0-1 行能力行**。
|
|
39
|
+
- 用户原话如果还是业务描述,先读 [rules/intent-routing.md](rules/intent-routing.md) 做语义翻译。
|
|
40
|
+
- 完整矩阵和未命中兜底见 [rules/decision-matrix.md](rules/decision-matrix.md)。
|
|
41
|
+
- 命中索引后,只跳到对应锚点附近 **1-3 行**,不要整表通读。
|
|
42
|
+
- **短路条件**:如果需求明确单一(例如"加个保存前校验""加个 F7 过滤"),且 `rules/cheat-sheet.md` 已覆盖所需 API,可跳过 references 直接用模板 + snippet。只有在不确定事件时机、生命周期约束或封装边界时,才需要展开 references 全文。
|
|
43
|
+
|
|
44
|
+
### 插件类
|
|
45
|
+
|
|
46
|
+
| 需求关键词 | 场景 | 详见矩阵行 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 表单 UI / 字段联动 / 控件交互 | 表单插件 | [`#form-plugin`](rules/decision-matrix.md#form-plugin) |
|
|
49
|
+
| 单据 UI / 审核提交按钮 | 单据插件 | [`#bill-plugin`](rules/decision-matrix.md#bill-plugin) |
|
|
50
|
+
| 列表 / 多选操作 / 批量 | 列表插件 | [`#list-plugin`](rules/decision-matrix.md#list-plugin) |
|
|
51
|
+
| 左树右表(单据 / 基础资料) | 树列表插件 | [`#tree-plugins`](rules/decision-matrix.md#tree-plugins) |
|
|
52
|
+
| 审核 / 保存 / 状态流转 / 校验 / 回滚 | 操作插件 | [`#op-plugin`](rules/decision-matrix.md#op-plugin) |
|
|
53
|
+
| 下推 / 选单 / 来源追踪 / 转换 | 转换插件 | [`#convert-plugin`](rules/decision-matrix.md#convert-plugin) |
|
|
54
|
+
| 明确指定反写插件 / BOTP 回写阶段 | 反写插件 | [`#writeback-plugin`](rules/decision-matrix.md#writeback-plugin) |
|
|
55
|
+
| 报表 / 数据分析 | 报表插件 | [`#report-form-plugin`](rules/decision-matrix.md#report-form-plugin) |
|
|
56
|
+
| 报表取数 / 动态列 / 自定义数据源 | 报表取数插件 | [`#report-data-plugin`](rules/decision-matrix.md#report-data-plugin) |
|
|
57
|
+
| 打印 / 套打 | 打印插件 | [`#print-plugin`](rules/decision-matrix.md#print-plugin) |
|
|
58
|
+
| OpenAPI / 外部集成 | OpenAPI 控制器 | [`#openapi-plugin`](rules/decision-matrix.md#openapi-plugin) |
|
|
59
|
+
| 后台任务 / 定时 / 调度作业 | 后台任务 | [`#task-plugin`](rules/decision-matrix.md#task-plugin) |
|
|
60
|
+
| 工作流 / 审批流 | 工作流插件 | [`#workflow-plugin`](rules/decision-matrix.md#workflow-plugin) |
|
|
61
|
+
| 导入 / 批量导入 | 导入插件 | [`#import-plugin`](rules/decision-matrix.md#import-plugin) |
|
|
62
|
+
|
|
63
|
+
### 能力类
|
|
64
|
+
|
|
65
|
+
| 需求关键词 | 能力 | 详见矩阵行 |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| 后台打开表单 / 列表 / 新页签跳转 | 视图打开与跳转 | [`#view-handler`](rules/decision-matrix.md#view-handler) |
|
|
68
|
+
| 表单控件 / UI 消息 / 元数据读取 | 界面工具 | [`#form-utils`](rules/decision-matrix.md#form-utils) |
|
|
69
|
+
| 数据加载 / 保存 / 查询 / ORM / DataSet | 查询与存取 | [`#query`](rules/decision-matrix.md#query) |
|
|
70
|
+
| 基础资料 / 管控策略 / 分配 / 个性化 | 基础资料 | [`#basedata`](rules/decision-matrix.md#basedata) |
|
|
71
|
+
| DynamicObject / 安全取值 / 序列化 | 数据包操作 | [`#dynamic-object`](rules/decision-matrix.md#dynamic-object) |
|
|
72
|
+
| 实体元数据 / 字段路径 / DBRoute | 元数据与结构 | [`#entity-metadata`](rules/decision-matrix.md#entity-metadata) |
|
|
73
|
+
| 弹性域字段 / 值解析 | 弹性域 | [`#flex-prop`](rules/decision-matrix.md#flex-prop) |
|
|
74
|
+
| 消息 / 邮件 / 短信 / 企业微信 | 消息通知 | [`#message`](rules/decision-matrix.md#message) |
|
|
75
|
+
| 附件上传 / 下载 / 复制 / 面板绑定 | 附件与文件 | [`#attachment`](rules/decision-matrix.md#attachment) |
|
|
76
|
+
| 组织 / 权限 / 上下文 | 上下文判定 | [`#request-context`](rules/decision-matrix.md#request-context) |
|
|
77
|
+
| 跨线程身份 / 上下文恢复 | 并发上下文恢复 | [`#thread-context`](rules/decision-matrix.md#thread-context) |
|
|
78
|
+
| 业务拓展点 / 业务扩展点 / SDK 扩展接口 / Java 示例 | 业务拓展点查询 | [`#business-extpoints`](rules/decision-matrix.md#business-extpoints) |
|
|
79
|
+
|
|
80
|
+
> 仍未命中时,按 [rules/decision-matrix.md#fallback](rules/decision-matrix.md#fallback) 的兜底流程处理;若 `ok-cosmic.json` 配置了 `extensionRepos`,则进入下方“扩展代码库探索”流程。
|
|
81
|
+
|
|
82
|
+
## 开发前规范预检(需求涉及平台对象时必做)
|
|
83
|
+
|
|
84
|
+
1. 先快速过一遍 `rules/platform-baseline.md`,确认需求是否涉及命名、设计器/PDM、数据库、多语言、微服务、报表等平台级规则。
|
|
85
|
+
2. 若涉及新增或修改业务对象、表、字段、索引、默认值、主键,先确认对象编码、`Key`、PDM 命名、是否允许删除/隐藏。
|
|
86
|
+
3. 若是扩展场景,先确认只做垂直扩展;源页面字段 `Key`、必录属性、基础资料类型不允许改,不需要显示时只做可见性处理。
|
|
87
|
+
4. 若涉及微服务,先确认服务工厂前缀、接口命名和应用归属。
|
|
88
|
+
5. 若涉及报表或大数据量查询,先设计字段裁剪、批量取数、子单据体拆分、`algo` 聚合方案。
|
|
89
|
+
|
|
90
|
+
## 开发决策路径(完成 Step 0 后执行)
|
|
91
|
+
|
|
92
|
+
> **并行优先原则**:下列步骤中标注 **‖** 的操作互不依赖,应在同一轮**同时发起**。具体方式:
|
|
93
|
+
> - **多个 read_file / grep_code** → 直接并行 tool call
|
|
94
|
+
> - **复杂多步探索**(标注 🔍)→ 启动多个 **Search Agent** 并行执行,每个 Agent 独立完成一个探索任务后汇总结果
|
|
95
|
+
|
|
96
|
+
1. 先判断插件类型或能力类别(查上方决策矩阵)。
|
|
97
|
+
- 有交互界面 → 区分“表单事件”和“控件事件”;控件事件需 `implements XxxListener` + `registerListener` 注册。
|
|
98
|
+
- 无交互界面(操作、转换、反写、任务) → 按生命周期选正确事件,不套用 UI 插件写法。
|
|
99
|
+
2. **‖ 并行加载**参考文档与模板(启动并行 Search Agent):
|
|
100
|
+
- 🔍 **Agent A — 事件参考**:读对应 `references/*.md` 的 TL;DR 摘要 + `assets/*.java` 模板,提取事件签名与骨架。只读当前任务需要的事件方法段,不要一次性通读整个模板。如果卡在事件先后顺序,先读 [references/adv/event-lifecycle.md](references/adv/event-lifecycle.md)。
|
|
101
|
+
- 🔍 **Agent B — 项目探索**:在用户项目中搜索相似插件实现(同类型插件、相似业务场景),分析已有代码风格、import 习惯、封装用法,确保生成代码与项目风格一致。
|
|
102
|
+
3. **‖ 并行验证**字段与 API 签名(互不依赖的查询应同时发起):
|
|
103
|
+
- 调用脚本前,先查下方“脚本路由”表格确认调用模板;表格未覆盖时才执行 `python3 <script> --help`。
|
|
104
|
+
- 3a. 若目标 API 已在 `rules/cheat-sheet.md` 中列出 → 直接使用,**无需脚本验证**。
|
|
105
|
+
- 3b. 字段 / `entityId` / 枚举值验证 → 查 `cosmic-form-metadata.py`。**只要要生成代码且已知目标单据/表单,凡涉及字段(无论用户给中文名还是英文标识),都必须验证字段是否存在、字段类型、所属实体和特殊取值规则;多个字段合并到同一次调用**。
|
|
106
|
+
- 3c. SDK 类名/方法签名不在 cheat-sheet 中 → 查 `cosmic-api-knowledge.py`。**与 3b 互不依赖,应同时发起**。
|
|
107
|
+
- 3d. 需要查询多个不同类的 detail → **多个 `detail` 调用也可并行**。
|
|
108
|
+
- ⚠️ `cosmic-basedata-query.py` 必须等 `entityId` 从 3b 确认后才能调用,**不可并行**。
|
|
109
|
+
4. 只有"插件类型 + 事件方法 + 字段/签名"都确认后,才开始生成代码。
|
|
110
|
+
5. 编写代码时遵守最小干预:插件只做当前事件该做的事;能用封装就不退回原生。
|
|
111
|
+
6. **代码生成后,必须执行 `cosmic-post-check.py` 自动校验**,详见"代码生成后自动校验"章节。
|
|
112
|
+
|
|
113
|
+
## 写代码前的最小确认卡
|
|
114
|
+
|
|
115
|
+
生成代码前,以下六项必须全部就绪,任一为空则继续查证:
|
|
116
|
+
|
|
117
|
+
| # | 确认项 | 来源 |
|
|
118
|
+
|---|--------|------|
|
|
119
|
+
| 1 | 插件类型 | 决策矩阵 |
|
|
120
|
+
| 2 | 目标事件方法 | 模板 / references |
|
|
121
|
+
| 3 | 使用模板 | `assets/*.java` |
|
|
122
|
+
| 4 | 已验证字段 / refType / entityId | 生成代码且已知目标单据/表单时,字段中文名/英文标识都必须经 `cosmic-form-metadata.py` 确认;`entityId` 来自用户明确给出或元数据脚本确认 |
|
|
123
|
+
| 5 | 已确认枚举/下拉选项值(有使用时) | `cosmic-form-metadata.py --show-detail` |
|
|
124
|
+
| 6 | 已验证类/方法签名 | cheat-sheet / `cosmic-api-knowledge.py` / 业务拓展点 `--full` 返回的清晰 Java 示例 |
|
|
125
|
+
|
|
126
|
+
## 脚本路由
|
|
127
|
+
|
|
128
|
+
### 脚本调用协议
|
|
129
|
+
|
|
130
|
+
常用脚本的调用模板已列在下方表格,可直接按模板执行。仅当参数不确定或下表未覆盖时,才需先执行 `python3 <script> --help` 确认调用方式。
|
|
131
|
+
|
|
132
|
+
### 先选脚本,再按模板调用
|
|
133
|
+
|
|
134
|
+
| 场景 | 优先脚本 | 常用用法 | 调用模板 | 备注 |
|
|
135
|
+
|---|---|---|---|---|
|
|
136
|
+
| SDK 类名、方法名、继承链、`@Override` 签名确认 | `scripts/cosmic-api-knowledge.py` | `search` / `search-method` / `detail` | `python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json <subcommand> ...` | `detail` 支持逗号分隔批量查类详情(并发请求) |
|
|
137
|
+
| 字段标识、枚举映射、`refType`、按中文名确认真实英文标识 | `scripts/cosmic-form-metadata.py` | `get` | `python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get ...` | 字段不确定先查它。`formIdOrName` 支持逗号分隔批量查询(formId 与中文名可混合,自动识别,并发请求) |
|
|
138
|
+
| 已确认 `entityId` 后查询基础资料编码/名称/完整数据 | `scripts/cosmic-basedata-query.py` | `get` | `python3 <SKILL_ROOT>/scripts/cosmic-basedata-query.py --config ok-cosmic.json get ...` | 只在 `entityId` 来源已确认后调用 |
|
|
139
|
+
| 查询业务拓展点 / SDK 扩展接口候选 | `scripts/cosmic-extpoints-query.py` | `get` | `python3 <SKILL_ROOT>/scripts/cosmic-extpoints-query.py --config ok-cosmic.json get --keyword ...` | 默认摘要模式;仅在需要生成代码或查看 Java 示例时加 `--full`;若 `--full` 已返回清晰 Java 示例,可先按示例,不强制立即 `detail` |
|
|
140
|
+
| 生成或修改苍穹 Java 代码后的统一校验 | `scripts/cosmic-post-check.py` | 直接执行 | `python3 <SKILL_ROOT>/scripts/cosmic-post-check.py <file_or_directory> --fix-hint` | 必须形成"生成 -> 校验 -> 修复 -> 复检"闭环 |
|
|
141
|
+
|
|
142
|
+
### 常用用法示例
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# 搜索类名
|
|
146
|
+
python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json search QueryServiceHelper
|
|
147
|
+
|
|
148
|
+
# 搜索方法名
|
|
149
|
+
python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json search-method loadSingle
|
|
150
|
+
|
|
151
|
+
# 查看类详情(全部方法)
|
|
152
|
+
python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json detail kd.bos.servicehelper.QueryServiceHelper
|
|
153
|
+
|
|
154
|
+
# 查看类详情(单个方法筛选)
|
|
155
|
+
python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json detail kd.bos.servicehelper.QueryServiceHelper --method loadSingle --compact
|
|
156
|
+
|
|
157
|
+
# 批量查类详情(逗号分隔,并发请求)
|
|
158
|
+
python3 <SKILL_ROOT>/scripts/cosmic-api-knowledge.py --config ok-cosmic.json detail kd.bos.servicehelper.QueryServiceHelper,kd.bos.servicehelper.SaveServiceHelper --method save --compact
|
|
159
|
+
|
|
160
|
+
# 查元数据字段
|
|
161
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order
|
|
162
|
+
|
|
163
|
+
# 查元数据字段(带数据库相关信息)
|
|
164
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order,ap_finapbill --sql
|
|
165
|
+
|
|
166
|
+
# 批量查询多个单据(逗号分隔)
|
|
167
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order,ap_finapbill --fuzzy supplier
|
|
168
|
+
|
|
169
|
+
# 混合查询:formId + 中文单据名(自动识别)
|
|
170
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get "ap_finapbill,物料,bd_supplier" --fuzzy number
|
|
171
|
+
|
|
172
|
+
# 模糊筛选字段
|
|
173
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order --fuzzy qty price amount
|
|
174
|
+
|
|
175
|
+
# 按多种字段类型筛选(正则 OR)
|
|
176
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order --type "combo|check"
|
|
177
|
+
|
|
178
|
+
# 类型 + 关键词交集筛选(Decimal 类型且含 amount)
|
|
179
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order --type decimal --fuzzy amount
|
|
180
|
+
|
|
181
|
+
# 按单据中文名查元数据
|
|
182
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get 物料
|
|
183
|
+
|
|
184
|
+
# 查看单据所有操作
|
|
185
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order --op
|
|
186
|
+
|
|
187
|
+
# 按关键词筛选操作
|
|
188
|
+
python3 <SKILL_ROOT>/scripts/cosmic-form-metadata.py --config ok-cosmic.json get sal_order --op 审核 提交
|
|
189
|
+
|
|
190
|
+
# 查基础资料
|
|
191
|
+
python3 <SKILL_ROOT>/scripts/cosmic-basedata-query.py --config ok-cosmic.json get --entity-id bd_material --number-or-name 01.0001
|
|
192
|
+
|
|
193
|
+
# 查业务拓展点
|
|
194
|
+
python3 <SKILL_ROOT>/scripts/cosmic-extpoints-query.py --config ok-cosmic.json get --keyword 应付
|
|
195
|
+
|
|
196
|
+
# 代码校验
|
|
197
|
+
python3 <SKILL_ROOT>/scripts/cosmic-post-check.py ./src/main/java/MyPlugin.java --fix-hint
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 跨脚本硬约束
|
|
201
|
+
|
|
202
|
+
- 完成 Step 0 后,后续脚本优先显式使用 `--config ok-cosmic.json`;若当前工作目录不是项目根目录,再传绝对路径。不要为了拼配置路径先额外搜索 `ok-cosmic.json`。
|
|
203
|
+
- **参数不确定时**,先执行 `python3 <script> --help` 确认调用方式;如果 `--help` 仍不足以确认,就停止并报告。
|
|
204
|
+
- **凡是带子命令的脚本,`--config` 等全局参数统一放在子命令前,按 `python3 <script> --config ok-cosmic.json <subcommand> ...` 组织。**
|
|
205
|
+
- `entityId` 只允许来自"用户明确给出的准确英文标识"或"元数据脚本确认出的真实标识";来源不明时,先查 `cosmic-form-metadata.py`,不得直接执行基础资料查询。
|
|
206
|
+
- **字段生成代码强制验证**:只要要生成/修改代码,且已知目标单据/表单(`formId` 或 `billName`),凡涉及字段(无论用户给的是中文名还是英文标识),都必须先用 `cosmic-form-metadata.py` 验证字段是否存在、字段类型、所属实体(表头/表体/子表体/容器)和特殊取值规则(如 `BasedataPropField` 的 `refType`、`LargeTextField` 的 `{fieldKey}_tag`、Combo/下拉字段的 Ext 映射)。目标单据/表单不明确时,先确认目标,不要直接把用户给的字段写进代码。
|
|
207
|
+
- **枚举/下拉选项值禁猜 [A1.8]**:使用 ComboField / 下拉字段的具体选项值前,必须先查 `cosmic-form-metadata.py` 的 Ext 列确认真实映射,详见 [constraints.md](rules/constraints.md) A1.8。
|
|
208
|
+
- 需要确认多个字段时,优先一次性合并到同一次元数据查询里;不要逐个字段重复调用脚本。
|
|
209
|
+
- **并行调用**:`cosmic-form-metadata.py`(字段/枚举验证)与 `cosmic-api-knowledge.py`(类/方法签名验证)查询不同数据源、互不依赖,应在同一轮并行发起。同理,多个 `detail` 查询、多个文件读取也应并行。唯一例外:`cosmic-basedata-query.py` 依赖 `entityId` 确认结果,必须串行等待。
|
|
210
|
+
- **元数据批量查询**:`cosmic-form-metadata.py` 的 `formIdOrName` 位置参数支持逗号分隔多个查询目标(如 `get sal_order,ap_finapbill,物料`),含中文的自动走 billName、英文标识走 formId,脚本内部通过 `ThreadPoolExecutor` 并发请求(最多 4 线程),结果按原始顺序拼接输出。跨单据场景(如下推、对比源单与目标单字段)优先使用批量查询,减少脚本调用次数。
|
|
211
|
+
- 查询超时或远端失败时,只能基于当前会话里已确认的字段、`refType`、`entityId`、接口返回继续;若本次查询结果是继续前提,则停止。
|
|
212
|
+
- 若 Traceback 明确指向 Skill 脚本实现问题,立即停止并报告命令与错误摘要;不要绕过验证继续生成依赖该事实的代码。
|
|
213
|
+
- 只有在用户已修正配置/环境,或本次明确修改了查询条件后,才允许重试同类脚本;不要原样重复执行。
|
|
214
|
+
|
|
215
|
+
### 项目级配置文件 (`ok-cosmic.json`)
|
|
216
|
+
|
|
217
|
+
脚本依赖 `ok-cosmic.json` 获取数据库路径及 API 地址。若需模板可参考 `<SKILL_ROOT>/setup/ok-cosmic.json`。
|
|
218
|
+
|
|
219
|
+
- **显式指定**: 调用脚本时建议指定 `--config <路径>`。未指定时读取**当前执行目录**下的 `ok-cosmic.json`;不存在则报错。
|
|
220
|
+
- **在线查询配置**: 三个在线查询脚本统一走 `route.apiUrl`(`runtime/route`,URL 中包含 `openApiSign`)/ `route.timeoutSeconds`;脚本内部通过 `data.type=meta|basedata|extpoint` 路由。
|
|
221
|
+
- **统一路由请求体**: 元数据 `data.type=meta` + `reqData.entityId/formId/billName/full`;基础资料 `data.type=basedata` + `reqData.entityId/numberOrName/full`;业务拓展点 `data.type=extpoint` + `reqData.keyword`。
|
|
222
|
+
|
|
223
|
+
## 扩展代码库探索(Extension Repos Fallback)
|
|
224
|
+
|
|
225
|
+
当决策矩阵未命中、`rules/cheat-sheet.md` 和 `assets/snippets/` 也无覆盖时,允许回落到用户配置的扩展代码库进行实现参考。
|
|
226
|
+
|
|
227
|
+
- **触发条件**(需同时满足):
|
|
228
|
+
- 决策矩阵未命中,且 `cheat-sheet.md` / `assets/snippets/` 均无覆盖;
|
|
229
|
+
- 且 **当前项目中没有具体实现可以满足需求**(在用户项目搜相似插件/业务无果,或已有实现与当前需求不匹配)。
|
|
230
|
+
- **不触发条件**:`ok-cosmic.json` 未配置 `extensionRepos` 或数组为空时,跳过本流程,继续按 fallback 第 1-3 步处理。
|
|
231
|
+
- **探索方式**:
|
|
232
|
+
- 从当前需求提取关键词:插件类型、事件方法名、实体/字段标识、业务关键词。
|
|
233
|
+
- 在 `extensionRepos` 所列路径下用 `grep_code` 或 Search Agent 搜索 `.java` 文件;多个路径并行探索。
|
|
234
|
+
- 优先阅读匹配类的整体结构和相关事件方法,了解真实项目中的写法习惯。
|
|
235
|
+
- **结果使用原则**:
|
|
236
|
+
- 扩展代码库仅作为**实现参考**,不等同于 ok-cosmic 推荐写法。
|
|
237
|
+
- 生成代码时仍须遵守 A 层硬约束(`rules/constraints.md`、`rules/anti-patterns.md`)与 B 层编码偏好(`rules/coding-preferences.md`)。
|
|
238
|
+
- 若扩展代码与 ok-cosmic 规范冲突,**以 ok-cosmic 规范为准**;只借鉴参考项目的业务组装方式与字段暴露结构。
|
|
239
|
+
- 若扩展代码库中未搜到相关实现,回落到 fallback 第 3 步(`cosmic-api-knowledge.py search`)后再向用户确认。
|
|
240
|
+
|
|
241
|
+
## 代码生成后自动校验(Post-Check)
|
|
242
|
+
|
|
243
|
+
修改任何苍穹 `.java` 文件后,必须执行:
|
|
244
|
+
|
|
245
|
+
`python3 <SKILL_ROOT>/scripts/cosmic-post-check.py <生成的文件或目录> --fix-hint`
|
|
246
|
+
|
|
247
|
+
- `ERROR` → 必须修复并复检;`WARNING` → 优先修复;`INFO` → 治理参考,不阻断。
|
|
248
|
+
- Gradle 项目编译成功后仍串联 post-lint 静态校验,以综合结果为准;非 Gradle 直接回退静态 lint。
|
|
249
|
+
- 最多连续 3 轮"修复 → 复检";3 轮后仍有 `ERROR`,向用户报告。
|
|
250
|
+
- 规则 ID 映射、修复示例、历史项目解释口径见 [rules/post-check.md](rules/post-check.md)。
|
|
251
|
+
|
|
252
|
+
## 规则分层
|
|
253
|
+
|
|
254
|
+
`ok-cosmic` 的规则默认分为三层,避免把"新代码默认要求"和"历史代码治理方向"混为一谈:
|
|
255
|
+
|
|
256
|
+
- **A 层:硬约束 / 交付红线**
|
|
257
|
+
- 直接影响正确性、事件时机、插件上下文、事实准确性。
|
|
258
|
+
- 新生成代码必须满足;若命中这层问题,默认阻断交付。
|
|
259
|
+
- 主要参考:`rules/constraints.md`、`rules/anti-patterns.md`、`rules/platform-baseline.md`
|
|
260
|
+
- **B 层:推荐项 / 新代码默认写法**
|
|
261
|
+
- 代表团队希望新代码优先采用的封装、工具类、查询方式和实现风格。
|
|
262
|
+
- 新代码默认尽量遵守;历史存量代码若能稳定运行,不因未完全满足而直接判错。
|
|
263
|
+
- 主要参考:`rules/coding-preferences.md`
|
|
264
|
+
- **C 层:目标态治理 / 渐进优化**
|
|
265
|
+
- 代表团队长期希望逐步收敛的治理方向,例如补验证来源注释、统一异常体系、进一步减少原生样板。
|
|
266
|
+
- 适合用于重构、专项治理、模板升级,不作为当前默认一次性交付阻断条件。
|
|
267
|
+
- 主要参考:`rules/coding-preferences.md`、`rules/post-check.md`
|
|
268
|
+
|
|
269
|
+
处理历史项目时,优先识别 **A 层问题**;对 **B/C 层** 问题应区分"当前可接受的历史写法"和"建议后续收敛的目标写法"。
|
|
270
|
+
|
|
271
|
+
## 子文件引用
|
|
272
|
+
|
|
273
|
+
以下文件提供详细规则,AI 应在需要时按需加载;优先先读文档开头的 `TL;DR` 摘要,再决定是否展开全文:
|
|
274
|
+
|
|
275
|
+
| 层级 | 文件 | 用途 |
|
|
276
|
+
|------|------|------|
|
|
277
|
+
| A 层 | [constraints.md](rules/constraints.md) | 硬约束 / 交付红线 |
|
|
278
|
+
| A 层 | [a-layer-rules.json](rules/a-layer-rules.json) | 规则 ID 配置(单一可信源) |
|
|
279
|
+
| A 层 | [anti-patterns.md](rules/anti-patterns.md) | 禁忌清单(自动检测部分 → `scene_check`) |
|
|
280
|
+
| 路由 | [intent-routing.md](rules/intent-routing.md) | 自然语言意图 → 技术场景路由 |
|
|
281
|
+
| 路由 | [decision-matrix.md](rules/decision-matrix.md) | 完整决策矩阵与未命中兜底 |
|
|
282
|
+
| 参考 | [event-lifecycle.md](references/adv/event-lifecycle.md) | 插件事件生命周期图 |
|
|
283
|
+
| B/C 层 | [coding-preferences.md](rules/coding-preferences.md) | 编码偏好 + STYLE/RESOURCE/VERIFY 速查 |
|
|
284
|
+
| 参考 | [platform-baseline.md](rules/platform-baseline.md) | 平台总规范摘要(guidance-only) |
|
|
285
|
+
| 速查 | [cheat-sheet.md](rules/cheat-sheet.md) | 高频 API(无需脚本验证) |
|
|
286
|
+
| 校验 | [post-check.md](rules/post-check.md) | 生成后自动校验规则(A/B/C 分层) |
|
|
287
|
+
| 片段 | [snippets-guide.md](assets/snippets/snippets-guide.md) | 场景化代码片段(推荐 / 原生两层) |
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "ok cosmic"
|
|
3
|
+
short_description: "封装优先的苍穹开发主 skill"
|
|
4
|
+
default_prompt: |
|
|
5
|
+
使用 $ok-cosmic 来实现或审查苍穹插件代码。严格遵循以下流程:
|
|
6
|
+
0. 首先执行 cosmic-config-check.py 完成配置预检;ERROR 必须停止,WARNING 需告知用户受限能力
|
|
7
|
+
1. 先查 SKILL.md 决策矩阵确定插件类型和对应模板
|
|
8
|
+
2. 读 references/*.md 确认事件边界和适用场景
|
|
9
|
+
3. 读 assets/*.java 模板沿用已有骨架,小场景查 snippets 映射表
|
|
10
|
+
4. 首次调用任何脚本前,先执行 --help 读取调用契约,定好命令模板后再填参数执行(三步首调协议)
|
|
11
|
+
5. 字段不确定先查 cosmic-form-metadata.py;entityId 来源不明先查 cosmic-form-metadata.py(查 refType 或按中文名确认英文标识),严禁凭经验猜 entityId;枚举/下拉选项值必须查 --show-detail 的 Ext 列确认(A1.8 硬约束),严禁凭空编造;SDK 签名不确定先查 cosmic-api-knowledge.py
|
|
12
|
+
6. 只有"插件类型 + 事件方法 + 字段/基础资料/签名 + 枚举值来源"都确认后,才开始生成代码
|
|
13
|
+
7. 代码生成后,执行 cosmic-post-check.py 自动校验,有 ERROR 须修复后重验
|
|
14
|
+
核心原则:封装优先(kd-cd-cosmic-commons),原生兜底;严禁凭记忆猜测 API 签名。
|
|
15
|
+
|
|
16
|
+
policy:
|
|
17
|
+
allow_implicit_invocation: true
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
package kd.cd.common;
|
|
2
|
+
|
|
3
|
+
import kd.bos.entity.api.ApiResult;
|
|
4
|
+
import kd.bos.entity.plugin.ImportLogger;
|
|
5
|
+
import kd.bos.form.plugin.impt.BatchImportPlugin;
|
|
6
|
+
import kd.bos.form.plugin.impt.ImportBillData;
|
|
7
|
+
|
|
8
|
+
import java.util.Iterator;
|
|
9
|
+
import java.util.List;
|
|
10
|
+
import java.util.Map;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 批量导入插件骨架模板(原生 BatchImportPlugin)。
|
|
14
|
+
* 该类仅用于示例写法,生成后请按实际业务删除无用事件并替换占位常量。
|
|
15
|
+
*/
|
|
16
|
+
public class BatchImportPluginTemplate extends BatchImportPlugin {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 触发时机: 在需要了解当前插件可访问上下文能力时调用。
|
|
20
|
+
* 参数要点: 无入参;仅展示当前插件可通过 this. 访问的方法能力。
|
|
21
|
+
* 典型用途: 作为模板提示,指导在各事件内选择正确的上下文 API。
|
|
22
|
+
*/
|
|
23
|
+
private void getContextSample() {
|
|
24
|
+
// this.getContext();
|
|
25
|
+
// this.getLogger();
|
|
26
|
+
// this.getBatchSize();
|
|
27
|
+
// this.refreshHeartbeat();
|
|
28
|
+
// this.call();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private static final int BATCH_SIZE = 200;
|
|
32
|
+
private static final String FIELD_BILL_STATUS = "billstatus";
|
|
33
|
+
private static final String FIELD_BILL_NO = "billno";
|
|
34
|
+
private static final String FIELD_NAME = "name";
|
|
35
|
+
|
|
36
|
+
// ===== 核心事件 =====
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 触发时机: 导入引擎初始化批处理策略时。
|
|
40
|
+
* 参数要点: 返回值决定单批处理行数。
|
|
41
|
+
* 典型用途: 控制批量导入吞吐、内存占用与事务规模。
|
|
42
|
+
*/
|
|
43
|
+
@Override
|
|
44
|
+
protected int getBatchImportSize() {
|
|
45
|
+
super.getBatchImportSize();
|
|
46
|
+
return BATCH_SIZE;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 触发时机: 导入引擎判断是否强制批处理时。
|
|
51
|
+
* 参数要点: 返回 true 表示按批次执行。
|
|
52
|
+
* 典型用途: 大数据量导入时强制走批处理模式。
|
|
53
|
+
*/
|
|
54
|
+
@Override
|
|
55
|
+
protected boolean isForceBatch() {
|
|
56
|
+
super.isForceBatch();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 触发时机: 每批数据执行保存时。
|
|
62
|
+
* 参数要点:
|
|
63
|
+
* - rowdatas: 当前批次行数据。
|
|
64
|
+
* - logger: 导入日志记录器,用于记录行级失败原因。
|
|
65
|
+
* 典型用途: 批量校验、过滤非法数据、自定义保存逻辑。
|
|
66
|
+
* 返回值: 返回 ApiResult 表示自定义处理结果,返回 null 由框架继续默认保存流程。
|
|
67
|
+
*/
|
|
68
|
+
@Override
|
|
69
|
+
protected ApiResult save(List<ImportBillData> rowdatas, ImportLogger logger) {
|
|
70
|
+
super.save(rowdatas, logger);
|
|
71
|
+
Iterator<ImportBillData> iterator = rowdatas.iterator();
|
|
72
|
+
while (iterator.hasNext()) {
|
|
73
|
+
ImportBillData data = iterator.next();
|
|
74
|
+
Map<String, Object> rowData = data.getData();
|
|
75
|
+
Object name = rowData == null ? null : rowData.get(FIELD_NAME);
|
|
76
|
+
String billStatus = rowData == null ? null : String.valueOf(rowData.get(FIELD_BILL_STATUS));
|
|
77
|
+
String billNo = rowData == null ? null : String.valueOf(rowData.get(FIELD_BILL_NO));
|
|
78
|
+
if (name == null) {
|
|
79
|
+
logger.log(data.getStartIndex(), "名称不能为空").fail();
|
|
80
|
+
iterator.remove();
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if ("A".equalsIgnoreCase(billStatus)) {
|
|
84
|
+
logger.log(data.getStartIndex(), "单据" + billNo + "为暂存状态,不允许导入").fail();
|
|
85
|
+
iterator.remove();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (rowdatas.isEmpty()) {
|
|
89
|
+
return ApiResult.fail("IMPORT_EMPTY", "当前批次无可保存数据");
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
package kd.cd.common;
|
|
2
|
+
|
|
3
|
+
import kd.bos.dataentity.resource.ResManager;
|
|
4
|
+
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
|
|
5
|
+
import kd.bos.form.control.events.ItemClickEvent;
|
|
6
|
+
import kd.bos.form.events.AfterDoOperationEventArgs;
|
|
7
|
+
import kd.bos.form.events.BeforeDoOperationEventArgs;
|
|
8
|
+
import kd.cd.common.plugin.AbstractBillPlugInExt;
|
|
9
|
+
import kd.cd.core.util.CharSequenceUtils;
|
|
10
|
+
|
|
11
|
+
import java.math.BigDecimal;
|
|
12
|
+
import java.util.EventObject;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 单据界面插件骨架模板(原生 AbstractBillPlugIn)。
|
|
16
|
+
* 该类仅用于示例写法,生成后请按实际业务删除无用事件并替换占位常量。
|
|
17
|
+
*
|
|
18
|
+
* @template BillPlugInTemplate
|
|
19
|
+
* @extends AbstractBillPlugInExt (kd.cd.common.plugin)
|
|
20
|
+
* @highFreqEvents afterLoadData, propertyChanged, beforeDoOperation, afterDoOperation, itemClick
|
|
21
|
+
* @medFreqEvents registerListener, beforeF7Select, click
|
|
22
|
+
* @relatedDocs references/adv/plugin-base.md, references/base/plugin/plugin-bill.md
|
|
23
|
+
*/
|
|
24
|
+
public class BillPlugInTemplate extends AbstractBillPlugInExt {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 触发时机: 在需要了解当前插件可访问上下文能力时调用。
|
|
28
|
+
* 参数要点: 无入参;仅展示当前插件可通过 this. 访问的方法能力。
|
|
29
|
+
* 典型用途: 作为模板提示,指导在各事件内选择正确的上下文 API。
|
|
30
|
+
*/
|
|
31
|
+
private void getContextSample() {
|
|
32
|
+
// this.getView();
|
|
33
|
+
// this.getModel();
|
|
34
|
+
// this.getPageCache();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private static final String TOOLBAR_KEY = "tbmain";
|
|
38
|
+
private static final String BTN_SYNC = "btn_sync";
|
|
39
|
+
private static final String OP_KEY_SAVE = "save";
|
|
40
|
+
private static final String FIELD_QTY = "qty";
|
|
41
|
+
private static final String BASEDATAFIELD = "basedatafield";
|
|
42
|
+
private static final String RES_APP_ID = "kd-cd-common-template";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 触发时机: 表单初始化完毕,所有事件监听注册前。
|
|
46
|
+
* 参数要点:
|
|
47
|
+
* - `EventObject e`: 通用事件对象。
|
|
48
|
+
* 典型用途: 注册菜单、按钮等交互监听。
|
|
49
|
+
*/
|
|
50
|
+
@Override
|
|
51
|
+
public void registerListener(EventObject e) {
|
|
52
|
+
super.registerListener(e);
|
|
53
|
+
this.addItemClickListeners(TOOLBAR_KEY);
|
|
54
|
+
this.addClickListeners(BTN_SYNC);
|
|
55
|
+
this.addBeforeF7SelectListeners(BASEDATAFIELD);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 触发时机: 单据数据从数据库加载完毕后。
|
|
60
|
+
* 参数要点:
|
|
61
|
+
* - `EventObject e`: 通用事件对象。
|
|
62
|
+
* 典型用途: 基于历史数据做界面初始化。
|
|
63
|
+
*/
|
|
64
|
+
@Override
|
|
65
|
+
public void afterLoadData(EventObject e) {
|
|
66
|
+
super.afterLoadData(e);
|
|
67
|
+
String billNo = this.getValue("billno");
|
|
68
|
+
if (CharSequenceUtils.isNotEmpty(billNo)) {
|
|
69
|
+
this.getView().showTipNotification(String.format(
|
|
70
|
+
ResManager.loadKDString("加载单据:%s", "BillPlugInTemplate_0", RES_APP_ID),
|
|
71
|
+
billNo
|
|
72
|
+
));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 触发时机: 用户点击工具栏或菜单项时。
|
|
78
|
+
* 参数要点:
|
|
79
|
+
* - `ItemClickEvent evt`: 可通过 `getItemKey()` 获取菜单标识。
|
|
80
|
+
* 典型用途: 处理工具栏动作。
|
|
81
|
+
*/
|
|
82
|
+
@Override
|
|
83
|
+
public void itemClick(ItemClickEvent evt) {
|
|
84
|
+
super.itemClick(evt);
|
|
85
|
+
if (BTN_SYNC.equals(evt.getItemKey())) {
|
|
86
|
+
this.getView().showTipNotification(ResManager.loadKDString("已触发同步动作", "BillPlugInTemplate_1", RES_APP_ID));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 触发时机: 用户点击表单控件时。
|
|
92
|
+
* 参数要点:
|
|
93
|
+
* - `EventObject evt`: `getSource()` 可获取控件对象。
|
|
94
|
+
* 典型用途: 处理按钮、链接等控件交互。
|
|
95
|
+
*/
|
|
96
|
+
@Override
|
|
97
|
+
public void click(EventObject evt) {
|
|
98
|
+
super.click(evt);
|
|
99
|
+
String clickKey = getClickKey(evt);
|
|
100
|
+
if (BTN_SYNC.equals(clickKey)) {
|
|
101
|
+
this.getView().showTipNotification(ResManager.loadKDString("按钮点击处理完成", "BillPlugInTemplate_2", RES_APP_ID));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 触发时机: 单据操作执行前。
|
|
107
|
+
* 参数要点:
|
|
108
|
+
* - `BeforeDoOperationEventArgs e`: 通过 `(AbstractOperate) e.getSource()` 获取操作对象。
|
|
109
|
+
* 典型用途: 做轻量前置校验,必要时取消操作。
|
|
110
|
+
*/
|
|
111
|
+
@Override
|
|
112
|
+
public void beforeDoOperation(BeforeDoOperationEventArgs e) {
|
|
113
|
+
super.beforeDoOperation(e);
|
|
114
|
+
String opKey = getOpKey(e);
|
|
115
|
+
if (OP_KEY_SAVE.equals(opKey)) {
|
|
116
|
+
BigDecimal qty = this.getValue(FIELD_QTY);
|
|
117
|
+
if (qty != null && qty.compareTo(BigDecimal.ZERO) <= 0) {
|
|
118
|
+
e.setCancel(true);
|
|
119
|
+
this.getView().showErrorNotification(ResManager.loadKDString("数量必须大于 0", "BillPlugInTemplate_3", RES_APP_ID));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* 触发时机: 单据操作执行后。
|
|
126
|
+
* 参数要点:
|
|
127
|
+
* - `AfterDoOperationEventArgs e`: 可读取操作结果与操作标识。
|
|
128
|
+
* 典型用途: 做提示、刷新或后续联动。
|
|
129
|
+
*/
|
|
130
|
+
@Override
|
|
131
|
+
public void afterDoOperation(AfterDoOperationEventArgs e) {
|
|
132
|
+
super.afterDoOperation(e);
|
|
133
|
+
this.getView().showTipNotification(String.format(
|
|
134
|
+
ResManager.loadKDString("操作完成:%s", "BillPlugInTemplate_4", RES_APP_ID),
|
|
135
|
+
e.getOperateKey()
|
|
136
|
+
));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 触发时机: 字段值写入模型后。
|
|
141
|
+
* 参数要点:
|
|
142
|
+
* - `PropertyChangedArgs e`: 可读取字段标识与变更值。
|
|
143
|
+
* 典型用途: 做字段联动与提示。
|
|
144
|
+
*/
|
|
145
|
+
@Override
|
|
146
|
+
public void propertyChanged(PropertyChangedArgs e) {
|
|
147
|
+
super.propertyChanged(e);
|
|
148
|
+
if (FIELD_QTY.equals(e.getProperty().getName())) {
|
|
149
|
+
Integer changedNewValue = getChangedNewValue(e);
|
|
150
|
+
this.getView().showTipNotification(String.format(
|
|
151
|
+
ResManager.loadKDString("数量已更新为:%s", "BillPlugInTemplate_5", RES_APP_ID),
|
|
152
|
+
changedNewValue
|
|
153
|
+
));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|