@sokeai/cli 1.0.76 → 1.0.77

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 (123) hide show
  1. package/README.md +7 -7
  2. package/package.json +1 -1
  3. package/scripts/build-binaries.sh +1 -1
  4. package/scripts/e2e-test.sh +75 -3
  5. package/skills/SKILL.md +18 -1
  6. package/skills/soke-ai-coach-director/CHANGELOG.md +203 -0
  7. package/skills/soke-ai-coach-director/README.md +123 -0
  8. package/skills/soke-ai-coach-director/SKILL.md +221 -0
  9. package/skills/soke-ai-coach-director/coaching/knowledge-packager/knowledge-packager.md +91 -0
  10. package/skills/soke-ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +97 -0
  11. package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part3-flow.md +3 -3
  12. package/skills/soke-ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +76 -0
  13. package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-optimizer/prompt-optimizer.md +77 -58
  14. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/workbuddy.md +2 -3
  15. package/skills/soke-ai-coach-director/platform/interaction.md +103 -0
  16. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/publish-gate.md +3 -3
  17. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/resource-finalizer.md +10 -35
  18. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/soke-ai-training/soke-ai-training.md +33 -3
  19. package/skills/soke-ai-coach-director/platform/sync-engine.md +39 -0
  20. package/skills/{ai-coach-director → soke-ai-coach-director}/references/change-log-partwise-refactor.md +1 -1
  21. package/skills/soke-ai-coach-director/references/env-check.md +146 -0
  22. package/skills/soke-ai-coach-director/references/exec-common.md +126 -0
  23. package/skills/soke-ai-coach-director/references/exec-handbook.md +621 -0
  24. package/skills/soke-ai-coach-director/references/exec-part1.md +86 -0
  25. package/skills/soke-ai-coach-director/references/exec-part2.md +145 -0
  26. package/skills/soke-ai-coach-director/references/exec-part3.md +91 -0
  27. package/skills/soke-ai-coach-director/references/exec-part4.md +187 -0
  28. package/skills/soke-ai-coach-director/references/gate-check-matrix.md +46 -0
  29. package/skills/soke-ai-coach-director/references/micro-tune-labels.md +30 -0
  30. package/skills/soke-ai-coach-director/references/platform-api-pitfalls.md +49 -0
  31. package/skills/soke-ai-coach-director/references/role-resource-matching.md +45 -0
  32. package/skills/{ai-coach-director → soke-ai-coach-director}/references/self-improvement-examples.md +2 -0
  33. package/skills/soke-ai-coach-director/references/self-learning-engine.md +489 -0
  34. package/skills/soke-ai-coach-director/references/subs/part1/SOP.md +17 -0
  35. package/skills/soke-ai-coach-director/references/subs/part2/SOP.md +34 -0
  36. package/skills/soke-ai-coach-director/references/subs/part3/SOP.md +27 -0
  37. package/skills/soke-ai-coach-director/references/subs/part4/SOP.md +31 -0
  38. package/skills/soke-ai-coach-director/references/subs/publish/SOP.md +81 -0
  39. package/skills/soke-ai-coach-director/references/subs/tune/SOP.md +92 -0
  40. package/skills/soke-ai-coach-director/references/verified-cli-cheatsheet.md +56 -0
  41. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/activator.sh +0 -0
  42. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/error-detector.sh +0 -0
  43. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/extract-skill.sh +0 -0
  44. package/skills/soke-ai-coach-director/scripts/gate_check.py +112 -0
  45. package/skills/soke-ai-coach-director/scripts/validate_operations.py +403 -0
  46. package/skills/soke-certificate/SKILL.md +717 -0
  47. package/skills/soke-course/README.md +6 -2
  48. package/skills/soke-course/SKILL.md +3 -3
  49. package/skills/soke-course/references/course-list-courses.md +49 -84
  50. package/skills/soke-course/references/intent-cases.md +2 -2
  51. package/skills/soke-course/references/sop-full-workflow.md +4 -2
  52. package/skills/soke-course/references/subs/publish/SOP.md +21 -3
  53. package/skills/soke-course/references/subs/query/SOP.md +9 -7
  54. package/skills/soke-course/references/subs/settings/SOP.md +2 -1
  55. package/skills/soke-exam-question-pool/SKILL.md +2 -2
  56. package/skills/soke-task/SKILL.md +32 -10
  57. package/skills/soke-training-demand/SKILL.md +2 -2
  58. package/skills/ai-coach-director/SKILL.md +0 -1563
  59. package/skills/ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +0 -317
  60. package/skills/ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +0 -244
  61. package/skills/ai-coach-director/platform/interaction.md +0 -315
  62. package/skills/ai-coach-director/platform/sync-engine.md +0 -1101
  63. package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277_/346/240/207/345/207/206/347/237/245/350/257/206/345/272/223.md +0 -199
  64. package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277/347/237/245/350/257/206/345/272/223.md +0 -388
  65. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-knowledge-base.md +0 -125
  66. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-p03-first-call-scenario-prompt.md +0 -428
  67. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204P03/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210_20260610.md +0 -225
  68. package/skills/ai-coach-director/references/cases/create//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214/345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/220/210/351/233/206.md +0 -525
  69. package/skills/ai-coach-director/references/cases/create//347/211/251/346/265/201/350/241/214/344/270/232//347/211/251/346/265/201/350/241/214/344/270/232-/345/210/235/346/254/241/346/213/234/350/256/277/351/246/231/347/262/276/351/246/231/346/226/231/345/256/242/346/210/267.md +0 -146
  70. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2061_/346/226/260/345/223/201/346/216/250/351/224/200_20260701.md +0 -230
  71. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2062_/345/202/254/350/217/234/345/256/211/346/212/232_20260701.md +0 -257
  72. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2063_/345/267/256/350/257/204/345/233/236/350/256/277_20260701.md +0 -259
  73. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203/345/234/272/346/231/257/346/226/271/346/241/210_20260701.md +0 -452
  74. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/345/256/242/346/210/267/347/241/256/350/256/244/345/217/215/351/246/210/350/241/250.md +0 -133
  75. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v1.md +0 -333
  76. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v2_Part1-Part5.md +0 -649
  77. package/skills/ai-coach-director/references/env-check.md +0 -167
  78. package/skills/ai-coach-director/references/platform-api-pitfalls.md +0 -232
  79. package/skills/ai-coach-director/references/role-resource-matching.md +0 -349
  80. package/skills/ai-coach-director/references/verified-cli-cheatsheet.md +0 -203
  81. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/ERRORS-TEMPLATE.md +0 -0
  82. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/FEATURE_REQUESTS-TEMPLATE.md +0 -0
  83. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/LEARNINGS-TEMPLATE.md +0 -0
  84. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/SKILL-TEMPLATE.md +0 -0
  85. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part1-basic.md +0 -0
  86. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part4-scoring.md +0 -0
  87. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part5-constraints.md +0 -0
  88. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/role-profiler/role-profiler.md +0 -0
  89. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/README.md +0 -0
  90. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/qclaw.md +0 -0
  91. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/wukong.md +0 -0
  92. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/zework.md +0 -0
  93. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/api-fallback.md +0 -0
  94. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/345/256/242/346/210/267/350/247/222/350/211/262/346/250/241/346/235/277/345/272/223.md" +0 -0
  95. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203Bad Case/346/240/267/346/234/254/345/272/223.md" +0 -0
  96. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/210/233/345/273/272/351/227/256/351/242/230/345/272/223.md" +0 -0
  97. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/234/272/346/231/257/345/210/206/347/261/273/345/272/223.md" +0 -0
  98. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/256/242/346/210/267/346/235/220/346/226/231/346/270/205/345/215/225/344/270/216/350/256/277/350/260/210/351/242/230/345/272/223.md" +0 -0
  99. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/276/256/350/260/203/351/227/256/351/242/230/345/272/223.md" +0 -0
  100. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/212/200/346/234/257/350/276/271/347/225/214/344/270/216/346/216/222/351/232/234/345/272/223.md" +0 -0
  101. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/346/250/241/345/235/227/345/272/223.md" +0 -0
  102. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/225/260/346/215/256/346/214/207/346/240/207/344/270/216/347/234/213/346/235/277/345/217/243/345/276/204/345/272/223.md" +0 -0
  103. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/272/223.md" +0 -0
  104. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/350/257/204/345/210/206/346/240/207/345/207/206/347/273/204/344/273/266/345/272/223.md" +0 -0
  105. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/351/241/271/347/233/256/346/241/210/344/276/213/345/244/215/347/233/230/345/272/223.md" +0 -0
  106. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/241/276/345/256/242/350/247/222/350/211/262/346/250/241/346/213/237_GoodCase_BadCase_20260701.md" +0 -0
  107. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/345/256/242/346/210/267/346/235/220/346/226/231/346/261/207/346/200/273_2026-05-19_1341.md" +0 -0
  108. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/347/237/245/350/257/206/345/272/223/347/224/237/346/210/220_20260615.md" +0 -0
  109. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/347/224/237/346/210/220_20260615.md" +0 -0
  110. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210/344/272/244/344/273/230/350/256/260/345/275/225_20260610.md" +0 -0
  111. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/346/217/220/347/244/272/350/257/215/346/220/255/345/273/272_20260622.md" +0 -0
  112. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.1_20260616.md" +0 -0
  113. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.2_20260616.md" +0 -0
  114. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/345/216/213/347/274/251/347/211/210_V2.0_20260616.md" +0 -0
  115. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_20260616.md" +0 -0
  116. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277AI/351/231/252/347/273/203/347/263/273/347/273/237_/346/265/213/350/257/225/345/217/215/351/246/210/346/261/207/346/200/273_2026-06-01.md" +0 -0
  117. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/344/277/241/344/273/273/345/200/274/347/246/201/344/273/244_2026-06-09_0932.md" +0 -0
  118. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v2_20260608.md" +0 -0
  119. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.1.md" +0 -0
  120. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.2.md" +0 -0
  121. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_V2_/350/257/212/346/226/255/344/272/244/344/273/230_20260609.md" +0 -0
  122. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases//345/233/233/345/244/247/345/234/272/346/231/257_GoodCase_BadCase_20260701.md" +0 -0
  123. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases//346/241/210/344/276/213/345/272/223/350/241/245/345/205/205_2026-06-24.md" +0 -0
