aitable-workflow-cli 0.1.28 → 0.1.29-beta.1790736949347

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/dist/assistant/assets/index-BA6il19d.css +1 -0
  2. package/dist/assistant/assets/{index-B3LvYfRW.js → index-BMzAOp70.js} +31 -31
  3. package/dist/assistant/index.html +2 -2
  4. package/dist/chunk-BBP5RVFU.js +15 -0
  5. package/dist/cli.js +180 -73
  6. package/dist/{config-ui-server-4SVD42Z3.js → config-ui-server-UWELHUH4.js} +1 -1
  7. package/dist/web/assets/index-Bnmnydwk.css +1 -0
  8. package/dist/web/assets/index-Dbs1xWB9.js +331 -0
  9. package/dist/web/index.html +2 -2
  10. package/dist/web/install.ps1 +173 -0
  11. package/dist/web/install.sh +188 -0
  12. package/package.json +3 -3
  13. package/templates/ai-native-sdlc/.env.example +11 -0
  14. package/templates/ai-native-sdlc/aitable-workflow.config.yml +47 -0
  15. package/templates/ai-native-sdlc/coding-agents.config.json +17 -0
  16. package/templates/ai-native-sdlc/docs/plans/2026-09-15-ai-native-sdlc-dual-staff-implementation-plan.md +150 -0
  17. package/templates/ai-native-sdlc/docs/plans/2026-09-15-ai-native-sdlc-dual-staff.md +213 -0
  18. package/templates/ai-native-sdlc/docs/plans/2026-09-16-domain-role-notification-routing.md +36 -0
  19. package/templates/ai-native-sdlc/docs/plans/2026-09-16-execution-resume-and-cr-loop.md +29 -0
  20. package/templates/ai-native-sdlc/docs/plans/2026-09-16-project-handoff.md +148 -0
  21. package/templates/ai-native-sdlc/docs/plans/2026-09-17-prd-code-context-and-readable-prompts.md +37 -0
  22. package/templates/ai-native-sdlc/docs/plans/2026-09-21-plan-merge-sync-and-agent-source.md +19 -0
  23. package/templates/ai-native-sdlc/docs/plans/2026-09-21-sdlc-base-ref-and-review-notification.md +18 -0
  24. package/templates/ai-native-sdlc/docs/plans/2026-09-29-borrow-from-joe-design.md +943 -0
  25. package/templates/ai-native-sdlc/lib/artifacts.ts +126 -0
  26. package/templates/ai-native-sdlc/lib/recipe-config.ts +34 -0
  27. package/templates/ai-native-sdlc/lib/recipe-helpers.ts +595 -0
  28. package/templates/ai-native-sdlc/npmrc +1 -0
  29. package/templates/ai-native-sdlc/package.json +19 -0
  30. package/templates/ai-native-sdlc/profile/profile.yml +115 -0
  31. package/templates/ai-native-sdlc/setup/module-config.seed.json +37 -0
  32. package/templates/ai-native-sdlc/test/artifacts.test.ts +72 -0
  33. package/templates/ai-native-sdlc/test/recipe-helpers.test.ts +931 -0
  34. package/templates/ai-native-sdlc/tsconfig.json +17 -0
  35. package/templates/ai-native-sdlc/workflows/.gitkeep +3 -0
  36. package/templates/ai-native-sdlc/workflows/execution/automations/blocked-questions-dev.json +91 -0
  37. package/templates/ai-native-sdlc/workflows/execution/automations/blocked-questions.json +91 -0
  38. package/templates/ai-native-sdlc/workflows/execution/automations/cr-review-dev.json +80 -0
  39. package/templates/ai-native-sdlc/workflows/execution/automations/cr-review.json +81 -0
  40. package/templates/ai-native-sdlc/workflows/execution/automations/resume-answers.json +42 -0
  41. package/templates/ai-native-sdlc/workflows/execution/automations/spec-review-dev.json +138 -0
  42. package/templates/ai-native-sdlc/workflows/execution/recipes/coding.recipe.ts +161 -0
  43. package/templates/ai-native-sdlc/workflows/execution/recipes/prd-review.recipe.ts +200 -0
  44. package/templates/ai-native-sdlc/workflows/execution/recipes/prd.recipe.ts +163 -0
  45. package/templates/ai-native-sdlc/workflows/execution/recipes/review.recipe.ts +257 -0
  46. package/templates/ai-native-sdlc/workflows/execution/recipes/spec-review.recipe.ts +242 -0
  47. package/templates/ai-native-sdlc/workflows/execution/recipes/spec.recipe.ts +173 -0
  48. package/templates/ai-native-sdlc/workflows/execution/workflow.yml +79 -0
  49. package/templates/ai-native-sdlc/workflows/intake/automations/accept-intake.json +101 -0
  50. package/templates/ai-native-sdlc/workflows/intake/recipes/classify-module.recipe.ts +133 -0
  51. package/templates/ai-native-sdlc/workflows/intake/recipes/create-change.recipe.ts +94 -0
  52. package/templates/ai-native-sdlc/workflows/intake/recipes/mechanical-deduplicate.recipe.ts +33 -0
  53. package/templates/ai-native-sdlc/workflows/intake/workflow.yml +62 -0
  54. package/templates/ai-native-sdlc/workspaces/dev/AGENTS.md +69 -0
  55. package/templates/ai-native-sdlc/workspaces/pm/AGENTS.md +48 -0
  56. package/templates/ai-native-sdlc/workspaces/reviewer/AGENTS.md +79 -0
  57. package/dist/assistant/assets/index-CCEHOkkJ.css +0 -1
  58. package/dist/chunk-YDJTCQW4.js +0 -15
  59. package/dist/web/assets/index-DPc2WOdp.css +0 -1
  60. package/dist/web/assets/index-HTw8K38o.js +0 -332
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "Bundler",
7
+ "types": ["node"],
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "isolatedModules": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "noEmit": true
15
+ },
16
+ "include": ["lib/**/*.ts", "workflows/**/*.ts", "test/**/*.ts"]
17
+ }
@@ -0,0 +1,3 @@
1
+ # 工作流目录 —— 设计阶段往这里生成 workflows/<id>/{workflow.yml,recipes/}
2
+ #
3
+ # 这个目录为空是预期状态,不是缺文件。
@@ -0,0 +1,91 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "Dev 阶段阻塞问答通知",
4
+ "description": "Dev 阶段有待回答的 AI 问题时,按模块通知 Dev负责人填写人工答复。",
5
+ "trigger": "start",
6
+ "_tables": {
7
+ "module_config": {
8
+ "name": "模块配置表",
9
+ "fields": [
10
+ { "name": "模块名称", "type": "text" },
11
+ { "name": "模块说明", "type": "text" },
12
+ { "name": "典型例子", "type": "text" },
13
+ { "name": "PM负责人", "type": "user" },
14
+ { "name": "Dev负责人", "type": "user" }
15
+ ]
16
+ }
17
+ },
18
+ "steps": {
19
+ "start": {
20
+ "type": "WhenRecordUpdated",
21
+ "next": "find_module",
22
+ "data": {
23
+ "sheetId": "<sheetId>",
24
+ "updatedFields": ["<状态_fieldId>", "<AI问题_fieldId>", "<当前角色_fieldId>"],
25
+ "where": {
26
+ "and": [
27
+ {
28
+ "left": "<状态_fieldId>",
29
+ "op": "EQ",
30
+ "right": { "option": "<状态_blocked_optionId>" }
31
+ },
32
+ {
33
+ "left": "<当前角色_fieldId>",
34
+ "op": "EQ",
35
+ "right": { "option": "<当前角色_Dev_optionId>" }
36
+ },
37
+ { "left": "<AI问题_fieldId>", "op": "EXIST" }
38
+ ]
39
+ }
40
+ }
41
+ },
42
+ "find_module": {
43
+ "type": "FindRecords",
44
+ "next": "notify_each_dev_owner",
45
+ "data": {
46
+ "sheetId": "<module_config_sheetId>",
47
+ "where": {
48
+ "left": "<module_config_模块名称_fieldId>",
49
+ "op": "EQ",
50
+ "right": { "ref": "$.start.<模块_fieldId>" }
51
+ },
52
+ "outputFields": ["<module_config_Dev负责人_fieldId>"],
53
+ "terminateIfNotFound": true
54
+ }
55
+ },
56
+ "notify_each_dev_owner": {
57
+ "type": "Loop",
58
+ "loopEntry": "send",
59
+ "next": null,
60
+ "data": {
61
+ "mode": "array",
62
+ "items": { "ref": "$.find_module.records[*]" },
63
+ "maxRuns": 20
64
+ }
65
+ },
66
+ "send": {
67
+ "type": "SendMessage",
68
+ "next": null,
69
+ "data": {
70
+ "title": "待人工答复",
71
+ "content": [
72
+ { "text": "需求:" },
73
+ { "ref": "$.start.<需求_fieldId>", "title": "需求" },
74
+ { "text": "\n请在该变更的「人工答复」中按问题编号填写答复:\n" },
75
+ { "ref": "$.start.<AI问题_fieldId>", "title": "AI问题" }
76
+ ],
77
+ "buttons": [
78
+ {
79
+ "name": "去填写",
80
+ "color": "blue",
81
+ "action": {
82
+ "type": "link",
83
+ "url": { "ref": "$.start.rowUrl.<表格视图_viewId>" }
84
+ }
85
+ }
86
+ ],
87
+ "to": { "users": [{ "ref": "$.notify_each_dev_owner.item.<module_config_Dev负责人_fieldId>" }] }
88
+ }
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "阻塞问答通知",
4
+ "description": "PM 阶段有待回答的 AI 问题时,按模块通知 PM负责人填写人工答复。",
5
+ "trigger": "start",
6
+ "_tables": {
7
+ "module_config": {
8
+ "name": "模块配置表",
9
+ "fields": [
10
+ { "name": "模块名称", "type": "text" },
11
+ { "name": "模块说明", "type": "text" },
12
+ { "name": "典型例子", "type": "text" },
13
+ { "name": "PM负责人", "type": "user" },
14
+ { "name": "Dev负责人", "type": "user" }
15
+ ]
16
+ }
17
+ },
18
+ "steps": {
19
+ "start": {
20
+ "type": "WhenRecordUpdated",
21
+ "next": "find_module",
22
+ "data": {
23
+ "sheetId": "<sheetId>",
24
+ "updatedFields": ["<状态_fieldId>", "<AI问题_fieldId>", "<当前角色_fieldId>"],
25
+ "where": {
26
+ "and": [
27
+ {
28
+ "left": "<状态_fieldId>",
29
+ "op": "EQ",
30
+ "right": { "option": "<状态_blocked_optionId>" }
31
+ },
32
+ {
33
+ "left": "<当前角色_fieldId>",
34
+ "op": "EQ",
35
+ "right": { "option": "<当前角色_PM_optionId>" }
36
+ },
37
+ { "left": "<AI问题_fieldId>", "op": "EXIST" }
38
+ ]
39
+ }
40
+ }
41
+ },
42
+ "find_module": {
43
+ "type": "FindRecords",
44
+ "next": "notify_each_pm_owner",
45
+ "data": {
46
+ "sheetId": "<module_config_sheetId>",
47
+ "where": {
48
+ "left": "<module_config_模块名称_fieldId>",
49
+ "op": "EQ",
50
+ "right": { "ref": "$.start.<模块_fieldId>" }
51
+ },
52
+ "outputFields": ["<module_config_PM负责人_fieldId>"],
53
+ "terminateIfNotFound": true
54
+ }
55
+ },
56
+ "notify_each_pm_owner": {
57
+ "type": "Loop",
58
+ "loopEntry": "send",
59
+ "next": null,
60
+ "data": {
61
+ "mode": "array",
62
+ "items": { "ref": "$.find_module.records[*]" },
63
+ "maxRuns": 20
64
+ }
65
+ },
66
+ "send": {
67
+ "type": "SendMessage",
68
+ "next": null,
69
+ "data": {
70
+ "title": "待人工答复",
71
+ "content": [
72
+ { "text": "需求:" },
73
+ { "ref": "$.start.<需求_fieldId>", "title": "需求" },
74
+ { "text": "\n请在该变更的「人工答复」中按问题编号填写答复:\n" },
75
+ { "ref": "$.start.<AI问题_fieldId>", "title": "AI问题" }
76
+ ],
77
+ "buttons": [
78
+ {
79
+ "name": "去填写",
80
+ "color": "blue",
81
+ "action": {
82
+ "type": "link",
83
+ "url": { "ref": "$.start.rowUrl.<表格视图_viewId>" }
84
+ }
85
+ }
86
+ ],
87
+ "to": { "users": [{ "ref": "$.notify_each_pm_owner.item.<module_config_PM负责人_fieldId>" }] }
88
+ }
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "评审 CR 待审通知",
4
+ "description": "评审阶段存在待审 CR 时,按模块通知 Dev负责人。",
5
+ "trigger": "start",
6
+ "_tables": {
7
+ "module_config": {
8
+ "name": "模块配置表",
9
+ "fields": [
10
+ { "name": "模块名称", "type": "text" },
11
+ { "name": "模块说明", "type": "text" },
12
+ { "name": "典型例子", "type": "text" },
13
+ { "name": "PM负责人", "type": "user" },
14
+ { "name": "Dev负责人", "type": "user" }
15
+ ]
16
+ }
17
+ },
18
+ "steps": {
19
+ "start": {
20
+ "type": "WhenRecordUpdated",
21
+ "next": "find_module",
22
+ "data": {
23
+ "sheetId": "<sheetId>",
24
+ "updatedFields": ["<当前CR链接_fieldId>", "<当前阶段_fieldId>", "<评审进展_fieldId>"],
25
+ "where": {
26
+ "and": [
27
+ {
28
+ "left": "<当前阶段_fieldId>",
29
+ "op": "EQ",
30
+ "right": { "option": "<当前阶段_评审_optionId>" }
31
+ },
32
+ { "left": "<当前CR链接_fieldId>", "op": "EXIST" }
33
+ ]
34
+ }
35
+ }
36
+ },
37
+ "find_module": {
38
+ "type": "FindRecords",
39
+ "next": "notify_each_dev_owner",
40
+ "data": {
41
+ "sheetId": "<module_config_sheetId>",
42
+ "where": {
43
+ "left": "<module_config_模块名称_fieldId>",
44
+ "op": "EQ",
45
+ "right": { "ref": "$.start.<模块_fieldId>" }
46
+ },
47
+ "outputFields": ["<module_config_Dev负责人_fieldId>"],
48
+ "terminateIfNotFound": true
49
+ }
50
+ },
51
+ "notify_each_dev_owner": {
52
+ "type": "Loop",
53
+ "loopEntry": "send",
54
+ "next": null,
55
+ "data": {
56
+ "mode": "array",
57
+ "items": { "ref": "$.find_module.records[*]" },
58
+ "maxRuns": 20
59
+ }
60
+ },
61
+ "send": {
62
+ "type": "SendMessage",
63
+ "next": null,
64
+ "data": {
65
+ "title": "CR待审",
66
+ "content": [
67
+ { "text": "需求:" },
68
+ { "ref": "$.start.<需求_fieldId>", "title": "需求" },
69
+ { "text": "\n当前阶段:" },
70
+ { "ref": "$.start.<当前阶段_fieldId>", "title": "当前阶段" },
71
+ { "text": "\n" },
72
+ { "ref": "$.start.<评审进展_fieldId>" },
73
+ { "text": "\n评审链接:\n" },
74
+ { "ref": "$.start.<当前CR链接_fieldId>", "title": "待评审 CR" }
75
+ ],
76
+ "to": { "users": [{ "ref": "$.notify_each_dev_owner.item.<module_config_Dev负责人_fieldId>" }] }
77
+ }
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "PRD CR 待审通知",
4
+ "description": "PRD 阶段存在待审 CR 时,按模块通知 PM负责人。",
5
+ "trigger": "start",
6
+ "_tables": {
7
+ "module_config": {
8
+ "name": "模块配置表",
9
+ "fields": [
10
+ { "name": "模块名称", "type": "text" },
11
+ { "name": "模块说明", "type": "text" },
12
+ { "name": "典型例子", "type": "text" },
13
+ { "name": "PM负责人", "type": "user" },
14
+ { "name": "Dev负责人", "type": "user" }
15
+ ]
16
+ }
17
+ },
18
+ "steps": {
19
+ "start": {
20
+ "type": "WhenRecordUpdated",
21
+ "next": "find_module",
22
+ "data": {
23
+ "sheetId": "<sheetId>",
24
+ "updatedFields": ["<当前CR链接_fieldId>", "<当前阶段_fieldId>", "<评审进展_fieldId>"],
25
+ "where": {
26
+ "and": [
27
+ {
28
+ "left": "<当前阶段_fieldId>",
29
+ "op": "EQ",
30
+ "right": { "option": "<当前阶段_PRD 评审_optionId>" }
31
+ },
32
+ { "left": "<当前CR链接_fieldId>", "op": "EXIST" }
33
+ ]
34
+ }
35
+ }
36
+ },
37
+ "find_module": {
38
+ "type": "FindRecords",
39
+ "next": "notify_each_pm_owner",
40
+ "data": {
41
+ "sheetId": "<module_config_sheetId>",
42
+ "where": {
43
+ "left": "<module_config_模块名称_fieldId>",
44
+ "op": "EQ",
45
+ "right": { "ref": "$.start.<模块_fieldId>" }
46
+ },
47
+ "outputFields": ["<module_config_PM负责人_fieldId>"],
48
+ "terminateIfNotFound": true
49
+ }
50
+ },
51
+ "notify_each_pm_owner": {
52
+ "type": "Loop",
53
+ "loopEntry": "send",
54
+ "next": null,
55
+ "data": {
56
+ "mode": "array",
57
+ "items": { "ref": "$.find_module.records[*]" },
58
+ "maxRuns": 20
59
+ }
60
+ },
61
+ "send": {
62
+ "type": "SendMessage",
63
+ "next": null,
64
+ "data": {
65
+ "title": "CR待审",
66
+ "content": [
67
+ { "text": "需求:" },
68
+ { "ref": "$.start.<需求_fieldId>", "title": "需求" },
69
+ { "text": "\n当前阶段:" },
70
+ { "ref": "$.start.<当前阶段_fieldId>", "title": "当前阶段" },
71
+ { "text": "\n评审通过并合并后,才会进入下一步" },
72
+ { "text": "\n" },
73
+ { "ref": "$.start.<评审进展_fieldId>" },
74
+ { "text": "\n评审链接:\n" },
75
+ { "ref": "$.start.<当前CR链接_fieldId>", "title": "待评审 CR" }
76
+ ],
77
+ "to": { "users": [{ "ref": "$.notify_each_pm_owner.item.<module_config_PM负责人_fieldId>" }] }
78
+ }
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "人工答复续跑",
4
+ "description": "真人填写人工答复后恢复同一变更的既有当前步骤,具体答复完整性仍由 recipe 校验。",
5
+ "trigger": "start",
6
+ "steps": {
7
+ "start": {
8
+ "type": "WhenRecordUpdated",
9
+ "next": "resume",
10
+ "data": {
11
+ "sheetId": "<sheetId>",
12
+ "updatedFields": ["<人工答复_fieldId>"],
13
+ "where": {
14
+ "and": [
15
+ {
16
+ "left": "<状态_fieldId>",
17
+ "op": "EQ",
18
+ "right": { "option": "<状态_blocked_optionId>" }
19
+ },
20
+ { "left": "<AI问题_fieldId>", "op": "EXIST" },
21
+ { "left": "<人工答复_fieldId>", "op": "EXIST" }
22
+ ]
23
+ }
24
+ }
25
+ },
26
+ "resume": {
27
+ "type": "UpdateRecord",
28
+ "next": null,
29
+ "data": {
30
+ "sheetId": "<sheetId>",
31
+ "target": {
32
+ "type": "previous",
33
+ "step": "start",
34
+ "rowId": { "ref": "$.start.rowId" }
35
+ },
36
+ "values": {
37
+ "<状态_fieldId>": { "option": "<状态_active_optionId>" }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,138 @@
1
+ {
2
+ "version": "workflow-dsl/v1",
3
+ "name": "技术方案评审 CR 待审通知",
4
+ "description": "技术方案评审阶段存在待审 CR 时,按模块通知 Dev负责人。",
5
+ "trigger": "start",
6
+ "_tables": {
7
+ "module_config": {
8
+ "name": "模块配置表",
9
+ "fields": [
10
+ {
11
+ "name": "模块名称",
12
+ "type": "text"
13
+ },
14
+ {
15
+ "name": "模块说明",
16
+ "type": "text"
17
+ },
18
+ {
19
+ "name": "典型例子",
20
+ "type": "text"
21
+ },
22
+ {
23
+ "name": "PM负责人",
24
+ "type": "user"
25
+ },
26
+ {
27
+ "name": "Dev负责人",
28
+ "type": "user"
29
+ }
30
+ ]
31
+ }
32
+ },
33
+ "steps": {
34
+ "start": {
35
+ "type": "WhenRecordUpdated",
36
+ "next": "find_module",
37
+ "data": {
38
+ "sheetId": "<sheetId>",
39
+ "updatedFields": [
40
+ "<当前CR链接_fieldId>",
41
+ "<当前阶段_fieldId>",
42
+ "<评审进展_fieldId>"
43
+ ],
44
+ "where": {
45
+ "and": [
46
+ {
47
+ "left": "<当前阶段_fieldId>",
48
+ "op": "EQ",
49
+ "right": {
50
+ "option": "<当前阶段_技术方案评审_optionId>"
51
+ }
52
+ },
53
+ {
54
+ "left": "<当前CR链接_fieldId>",
55
+ "op": "EXIST"
56
+ }
57
+ ]
58
+ }
59
+ }
60
+ },
61
+ "find_module": {
62
+ "type": "FindRecords",
63
+ "next": "notify_each_dev_owner",
64
+ "data": {
65
+ "sheetId": "<module_config_sheetId>",
66
+ "where": {
67
+ "left": "<module_config_模块名称_fieldId>",
68
+ "op": "EQ",
69
+ "right": {
70
+ "ref": "$.start.<模块_fieldId>"
71
+ }
72
+ },
73
+ "outputFields": [
74
+ "<module_config_Dev负责人_fieldId>"
75
+ ],
76
+ "terminateIfNotFound": true
77
+ }
78
+ },
79
+ "notify_each_dev_owner": {
80
+ "type": "Loop",
81
+ "loopEntry": "send",
82
+ "next": null,
83
+ "data": {
84
+ "mode": "array",
85
+ "items": {
86
+ "ref": "$.find_module.records[*]"
87
+ },
88
+ "maxRuns": 20
89
+ }
90
+ },
91
+ "send": {
92
+ "type": "SendMessage",
93
+ "next": null,
94
+ "data": {
95
+ "title": "CR待审",
96
+ "content": [
97
+ {
98
+ "text": "需求:"
99
+ },
100
+ {
101
+ "ref": "$.start.<需求_fieldId>",
102
+ "title": "需求"
103
+ },
104
+ {
105
+ "text": "\n当前阶段:"
106
+ },
107
+ {
108
+ "ref": "$.start.<当前阶段_fieldId>",
109
+ "title": "当前阶段"
110
+ },
111
+ {
112
+ "text": "\n评审通过并合并后,才会进入下一步"
113
+ },
114
+ {
115
+ "text": "\n"
116
+ },
117
+ {
118
+ "ref": "$.start.<评审进展_fieldId>"
119
+ },
120
+ {
121
+ "text": "\n评审链接:\n"
122
+ },
123
+ {
124
+ "ref": "$.start.<当前CR链接_fieldId>",
125
+ "title": "待评审 CR"
126
+ }
127
+ ],
128
+ "to": {
129
+ "users": [
130
+ {
131
+ "ref": "$.notify_each_dev_owner.item.<module_config_Dev负责人_fieldId>"
132
+ }
133
+ ]
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }