@dazitech/cli 3.0.0 → 3.0.2

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 (60) hide show
  1. package/README.md +16 -14
  2. package/dist/clis/dazi-app.js +95 -14
  3. package/dist/clis/dazi-flow.js +602 -172
  4. package/dist/clis/dazi-onto.js +5 -3
  5. package/dist/clis/dazi.js +139 -38
  6. package/dist/docs/app/app-init.md +15 -15
  7. package/dist/docs/app/build-upload.md +13 -13
  8. package/dist/docs/app/release-guide.md +9 -9
  9. package/dist/docs/app//344/270/273/350/246/201/350/264/242/345/212/241/346/214/207/346/240/207/345/244/215/346/235/202/346/212/245/350/241/250/345/274/200/345/217/221/345/256/236/350/267/265.md +45 -41
  10. package/dist/docs/auth/auth-login.md +4 -4
  11. package/dist/docs/auth/token-management.md +5 -5
  12. package/dist/docs/data/cube-guide.md +2 -2
  13. package/dist/docs/data/data-spaces.md +4 -3
  14. package/dist/docs/data/table-preview.md +6 -6
  15. package/dist/docs/flow/ai-workflow-playbook.md +69 -0
  16. package/dist/docs/flow/flow-project-guide.md +92 -87
  17. package/dist/docs/flow/flows-guide.md +98 -94
  18. package/dist/docs/flow/local-files-spec.md +194 -0
  19. package/dist/docs/flow/node-code-guide.md +57 -55
  20. package/dist/docs/flow/run-guide.md +18 -18
  21. package/dist/docs/flow/variables-guide.md +61 -61
  22. package/dist/docs/flow//346/265/201/347/250/213/345/274/200/345/217/221/346/234/200/344/275/263/345/256/236/350/267/265-VS-flow0/346/241/210/344/276/213.md +31 -31
  23. package/dist/docs/guides/cli-invocation.md +30 -29
  24. package/dist/docs/guides/cli-reference.md +72 -71
  25. package/dist/docs/guides/flow-consistency-checklist.md +42 -0
  26. package/dist/docs/guides/mcp-setup.md +34 -34
  27. package/dist/docs/guides/migrate-v2-v3.md +6 -5
  28. package/dist/docs/guides/quickstart.md +8 -8
  29. package/dist/docs/guides/troubleshooting.md +40 -22
  30. package/dist/docs/guides/workspace-v3.md +17 -17
  31. package/dist/docs/index.json +19 -7
  32. package/dist/docs/onto/action-guide.md +4 -3
  33. package/dist/docs/onto/dazi_script_sdk_reference.md +20 -14
  34. package/dist/docs/onto/dazi_script_seed_data_guide.md +14 -14
  35. package/dist/docs/onto/function-guide.md +5 -5
  36. package/dist/docs/onto/rule-guide.md +7 -6
  37. package/dist/docs/onto/space-management.md +5 -3
  38. package/dist/docs/onto//346/234/254/344/275/223/350/204/232/346/234/254/347/274/226/345/206/231/346/214/207/345/215/227.md +35 -35
  39. package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +21 -21
  40. package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/345/210/251/346/266/246/345/210/206/346/236/220/346/234/254/344/275/223/346/226/271/346/241/210.md +11 -11
  41. package/dist/examples/flow/minimal-excel-python/README.md +5 -0
  42. package/dist/examples/flow/minimal-excel-python/flow.json +48 -0
  43. package/dist/examples/flow/minimal-excel-python/flow.meta.json +23 -0
  44. package/dist/examples/flow/minimal-excel-python//350/212/202/347/202/271/Excel/347/244/272/344/276/213/code.py +7 -0
  45. package/dist/examples/flow/minimal-excel-python//350/212/202/347/202/271/Excel/347/244/272/344/276/213/node.info.json +14 -0
  46. package/dist/examples/index.json +7 -1
  47. package/dist/prompts/data/data-analysis.md +2 -2
  48. package/dist/prompts/flow/ai-workflow-playbook.md +69 -0
  49. package/dist/prompts/flow/flow-design.md +33 -19
  50. package/dist/prompts/flow/plan-generate.md +7 -7
  51. package/dist/prompts/flow/run-debug.md +15 -15
  52. package/dist/prompts/flow/run-fix-loop.md +20 -17
  53. package/dist/prompts/general/ask-dazi.md +6 -6
  54. package/dist/prompts/general/troubleshoot.md +4 -3
  55. package/dist/prompts/index.json +94 -15
  56. package/dist/prompts/onto/action-design.md +7 -5
  57. package/dist/prompts/onto/function-design.md +6 -4
  58. package/dist/prompts/onto/rule-seed.md +4 -2
  59. package/dist/prompts/onto/script-publish-run.md +19 -19
  60. package/package.json +1 -1