@@ -81,6 +81,7 @@ soke-cli course +list-course-users --course-id "COURSE-UUID"
81
81
  | `+list-categories` | 查询课程分类(获取 category-id) |
82
82
  | `+create` | 创建课程基本信息 |
83
83
  | `+update` | 更新课程信息 |
84
+ | `+delete` | 删除未发布或已关闭课程 |
84
85
  | `+advanced` | 更新课程高级设置 |
85
86
  | `+publish` | 发布课程 |
86
87
  | `+get-course` | 查询课程详情 |
@@ -168,6 +169,9 @@ soke-cli course +update \
168
169
  --title "新标题" \
169
170
  --description "新描述"
170
171
 
172
+ # 删除未发布或已关闭课程
173
+ soke-cli course +delete --course-id "COURSE-UUID"
174
+
171
175
  # 添加新课件
172
176
  media_id=$(soke-cli file +upload --file ./new-lesson.mp4 --format json | jq -r '.data.uuid')
173
177
  soke-cli course +lesson-create \
@@ -215,8 +219,8 @@ const endTime = new Date('2024-12-31').getTime(); // 1735660799000
215
219
  - `2`: 已关闭
216
220
 
217
221
  **课程来源 (is-in)**:
218
- - `0`: 采购课
219
- - `1`: 自建课
222
+ - `0`: 外部课列表
223
+ - `1`: 内部课列表
220
224
 
