@sokeai/cli 1.0.77 → 1.0.78

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 (288) hide show
  1. package/package.json +1 -1
  2. package/scripts/install.js +2 -2
  3. package/scripts/local-test.js +1 -1
  4. package/scripts/test-auto-detect.js +20 -3
  5. package/skills/README.md +25 -174
  6. package/skills/SKILL.md +17 -239
  7. package/skills/mono/README.md +10 -0
  8. package/skills/mono/SKILL.md +223 -0
  9. package/skills/{soke-course/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md → mono/references/installation.md} +0 -3
  10. package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/README.md +1 -3
  11. package/skills/mono/references/modules/soke-ai-coach-director/platform/soke-ai-training/soke-ai-training.md +123 -0
  12. package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/self-learning-engine.md +0 -4
  13. package/skills/{soke-ai-training/SKILL.md → mono/references/modules/soke-ai-training/MODULE.md} +1 -1
  14. package/skills/mono/references/modules/soke-assign/README.md +308 -0
  15. package/skills/{soke-certificate/SKILL.md → mono/references/modules/soke-certificate/MODULE.md} +2 -2
  16. package/skills/mono/references/modules/soke-course/MODULE.md +402 -0
  17. package/skills/mono/references/modules/soke-course/README.md +291 -0
  18. package/skills/{soke-course → mono/references/modules/soke-course}/references/examples.md +3 -3
  19. package/skills/{soke-exam/SKILL.md → mono/references/modules/soke-exam/MODULE.md} +1 -1
  20. package/skills/{soke-learning-map/SKILL.md → mono/references/modules/soke-learning-map/MODULE.md} +5 -6
  21. package/skills/{soke-learning-profile/SKILL.md → mono/references/modules/soke-learning-profile/MODULE.md} +2 -2
  22. package/skills/mono/references/modules/soke-lesson/README.md +53 -0
  23. package/skills/mono/references/modules/soke-material/README.md +49 -0
  24. package/skills/{soke-photo-gallery/SKILL.md → mono/references/modules/soke-photo-gallery/MODULE.md} +2 -3
  25. package/skills/mono/references/modules/soke-supervisor/MODULE.md +186 -0
  26. package/skills/mono/references/modules/soke-task/MODULE.md +146 -0
  27. package/skills/{soke-training-demand/SKILL.md → mono/references/modules/soke-training-demand/MODULE.md} +1 -1
  28. package/skills/mono/references/shared/cli-basics.md +185 -0
  29. package/skills/mono/scripts/check_readiness.py +28 -0
  30. package/skills/mono/scripts/gate_check.py +112 -0
  31. package/skills/mono/scripts/validate_operations.py +403 -0
  32. package/skills/multi/README.md +18 -0
  33. package/skills/multi/soke-ai-coach-director/CHANGELOG.md +203 -0
  34. package/skills/multi/soke-ai-coach-director/README.md +121 -0
  35. package/skills/multi/soke-ai-coach-director/SKILL.md +220 -0
  36. package/skills/multi/soke-ai-coach-director/assets/ERRORS-TEMPLATE.md +5 -0
  37. package/skills/multi/soke-ai-coach-director/assets/FEATURE_REQUESTS-TEMPLATE.md +5 -0
  38. package/skills/multi/soke-ai-coach-director/assets/LEARNINGS-TEMPLATE.md +44 -0
  39. package/skills/multi/soke-ai-coach-director/assets/SKILL-TEMPLATE.md +177 -0
  40. package/skills/multi/soke-ai-coach-director/coaching/knowledge-packager/knowledge-packager.md +91 -0
  41. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part1-basic.md +59 -0
  42. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +97 -0
  43. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part3-flow.md +72 -0
  44. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part4-scoring.md +87 -0
  45. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part5-constraints.md +48 -0
  46. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +76 -0
  47. package/skills/multi/soke-ai-coach-director/coaching/prompt-optimizer/prompt-optimizer.md +381 -0
  48. package/skills/multi/soke-ai-coach-director/coaching/role-profiler/role-profiler.md +87 -0
  49. package/skills/multi/soke-ai-coach-director/platform/adapters/README.md +68 -0
  50. package/skills/multi/soke-ai-coach-director/platform/adapters/qclaw.md +67 -0
  51. package/skills/multi/soke-ai-coach-director/platform/adapters/workbuddy.md +44 -0
  52. package/skills/multi/soke-ai-coach-director/platform/adapters/wukong.md +70 -0
  53. package/skills/multi/soke-ai-coach-director/platform/adapters/zework.md +89 -0
  54. package/skills/multi/soke-ai-coach-director/platform/api-fallback.md +262 -0
  55. package/skills/multi/soke-ai-coach-director/platform/interaction.md +103 -0
  56. package/skills/multi/soke-ai-coach-director/platform/publish-gate.md +44 -0
  57. package/skills/multi/soke-ai-coach-director/platform/resource-finalizer.md +103 -0
  58. package/skills/{soke-ai-coach-director → multi/soke-ai-coach-director}/platform/soke-ai-training/soke-ai-training.md +1 -1
  59. package/skills/multi/soke-ai-coach-director/platform/sync-engine.md +39 -0
  60. package/skills/multi/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 +265 -0
  61. package/skills/multi/soke-ai-coach-director/references/cases/AI/351/231/252/347/273/203Bad Case/346/240/267/346/234/254/345/272/223.md" +206 -0
  62. package/skills/multi/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 +666 -0
  63. package/skills/multi/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 +213 -0
  64. package/skills/multi/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 +229 -0
  65. package/skills/multi/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 +833 -0
  66. package/skills/multi/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 +239 -0
  67. package/skills/multi/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 +249 -0
  68. package/skills/multi/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 +282 -0
  69. package/skills/multi/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 +254 -0
  70. package/skills/multi/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 +264 -0
  71. package/skills/multi/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 +223 -0
  72. package/skills/multi/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 +304 -0
  73. package/skills/multi/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 +42 -0
  74. package/skills/multi/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 +23 -0
  75. package/skills/multi/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 +34 -0
  76. package/skills/multi/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 +26 -0
  77. package/skills/multi/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 +30 -0
  78. package/skills/multi/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 +254 -0
  79. package/skills/multi/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 +96 -0
  80. package/skills/multi/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 +20 -0
  81. package/skills/multi/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 +434 -0
  82. package/skills/multi/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 +22 -0
  83. package/skills/multi/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 +261 -0
  84. package/skills/multi/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 +354 -0
  85. package/skills/multi/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 +26 -0
  86. package/skills/multi/soke-ai-coach-director/references/cases//345/233/233/345/244/247/345/234/272/346/231/257_GoodCase_BadCase_20260701.md +194 -0
  87. package/skills/multi/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 +41 -0
  88. package/skills/multi/soke-ai-coach-director/references/change-log-partwise-refactor.md +74 -0
  89. package/skills/multi/soke-ai-coach-director/references/env-check.md +146 -0
  90. package/skills/multi/soke-ai-coach-director/references/exec-common.md +126 -0
  91. package/skills/multi/soke-ai-coach-director/references/exec-handbook.md +621 -0
  92. package/skills/multi/soke-ai-coach-director/references/exec-part1.md +86 -0
  93. package/skills/multi/soke-ai-coach-director/references/exec-part2.md +145 -0
  94. package/skills/multi/soke-ai-coach-director/references/exec-part3.md +91 -0
  95. package/skills/multi/soke-ai-coach-director/references/exec-part4.md +187 -0
  96. package/skills/multi/soke-ai-coach-director/references/gate-check-matrix.md +46 -0
  97. package/skills/{soke-learning-map/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md → multi/soke-ai-coach-director/references/installation.md} +0 -3
  98. package/skills/multi/soke-ai-coach-director/references/micro-tune-labels.md +30 -0
  99. package/skills/multi/soke-ai-coach-director/references/platform-api-pitfalls.md +49 -0
  100. package/skills/multi/soke-ai-coach-director/references/role-resource-matching.md +45 -0
  101. package/skills/multi/soke-ai-coach-director/references/self-improvement-examples.md +373 -0
  102. package/skills/multi/soke-ai-coach-director/references/self-learning-engine.md +485 -0
  103. package/skills/multi/soke-ai-coach-director/references/shared.md +185 -0
  104. package/skills/multi/soke-ai-coach-director/references/subs/part1/SOP.md +17 -0
  105. package/skills/multi/soke-ai-coach-director/references/subs/part2/SOP.md +34 -0
  106. package/skills/multi/soke-ai-coach-director/references/subs/part3/SOP.md +27 -0
  107. package/skills/multi/soke-ai-coach-director/references/subs/part4/SOP.md +31 -0
  108. package/skills/multi/soke-ai-coach-director/references/subs/publish/SOP.md +81 -0
  109. package/skills/multi/soke-ai-coach-director/references/subs/tune/SOP.md +92 -0
  110. package/skills/multi/soke-ai-coach-director/references/verified-cli-cheatsheet.md +56 -0
  111. package/skills/multi/soke-ai-coach-director/scripts/gate_check.py +112 -0
  112. package/skills/multi/soke-ai-coach-director/scripts/validate_operations.py +403 -0
  113. package/skills/multi/soke-ai-training/SKILL.md +247 -0
  114. package/skills/{soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md → multi/soke-ai-training/references/installation.md} +0 -3
  115. package/skills/multi/soke-ai-training/references/shared.md +185 -0
  116. package/skills/{soke-assign → multi/soke-assign}/README.md +3 -5
  117. package/skills/multi/soke-assign/SKILL.md +101 -0
  118. package/skills/{soke-course/SKILL.md → multi/soke-assign/references/dependencies/soke-course.md} +1 -1
  119. package/skills/multi/soke-assign/references/dependencies/soke-exam.md +600 -0
  120. package/skills/multi/soke-assign/references/installation.md +451 -0
  121. package/skills/multi/soke-assign/references/shared.md +185 -0
  122. package/skills/multi/soke-certificate/SKILL.md +715 -0
  123. package/skills/multi/soke-certificate/references/installation.md +451 -0
  124. package/skills/multi/soke-certificate/references/shared.md +185 -0
  125. package/skills/{soke-course → multi/soke-course}/README.md +5 -7
  126. package/skills/multi/soke-course/SKILL.md +399 -0
  127. package/skills/multi/soke-course/agents/openai.yaml +7 -0
  128. package/skills/multi/soke-course/examples/create-basic.md +70 -0
  129. package/skills/multi/soke-course/references/course-list-courses.md +216 -0
  130. package/skills/multi/soke-course/references/dependencies/soke-assign.md +103 -0
  131. package/skills/multi/soke-course/references/dependencies/soke-lesson.md +119 -0
  132. package/skills/multi/soke-course/references/dependencies/soke-material.md +105 -0
  133. package/skills/multi/soke-course/references/examples.md +480 -0
  134. package/skills/multi/soke-course/references/installation.md +451 -0
  135. package/skills/multi/soke-course/references/intent-cases.md +99 -0
  136. package/skills/multi/soke-course/references/shared.md +185 -0
  137. package/skills/multi/soke-course/references/sop-full-workflow.md +177 -0
  138. package/skills/multi/soke-course/references/sop-lesson-types.md +66 -0
  139. package/skills/multi/soke-course/references/sop-publish-check.md +76 -0
  140. package/skills/multi/soke-course/references/subs/ai/SOP.md +153 -0
  141. package/skills/multi/soke-course/references/subs/category/SOP.md +112 -0
  142. package/skills/multi/soke-course/references/subs/charge/SOP.md +107 -0
  143. package/skills/multi/soke-course/references/subs/copy/SOP.md +80 -0
  144. package/skills/multi/soke-course/references/subs/publish/SOP.md +168 -0
  145. package/skills/multi/soke-course/references/subs/query/SOP.md +165 -0
  146. package/skills/multi/soke-course/references/subs/settings/SOP.md +136 -0
  147. package/skills/multi/soke-course/references/subs/template/SOP.md +223 -0
  148. package/skills/multi/soke-course/references/troubleshoot.md +68 -0
  149. package/skills/multi/soke-course/scripts/check_readiness.py +87 -0
  150. package/skills/multi/soke-exam/SKILL.md +598 -0
  151. package/skills/multi/soke-exam/references/exam-get-exam-user.md +212 -0
  152. package/skills/multi/soke-exam/references/installation.md +451 -0
  153. package/skills/multi/soke-exam/references/shared.md +185 -0
  154. package/skills/multi/soke-exam-question-pool/SKILL.md +121 -0
  155. package/skills/multi/soke-exam-question-pool/references/installation.md +451 -0
  156. package/skills/multi/soke-exam-question-pool/references/shared.md +185 -0
  157. package/skills/multi/soke-learning-map/SKILL.md +553 -0
  158. package/skills/multi/soke-learning-map/references/dependencies/soke-assign.md +103 -0
  159. package/skills/{soke-task/SKILL.md → multi/soke-learning-map/references/dependencies/soke-task.md} +1 -1
  160. package/skills/multi/soke-learning-map/references/installation.md +451 -0
  161. package/skills/multi/soke-learning-map/references/shared.md +185 -0
  162. package/skills/multi/soke-learning-profile/SKILL.md +221 -0
  163. package/skills/multi/soke-learning-profile/references/installation.md +451 -0
  164. package/skills/multi/soke-learning-profile/references/shared.md +185 -0
  165. package/skills/multi/soke-lesson/SKILL.md +117 -0
  166. package/skills/multi/soke-lesson/references/installation.md +451 -0
  167. package/skills/multi/soke-lesson/references/shared.md +185 -0
  168. package/skills/multi/soke-material/SKILL.md +103 -0
  169. package/skills/multi/soke-material/references/installation.md +451 -0
  170. package/skills/multi/soke-material/references/shared.md +185 -0
  171. package/skills/multi/soke-photo-gallery/SKILL.md +284 -0
  172. package/skills/multi/soke-photo-gallery/references/installation.md +451 -0
  173. package/skills/multi/soke-photo-gallery/references/shared.md +185 -0
  174. package/skills/multi/soke-shared/SKILL.md +183 -0
  175. package/skills/multi/soke-supervisor/SKILL.md +184 -0
  176. package/skills/multi/soke-supervisor/references/installation.md +451 -0
  177. package/skills/multi/soke-supervisor/references/shared.md +185 -0
  178. package/skills/multi/soke-task/SKILL.md +144 -0
  179. package/skills/multi/soke-task/references/installation.md +451 -0
  180. package/skills/multi/soke-task/references/shared.md +185 -0
  181. package/skills/multi/soke-training-demand/SKILL.md +219 -0
  182. package/skills/multi/soke-training-demand/references/installation.md +451 -0
  183. package/skills/multi/soke-training-demand/references/shared.md +185 -0
  184. package/skills/soke-ai-coach-director/scripts/activator.sh +0 -4
  185. package/skills/soke-ai-coach-director/scripts/error-detector.sh +0 -4
  186. package/skills/soke-ai-coach-director/scripts/extract-skill.sh +0 -7
  187. package/skills/soke-course/scripts/check_readiness.sh +0 -82
  188. /package/skills/{soke-ai-coach-director → mono}/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
  189. /package/skills/{soke-ai-coach-director → mono}/references/cases/AI/351/231/252/347/273/203Bad Case/346/240/267/346/234/254/345/272/223.md" +0 -0
  190. /package/skills/{soke-ai-coach-director → mono}/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
  191. /package/skills/{soke-ai-coach-director → mono}/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
  192. /package/skills/{soke-ai-coach-director → mono}/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
  193. /package/skills/{soke-ai-coach-director → mono}/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
  194. /package/skills/{soke-ai-coach-director → mono}/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
  195. /package/skills/{soke-ai-coach-director → mono}/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
  196. /package/skills/{soke-ai-coach-director → mono}/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
  197. /package/skills/{soke-ai-coach-director → mono}/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
  198. /package/skills/{soke-ai-coach-director → mono}/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
  199. /package/skills/{soke-ai-coach-director → mono}/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
  200. /package/skills/{soke-ai-coach-director → mono}/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
  201. /package/skills/{soke-ai-coach-director → mono}/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
  202. /package/skills/{soke-ai-coach-director → mono}/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
  203. /package/skills/{soke-ai-coach-director → mono}/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
  204. /package/skills/{soke-ai-coach-director → mono}/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
  205. /package/skills/{soke-ai-coach-director → mono}/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
  206. /package/skills/{soke-ai-coach-director → mono}/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
  207. /package/skills/{soke-ai-coach-director → mono}/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
  208. /package/skills/{soke-ai-coach-director → mono}/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
  209. /package/skills/{soke-ai-coach-director → mono}/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
  210. /package/skills/{soke-ai-coach-director → mono}/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
  211. /package/skills/{soke-ai-coach-director → mono}/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
  212. /package/skills/{soke-ai-coach-director → mono}/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
  213. /package/skills/{soke-ai-coach-director → mono}/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
  214. /package/skills/{soke-ai-coach-director → mono}/references/cases//345/233/233/345/244/247/345/234/272/346/231/257_GoodCase_BadCase_20260701.md" +0 -0
  215. /package/skills/{soke-ai-coach-director → mono}/references/cases//346/241/210/344/276/213/345/272/223/350/241/245/345/205/205_2026-06-24.md" +0 -0
  216. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/CHANGELOG.md +0 -0
  217. /package/skills/{soke-ai-coach-director/SKILL.md → mono/references/modules/soke-ai-coach-director/MODULE.md} +0 -0
  218. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/assets/ERRORS-TEMPLATE.md +0 -0
  219. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/assets/FEATURE_REQUESTS-TEMPLATE.md +0 -0
  220. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/assets/LEARNINGS-TEMPLATE.md +0 -0
  221. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/assets/SKILL-TEMPLATE.md +0 -0
  222. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/knowledge-packager/knowledge-packager.md +0 -0
  223. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/parts/part1-basic.md +0 -0
  224. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/parts/part2-roles.md +0 -0
  225. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/parts/part3-flow.md +0 -0
  226. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/parts/part4-scoring.md +0 -0
  227. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/parts/part5-constraints.md +0 -0
  228. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-engineer/prompt-engineer.md +0 -0
  229. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/prompt-optimizer/prompt-optimizer.md +0 -0
  230. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/coaching/role-profiler/role-profiler.md +0 -0
  231. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/adapters/README.md +0 -0
  232. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/adapters/qclaw.md +0 -0
  233. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/adapters/workbuddy.md +0 -0
  234. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/adapters/wukong.md +0 -0
  235. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/adapters/zework.md +0 -0
  236. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/api-fallback.md +0 -0
  237. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/interaction.md +0 -0
  238. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/publish-gate.md +0 -0
  239. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/resource-finalizer.md +0 -0
  240. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/platform/sync-engine.md +0 -0
  241. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/change-log-partwise-refactor.md +0 -0
  242. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/env-check.md +0 -0
  243. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-common.md +0 -0
  244. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-handbook.md +0 -0
  245. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-part1.md +0 -0
  246. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-part2.md +0 -0
  247. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-part3.md +0 -0
  248. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/exec-part4.md +0 -0
  249. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/gate-check-matrix.md +0 -0
  250. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/micro-tune-labels.md +0 -0
  251. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/platform-api-pitfalls.md +0 -0
  252. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/role-resource-matching.md +0 -0
  253. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/self-improvement-examples.md +0 -0
  254. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/part1/SOP.md +0 -0
  255. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/part2/SOP.md +0 -0
  256. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/part3/SOP.md +0 -0
  257. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/part4/SOP.md +0 -0
  258. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/publish/SOP.md +0 -0
  259. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/subs/tune/SOP.md +0 -0
  260. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/references/verified-cli-cheatsheet.md +0 -0
  261. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/scripts/gate_check.py +0 -0
  262. /package/skills/{soke-ai-coach-director → mono/references/modules/soke-ai-coach-director}/scripts/validate_operations.py +0 -0
  263. /package/skills/{soke-assign/SKILL.md → mono/references/modules/soke-assign/MODULE.md} +0 -0
  264. /package/skills/{soke-course → mono/references/modules/soke-course}/agents/openai.yaml +0 -0
  265. /package/skills/{soke-course → mono/references/modules/soke-course}/examples/create-basic.md +0 -0
  266. /package/skills/{soke-course → mono/references/modules/soke-course}/references/course-list-courses.md +0 -0
  267. /package/skills/{soke-course → mono/references/modules/soke-course}/references/intent-cases.md +0 -0
  268. /package/skills/{soke-course → mono/references/modules/soke-course}/references/sop-full-workflow.md +0 -0
  269. /package/skills/{soke-course → mono/references/modules/soke-course}/references/sop-lesson-types.md +0 -0
  270. /package/skills/{soke-course → mono/references/modules/soke-course}/references/sop-publish-check.md +0 -0
  271. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/ai/SOP.md +0 -0
  272. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/category/SOP.md +0 -0
  273. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/charge/SOP.md +0 -0
  274. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/copy/SOP.md +0 -0
  275. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/publish/SOP.md +0 -0
  276. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/query/SOP.md +0 -0
  277. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/settings/SOP.md +0 -0
  278. /package/skills/{soke-course → mono/references/modules/soke-course}/references/subs/template/SOP.md +0 -0
  279. /package/skills/{soke-course → mono/references/modules/soke-course}/references/troubleshoot.md +0 -0
  280. /package/skills/{soke-exam → mono/references/modules/soke-exam}/references/exam-get-exam-user.md +0 -0
  281. /package/skills/{soke-exam-question-pool/SKILL.md → mono/references/modules/soke-exam-question-pool/MODULE.md} +0 -0
  282. /package/skills/{soke-lesson/SKILL.md → mono/references/modules/soke-lesson/MODULE.md} +0 -0
  283. /package/skills/{soke-material/SKILL.md → mono/references/modules/soke-material/MODULE.md} +0 -0
  284. /package/skills/{soke-shared/SKILL.md → mono/references/modules/soke-shared/MODULE.md} +0 -0
  285. /package/skills/{soke-ai-coach-director → multi/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
  286. /package/skills/{soke-ai-coach-director → multi/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
  287. /package/skills/{soke-lesson → multi/soke-lesson}/README.md +0 -0
  288. /package/skills/{soke-material → multi/soke-material}/README.md +0 -0
@@ -0,0 +1,403 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ soke-ai-coach-director · 执行手册验证器
4
+ Usage:
5
+ python3 scripts/validate_operations.py <part> <operations.json>
6
+ python3 scripts/validate_operations.py part1 ./part1-create.json
7
+ python3 scripts/validate_operations.py part2 ./part2-operations.json
8
+ python3 scripts/validate_operations.py part3 ./part3-operations.json
9
+ python3 scripts/validate_operations.py part4 ./part4-operations.json
10
+ python3 scripts/validate_operations.py part5 ./part5-operations.json
11
+
12
+ 退出码:
13
+ 0 = 全部通过
14
+ 1 = 有错误(详情打印到 stderr)
15
+ """
16
+
17
+ import json
18
+ import sys
19
+ import os
20
+ from typing import Any
21
+
22
+
23
+ # ---------- Part1: step1-create.json / part1-create.json ----------
24
+
25
+ def validate_part1(data: dict) -> list[str]:
26
+ """Part1 不是 operations 数组,而是单个 JSON 对象。"""
27
+ errors = []
28
+
29
+ # name
30
+ name = data.get("name")
31
+ if not isinstance(name, str) or not (1 <= len(name) <= 100):
32
+ errors.append(f"name: 必须是 1-100 字符的字符串,当前 type={type(name).__name__} value={name!r}")
33
+
34
+ # description
35
+ desc = data.get("description")
36
+ if not isinstance(desc, str) or len(desc) < 20:
37
+ errors.append(f"description: 必须是 ≥20 字符的字符串,当前 len={len(desc) if isinstance(desc, str) else 0}")
38
+
39
+ # tags
40
+ tags = data.get("tags")
41
+ if not isinstance(tags, list):
42
+ errors.append(f"tags: 必须是数组,当前 type={type(tags).__name__}")
43
+ elif not (3 <= len(tags) <= 5):
44
+ errors.append(f"tags: 必须是 3-5 个元素,当前 {len(tags)}")
45
+ elif not all(isinstance(t, str) and t for t in tags):
46
+ errors.append("tags: 所有元素必须是非空字符串")
47
+
48
+ # key_points: 必须是字符串(最高频错误)
49
+ kp = data.get("key_points")
50
+ if not isinstance(kp, str) or not kp:
51
+ errors.append(f"key_points: 必须是非空字符串(不能是数组),当前 type={type(kp).__name__}")
52
+ # 回查: 如果是数组,提示
53
+ if isinstance(kp, list):
54
+ errors.append("key_points: ❌ 被写成数组,平台会接受但字段为空。改为分号拼接的单字符串")
55
+
56
+ # scene_lang
57
+ if data.get("scene_lang") != "简体中文":
58
+ errors.append(f"scene_lang: 必须固定为 '简体中文',当前 {data.get('scene_lang')!r}")
59
+
60
+ # scenario_cover 或 cover_url(CLI 接受两者)
61
+ cover = data.get("scenario_cover") or data.get("cover_url")
62
+ if cover != "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png":
63
+ errors.append(f"scenario_cover/cover_url: 必须使用固定默认图 URL,当前 {cover!r}")
64
+
65
+ return errors
66
+
67
+
68
+ # ---------- Part2: operations 数组(update_basic + replace_ai_roles) ----------
69
+
70
+ def validate_part2(operations: list) -> list[str]:
71
+ errors = []
72
+
73
+ # 操作 1: update_basic (OS)
74
+ os_ops = [o for o in operations if o.get("type") == "update_basic"]
75
+ if not os_ops:
76
+ errors.append("❌ 缺操作 1: update_basic(OS 整体设定)—— 会导致平台无 OS,角色行为退化")
77
+ else:
78
+ for op in os_ops:
79
+ os_text = op.get("data", {}).get("ai_roles_overall_description")
80
+ if not isinstance(os_text, str):
81
+ errors.append(f"ai_roles_overall_description: 必须是字符串,当前 type={type(os_text).__name__}")
82
+ elif len(os_text) < 500:
83
+ errors.append(f"ai_roles_overall_description: 必须 ≥500 字符(当前 {len(os_text)}),A1-A7 全文不摘要")
84
+
85
+ # 操作 2: replace_ai_roles
86
+ role_ops = [o for o in operations if o.get("type") == "replace_ai_roles"]
87
+ if not role_ops:
88
+ errors.append("❌ 缺操作 2: replace_ai_roles(角色数据)—— 会导致平台有 OS 无角色")
89
+ else:
90
+ for ri, op in enumerate(role_ops):
91
+ # v2.26: 检测 ai_roles_overall_description 是否被错误放入 replace_ai_roles.data
92
+ wrong_os = op.get("data", {}).get("ai_roles_overall_description")
93
+ if wrong_os is not None:
94
+ errors.append(
95
+ "❌ ai_roles_overall_description 被错误放入 replace_ai_roles.data!"
96
+ "必须移到 update_basic.data 中,否则平台静默丢弃、API 不报错。"
97
+ )
98
+ roles = op.get("data", {}).get("roles")
99
+ if not isinstance(roles, list) or not roles:
100
+ errors.append(f"replace_ai_roles.data.roles: 必须是非空数组")
101
+ continue
102
+ for i, r in enumerate(roles):
103
+ # 外壳字段必须在 role_data 外层(source_type 允许同时存在于两处)
104
+ for shell_field in ["customization_level", "is_custom_role", "customized_fields"]:
105
+ if shell_field not in r:
106
+ errors.append(f"roles[{i}]: 缺外壳字段 {shell_field}(必须在 role_data 外层)")
107
+ # source_type 是特殊情况:顶层必须有,role_data 里可以有也可以没有
108
+ if "source_type" not in r:
109
+ errors.append(f"roles[{i}]: 缺外壳字段 source_type(必须在 role_data 外层)")
110
+
111
+ rd = r.get("role_data", {})
112
+ for k in ["name", "description", "communication_style", "background",
113
+ "personality_type", "personality", "avatar", "voice_id"]:
114
+ if not rd.get(k):
115
+ errors.append(f"roles[{i}].role_data.{k}: 空/缺失")
116
+
117
+ # knowledge_level 必须是数组
118
+ kl = rd.get("knowledge_level")
119
+ if not isinstance(kl, list):
120
+ errors.append(f"roles[{i}].role_data.knowledge_level: 必须是数组(如 ['小白']),当前 type={type(kl).__name__}")
121
+
122
+ # tags 必须是数组 2-4 个
123
+ tags = rd.get("tags")
124
+ if not isinstance(tags, list) or not (2 <= len(tags) <= 4):
125
+ errors.append(f"roles[{i}].role_data.tags: 必须是 2-4 个元素的数组,当前 {tags!r}")
126
+
127
+ # avatar URL 必须在平台头像库中(v2.24.2 新增)
128
+ avatar_url = rd.get("avatar", "")
129
+ if avatar_url and "/public/ai/avatar/" in avatar_url:
130
+ errors.append(f"roles[{i}].role_data.avatar: ❌ URL 路径错误!正确路径是 `/public/ai/roles_avatars/` 不是 `/public/ai/avatar/`(长龙航空事故)")
131
+ elif avatar_url and "/public/ai/roles_avatars/" not in avatar_url and "/public/ai/cover/" not in avatar_url:
132
+ print(f"⚠️ roles[{i}].role_data.avatar: URL 不在平台头像库路径下(/public/ai/roles_avatars/ 或 /public/ai/cover/)", file=sys.stderr)
133
+ to = rd.get("taboos_objections")
134
+ # taboos_objections 必须是数组
135
+ to = rd.get("taboos_objections")
136
+ if not isinstance(to, list):
137
+ errors.append(f"roles[{i}].role_data.taboos_objections: 必须是数组")
138
+
139
+ # background 四段完整性检查(中英文任一全套即通过)
140
+ bg = rd.get("background", "") or ""
141
+ cn_segs = ["我是谁", "我的困扰", "我的过往经历", "我今天的心态"]
142
+ en_segs = ["Who I am", "My concern", "My past experience", "My mindset today"]
143
+ cn_missing = [s for s in cn_segs if s not in bg]
144
+ en_missing = [s for s in en_segs if s not in bg]
145
+ if cn_missing and en_missing:
146
+ for s in cn_missing:
147
+ errors.append(f"roles[{i}].role_data.background: 缺四段画像段落 '{s}'")
148
+
149
+ return errors
150
+
151
+
152
+ # ---------- Part3: operations 数组(update_basic + add_conversation_step) ----------
153
+
154
+ def validate_part3(operations: list) -> list[str]:
155
+ errors = []
156
+
157
+ # 开场语
158
+ open_ops = [o for o in operations if o.get("type") == "update_basic"]
159
+ if not open_ops:
160
+ errors.append("缺 update_basic 操作(开场语)")
161
+ else:
162
+ d = open_ops[0].get("data", {})
163
+ od = d.get("opening_dialogue")
164
+ if not isinstance(od, str) or len(od) < 20:
165
+ errors.append(f"opening_dialogue: 必须 ≥20 字符,当前 len={len(od) if isinstance(od, str) else 0}")
166
+ odt = d.get("opening_dialogue_type")
167
+ if odt != 1:
168
+ errors.append(f"opening_dialogue_type: 必须是数字 1(不是字符串),当前 {odt!r}")
169
+
170
+ # 对话环节
171
+ steps = [o for o in operations if o.get("type") == "add_conversation_step"]
172
+ if not (3 <= len(steps) <= 7):
173
+ errors.append(f"对话环节数: 必须 3-7 个,当前 {len(steps)}")
174
+
175
+ for i, s in enumerate(steps):
176
+ d = s.get("data", {})
177
+ # sort_order 平台自动生成(创建时不传,更新时才传)- 不强制
178
+ for k in ["step_name", "student_objective", "ai_task", "max_rounds"]:
179
+ if d.get(k) in (None, "", []):
180
+ errors.append(f"step[{i}].data.{k}: 空/缺失")
181
+
182
+ # sort_order 如果传了,必须是字符串(平台创建时不传也可以)
183
+ so = d.get("sort_order")
184
+ if so is not None and not isinstance(so, str):
185
+ errors.append(f"step[{i}].sort_order: 必须是字符串(如 '1'),当前 type={type(so).__name__}")
186
+
187
+ # max_rounds 必须是整数 3-10
188
+ mr = d.get("max_rounds")
189
+ if not isinstance(mr, int) or not (3 <= mr <= 10):
190
+ errors.append(f"step[{i}].max_rounds: 必须是 3-10 的整数,当前 {mr!r}")
191
+
192
+ # ai_task 应含条件逻辑(中英文任一)和退出条件
193
+ at = d.get("ai_task", "") or ""
194
+ has_if_logic = any(kw in at for kw in ["IF", "如果", "进入条件", "行为分支"]) or "条件" in at
195
+ has_exit = any(kw in at for kw in ["退出", "结束", "退出条件"])
196
+ if not has_if_logic:
197
+ errors.append(f"step[{i}].ai_task: 缺条件逻辑(IF/进入条件/行为分支/如果)")
198
+ if not has_exit:
199
+ errors.append(f"step[{i}].ai_task: 缺退出条件")
200
+
201
+ # 原子性检查:开场语 + 环节应在同一批 operations
202
+ if open_ops and steps:
203
+ # 这里只能检查是否在同一数组,不能检查是否同一次 apply(由 SKILL.md 约束)
204
+ pass
205
+
206
+ return errors
207
+
208
+
209
+ # ---------- Part4: operations 数组(replace_scoring_criteria_config 双层包装) ----------
210
+
211
+ def validate_part4(operations: list) -> list[str]:
212
+ errors = []
213
+
214
+ p4_ops = [o for o in operations if o.get("type") == "replace_scoring_criteria_config"]
215
+ if not p4_ops:
216
+ errors.append("缺 replace_scoring_criteria_config 操作")
217
+ return errors
218
+
219
+ for ri, op in enumerate(p4_ops):
220
+ config = op.get("data", {}).get("config")
221
+ if not isinstance(config, dict):
222
+ errors.append(f"op[{ri}].data.config: 必须是对象")
223
+ continue
224
+
225
+ # v2.26 硬阻断: shell 字段必须在 config 顶层,不在 criteria_data 内
226
+ cd = config.get("criteria_data") or {}
227
+ SHELL_FIELDS = ["scenario_criteria_id", "customization_level", "is_custom_criteria", "customized_fields"]
228
+ for k in SHELL_FIELDS:
229
+ if k not in config:
230
+ errors.append(f"❌ op[{ri}].data.config.{k}: 缺失(v2.26 硬阻断:shell 字段必须在 config 顶层,否则 UI 不显示评分标准)")
231
+ if k in cd:
232
+ errors.append(
233
+ f"❌ op[{ri}]: shell 字段 {k} 被错误放入 criteria_data 内层!"
234
+ f"必须移到 data.config 顶层。错放会导致 UI 显示「请选择或创建评分标准」空状态,API 不报错。"
235
+ )
236
+
237
+ # 第 2 层 criteria_data 包装(必须存在)
238
+ if not isinstance(cd, dict) or not cd:
239
+ errors.append(f"op[{ri}].data.config.criteria_data: ❌ 缺第 2 层 criteria_data 包装(平台会接受但存储错误)")
240
+ continue
241
+
242
+ # 必填字段(实际影响平台存储和 UI 展示)
243
+ # name/description/dimensions 是 API 硬必填
244
+ for k in ["name", "description", "dimensions"]:
245
+ if cd.get(k) in (None, "", []):
246
+ errors.append(f"op[{ri}].data.config.criteria_data.{k}: 空/缺失(必填)")
247
+ # v2.26: criteria_data 内业务字段硬阻断
248
+ if cd.get("total_weight") not in (100, None):
249
+ errors.append(f"op[{ri}].criteria_data.total_weight: 必须 100,当前 {cd.get('total_weight')!r}")
250
+ for k in ["tags", "source_type", "status"]:
251
+ if k not in cd:
252
+ errors.append(f"op[{ri}].criteria_data.{k}: ❌ 缺失(v2.26 硬阻断)")
253
+ elif k == "tags" and (not isinstance(cd.get(k), list) or len(cd.get(k)) == 0):
254
+ errors.append(f"op[{ri}].criteria_data.tags: 必须是非空数组")
255
+ elif k == "source_type" and cd.get(k) not in ("enterprise", "custom"):
256
+ errors.append(f"op[{ri}].criteria_data.source_type: 必须 'enterprise',当前 {cd.get(k)!r}")
257
+ elif k == "status" and cd.get(k) != 1:
258
+ errors.append(f"op[{ri}].criteria_data.status: 必须 1,当前 {cd.get(k)!r}")
259
+
260
+ if cd.get("source_type") not in ("enterprise", "custom"):
261
+ errors.append(f"op[{ri}].criteria_data.source_type: 应为 'enterprise' 或 'custom',当前 {cd.get('source_type')!r}")
262
+
263
+ # total_weight 是警告不是错误(中文版不加也成功)
264
+ if "total_weight" in cd and cd.get("total_weight") != 100:
265
+ print(f"⚠️ op[{ri}].criteria_data.total_weight: 建议 100,当前 {cd.get('total_weight')!r}", file=sys.stderr)
266
+
267
+ dims = cd.get("dimensions", [])
268
+ if not isinstance(dims, list) or len(dims) < 2:
269
+ errors.append(f"op[{ri}].criteria_data.dimensions: 必须 ≥2 个维度")
270
+ else:
271
+ weight_sum = sum(d.get("weight", 0) for d in dims)
272
+ if weight_sum != 100:
273
+ errors.append(f"op[{ri}].dimensions weight sum: 必须 100,当前 {weight_sum}")
274
+
275
+ for i, d in enumerate(dims):
276
+ # 硬必填(API + UI)
277
+ for k in ["id", "code", "name", "weight", "scoring_rule", "criteria", "sort_order"]:
278
+ if d.get(k) in (None, "", []):
279
+ errors.append(f"op[{ri}].dimensions[{i}].{k}: 空/缺失(必填)")
280
+ # description 建议字段
281
+ if "description" not in d or d.get("description") in (None, "", []):
282
+ print(f"⚠️ op[{ri}].dimensions[{i}].description: 建议字段", file=sys.stderr)
283
+
284
+ # sort_order 必须是数字
285
+ so = d.get("sort_order")
286
+ if not isinstance(so, int):
287
+ errors.append(f"op[{ri}].dimensions[{i}].sort_order: 必须是数字(不是字符串),当前 type={type(so).__name__}")
288
+
289
+ # criteria 至少 2 个
290
+ crit = d.get("criteria", [])
291
+ if not isinstance(crit, list) or len(crit) < 2:
292
+ errors.append(f"op[{ri}].dimensions[{i}].criteria: 至少 2 个评分点")
293
+
294
+ # code 必须是英文
295
+ code = d.get("code", "")
296
+ if code and not code.isascii():
297
+ errors.append(f"op[{ri}].dimensions[{i}].code: 必须是英文,当前 {code!r}")
298
+
299
+ return errors
300
+
301
+
302
+ # ---------- Part5: operations 数组(update_basic 6 项固定配置) ----------
303
+
304
+ def validate_part5(operations: list) -> list[str]:
305
+ errors = []
306
+
307
+ ops = [o for o in operations if o.get("type") == "update_basic"]
308
+ if not ops:
309
+ errors.append("缺 update_basic 操作")
310
+ return errors
311
+
312
+ d = ops[0].get("data", {})
313
+ # Part5 固定配置(以平台实际接受值为准)
314
+ # min/max_practice_duration 平台允许 0 或正整数(0=不限)
315
+ # max_practice_attempts=10, passing_score=60, completion_rule=all_steps 是平台默认值
316
+ checks = {
317
+ "max_practice_attempts": (lambda v: isinstance(v, int) and v > 0, "正整数"),
318
+ "passing_score": (lambda v: isinstance(v, int) and 0 < v <= 100, "1-100 整数"),
319
+ "completion_rule": (lambda v: v == "all_steps", "'all_steps'"),
320
+ "pass_difficulty": (lambda v: isinstance(v, int) and 1 <= v <= 3, "1-3 整数"),
321
+ }
322
+ for k, (check, hint) in checks.items():
323
+ actual = d.get(k)
324
+ if actual is None:
325
+ errors.append(f"{k}: 缺失(Part5 必填)")
326
+ elif not check(actual):
327
+ errors.append(f"{k}: 必须为 {hint},当前 {actual!r}")
328
+ # ai_assistance_enabled 应为 True
329
+ if d.get("ai_assistance_enabled") is not True:
330
+ errors.append(f"ai_assistance_enabled: 必须为 True,当前 {d.get('ai_assistance_enabled')!r}")
331
+ # 禁止字段(已在 Part1/Part3 同步过)
332
+ for forbidden in ["opening_dialogue", "opening_dialogue_type", "key_points", "name", "description", "tags", "scenario_cover"]:
333
+ if forbidden in d:
334
+ errors.append(f"{forbidden}: ❌ Part5 不应同步此字段(已在 Part1 同步)")
335
+
336
+ return errors
337
+
338
+
339
+ # ---------- 入口 ----------
340
+
341
+ def load_json(path: str) -> Any:
342
+ with open(path, "r", encoding="utf-8") as f:
343
+ return json.load(f)
344
+
345
+
346
+ def main() -> int:
347
+ if len(sys.argv) != 3:
348
+ print(__doc__, file=sys.stderr)
349
+ return 2
350
+
351
+ part = sys.argv[1].lower().strip()
352
+ path = sys.argv[2]
353
+
354
+ if not os.path.isfile(path):
355
+ print(f"❌ 文件不存在: {path}", file=sys.stderr)
356
+ return 2
357
+
358
+ try:
359
+ data = load_json(path)
360
+ except json.JSONDecodeError as e:
361
+ print(f"❌ JSON 解析失败: {e}", file=sys.stderr)
362
+ return 2
363
+
364
+ validators = {
365
+ "part1": (validate_part1, "dict"),
366
+ "part2": (validate_part2, "list"),
367
+ "part3": (validate_part3, "list"),
368
+ "part4": (validate_part4, "list"),
369
+ "part5": (validate_part5, "list"),
370
+ }
371
+
372
+ if part not in validators:
373
+ print(f"❌ 未知 part: {part},支持: {list(validators.keys())}", file=sys.stderr)
374
+ return 2
375
+
376
+ func, expected_type = validators[part]
377
+ if expected_type == "dict" and not isinstance(data, dict):
378
+ print(f"❌ {part} 期望 JSON 对象,实际 {type(data).__name__}", file=sys.stderr)
379
+ return 1
380
+ # 支持两种格式:
381
+ # 1. 纯 operations 数组 [...]
382
+ # 2. CLI request-file 对象 {operations: [...], idempotency_key, ...}
383
+ if expected_type == "list":
384
+ if isinstance(data, dict) and "operations" in data:
385
+ data = data["operations"]
386
+ if not isinstance(data, list):
387
+ print(f"❌ {part} 期望 JSON 数组或 {{operations:[...]}} 对象,实际 {type(data).__name__}", file=sys.stderr)
388
+ return 1
389
+
390
+ errors = func(data)
391
+
392
+ if not errors:
393
+ print(f"✅ {part} 验证通过({len(errors)} 个错误)")
394
+ return 0
395
+ else:
396
+ print(f"❌ {part} 验证失败({len(errors)} 个错误):", file=sys.stderr)
397
+ for e in errors:
398
+ print(f" - {e}", file=sys.stderr)
399
+ return 1
400
+
401
+
402
+ if __name__ == "__main__":
403
+ sys.exit(main())
@@ -0,0 +1,247 @@
1
+ ---
2
+ name: soke-ai-training
3
+ description: "用于本地Agent通过soke-cli调用开放平台AI教练接口,完成Markdown source上传、结构化entries同步、source管理、场景知识包版本绑定、知识计划编译查询、场景详情读取、系统角色资源查询和场景CLI安全更新。"
4
+ metadata:
5
+ requires:
6
+ bins: ["soke-cli"]
7
+ cliHelp: "soke-cli ai-training --help"
8
+ ---
9
+
10
+ # AI教练知识包与场景管理
11
+
12
+ **CRITICAL — 开始前 MUST 先读取 [`./references/shared.md`](./references/shared.md),其中包含认证、配置和权限处理。**
13
+
14
+ ## 使用前提
15
+
16
+ 1. 运行 `soke-cli auth login` 完成用户授权。
17
+ 2. 确认 `soke-cli config show` 中有 `APIBaseURL`、`AppKey`、`AppSecret`、`CorpID` 和用户 token。
18
+ 3. 客户原始 PDF、Word、Excel、网页等资料必须先由本地 Agent/Skills 提炼为 Markdown sources 和结构化 entries JSON。
19
+
20
+ ## 推荐同步
21
+
22
+ ```bash
23
+ soke-cli ai-training +sync \
24
+ --manifest ./knowledge-package.json \
25
+ --idempotency-key cli-rcb-loan-products-20260610-001
26
+ ```
27
+
28
+ `+sync` 会完成:
29
+
30
+ 1. 读取 manifest 和 entries。
31
+ 2. 校验 Markdown 文件、source_refs、entry_id/source_id 唯一性。
32
+ 3. 调用 `/skills/ai-training/knowledge-packages/upload-tokens`。
33
+ 4. 直传 Markdown 到服务端返回的 `upload_url`。
34
+ 5. 调用 `/skills/ai-training/knowledge-packages/sync`。
35
+ 6. 写入 `.mentorai-sync-state.json`。
36
+
37
+ ## Manifest 示例
38
+
39
+ ```json
40
+ {
41
+ "package": {
42
+ "package_id": "rcb-loan-products",
43
+ "name": "农商银行贷款产品知识包",
44
+ "domain": "banking_loan",
45
+ "tags": ["贷款产品"]
46
+ },
47
+ "sources": [
48
+ {
49
+ "source_id": "src_manual",
50
+ "path": "./sources/manual.md",
51
+ "display_name": "贷款产品手册",
52
+ "origin_type": "pdf",
53
+ "origin_filename": "贷款产品手册.pdf"
54
+ }
55
+ ],
56
+ "entries_path": "./knowledge-package.entries.json"
57
+ }
58
+ ```
59
+
60
+ ## 查询和管理
61
+
62
+ ```bash
63
+ soke-cli ai-training +list-packages --format json
64
+ soke-cli ai-training +list-versions --package-id rcb-loan-products
65
+ soke-cli ai-training +list-sources --package-id rcb-loan-products
66
+ soke-cli ai-training +rename-source --package-id rcb-loan-products --source-id src_manual --display-name "贷款产品手册2026Q2"
67
+ soke-cli ai-training +delete-source --package-id rcb-loan-products --source-id src_manual
68
+ ```
69
+
70
+ ## 场景绑定
71
+
72
+ ```bash
73
+ soke-cli ai-training +bind-scenario \
74
+ --scenario-id scenario_micro_loan_sales \
75
+ --version-ids 8ed4c1c4-5b3c-4d44-ae8e-d5b064bf1e12 \
76
+ --compile-plan
77
+
78
+ soke-cli ai-training +compile-plan \
79
+ --scenario-id scenario_micro_loan_sales \
80
+ --version-ids 8ed4c1c4-5b3c-4d44-ae8e-d5b064bf1e12 \
81
+ --force
82
+
83
+ soke-cli ai-training +get-plan --scenario-id scenario_micro_loan_sales --format json
84
+ ```
85
+
86
+ ## 场景读取与更新
87
+
88
+ 场景配置更新必须先读取当前场景,再基于 `updated_at` 构造 `base_updated_at`。只修改描述、角色、评分或流程时,使用 `+preview-scenario-update` 和 `+apply-scenario-update`;发布场景时才使用 `+publish-scenario`。
89
+
90
+ ### 创建场景
91
+
92
+ 如果封面图由本地智能体生成,先上传封面并拿到可写入 `scenario_cover` 的 CDN URL:
93
+
94
+ ```bash
95
+ soke-cli ai-training +upload-scenario-cover \
96
+ --file ./cover.png
97
+ ```
98
+
99
+ 默认只输出 CDN URL。需要排障时可加 `--raw` 查看完整上传凭证响应;不要把 `upload_url`、OSS 签名字段、access key 或 security token 写入仓库、状态文件或对话记录。SaaS 与 MentorAI 共用 OSS/CDN,封面上传复用开放平台的 SaaS OSS 签名能力,不需要 MentorAI 端单独上传接口。
100
+
101
+ 最小参数创建:
102
+
103
+ ```bash
104
+ soke-cli ai-training +upload-scenario-cover --file ./cover.png > cover-url.txt
105
+
106
+ soke-cli ai-training +create-scenario \
107
+ --name "创建测试" \
108
+ --description "描述" \
109
+ --tags "" \
110
+ --key-points "关键点" \
111
+ --scene-lang zh \
112
+ --scenario-cover "$(cat cover-url.txt)" \
113
+ --pretty
114
+ ```
115
+
116
+ 复杂角色、评分规则、流程步骤和时间设置使用完整 JSON:
117
+
118
+ ```bash
119
+ soke-cli ai-training +create-scenario \
120
+ --request-file scenario-create.json \
121
+ --pretty
122
+ ```
123
+
124
+ 创建命令默认输出 MentorAI `BaseResponse.data`,通常可从返回对象中读取新场景 ID。创建请求中的 `corp_id`、`company_id`、`user_id`、`implementation_corp_id` 不作为授权依据,企业和用户上下文由开放平台认证注入。
125
+
126
+ ### 读取和资源选择
127
+
128
+ ```bash
129
+ soke-cli ai-training +list-scenarios \
130
+ --page 1 \
131
+ --page-size 20 \
132
+ --keyword "销售" \
133
+ --pretty
134
+
135
+ soke-cli ai-training +get-scenario \
136
+ --scenario-id scenario_micro_loan_sales \
137
+ --pretty \
138
+ --output scenario.json
139
+
140
+ soke-cli ai-training +list-role-avatars \
141
+ --lang zh \
142
+ --show-detail \
143
+ --pretty
144
+
145
+ soke-cli ai-training +list-role-voices \
146
+ --lang zh \
147
+ --gender female \
148
+ --pretty
149
+ ```
150
+
151
+ `+list-scenarios` 默认输出 MentorAI `BaseResponse.data`,用于发现可操作场景 ID。列表 query 不要伪造 `corp_id`、`company_id`、`user_id` 或 `implementation_corp_id`;可见范围由开放平台 token、用户登录态和 MentorAI 权限决定。拿到场景 ID 后,优先执行 `+get-scenario` 保存完整基准 JSON。
152
+
153
+ 头像更新写入 `ai_roles[].role_data.avatar` 时使用头像资源的 `url`,不是资源 `id`。声音更新写入 `ai_roles[].role_data.voice_id` 时使用声音资源的 `id`,不是 `sample_url`。
154
+
155
+ ### 预览和应用
156
+
157
+ 完整请求文件示例:
158
+
159
+ ```json
160
+ {
161
+ "base_updated_at": "2026-07-08T10:20:00+08:00",
162
+ "idempotency_key": "cli-scenario-update-001",
163
+ "reason": "优化客户角色开场和声音",
164
+ "source": "cli",
165
+ "operations": [
166
+ {
167
+ "type": "patch_ai_role",
168
+ "data": {
169
+ "scenario_role_id": "role_customer_owner",
170
+ "patch": {
171
+ "role_data": {
172
+ "voice_id": "zh_female_warm_01"
173
+ },
174
+ "customized_fields": ["voice_id"]
175
+ }
176
+ }
177
+ }
178
+ ]
179
+ }
180
+ ```
181
+
182
+ ```bash
183
+ soke-cli ai-training +preview-scenario-update \
184
+ --scenario-id scenario_micro_loan_sales \
185
+ --request-file update.json \
186
+ --pretty
187
+
188
+ soke-cli ai-training +apply-scenario-update \
189
+ --scenario-id scenario_micro_loan_sales \
190
+ --request-file update.json \
191
+ --pretty
192
+ ```
193
+
194
+ 也可以只提供 operations 数组,并用 flag 组装请求:
195
+
196
+ ```bash
197
+ soke-cli ai-training +preview-scenario-update \
198
+ --scenario-id scenario_micro_loan_sales \
199
+ --operations-file operations.json \
200
+ --base-updated-at "2026-07-08T10:20:00+08:00" \
201
+ --reason "优化场景说明" \
202
+ --pretty
203
+ ```
204
+
205
+ `+apply-scenario-update` 必须有 `idempotency_key`,可放在 `--request-file` 中,或用 `--idempotency-key` 覆盖补充。遇到 409 乐观锁冲突时,重新执行 `+get-scenario` 获取最新 `updated_at` 后再生成更新请求。
206
+
207
+ ### 发布场景
208
+
209
+ 发布场景使用独立命令:
210
+
211
+ ```bash
212
+ soke-cli ai-training +publish-scenario \
213
+ --scenario-id scenario_micro_loan_sales \
214
+ --pretty
215
+ ```
216
+
217
+ MentorAI `POST /api/v1/scenarios/{scenario_id}/publish` 使用路径中的 `scenario_id`,并在 body 中发送 `version` 和 `version_description`。CLI 默认 `--version 1`、`--version-description "CLI发布"`,不再提供 `--request-file`。不要用 `+publish-scenario` 做任意局部更新;如果只是修改描述、角色字段、评分项或对话步骤,继续走 preview/apply。发布接口返回 409/422 时,加 `--raw` 保留 `errorCode/errorMessage/details/traceId`。
218
+
219
+ ### 快照
220
+
221
+ ```bash
222
+ soke-cli ai-training +list-scenario-snapshots \
223
+ --scenario-id scenario_micro_loan_sales \
224
+ --page 1 \
225
+ --page-size 20 \
226
+ --pretty
227
+
228
+ soke-cli ai-training +restore-scenario-snapshot \
229
+ --scenario-id scenario_micro_loan_sales \
230
+ --snapshot-id snapshot_001 \
231
+ --reason "回滚错误CLI更新" \
232
+ --pretty
233
+ ```
234
+
235
+ 新增场景命令默认输出 MentorAI `BaseResponse.data`;排查错误时加 `--raw` 保留 `success/errorCode/errorMessage/details/traceId`。
236
+
237
+ ## 注意
238
+
239
+ - 不要在 manifest 或 entries 中伪造 `corp_id`、`user_id` 或 `object_key`。
240
+ - `object_key` 必须使用 upload-token 返回值。
241
+ - 不要把客户原始资料、token、app_secret 或 OSS 签名写入仓库。
242
+ - `+upload-scenario-cover` 默认只输出 `cdn_url`;只有排障时才使用 `--raw`,且不要持久化完整签名响应。
243
+ - `advisor_golden_script` 不应进入 AI 客户角色可见知识。
244
+ - 场景更新请求体或 query 中不要伪造 `corp_id`、`company_id`、`user_id`。
245
+ - 场景创建请求体中的 `corp_id`、`company_id`、`user_id`、`implementation_corp_id` 会由代理剥离,不要依赖它们选择租户。
246
+ - 场景更新前必须以 `+get-scenario` 的 `updated_at` 作为 `base_updated_at`。
247
+ - 场景发布需要 `+publish-scenario --scenario-id <id>`,默认带 `version=1` 和 `version_description=CLI发布`;不要把它当作局部更新命令。
@@ -434,9 +434,6 @@ npx skills add liuchenlong1111/soke-cli -y -g
434
434
 
435
435
  ### 📖 阅读详细文档
436
436
 
437
- - [README.md](../README.md) - 项目概览
438
- - [CLAUDE.md](../CLAUDE.md) - 项目架构和开发规范
439
- - [skills/README.md](../skills/README.md) - AI Agent Skills 详细说明
440
437
 
441
438
  ---
442
439