package/README.md CHANGED
@@ -2,14 +2,16 @@
2
2
 
3
3
  搭子 v3 终端 CLI 的 **pnpm 可发布包**,与 `dazi-vscode` 扩展使用同一套 `bundled/clis` 产物。
4
4
 
5
+ 完整说明见:**`dazi/docs/341-dazi-vscode-cli打包和发布指南.md`**。
6
+
5
7
  ## 与 `dazi.ps1` 的关系
6
8
 
7
- | 方式 | 适用 |
8
- |------|------|
9
- | `.\scripts\dazi.ps1` | 仅拷贝 `dazi-work`、未装全局 CLI |
10
- | **`dazi` / `dazi-flow`(本包)** | 开发机全局短命令 |
9
+ | 方式 | 适用 |
10
+ | -------------------------------- | -------------------------------- |
11
+ | `dazi` | 仅拷贝 `dazi-work`、未装全局 CLI |
12
+ | **`dazi` / `dazi-flow`(本包)** | 开发机全局短命令 |
11
13
 
12
- 二者等价:`dazi flow …` ≈ `.\scripts\dazi.ps1 flow …`。
14
+ 二者等价:`dazi flow …` ≈ `dazi flow …`。
13
15
 
14
16
  ## 研发:准备发布目录
15
17
 
@@ -58,15 +60,15 @@ pnpm run publish:cli
58
60
 
59
61
  **方式 B — Granular Access Token + `.npmrc`(纯文本文件):**
60
62
 
63
+ **推荐**把 token 写在 `%USERPROFILE%\.npmrc`(避免 `pnpm run vsix` 把密钥打进扩展包):
64
+
61
65
  ```powershell
62
- cd packages\cli-dist
63
- copy .npmrc.example .npmrc
64
- # 用编辑器打开 .npmrc,把 YOUR_NPM_TOKEN_HERE 换成 npm_ 开头的 token
65
- cd ..\..
66
+ copy packages\cli-dist\.npmrc.example %USERPROFILE%\.npmrc
67
+ notepad %USERPROFILE%\.npmrc
66
68
  pnpm run publish:cli
67
69
  ```
68
70
 
69
- `.npmrc` 已加入 `.gitignore`,不要提交到 Git。也可放在用户目录 `%USERPROFILE%\.npmrc` 供本机所有项目使用。
71
+ 勿在 `packages\cli-dist\.npmrc` 长期保存真实 token。若已泄露,请在 npm Revoke 该 token 并重建。
70
72
 
71
73
  内网 registry:把 `registry=` 和 token 行改成你们私服地址。
72
74
 
@@ -76,7 +78,7 @@ pnpm run publish:cli
76
78
 