221
225
  **学习模式 (study_type)**:
222
226
  - `1`: 自由式(可任意顺序学习)
@@ -263,7 +263,7 @@ Gate 4→5: ✅ status=1
263
263
  #### Phase 6: 运营维护
264
264
 
265
265
  → read references/subs/query/SOP.md 执行(进度/记录/人脸)
266
- → read references/subs/publish/SOP.md 执行(关闭/删除,⚠️)
266
+ → read references/subs/publish/SOP.md 执行(关闭/删除;删除仅允许 status=0/2)
267
267
  → read references/subs/copy/SOP.md 执行(复制,⚠️)
268
268
 
269
269
  ### 3.3 课件子流程
@@ -293,7 +293,7 @@ Gate 4→5: ✅ status=1
293
293
 
294
294
  ### 3.8 维护子流程
295
295
 
296
- 流程: read references/subs/publish/SOP.md(关闭/删除)/ references/subs/copy/SOP.md(复制)/ references/subs/category/SOP.md(分类)
296
+ 流程: read references/subs/publish/SOP.md(关闭/删除,删除前必须校验 status=0 未发布或 status=2 已关闭)/ references/subs/copy/SOP.md(复制)/ references/subs/category/SOP.md(分类)
297
297
 
298
298
  ### SOP 执行 5 步法
299
299
 
@@ -384,7 +384,7 @@ Gate 4→5: ✅ status=1
384
384
  | 高级设置 | 证书/签名 |
385
385
  | 收费 | 价格/试看 |
386
386
  | 发布 | 审批/批量 |
387
- | 维护 | 关闭/删除/复制 |
387
+ | 维护 | 复制 |
388
388
 
389
389
  ### 中断恢复
390
390
  用户"继续"/"接着做": 检查 course-id → 有:查状态+课件→报告→继续 | 无:列课程→选→恢复
@@ -2,22 +2,23 @@
2
2
 
3
3
  ## 命令说明
4
4
 
5
- `soke-cli course +list-courses` 用于查询课程列表,支持按时间范围、分类、状态等条件筛选。
5
+ `soke-cli course +list-courses` 用于查询课程列表,转发到 `/skills/course/list`,支持按课程列表模糊搜索关键字、课程分类、课程状态、课程来源、我的课程和协同关系筛选。
6
6
 
7
7
  ## 基本用法
8
8
 
9
- ### 查询指定时间范围的课程
9
+ ### 查询已发布课程
10
10
 
11
11
  ```bash
12
12
  soke-cli course +list-courses \
13
- --start-time 1704038400000 \
14
- --end-time 1735660799000
13
+ --status 1 \
14
+ --page 1 \
15
+ --page-size 10
15
16
  ```
16
17
 
17
18
  **说明**:
18
- - `--start-time`: 课程创建开始时间(Unix时间戳,毫秒)
19
- - `--end-time`: 课程创建结束时间(Unix时间戳,毫秒)
20
- - 时间范围不能超过365天
19
+ - `--status`: 课程状态,默认 `1`
20
+ - `--page`: 页码,默认 `1`
21
+ - `--page-size`: 每页数据,默认 `10`
21
22
 
22
23
  ## 高级筛选
23
24
 
@@ -26,20 +27,14 @@ soke-cli course +list-courses \
26
27
  ```bash
27
28
  # 查询已发布的课程
28
29
  soke-cli course +list-courses \
29
- --start-time 1704038400000 \
30
- --end-time 1735660799000 \
31
30
  --status 1
32
31
 
33
32
  # 查询未发布的课程
34
33
  soke-cli course +list-courses \
35
- --start-time 1704038400000 \
36
- --end-time 1735660799000 \
37
34
  --status 0
38
35
 
39
36
  # 查询已关闭的课程
40
37
  soke-cli course +list-courses \
41
- --start-time 1704038400000 \
42
- --end-time 1735660799000 \
43
38
  --status 2
44
39
  ```
45
40
 
@@ -51,44 +46,46 @@ soke-cli course +list-courses \
51
46
  ### 按课程来源筛选
52
47
 
53
48
  ```bash
54
- # 查询自建课
49
+ # 查询内部课列表
55
50
  soke-cli course +list-courses \
56
- --start-time 1704038400000 \
57
- --end-time 1735660799000 \
58
51
  --is-in 1
59
52
 
60
- # 查询采购课
53
+ # 查询外部课列表
61
54
  soke-cli course +list-courses \
62
- --start-time 1704038400000 \
63
- --end-time 1735660799000 \
64
55
  --is-in 0
65
56
  ```
66
57
 
67
58
  **来源说明**:
68
- - `0`: 采购课(从外部采购的课程)
69
- - `1`: 自建课(企业自己创建的课程)
59
+ - `0`: 外部课列表
60
+ - `1`: 内部课列表
70
61
 
71
- ### 按课程分类筛选
62
+ ### 按关键字筛选
72
63
 
73
64
  ```bash
74
- soke-cli course +list-categories
65
+ soke-cli course +list-courses \
66
+ --keyword "测试"
67
+ ```
68
+
69
+ **说明**:`--keyword` 是课程列表模糊搜索关键字。
75
70
 
71
+ ### 按课程分类筛选
72
+
73
+ ```bash
76
74
  soke-cli course +list-courses \
77
- --start-time 1704038400000 \
78
- --end-time 1735660799000 \
79
- --category-id "category-uuid-here"
75
+ --category-path "category-uuid-here"
80
76
  ```
81
77
 
78
+ **说明**:`--category-path` 会作为接口参数 `categoryPath` 传递,用于按照课程分类 ID 筛选课程。
79
+
82
80
  ### 组合筛选
83
81
 
84
82
  ```bash
85
- # 查询已发布的自建课,且属于特定分类
83
+ # 查询已发布的内部课,只看我创建的,并限制课程分类
86
84
  soke-cli course +list-courses \
87
- --start-time 1704038400000 \
88
- --end-time 1735660799000 \
89
85
  --status 1 \
90
86
  --is-in 1 \
91
- --category-id "category123"
87
+ --is-my 1 \
88
+ --category-path "category123"
92
89
  ```
93
90
 
94
91
  ## 分页查询
@@ -96,22 +93,32 @@ soke-cli course +list-courses \
96
93
  ```bash
97
94
  # 第一页,每页10条
98
95
  soke-cli course +list-courses \
99
- --start-time 1704038400000 \
100
- --end-time 1735660799000 \
101
96
  --page 1 \
102
97
  --page-size 10
103
98
 
104
99
  # 第二页,每页10条
105
100
  soke-cli course +list-courses \
106
- --start-time 1704038400000 \
107
- --end-time 1735660799000 \
108
101
  --page 2 \
109
102
  --page-size 10
110
103
  ```
111
104
 
112
105
  **分页说明**:
113
106
  - `--page`: 页码,从1开始,默认为1
114
- - `--page-size`: 每页数量,最大100,默认为100
107
+ - `--page-size`: 每页数量,默认为10
108
+
109
+ ## 参数说明
110
+
111
+ | 参数 | 默认值 | 说明 |
112
+ |------|--------|------|
113
+ | `--keyword` | 空 | 课程列表模糊搜索关键字 |
114
+ | `--category-path` | 空 | 课程分类 ID,用于按照分类筛选课程 |
115
+ | `--page` | `1` | 页码 |
116
+ | `--is-in` | `1` | 课程来源:0=外部课列表,1=内部课列表 |
117
+ | `--page-size` | `10` | 每页数据 |
118
+ | `--is-my` | `0` | 是否只看我创建的:0=否,1=是 |
119
+ | `--status` | `1` | 课程状态:0=未发布,1=已发布,2=已关闭 |
120
+ | `--is-joint` | `0` | 协同给我的:0=否,1=是 |
121
+ | `--joint-out` | `0` | 我协同出去的:0=否,1=是 |
115
122
 
