dsh-d365-kit 0.34.1 → 0.34.4

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.
Files changed (75) hide show
  1. package/CHANGELOG.md +319 -308
  2. package/CHANGELOG.zh-CN.md +318 -307
  3. package/INSTALL.md +94 -94
  4. package/INSTALL.zh-CN.md +93 -93
  5. package/LICENSE +21 -21
  6. package/README.md +336 -327
  7. package/README.zh-CN.md +336 -327
  8. package/client.js +1818 -1818
  9. package/cordis.patch.yml +44 -44
  10. package/docs/en/architecture.md +172 -172
  11. package/docs/en/checks.md +184 -184
  12. package/docs/en/installation.md +151 -151
  13. package/docs/en/permissions.md +161 -161
  14. package/docs/en/scenarios.md +202 -202
  15. package/docs/en/tools.md +665 -665
  16. package/docs/en/troubleshooting.md +131 -131
  17. package/docs/zh/architecture.md +172 -172
  18. package/docs/zh/checks.md +184 -184
  19. package/docs/zh/installation.md +151 -151
  20. package/docs/zh/permissions.md +161 -161
  21. package/docs/zh/scenarios.md +202 -202
  22. package/docs/zh/tools.md +665 -665
  23. package/docs/zh/troubleshooting.md +131 -131
  24. package/examples/prompts.en.md +206 -206
  25. package/examples/prompts.zh-CN.md +206 -206
  26. package/examples/waivers.example.json +20 -20
  27. package/icon.svg +6 -6
  28. package/index.js +139 -139
  29. package/lib/auth.js +181 -181
  30. package/lib/client.js +496 -496
  31. package/lib/code-check.js +549 -549
  32. package/lib/config.js +323 -323
  33. package/lib/contract-history.js +49 -49
  34. package/lib/contract.js +583 -583
  35. package/lib/csharp-check.js +493 -493
  36. package/lib/data-migrate.js +1318 -1318
  37. package/lib/data-policy.js +78 -78
  38. package/lib/error-codes.js +80 -80
  39. package/lib/gitlab.js +161 -161
  40. package/lib/health.js +205 -205
  41. package/lib/migrate.js +732 -732
  42. package/lib/preflight.js +116 -116
  43. package/lib/refs.js +191 -191
  44. package/lib/resources.js +320 -320
  45. package/lib/retention-defaults.js +17 -17
  46. package/lib/retention.js +384 -384
  47. package/lib/runtime.js +232 -232
  48. package/lib/settings-http.js +512 -512
  49. package/lib/settings-store.js +371 -371
  50. package/lib/snapshot.js +149 -149
  51. package/lib/tool-code-check.js +133 -133
  52. package/lib/tool-configure.js +169 -169
  53. package/lib/tool-contract.js +376 -376
  54. package/lib/tool-data-sync.js +559 -559
  55. package/lib/tool-data-write.js +203 -203
  56. package/lib/tool-data.js +282 -282
  57. package/lib/tool-diff.js +484 -484
  58. package/lib/tool-environments.js +106 -106
  59. package/lib/tool-flows.js +540 -540
  60. package/lib/tool-health.js +127 -127
  61. package/lib/tool-layers.js +497 -497
  62. package/lib/tool-metadata.js +417 -417
  63. package/lib/tool-migrate.js +102 -102
  64. package/lib/tool-refs.js +206 -206
  65. package/lib/tool-reports.js +299 -299
  66. package/lib/tool-sync.js +430 -430
  67. package/lib/tool-write.js +563 -563
  68. package/lib/waivers.js +83 -83
  69. package/lib/write-actions.js +1374 -1374
  70. package/lib/write-policy.js +199 -199
  71. package/lib/write-store.js +167 -167
  72. package/locale/en.json +68 -68
  73. package/locale/zh.json +68 -68
  74. package/package.json +2 -2
  75. package/skills/d365-troubleshooting/SKILL.md +115 -115