77
79
  ```powershell
78
80
  # 全局
79
- pnpm add -g @dazitech/cli@3.0.0
81
+ pnpm add -g @dazitech/cli@3.0.2
80
82
 
81
83
  # 确认 PATH(pnpm 全局 bin)
82
84
  pnpm bin -g
@@ -98,7 +100,7 @@ dazi flow project status --dir "项目\flow_xxx\流程\MyFlow"
98
100
 
99
101
  ## 环境变量
100
102
 
101
- | 变量 | 说明 |
102
- |------|------|
103
- | `DAZI_BUNDLED_DIR` | 默认:包内 `dist/clis` |
103
+ | 变量 | 说明 |
104
+ | --------------------- | ------------------------------------------------- |
105
+ | `DAZI_BUNDLED_DIR` | 默认:包内 `dist/clis` |
104
106
  | `DAZI_WORKSPACE_ROOT` | 默认:从 cwd 向上查找含 `scripts/dazi.ps1` 的目录 |
@@ -13775,7 +13775,7 @@ function applyPlaceholdersInTree(targetDir, ph, oldAppId = "${appId}") {
13775
13775
  walk(targetDir);
13776
13776
  }
13777
13777
  function replacePlaceholders(text, ph, oldAppId) {
13778
- return text.split("${appId}").join(ph.appId).split("${spaceId}").join(ph.spaceId).split("${appName}").join(ph.appName).split("space__demo").join(ph.spaceId).split(`/runtime-apps/${oldAppId}`).join(`/runtime-apps/${ph.appId}`).split(oldAppId).join(ph.appId);
13778
+ return text.split('"${spaceId}"').join(JSON.stringify(ph.spaceId)).split("${appId}").join(ph.appId).split("${spaceId}").join(ph.spaceId).split("${appName}").join(ph.appName).split("space__demo").join(ph.spaceId).split(`/runtime-apps/${oldAppId}`).join(`/runtime-apps/${ph.appId}`).split(oldAppId).join(ph.appId);
13779
13779
  }
13780
13780
  function writeContextMd(targetDir, ph) {
13781
13781
  const aiDir = import_node_path9.default.join(targetDir, ".ai");
@@ -13910,6 +13910,34 @@ function parseDataspaceId(permissions) {
13910
13910
  }
13911
13911
  return void 0;
13912
13912
  }
13913
+ function resolveManifestSpaceId(manifest) {
13914
+ const fromField = String(manifest.space_id ?? "").trim();
13915
+ if (fromField) return fromField;
13916
+ return parseDataspaceId(manifest.permissions);
13917
+ }
13918
+ function syncManifestSpace(cwd, spaceId) {
13919
+ const sid = spaceId.trim();
13920
+ if (!sid) throw new Error("spaceId \u4E0D\u80FD\u4E3A\u7A7A");
13921
+ const manifestPath = import_node_path10.default.join(cwd, "manifest.json");
13922
+ const manifest = JSON.parse(
13923
+ import_node_fs11.default.readFileSync(manifestPath, "utf8")
13924
+ );
13925
+ const previous = resolveManifestSpaceId(manifest);
13926
+ const required = `dataspace:${sid}`;
13927
+ const perms = Array.isArray(manifest.permissions) ? manifest.permissions.map((p) => String(p).trim()) : [];
13928
+ const nextPerms = [
13929
+ ...perms.filter((p) => !p.startsWith("dataspace:")),
13930
+ required
13931
+ ];
13932
+ const changed = manifest.space_id !== sid || JSON.stringify(manifest.permissions) !== JSON.stringify(nextPerms);
13933
+ manifest.space_id = sid;
13934
+ manifest.permissions = nextPerms;
13935
+ if (changed) {
13936
+ import_node_fs11.default.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}
13937
+ `, "utf8");
13938
+ }
13939
+ return { changed, previous: previous ?? void 0 };
13940
+ }
13913
13941
  function validateDataSource(ds, index, projectRoot) {
13914
13942
  const base = `data_sources[${index}]`;
13915
13943
  const issues = [];
@@ -14229,23 +14257,55 @@ function validateManifestRecord(manifest, opts) {
14229
14257
  }
14230
14258
  }
14231
14259
  }
14260
+ const declaredSpace = String(manifest.space_id ?? "").trim();
14232
14261
  const perms = manifest.permissions;