116
123
  ## 返回数据示例
117
124
 
@@ -166,66 +173,24 @@ soke-cli course +list-courses \
166
173
  | description | String | 课程描述 |
167
174
  | pc_url | String | PC端跳转链接 |
168
175
  | mobile_url | String | 移动端跳转链接 |
169
- | create_time | Int | 创建时间(Unix时间戳,毫秒) |
170
- | update_time | Int | 更新时间(Unix时间戳,毫秒) |
176
+ | create_time | Int/String | 创建时间 |
177
+ | update_time | Int/String | 更新时间 |
171
178
  | create_dept_user_id | String | 创建人ID |
172
179
  | create_dept_user_name | String | 创建人姓名 |
173
180
  | has_more | Int | 是否还有更多数据(1=有, 0=没有) |
174
181
 
175
- ## 时间戳转换
176
-
177
- ### JavaScript/Node.js
178
- ```javascript
179
- // 获取当前时间戳(毫秒)
180
- const now = Date.now();
181
-
182
- // 获取指定日期的时间戳
183
- const date = new Date('2024-01-01 00:00:00');
184
- const timestamp = date.getTime();
185
- ```
186
-
187
- ### Python
188
- ```python
189
- import time
190
- from datetime import datetime
191
-
192
- # 获取当前时间戳(毫秒)
193
- now = int(time.time() * 1000)
194
-
195
- # 获取指定日期的时间戳
196
- dt = datetime(2024, 1, 1, 0, 0, 0)
197
- timestamp = int(dt.timestamp() * 1000)
198
- ```
199
-
200
- ### Go
201
- ```go
202
- import "time"
203
-
204
- // 获取当前时间戳(毫秒)
205
- now := time.Now().UnixMilli()
206
-
207
- // 获取指定日期的时间戳
208
- t := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
209
- timestamp := t.UnixMilli()
210
- ```
211
-
212
182
  ## 常见问题
213
183
 
214
- ### Q: 为什么时间范围不能超过365天?
215
- A: 这是API的限制,为了防止一次查询返回过多数据。如果需要查询更长时间范围的数据,可以分多次查询。
216
-
217
184
  ### Q: 如何查询所有课程?
218
- A: 可以按年份分批查询,例如:
185
+ A: 使用分页逐页查询,例如:
219
186
  ```bash
220
- # 查询2024年的课程
221
187
  soke-cli course +list-courses \
222
- --start-time 1704038400000 \
223
- --end-time 1735660799000
188
+ --page 1 \
189
+ --page-size 10
224
190
 
225
- # 查询2025年的课程
226
191
  soke-cli course +list-courses \
227
- --start-time 1735660800000 \
228
- --end-time 1767196799000
192
+ --page 2 \
193
+ --page-size 10
229
194
  ```
230
195
 
231
196
  ### Q: 如何知道是否还有更多数据?
@@ -78,8 +78,8 @@
78
78
 
79
79
  | # | 用户输入 | 提取 | 路由 |
80
80
  |---|---------|------|------|
81
- | 35 | "关闭这门课" | close | Phase 6(⚠️ 不支持) |
82
- | 36 | "删除课程" | delete | Phase 6(⚠️ 不支持) |
81
+ | 35 | "关闭这门课" | close | Phase 6(course +update --action close) |
82
+ | 36 | "删除课程" | delete | Phase 6(先查 status,仅 0/2 可删) |
83
83
  | 37 | "复制这门课,叫 V2.0" | copy, title=V2.0 | Phase 6(⚠️ 不支持) |
84
84
  | 38 | "批量发布这几门" | batch, publish | Phase 6(⚠️ 不支持) |
85
85
 
@@ -166,9 +166,11 @@ Gate 4→5: ✅ status=1
166
166
  读取: subs/query/SOP.md 执行
167
167
  操作: course +list-course-users / +get-course-user / +list-lesson-learns / +list-lesson-faces
168
168
 
169
- ### Step 6.2: 关闭/删除(⚠️ CLI 不支持)
169
+ ### Step 6.2: 关闭/删除
170
170
  读取: subs/publish/SOP.md 执行
171
- 告知: "关闭/删除操作需在后台→课程列表中进行"
171
+ 关闭: course +update --course-id <uuid> --action close
172
+ 删除: 先查 status,仅 status=0 未发布或 status=2 已关闭时执行 course +delete --course-id <uuid>
173
+ 阻塞: status=1 已发布课程不能直接删除,先关闭再删除
172
174
 
173
175
  ### Step 6.3: 复制(⚠️ CLI 不支持)
174
176
  读取: subs/copy/SOP.md 执行
@@ -76,14 +76,32 @@ soke course +publish \
76
76
 
77
77
  发布成功后课程状态由 `0` → `1`。