@@ -1,131 +1,131 @@
1
- # 故障排查
2
-
3
- **[English](../en/troubleshooting.md)** | 简体中文
4
-
5
- ## 先做这三件事
6
-
7
- ```
8
- plugin_manager list_plugins
9
- d365_envs check=true
10
- d365_health allEnvironments=true
11
- ```
12
-
13
- 第一条看插件在不在、是否 active;第二条看凭据与网络;第三条看环境是不是正忙。多数「工具报错」能在这三步里定位。
14
-
15
- ---
16
-
17
- ## 错误码对照
18
-
19
- | 错误 / 现象 | 含义 | 处理 |
20
- | --- | --- | --- |
21
- | `unknown-environment` | 环境 key 不存在 | `d365_envs` 看可用 key;设置页检查拼写 |
22
- | AADSTS 系列 / `invalid_client` | 凭据错、secret 过期、应用未授权 | 重新生成 secret;确认应用用户在**这个**环境里存在 |
23
- | `metadata-read-forbidden` | 该环境被关掉了「读取元数据」 | 设置页 → 权限 → 勾回「读取元数据」(默认开启,只有被显式取消才会报这个) |
24
- | `data-read-forbidden` | 该环境未授权读业务数据 | 设置页 → 权限 → 勾「读取业务数据」 |
25
- | `data-write-forbidden` | 未授权写业务数据 | 勾「新增/修改业务数据」;每次写入仍需确认 |
26
- | `environment-busy` | 环境正在导入/发布(`msdyn_solutionhistories` 有未结束记录) | 等它结束;确认是残留才用 `force: true` |
27
- | `plan-not-pending` | 计划正在执行 / 上次中断 / 已执行过 | 重新生成计划;写操作不是幂等的,不要重跑旧计划 |
28
- | `unknown-solution` / `managed-solution` | 默认解决方案不存在或是受管的 | 换一个**已存在的未受管**解决方案 |
29
- | `destructive-not-acknowledged` | 删除字段/选项值没传 `acknowledge: true` | 明确确认后再传 |
30
- | `option-set-unreadable` | 字段的本地选项集读不出来(类型转换都失败) | 确认该字段确实是选项集;看返回里的 hint |
31
- | `unknown-view` / `ambiguous-view` | 视图名不存在 / 同名多个 | 传 `entity` 区分 |
32
- | `HTTP 400 … Could not find a property named` | 该环境没有这个列,或列名不适配此端点 | 工具会尝试降级;仍失败时用 `select` 显式指定存在的列 |
33
- | `0x80060888 … query parameter is not supported` | 端点不接受该参数(如 `EntityDefinitions` 的 `$top`/`$orderby`) | 客户端已自动降级;自己写脚本时注意 |
34
- | `0x80071151` | 定制化锁被占用(正在导入/发布) | 用 `d365_health` 确认,等结束;别反复重试 |
35
- | `HTTP 429` | 服务保护(约 6000 请求/5 分钟) | 降并发(`concurrency` ≤ 4)、稍后重试;写请求只在 429 时自动重试 |
36
- | 发布 60–300 秒超时 | `PublishAllXml` 在两千多张表的组织上很慢 | 已改为按受影响组件 `PublishXml`;仍超时看 `d365_health` |
37
- | `GitLab 403` | 令牌 scope 不足,或用户在项目里低于 Reporter | 换个人访问令牌或提升角色;Guest 读不到仓库与 MR |
38
- | `GitLab 404` | 项目路径或 IID 错,或令牌看不到该项目 | 用完整 MR 链接,或填默认项目 |
39
-
40
- ---
41
-
42
- ## 安装 / 加载问题
43
-
44
- ### 工具没出现
45
-
46
- 1. `plugin_manager list_plugins` 找 `include:dsh-d365-kit`,确认 `enabled=true`、`fiberPhase=active`;
47
- 2. 刚装完要重启 DSH(Web 客户端插件有模块图缓存);
48
- 3. 若条目不存在:`remove_bundle` 再 `install_bundle`(link/pnpm 认为包已存在时只会返回 `already-installed`,不会替换代码)。
49
-
50
- ### 重启报 `duplicate factory registration` / `import failed`
51
-
52
- 同一个 bundle 被执行了两次。检查两处名字是否与包名一致:
53
-
54
- - `client.js` 顶部的 `window.__ModuleLoader__.load({ id: ... })`
55
- - `index.js` 的 `export const name = ...`
56
-
57
- 改名或改包名时容易漏掉这两个「自报名字」。仍然复现的话,完全退出 DSH 后删 Electron 的编译缓存再启动:
58
-
59
- ```
60
- %APPDATA%\@deepseek-ai\dsh-desktop\Code Cache
61
- %APPDATA%\@deepseek-ai\dsh-desktop\Local Storage
62
- %APPDATA%\@deepseek-ai\dsh-desktop\Session Storage
63
- %APPDATA%\@deepseek-ai\dsh-desktop\Cache
64
- %APPDATA%\@deepseek-ai\dsh-desktop\GPUCache
65
- ```
66
-
67
- 只丢界面偏好,不动 `.dsh` 里的会话与配置。
68
-
69
- ### 设置页没有「D365 工具箱」
70
-
71
- Host 侧可能已加载、客户端半边没进模块图:重启一次。仍没有就查 `client.js` 的模块 id 与包名是否一致(同上)。
72
-
73
- ---
74
-
75
- ## 设置页报错
76
-
77
- | 现象 | 原因 | 处理 |
78
- | --- | --- | --- |
79
- | 保存权限报「写入只能从设置页发起」 | 请求缺 `x-d365-meta-write: 1`,或来自别的源 | 只在设置页里操作;被拒记录见 `.d365/write-guard.log` |
80
- | 某个标签打开报 `HTTP 400` 且没有详细信息 | 路由未声明请求体模式,连接层构造了带 body 的 GET | 升级到 0.18.0+(已修);旧 bundle 需重启 |
81
- | 保存后配置没变 | `configFile` 指向了另一个位置 | 设置页底部会显示配置文件路径;用 `D365_CONFIG_FILE` 或 patch 固定 |
82
- | 中文界面出现英文 | DSH 界面语言是英文 | 正常行为:页面文案跟随 DSH |
83
-
84
- ---
85
-
86
- ## 数据问题
87
-
88
- ### 层查询返回 0 行
89
-
90
- `msdyn_componentlayer` 是虚拟实体,**必须同时给组件 id 和类型**。只给名字、只给 id、不带过滤,都会静默返回 0 行(不报错)。
91
-
92
- 部分环境里该表能读,但应用用户看不到数据,需要管理员身份。
93
-
94
- ### 快照很大
95
-
96
- 单份全量约 125 MB(20 万条 solution components、9.4 万条插件步骤、6.6 万个 Web 资源)。默认每环境留 2 份;`d365_reports action=compact` 可把缩进 JSON 压成单行(实测省 68 MB)。
97
-
98
- ### 差异报告噪声大
99
-
100
- 先用 `resources` 限定范围;`organization` 默认已跳过,时间戳与 `*id` 列不参与比较。跨环境比较请用逻辑名。
101
-
102
- ---
103
-
104
- ## 写入问题
105
-
106
- ### 计划执行后报「计划不存在」
107
-
108
- 执行成功后会删除计划文件。再次点旧卡片或重复执行会得到这个提示;到设置页「计划」看最近变更记录确认结果。
109
-
110
- ### 写入成功但下游看不到
111
-
112
- 1. 改动是不是进了活动默认层?填「变更默认解决方案」,否则导出解决方案带不走;
113
- 2. 下游有没有被别的受管解决方案的层盖住?`d365_layers` 看;
114
- 3. 有没有发布?写入会自动发布受影响组件,结果看 `.d365/changes/publish-<planId>.json`。
115
-
116
- ### 发布一直 `running`
117
-
118
- 发布在后台进行,sidecar 文件在结束时才写。看 `d365_health` 里该环境是否仍在发布;确认没有活动后重跑一次 `PublishXml` 即可,发布本身是幂等的(重复发布不改变结果)。
119
-
120
- ---
121
-
122
- ## 还是解决不了
123
-
124
- 收集这些再问:
125
-
126
- ```
127
- d365_envs
128
- d365_health environments=["<那个环境>"]
129
- ```
130
-
131
- 加上报错的完整文本、时间点,以及 `.d365/write-guard.log`(设置页写入问题时)。
1
+ # 故障排查
2
+
3
+ **[English](../en/troubleshooting.md)** | 简体中文
4
+
5
+ ## 先做这三件事
6
+
7
+ ```
8
+ plugin_manager list_plugins
9
+ d365_envs check=true
10
+ d365_health allEnvironments=true
11
+ ```
12
+
13
+ 第一条看插件在不在、是否 active;第二条看凭据与网络;第三条看环境是不是正忙。多数「工具报错」能在这三步里定位。
14
+
15
+ ---
16
+
17
+ ## 错误码对照
18
+
19
+ | 错误 / 现象 | 含义 | 处理 |
20
+ | --- | --- | --- |
21
+ | `unknown-environment` | 环境 key 不存在 | `d365_envs` 看可用 key;设置页检查拼写 |
22
+ | AADSTS 系列 / `invalid_client` | 凭据错、secret 过期、应用未授权 | 重新生成 secret;确认应用用户在**这个**环境里存在 |
23
+ | `metadata-read-forbidden` | 该环境被关掉了「读取元数据」 | 设置页 → 权限 → 勾回「读取元数据」(默认开启,只有被显式取消才会报这个) |
24
+ | `data-read-forbidden` | 该环境未授权读业务数据 | 设置页 → 权限 → 勾「读取业务数据」 |
25
+ | `data-write-forbidden` | 未授权写业务数据 | 勾「新增/修改业务数据」;每次写入仍需确认 |
26
+ | `environment-busy` | 环境正在导入/发布(`msdyn_solutionhistories` 有未结束记录) | 等它结束;确认是残留才用 `force: true` |
27
+ | `plan-not-pending` | 计划正在执行 / 上次中断 / 已执行过 | 重新生成计划;写操作不是幂等的,不要重跑旧计划 |
28
+ | `unknown-solution` / `managed-solution` | 默认解决方案不存在或是受管的 | 换一个**已存在的未受管**解决方案 |
29
+ | `destructive-not-acknowledged` | 删除字段/选项值没传 `acknowledge: true` | 明确确认后再传 |
30
+ | `option-set-unreadable` | 字段的本地选项集读不出来(类型转换都失败) | 确认该字段确实是选项集;看返回里的 hint |
31
+ | `unknown-view` / `ambiguous-view` | 视图名不存在 / 同名多个 | 传 `entity` 区分 |
32
+ | `HTTP 400 … Could not find a property named` | 该环境没有这个列,或列名不适配此端点 | 工具会尝试降级;仍失败时用 `select` 显式指定存在的列 |
33
+ | `0x80060888 … query parameter is not supported` | 端点不接受该参数(如 `EntityDefinitions` 的 `$top`/`$orderby`) | 客户端已自动降级;自己写脚本时注意 |
34
+ | `0x80071151` | 定制化锁被占用(正在导入/发布) | 用 `d365_health` 确认,等结束;别反复重试 |
35
+ | `HTTP 429` | 服务保护(约 6000 请求/5 分钟) | 降并发(`concurrency` ≤ 4)、稍后重试;写请求只在 429 时自动重试 |
36
+ | 发布 60–300 秒超时 | `PublishAllXml` 在两千多张表的组织上很慢 | 已改为按受影响组件 `PublishXml`;仍超时看 `d365_health` |
37
+ | `GitLab 403` | 令牌 scope 不足,或用户在项目里低于 Reporter | 换个人访问令牌或提升角色;Guest 读不到仓库与 MR |
38
+ | `GitLab 404` | 项目路径或 IID 错,或令牌看不到该项目 | 用完整 MR 链接,或填默认项目 |
39
+
40
+ ---
41
+
42
+ ## 安装 / 加载问题
43
+
44
+ ### 工具没出现
45
+
46
+ 1. `plugin_manager list_plugins` 找 `include:dsh-d365-kit`,确认 `enabled=true`、`fiberPhase=active`;
47
+ 2. 刚装完要重启 DSH(Web 客户端插件有模块图缓存);
48
+ 3. 若条目不存在:`remove_bundle` 再 `install_bundle`(link/pnpm 认为包已存在时只会返回 `already-installed`,不会替换代码)。
49
+
50
+ ### 重启报 `duplicate factory registration` / `import failed`
51
+
52
+ 同一个 bundle 被执行了两次。检查两处名字是否与包名一致:
53
+
54
+ - `client.js` 顶部的 `window.__ModuleLoader__.load({ id: ... })`
55
+ - `index.js` 的 `export const name = ...`
56
+
57
+ 改名或改包名时容易漏掉这两个「自报名字」。仍然复现的话,完全退出 DSH 后删 Electron 的编译缓存再启动:
58
+
59
+ ```
60
+ %APPDATA%\@deepseek-ai\dsh-desktop\Code Cache
61
+ %APPDATA%\@deepseek-ai\dsh-desktop\Local Storage
62
+ %APPDATA%\@deepseek-ai\dsh-desktop\Session Storage
63
+ %APPDATA%\@deepseek-ai\dsh-desktop\Cache
64
+ %APPDATA%\@deepseek-ai\dsh-desktop\GPUCache
65
+ ```
66
+
67
+ 只丢界面偏好,不动 `.dsh` 里的会话与配置。
68
+
69
+ ### 设置页没有「D365 工具箱」
70
+
71
+ Host 侧可能已加载、客户端半边没进模块图:重启一次。仍没有就查 `client.js` 的模块 id 与包名是否一致(同上)。
72
+
73
+ ---
74
+
75
+ ## 设置页报错
76
+
77
+ | 现象 | 原因 | 处理 |
78
+ | --- | --- | --- |
79
+ | 保存权限报「写入只能从设置页发起」 | 请求缺 `x-d365-meta-write: 1`,或来自别的源 | 只在设置页里操作;被拒记录见 `.d365/write-guard.log` |
80
+ | 某个标签打开报 `HTTP 400` 且没有详细信息 | 路由未声明请求体模式,连接层构造了带 body 的 GET | 升级到 0.18.0+(已修);旧 bundle 需重启 |
81
+ | 保存后配置没变 | `configFile` 指向了另一个位置 | 设置页底部会显示配置文件路径;用 `D365_CONFIG_FILE` 或 patch 固定 |
82
+ | 中文界面出现英文 | DSH 界面语言是英文 | 正常行为:页面文案跟随 DSH |
83
+
84
+ ---
85
+
86
+ ## 数据问题
87
+
88
+ ### 层查询返回 0 行
89
+
90
+ `msdyn_componentlayer` 是虚拟实体,**必须同时给组件 id 和类型**。只给名字、只给 id、不带过滤,都会静默返回 0 行(不报错)。
91
+
92
+ 部分环境里该表能读,但应用用户看不到数据,需要管理员身份。
93
+
94
+ ### 快照很大
95
+
96
+ 单份全量约 125 MB(20 万条 solution components、9.4 万条插件步骤、6.6 万个 Web 资源)。默认每环境留 2 份;`d365_reports action=compact` 可把缩进 JSON 压成单行(实测省 68 MB)。
97
+
98
+ ### 差异报告噪声大
99
+
100
+ 先用 `resources` 限定范围;`organization` 默认已跳过,时间戳与 `*id` 列不参与比较。跨环境比较请用逻辑名。
101
+
102
+ ---
103
+
104
+ ## 写入问题
105
+
106
+ ### 计划执行后报「计划不存在」
107
+
108
+ 执行成功后会删除计划文件。再次点旧卡片或重复执行会得到这个提示;到设置页「计划」看最近变更记录确认结果。
109
+
110
+ ### 写入成功但下游看不到
111
+
112
+ 1. 改动是不是进了活动默认层?填「变更默认解决方案」,否则导出解决方案带不走;
113
+ 2. 下游有没有被别的受管解决方案的层盖住?`d365_layers` 看;
114
+ 3. 有没有发布?写入会自动发布受影响组件,结果看 `.d365/changes/publish-<planId>.json`。
115
+
116
+ ### 发布一直 `running`
117
+
118
+ 发布在后台进行,sidecar 文件在结束时才写。看 `d365_health` 里该环境是否仍在发布;确认没有活动后重跑一次 `PublishXml` 即可,发布本身是幂等的(重复发布不改变结果)。
119
+
120
+ ---
121
+
122
+ ## 还是解决不了
123
+
124
+ 收集这些再问:
125
+
126
+ ```
127
+ d365_envs
128
+ d365_health environments=["<那个环境>"]
129
+ ```
130
+
131
+ 加上报错的完整文本、时间点,以及 `.d365/write-guard.log`(设置页写入问题时)。