14233
- if (!Array.isArray(perms) || perms.length === 0) {
14262
+ const permSpace = parseDataspaceId(perms);
14263
+ if (!declaredSpace && !permSpace) {
14234
14264
  issues.push(
14235
14265
  issue(
14236
14266
  "error",
14237
- "PERMISSIONS_REQUIRED",
14238
- "permissions",
14239
- "\u81F3\u5C11\u58F0\u660E permissions\uFF08\u5982 dataspace:<spaceId>\uFF09"
14267
+ "SPACE_ID_REQUIRED",
14268
+ "space_id",
14269
+ "\u987B\u914D\u7F6E space_id\uFF08\u63A8\u8350\uFF09\u6216 permissions \u4E2D\u7684 dataspace:<\u7A7A\u95F4Id>"
14240
14270
  )
14241
14271
  );
14242
- } else if (!parseDataspaceId(perms)) {
14272
+ } else if (declaredSpace && permSpace && declaredSpace !== permSpace) {
14273
+ issues.push(
14274
+ issue(
14275
+ "error",
14276
+ "SPACE_ID_MISMATCH",
14277
+ "space_id",
14278
+ `space_id=${JSON.stringify(declaredSpace)} \u4E0E permissions dataspace:${permSpace} \u4E0D\u4E00\u81F4`
14279
+ )
14280
+ );
14281
+ }
14282
+ if (!Array.isArray(perms) || perms.length === 0) {
14283
+ if (!declaredSpace) {
14284
+ issues.push(
14285
+ issue(
14286
+ "error",
14287
+ "PERMISSIONS_REQUIRED",
14288
+ "permissions",
14289
+ "\u81F3\u5C11\u58F0\u660E permissions\uFF08\u5982 dataspace:<spaceId>\uFF09\u6216\u914D\u7F6E space_id"
14290
+ )
14291
+ );
14292
+ } else {
14293
+ issues.push(
14294
+ issue(
14295
+ "warning",
14296
+ "PERMISSIONS_DATASPACE",
14297
+ "permissions",
14298
+ `upload \u65F6\u5C06\u81EA\u52A8\u8865\u9F50 dataspace:${declaredSpace}`
14299
+ )
14300
+ );
14301
+ }
14302
+ } else if (!permSpace && !declaredSpace) {
14243
14303
  issues.push(
14244
14304
  issue(
14245
14305
  "warning",
14246
14306
  "PERMISSIONS_DATASPACE",
14247
14307
  "permissions",
14248
- "\u672A\u627E\u5230 dataspace:<id>\uFF0Cupload \u65F6\u9700 --space \u6216\u8865\u5168 permissions"
14308
+ "\u672A\u627E\u5230 dataspace:<id>\uFF1B\u8BF7\u914D\u7F6E manifest.space_id"
14249
14309
  )
14250
14310
  );
14251
14311
  }
@@ -14409,7 +14469,7 @@ function validateManifest(cwd, opts = {}) {
14409
14469
  manifestPath,
14410
14470
  appId: String(manifest.appId ?? "").trim() || void 0,
14411
14471
  version: String(manifest.version ?? "").trim() || void 0,
14412
- spaceId: parseDataspaceId(manifest.permissions),
14472
+ spaceId: resolveManifestSpaceId(manifest),
14413
14473
  dataSourceKeys,
14414
14474
  kinds: [...kindSet],
14415
14475
  issues,
@@ -14564,6 +14624,22 @@ function registerUpload(program3) {
14564
14624
  program3.command("upload").description("\u6253\u5305\u5E76\u4E0A\u4F20\u5230 Registry\uFF08\u65E0 app \u5219\u5148 create\uFF09").option("--cwd <dir>", "DRAP \u9879\u76EE\u76EE\u5F55\uFF08\u9ED8\u8BA4\u81EA\u52A8\u8BC6\u522B\uFF1Ashell \u76EE\u5F55\u6216\u542B manifest.json \u7684\u7956\u5148\uFF09").option("--space <id>", "\u6570\u636E\u7A7A\u95F4 id\uFF08\u5FC5\u586B\uFF0C\u9996\u6B21 create\uFF09").option("--activate", "\u4E0A\u4F20\u540E\u6FC0\u6D3B", false).option("--changelog <text>", "\u53D8\u66F4\u8BF4\u660E").option("--file <path>", "\u5DF2\u6709 .dazi-app\uFF0C\u8DF3\u8FC7 package").option("--skip-validate", "\u8DF3\u8FC7 manifest \u6821\u9A8C\uFF08\u4E0D\u63A8\u8350\uFF09").option("--no-source", "\u4E0D\u4E0A\u4F20\u6E90\u7801\u5FEB\u7167\uFF08\u9ED8\u8BA4\u4E0A\u4F20\uFF0C\u4F9B release \u8F6C\u6A21\u677F\uFF09").option("--json").action(async (opts) => {
14565
14625
  if (!loadAuth()) throw new Error("\u8BF7\u5148 dazi-app auth login");
14566
14626
  const cwd = requireProjectCwd(opts.cwd);
14627
+ const manifestEarly = JSON.parse(
14628
+ import_node_fs13.default.readFileSync(import_node_path12.default.join(cwd, "manifest.json"), "utf8")
14629
+ );
14630
+ const uploadSpaceId = String(opts.space || "").trim() || resolveManifestSpaceId(manifestEarly) || "";
14631
+ if (!uploadSpaceId) {
14632
+ throw new Error(
14633
+ "manifest \u987B\u914D\u7F6E space_id\uFF0C\u6216 permissions \u542B dataspace:<\u7A7A\u95F4Id>\uFF1B\u4E5F\u53EF upload --space <id>"
14634
+ );
14635
+ }
14636
+ const sync = syncManifestSpace(cwd, uploadSpaceId);
14637
+ if (sync.changed && !opts.json) {
14638
+ const prev = sync.previous ? `\uFF08\u539F ${sync.previous}\uFF09` : "";
14639
+ console.warn(
14640
+ `\u5DF2\u540C\u6B65 manifest space_id / permissions \u2192 ${uploadSpaceId}${prev}`
14641
+ );
14642
+ }
14567
14643
  if (!opts.skipValidate) {
14568
14644
  const vr = validateManifest(cwd, { scanSrc: true });
14569
14645
  if (!vr.ok) {
@@ -14907,9 +14983,9 @@ function formatAppCliCommands(opts) {
14907
14983
  if (work) {
14908
14984
  lines.push(
14909
14985
  `# \u5728 dazi-work \u6839\u6267\u884C\uFF08\u63A8\u8350\uFF0C\u81EA\u52A8 bundled CLI\uFF09`,
14910
- `.\\scripts\\dazi.ps1 app manifest validate --cwd ${work.cwdRel} --scan-src`,
14911
- `.\\scripts\\dazi.ps1 app doctor --cwd ${work.cwdRel}`,
14912
- `.\\scripts\\dazi.ps1 app upload --cwd ${work.cwdRel} --space ${opts.spaceId} --activate`
14986
+ `dazi app manifest validate --cwd ${work.cwdRel} --scan-src`,
14987
+ `dazi app doctor --cwd ${work.cwdRel}`,
14988
+ `dazi app upload --cwd ${work.cwdRel} --space ${opts.spaceId} --activate`
14913
14989
  );
14914
14990
  return lines.join("\n");
14915
14991
  }
@@ -14936,8 +15012,8 @@ function buildInitNextSteps(outDir, spaceId, installOk, workspaceRoot) {
14936
15012
  "pnpm run dev",
14937
15013
  "pnpm run build",
14938
15014
  `# \u5728 dazi-work \u6839\uFF1A`,
14939
- `.\\scripts\\dazi.ps1 app doctor --cwd ${work.cwdRel}`,
14940
- `.\\scripts\\dazi.ps1 app upload --cwd ${work.cwdRel} --space ${spaceId} --activate`
15015
+ `dazi app doctor --cwd ${work.cwdRel}`,
15016
+ `dazi app upload --cwd ${work.cwdRel} --space ${spaceId} --activate`
14941
15017
  ];
14942
15018
  }
14943
15019
  return [
@@ -15416,10 +15492,13 @@ function registerInit(program3) {
15416
15492
  const manifest = JSON.parse(import_node_fs22.default.readFileSync(manifestPath, "utf8"));
15417
15493
  manifest.appId = appId;
15418
15494
  manifest.name = appName;
15495
+ manifest.space_id = spaceId;
15419
15496
  if (Array.isArray(manifest.permissions)) {
15420
15497
  manifest.permissions = manifest.permissions.map(
15421
15498
  (p) => p.startsWith("dataspace:") ? `dataspace:${spaceId}` : p
15422
15499
  );
15500
+ } else {
15501
+ manifest.permissions = [`dataspace:${spaceId}`];
15423
15502
  }
15424
15503
  import_node_fs22.default.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf8");
15425
15504
  patchPackageJsonForApp(outDir, appId, appName);
@@ -16672,7 +16751,9 @@ function registerLegacyCompatCommands(program3) {
16672
16751
 
16673
16752
  // cli/dazi-app/src/index.ts
16674
16753
  var program2 = new Command();
16675
- program2.name("dazi-app").description("\u642D\u5B50 App CLI \u2014 DRAP \u524D\u7AEF\u5E94\u7528\uFF08manifest / build / upload / preview\uFF09").version("3.0.0", "-v, --version");
16754
+ program2.name("dazi-app").description(
16755
+ "\u642D\u5B50 App CLI \u2014 DRAP \u524D\u7AEF\u5E94\u7528\uFF08manifest / build / upload / preview\uFF09"
16756
+ ).version("3.0.2", "-v, --version");
16676
16757
  registerAuth(program2);
16677
16758
  registerBuild(program2);
16678
16759
  registerDev(program2);