78
78
 
79
+ ## 关闭课程
80
+
81
+ 关闭已发布课程:
82
+
83
+ ```bash
84
+ soke course +update --course-id <courseId> --action close
85
+ ```
86
+
87
+ 关闭成功后课程状态由 `1` → `2`,学员端不可见,历史学习记录保留。已关闭课程可再次执行 `course +publish` 重新发布。
88
+
89
+ ## 删除课程
90
+
91
+ 删除未发布或已关闭课程:
92
+
93
+ ```bash
94
+ soke course +delete --course-id <courseId>
95
+ ```
96
+
97
+ 删除前必须先查询课程状态。仅允许删除 `status=0` 未发布或 `status=2` 已关闭课程;`status=1` 已发布课程必须先执行 `course +update --course-id <courseId> --action close` 关闭后再删除。删除成功后课程状态变为已删除(`status=-1` 或 `status=3`)。
98
+
79
99
  ## ⚠️ CLI 不支持的操作
80
100
 
81
101
  | 操作 | 说明 | 替代路径 |
82
102
  |------|------|---------|
83
103
  | **审批流** | 发布需经过审批流程 | 后台 → 系统设置 → 审批设置 |
84
104
  | **批量发布** | 一次发布多门课程 | 后台 → 课程管理 → 批量操作 |
85
- | **关闭课程** | 将已发布课程下线 | 后台 → 课程管理 → 课程操作 → 关闭 |
86
- | **删除课程** | 物理删除课程及所有数据 | 后台 → 课程管理 → 课程操作 → 删除 |
87
105
 
88
106
  ## 审批规则
89
107
 
@@ -135,7 +153,7 @@ Gate Check 不通过(示例):
135
153
  2. 转码是异步过程,上传视频/音频后需等待转码完成再发布
136
154
  3. 课程关闭后学员端不可见,但历史学习记录保留
137
155
  4. 关闭后可重新发布,状态回到 1
138
- 5. 删除课程不可逆,CLI 不提供删除入口
156
+ 5. 删除课程不可逆,CLI 只允许删除未发布(status=0)或已关闭(status=2)课程
139
157
  6. 审批流默认关闭,如需开启需后台手动配置
140
158
 
141
159
  ## 检查清单
@@ -13,8 +13,8 @@ tags: [soke, query, data, analytics, learning-records]
13
13
 
14
14
  ## 通用约束
15
15
 
16
- - **时间范围限制**:所有查询的时间跨度 ≤ 365 天(如超出返回错误)
17
- - **时间戳格式**:所有时间戳均为**毫秒级 Unix timestamp**
16
+ - 课程列表走 `/skills/course/list`,不再使用创建时间范围筛选。
17
+ - 学习记录类查询如包含时间参数,时间戳仍使用**毫秒级 Unix timestamp**。
18
18
  - **状态码含义**:
19
19
  - `status`(课程):`0`=未发布,`1`=已发布,`2`=已关闭
20
20
  - `face_status`(人脸):`1`=验证成功,`2`=验证失败
@@ -29,13 +29,15 @@ soke course +list-courses
29
29
 
30
30
  | 参数 | 必填 | 说明 |
31
31
  |------|------|------|
32
- | `--keyword` | 否 | 按标题/描述模糊搜索 |
32
+ | `--keyword` | 否 | 课程列表模糊搜索关键字 |
33
+ | `--category-path` | 否 | 课程分类 ID,用于按照分类筛选课程 |
33
34
  | `--status` | 否 | 按状态过滤(0/1/2) |
34
- | `--category-id` | 否 | 按分类过滤 |
35
+ | `--is-in` | 否 | 课程来源:0=外部课列表,1=内部课列表(默认 1) |
36
+ | `--is-my` | 否 | 是否只看我创建的(默认 0) |
37
+ | `--is-joint` | 否 | 协同给我的(默认 0) |
38
+ | `--joint-out` | 否 | 我协同出去的(默认 0) |
35
39
  | `--page` | 否 | 页码(默认 1) |
36
- | `--page-size` | 否 | 每页条数(默认 20) |
37
- | `--start-time` | 否 | 创建时间起始(ms) |
38
- | `--end-time` | 否 | 创建时间结束(ms),与 start-time 跨度 ≤ 365 天 |
40
+ | `--page-size` | 否 | 每页条数(默认 10) |
39
41
 
40
42
  返回课程列表,包含课程 ID、标题、状态、创建时间、学习人数等摘要。
41
43
 
@@ -27,6 +27,7 @@ soke course +update \
27
27
  | 参数 | 必填 | 说明 |
28
28
  |------|------|------|
29
29
  | `--course-id` | 是 | 课程 ID |
30
+ | `--action` | 否 | 操作类型,默认 `update`;传 `close` 可关闭课程 |
30
31
  | `--title` | 否 | 课程标题 |
31
32
  | `--credit` | 否 | 学分 |
32
33
  | `--description` | 否 | 课程描述/简介 |
@@ -122,7 +123,7 @@ soke-cli course +advanced \
122
123
 
123
124
  ## 注意事项
124
125
 
125
- 1. `course +update` 支持标题、学分、描述、封面图和分类 ID 修改
126
+ 1. `course +update` 支持标题、学分、描述、封面图、分类 ID 修改,以及通过 `--action close` 关闭课程
126
127
  2. 封面图地址来自图片库列表接口返回的 `photoUri`
127
128
  3. 分类修改可通过 `--category-id` 更新
128
129
  4. 高级设置项之间可能存在依赖关系(如开启视频学习中人脸识别后再设置识别次数),建议按表格顺序逐项配置
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: soke-exam-question-pool
3
- summary: 授客可练习题库交互式练习系统
3
+ summary: 授客学堂题库答题练习(拉取题库列表/选择题库/随机出题/实时判分/进度追踪),支持填空、判断、单选、多选、不定项五种题型,答题状态持久化
4
4
  version: 2.0.0
5
- description: 授客可练习题库交互式练习
5
+ description: "授客学堂题库答题练习:通过 soke-cli exam-question-pool 分页拉取可练习题库列表,选择题库后随机逐题出题、实时判分并反馈进度。支持填空、判断、单选、多选、不定项五种题型,答题状态本地持久化。当用户需要刷题、题库练习、随机答题或查看答题进度时使用。"
6
6
  metadata:
7
7
  requires:
8
8
  bins: [soke-cli]
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: soke-task
3
- summary: 授客学堂异步任务管理(创建任务/查询任务),支持学习地图学员统计报表和统计生成
4
- version: 1.0.0
5
- description: "授客学堂异步任务管理:通过独立 task 命令创建和查询异步任务。目前支持学习地图学员统计报表和统计生成,按“创建任务 -> 获取 data.id -> 查询任务详情和 filePath”的流程使用。当用户需要生成学习地图学员统计报表、生成统计、查询任务状态或获取文件下载地址时使用。 | Soke Academy async task management: create and query jobs through the standalone task command. Currently supports learning map learner statistics report/statistics generation. Use when users need to generate learner statistics reports, generate statistics, check task status, or obtain file URLs."
3
+ summary: 授客学堂异步任务管理(创建统计任务/查询任务状态/获取报表文件),支持学习地图和课程学员统计的报表导出与统计生成,通过 soke-cli 操作
4
+ version: 1.1.0
5
+ description: "授客学堂异步任务管理:通过 soke-cli task 创建统计任务、查询任务状态、获取导出文件。支持学习地图学员统计和课程学员统计的报表导出与统计生成。当用户需要生成学习地图或课程学员统计报表、生成统计、查询任务状态或获取文件下载地址时使用。"
6
6
  metadata:
7
7
  requires:
8
8
  bins: ["soke-cli"]
@@ -18,7 +18,10 @@ metadata:
18
18
  - 任务接口是独立模块,命令统一使用 `soke-cli task ...`,不要使用 `soke-cli learning-map ...` 创建或查询任务。
19
19
  - 创建任务后必须保存返回的 `data.id`,再调用 `+get` 查询任务详情。
20
20
  - 默认用 `--format json` 获取结构化输出;需要人工快速查看时可省略 format 输出表格。
21
- - 当前已知任务类型是学习地图学员统计相关任务,`--module` 默认 `learningMapUser`,`--action` 默认 `export`,`--type` 默认 `aloneDept`。
21
+ - 当前已知任务类型是学习地图学员统计和课程学员统计;`--module` 默认 `learningMapUser`,课程学员统计使用 `--module courseUser`。
22
+ - `--target-id` 是统一目标 ID:`--module learningMapUser` 时会提交为 `学习地图id`,`--module courseUser` 时会提交为 `课程id`。
23
+ - `--departments` 和 `--users` 可传英文逗号分隔 ID 或 JSON 数组;CLI 会转换为接口需要的对象数组。
24
+ - `--action` 默认 `export`,`--type` 默认 `aloneDept`。
22
25
  - 查询 `soke-cli task +get --id "TASK-ID"` 后,必须根据创建任务时传入的 `--action` 判断状态字段:`action=export` 看 `data.export_status`,`action=report` 看 `data.status`。
23
26
 
24
27
  ## 命令
@@ -27,20 +30,36 @@ metadata:
27
30
 
28
31
  ```bash
29
32
  soke-cli task +create \
30
- --map-id "MAP-UUID" \
33
+ --target-id "MAP-UUID" \
31
34
  --learn-type "required" \
32
35
  --type "aloneDept" \
36
+ --departments "130110584" \
37
+ --users "1302105847786" \
33
38
  --custom-tags "job_number,position" \
34
39
  --limit 4500 \
35
40
  --format json
36
41
  ```
37
42
 
43
+ ### 创建课程学员统计任务
44
+
45
+ ```bash
46
+ soke-cli task +create \
47
+ --target-id "COURSE-UUID" \
48
+ --module courseUser \
49
+ --learn-type "required" \
50
+ --type "aloneDept" \
51
+ --departments '[130110584]' \
52
+ --users '[1302105847786]' \
53
+ --limit 4500 \
54
+ --format json
55
+ ```
56
+
38
57
  完整参数:
39
58
 
40
59
  | 参数 | 必填 | 默认值 | 说明 |
41
60
  |------|------|--------|------|
42
- | `--map-id` | 是 | - | 学习地图 UUID |
43
- | `--module` | 否 | `learningMapUser` | 任务模块,学习地图学员统计固定为 `learningMapUser` |
61
+ | `--target-id` | 是 | - | 目标 UUID;`learningMapUser` 时作为 `map_id`,`courseUser` 时作为 `course_id` |
62
+ | `--module` | 否 | `learningMapUser` | 任务模块:`learningMapUser` 学习地图学员统计,`courseUser` 课程学员统计 |
44
63
  | `--learn-type` | 否 | `required` | 学习类型,如 `required` |
45
64
  | `--learn-status` | 否 | 空 | 学习状态筛选:空值表示不限,`learning` 未完成,`finished` 已完成 |
46
65
  | `--eligible-status` | 否 | 空 | 达标状态筛选,空值表示不限 |
@@ -49,6 +68,8 @@ soke-cli task +create \
49
68
  | `--type` | 否 | `aloneDept` | 部门导出类型:`aloneDept` 单列导出,`manyDept` 部门多列导出 |
50
69
  | `--is-leave` | 否 | `0` | 是否离职:`0` 否,`1` 是 |
51
70
  | `--taskId` | 否 | 空字符串 | 任务 ID,默认空字符串 |
71
+ | `--departments` | 否 | 空 | 部门 ID 列表,多个 ID 用英文逗号分隔;也可传 JSON 数组 |
72
+ | `--users` | 否 | 空 | 用户 ID 列表,多个 ID 用英文逗号分隔;也可传 JSON 数组 |
52
73
  | `--custom-tags` | 否 | 空 | 导出的自定义字段列表,多个字段用英文逗号分隔;也可传 JSON 字符串数组 |
53
74
 
54
75
  响应关键字段:
@@ -89,7 +110,7 @@ soke-cli task +get --id "TASK-ID" --format json
89
110
 
90
111
  ```bash
91
112
  TASK_ID=$(soke-cli task +create \
92
- --map-id "$MAP_UUID" \
113
+ --target-id "$MAP_UUID" \
93
114
  --learn-type "required" \
94
115
  --type "aloneDept" \
95
116
  --custom-tags "工号,岗位,入职日期" \
@@ -120,5 +141,6 @@ soke-cli task +get --id "$TASK_ID" --format json | jq -r '.data.status'
120
141
 
121
142
  - `data.filePath` 为空:任务可能还未完成,等待后重新执行 `task +get --id "TASK-ID" --format json`。
122
143
  - `未登录授权`:按 `soke-shared` 执行 `soke-cli auth login` 后重试。
123
- - 自定义字段没有导出:确认已通过 `--custom-tags "字段1,字段2"` 指定,字段名需与学习地图学员统计支持的自定义字段一致。
124
- - 任务创建失败:确认 `--map-id` 是有效学习地图 UUID,`--module learningMapUser`,`--action export` `--action report`,`--type aloneDept` 或 `--type manyDept`。
144
+ - 自定义字段没有导出:确认已通过 `--custom-tags "字段1,字段2"` 指定,字段名需与当前任务类型支持的自定义字段一致。
145
+ - 任务创建失败:确认 `--target-id` `--module` 匹配;学习地图用 `--module learningMapUser`,课程用 `--module courseUser`。
146
+ - 部门或用户筛选无效:先用 `soke-cli assign +list-departments` / `soke-cli assign +list-users` 确认可用 ID,再传给 `--departments` / `--users`。
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: soke-training-demand
3
- summary: 培训需求收集:分步引导提交培训需求、浏览需求列表和投票
3
+ summary: 授客学堂培训需求收集(提交需求/浏览列表/投票),提交时分步引导选择分类、标签、描述、紧急程度,通过 soke-cli 操作
4
4
  version: 2.5.0
5
- description: "用于通过 soke-cli 对接授客AI培训需求收集接口。当用户需要查看培训需求列表、获取需求分类、提交新的培训需求、或给培训需求投票时使用。"
5
+ description: "授客学堂培训需求收集:通过 soke-cli training-demand 浏览需求列表、获取需求分类、分步引导提交培训需求(分类、标签、描述、紧急程度)以及为需求投票。当用户需要提交培训需求、浏览需求列表、给需求投票或查看需求分类时使用。"
6
6
  metadata:
7
7
  requires:
8
8
  bins: ["soke-cli"]