@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,18 @@
1
+ # soke-cli Multi Skills
2
+
3
+ 本目录按业务模块提供独立 Skill。每个一级目录都包含自己的 `SKILL.md`,其余子目录是该 Skill 的内部参考资料、示例、模板或脚本。
4
+
5
+ 安装全部模块:
6
+
7
+ ```bash
8
+ cp -r skills/multi/soke-* ~/.claude/skills/
9
+ ```
10
+
11
+ 安装单个模块:
12
+
13
+ ```bash
14
+ cp -r skills/multi/soke-exam ~/.claude/skills/
15
+ ```
16
+
17
+ 每个模块都应能够脱离原仓库独立读取;模块之间不依赖兄弟目录。
18
+
@@ -0,0 +1,203 @@
1
+ # 变更日志
2
+
3
+ ## v2.43.1 — 2026-08-19
4
+
5
+ ### exec-part5.md 并入 exec-part4.md(文件删除)
6
+
7
+ **背景**:v2.43 已将 Part5 固定配置合并进 Part4 弹窗+同批 apply,exec-part5.md 仅剩向后兼容用途,创建型任务不再加载。用户要求彻底合并去掉该文件。
8
+
9
+ **变更**:
10
+ 1. 删除 `references/exec-part5.md`——独有规则(6 项固定值禁按场景调整 / 字段名以实际发布版本为准 / 不同步 closing_dialogue 等已在前序 Part 同步的字段)已并入 exec-part4.md 注意事项区
11
+ 2. 删除 `references/subs/part5/`(SOP 自检清单已内联 exec-part4 断言区)
12
+ 3. 更新引用:SKILL.md(版本行/规则 34/加载清单/禁止加载清单)、interaction.md(模板 4 改为 Part4+5 合并确认,原模板 5 删除)、sync-engine.md(文件产出表+一致性扫描合并为 Part4+5 行)、adapters/workbuddy.md(按钮表合并)、README.md
13
+ 4. 加载清单不变(仍 ≤9 次读取)——exec-part5.md 本就不在加载路径上,本次是清理死文件
14
+
15
+ **收益**:技能包文件数 -2,消除"发现 exec-part5.md 会不会要读"的歧义;对积分无影响(该文件已不在加载路径)。
16
+
17
+ ## v2.43.0 — 2026-08-19
18
+
19
+ ### 交付后不写日志 + 剩余 5 项优化(88.37 → 目标 ~73-77)
20
+
21
+ **背景**:v2.42 实测 88.37(场景内容量更大:6 环节+803字OS+7知识条目,工具化收益真实)。用户要求:分发版同步平台后不写日志 + 继续压积分。
22
+
23
+ **日志规则(规则 31,分发版核心诉求)**:
24
+ - 创建型任务在平台同步、发布、知识包绑定成功后直接输出完成摘要并结束
25
+ - 禁止自动编辑 SKILL.md、CHANGELOG.md、README.md、项目工作日志或新增学习条目
26
+ - 仅用户明确要求"更新技能/记录经验/维护日志"时才执行维护写入
27
+ - `state-snapshot.json` 仍保留断点恢复状态(每个 Part apply 后写),不作为运行日志
28
+
29
+ **5 项优化(规则 32-35)**:
30
+ 1. **get 回读零上下文(规则 32)**:/tmp/scenario_get.json 只允许 gate_check.py 读取,AI 禁止 Read/tail 引入上下文;闸门结果只看脚本单行输出(省 ~3-4,Step6-8 实测 7.40 偏高,脚本校验后又人工核对是双份)
31
+ 2. **知识包条目预生成(规则 33)**:Step 0.5 写提炼稿时同步产出 /tmp/kb-entries.json,Step 10 只剩 sync+bind(省 ~2-3,Step10 实测 13.07 里拆条是二次推导)
32
+ 3. **Part4+5 合并应用(规则 34)**:Part5 固定配置不再单独弹窗+apply,并入 Part4 弹窗和同批 operations(省 1 弹窗+1 apply ≈ 2-3)
33
+ 4. **材料 sed 限流(规则 35)**:sed 抓段后接 `| head -c 6000`,防关键词密集段一次抓几万字(省 ~1-2)
34
+ 5. **交付后不写日志(规则 31)**:见上
35
+
36
+ **成本结构结论**(88.37 实测):
37
+ - 内容生成 48.90(55.3%)是**不可压地板**——角色画像/环节/评分就是陪练质量本身
38
+ - 可压空间只有执行浪费 ~11-15 分;再往下只能砍内容(角色 3→2、环节 6→5)或砍知识包,属产品决策非执行优化
39
+ - 积分目标从 ≤60 修正为 **≤75**(诚实反映内容生成成本)
40
+
41
+ **文件变更**:
42
+ - 更新:SKILL.md(规则 31-35、Step 0.5/5/6-8/10 描述、加载清单 Part4+5 合并行)
43
+ - 更新:exec-part4.md(并入 Part5 固定配置 + 合并弹窗引导语)
44
+ - exec-part5.md 保留(向后兼容,但创建型任务不再加载)→ **v2.43.1 已删除并彻底并入 exec-part4.md**
45
+
46
+ ## v2.42.0 — 2026-08-19
47
+
48
+ ### 工具化优化(79.64 → 目标 ~62)
49
+
50
+ **背景**:v2.41.1 实测 79.64 积分(较 142.19 大幅下降,加载清单生效),但离 60 目标还差 ~19.6 分。超支点全是"规则已有但没执行":
51
+ 1. 闸门阶段 8 轮 Python 逐步探查 get-scenario 返回结构(~8 分,最大头)
52
+ 2. 材料分 4 轮 sed 逐段读手册(~4.5 分)
53
+ 3. 读取禁止加载文件 3 个(~3.5 分,其中 part2-roles.md 是被迫——exec-part2 引用 A1-A7 却没内联结构)
54
+ 4. apply 后额外校验(~3.6 分)
55
+
56
+ **根因**:规则是声明性的,AI 执行时因"不知道返回结构"只能边看边猜拆轮探查。
57
+
58
+ **4 项工具化修复(规则 → 现成工具)**:
59
+ 1. **闸门工具化(规则 27)**:新增 `scripts/gate_check.py`——一次跑完 Step 7+8 全部校验(4 项发布闸门 + 3 项补查),自动解包 {data:{...}} 嵌套,Part3 steps 空值告警不阻塞,Part4 权重校验。输出单行 GATE PASS/FAIL。已双路径测试通过。**禁止再用 Python 逐步探查返回结构**(省 ~8 分)
60
+ 2. **材料 sed 单命令(规则 28)**:提炼稿只允许一个 sed 命令用多模式一次抓完全部关键段落,禁止分轮读(省 ~4.5 分)
61
+ 3. **OS 结构内联(规则 29)**:A1-A7 OS 写作结构从 part2-roles.md 内联到 exec-part2.md,消除被迫读取(省 ~1.5 分)
62
+ 4. **apply 后零校验(规则 30)**:apply/publish/sync/bind 成功后只看 tail -3 状态行,禁止任何额外校验,验证统一收敛到闸门 gate_check.py(省 ~3.6 分)
63
+
64
+ **预期**:79.64 - 8 - 4.5 - 1.5 - 3.6 ≈ 62 积分(接近 60 目标)
65
+
66
+ **文件变更**:
67
+ - 新增:`scripts/gate_check.py`(闸门一次性校验器,双路径测试通过)
68
+ - 更新:`SKILL.md` 版本 v2.42.0 + 规则 27-30 + 加载清单 Step 6-8 行
69
+ - 更新:`references/exec-part2.md` 内联 A1-A7 OS 写作结构
70
+
71
+ ## v2.41.1 — 2026-08-18
72
+
73
+ ### Bug 修复(用户反馈 3 个问题)
74
+
75
+ **问题 1:弹窗仍显示完整内容**
76
+ - 根因:`interaction.md` 仍保留 v2.37 规则(question 字段承载完整内容),与 SKILL.md v2.41 规则(摘要化展示)冲突
77
+ - 修复:重写 interaction.md 核心规则 5 + v2.41 弹窗规则 + question 字段模板 + AskUserQuestion 调用示例 + 模板 1-5 的 question 字段,全部改为 ≤2 行引导语
78
+ - 同步修复 SKILL.md 前台可见行和输出格式行
79
+
80
+ **问题 2:创建完成后为什么要写入 gkill(state-snapshot.json)**
81
+ - 回答:state-snapshot.json 是**断点续传**机制——记录 scenario_id / current_part / applied 标志 / confirmed_data。如果中途中断(网络断/会话超时),下次可以从断点恢复,不用从头创建。这不是浪费,是必要的容错机制。但 v2.41 已将 file_reads 计数器加入其中。
82
+
83
+ **问题 3:优化后比优化前消耗更多(142.19 vs 93.19)**
84
+ - 根因分析:
85
+ 1. **技能文件过度加载(~27 次 Read)**:规则要求 ≤8 次,实际读了 27 次(exec-part1-5 + part1-5 框架 + 3 个子 SOP + cheatsheet + sync-engine + interaction + publish-gate + gate-matrix + 场景分类库 + soke-ai-training)。这是最大浪费源——"求稳求全"而非"按需加载"
86
+ 2. **CLI 命令 help 探测(~6 次)**:规则明确禁止为查格式跑 --help,实际跑了 6 次
87
+ 3. **知识包 sync 重试 1 次**:--output 参数不存在导致失败重跑
88
+ - 根本原因:v2.41 的规则是**声明性**的——说了"≤8 次"但没有强制拦截机制。AI 在执行时"求稳求全",把所有可能用到的文件都预读了
89
+ - 修复方向:需要从"声明规则"转向"结构性约束"——在 SKILL.md 中加入**加载顺序清单**(精确到每个 Step 读哪个文件),让 AI 按清单执行而非自行判断
90
+
91
+ ## v2.41.0 — 2026-08-18
92
+
93
+ ### 深度结构优化(目标 60 积分)
94
+
95
+ **背景**:v2.40 后实测 94 积分,用户要求控制在 60 左右。分析 94 积分构成:
96
+ - Part1-5 生成 35 (37%) / 技能加载 15 (16%) / CLI 15 (16%) / 回读排障 13 (14%) / 材料 10 (11%) / 弹窗 6 (6%)
97
+ - 可避免 ~14 分:Part2 重试 5 + 无关 PDF 4 + 积分排查 5
98
+
99
+ **5 项结构性优化**:
100
+ 1. **exec-handbook 按 Part 拆分(规则 22)**:26KB 单文件 → 5 个 ~5KB Part 文件 + 4KB common 文件。每个 Part 只加载对应文件,总加载量 26KB → ~9KB(-65%)
101
+ 2. **Part 展示摘要化(规则 23)**:聊天正文只展示关键字段摘要,完整 JSON 直接 Write 落盘 /tmp/。中文 token 密度降低 ~60%
102
+ 3. **材料预过滤(规则 24)**:pdftotext 前先看文件名/标题,无关材料直接跳过(省 ~4 分)
103
+ 4. **apply --reason 内联(规则 25)**:apply 必须带 --reason 参数,格式内联 CLI 速查表(省 Part2 重试 ~5 分)
104
+ 5. **CLI 合并调用(规则 26)**:Part2 头像+语音列表合并为 1 次 Bash 调用(省 1 次独立调用)
105
+
106
+ **预期效果**:
107
+ - 技能加载 15 → 7(-8):exec-handbook 拆分省 8KB token
108
+ - Part1-5 生成 35 → 28(-7):摘要化展示省中文 token
109
+ - CLI 15 → 11(-4)+ 回读 13 → 8(-5):合并调用 + --reason 防重试
110
+ - 材料 10 → 6(-4):预过滤省无关 PDF
111
+ - 总计:94 - 8 - 7 - 9 - 4 = 66 积分(接近 60 目标)
112
+
113
+ **文件变更**:
114
+ - 新增:`references/exec-common.md` / `exec-part1.md` / `exec-part2.md` / `exec-part3.md` / `exec-part4.md` / `exec-part5.md`
115
+ - 保留:`references/exec-handbook.md`(向后兼容,微调型任务仍可引用)
116
+ - 更新:`SKILL.md` 版本 v2.40 → v2.41,规则 22-26,CLI 速查表,Step 0.5/5 描述
117
+
118
+ ## v2.40.0 — 2026-08-18
119
+
120
+ ### 结构性优化(积分增长根因修复)
121
+
122
+ **问题**:v2.39 优化后积分从 126 增至 147(+21),原因:
123
+ 1. 分析阶段自身消耗 ~10 积分(读 20+ 文件 + 改 5 文件)
124
+ 2. 文件膨胀反噬 ~6 积分(SKILL +2 规则、矩阵 +列、SOP +表)
125
+ 3. 规则无强制机制 ~3 积分(规则 17/18 是声明,无计数器)
126
+ 4. 三大浪费未触及 ~2 积分(CLI 探索/标杆查找/Part3 调查)
127
+
128
+ **修复**:
129
+ - **规则 17-18 精简**:从 ~400 字缩减为 2 行指针引用,详细说明留在 `gate-check-matrix.md`
130
+ - **规则 19 CLI 命令内联**:高频命令格式直接写入 SKILL.md「CLI 速查」表,禁止为查格式而 Read cheatsheet 文件(省 5 次文件读取)
131
+ - **规则 20 禁止标杆查找**:创建型任务不搜索不加载标杆案例(省 2 次操作)
132
+ - **规则 21 Part3 回读限制**:apply 后只做 1 次布尔断言,禁止多次 get 调查(省 3 次操作)
133
+ - **文件读取计数器**:state-snapshot.json 记录 `file_reads`,超 8 次触发警告(声明→强制)
134
+
135
+ **预期效果**:消除 18 次可避免操作中的 10 次(CLI 探索 5 + 标杆 2 + Part3 调查 3),预估 147 → ~125 积分。剩余 ~45 积分差距需后续版本通过管线合并(Part2 头像/语音列表合并为 1 次调用)等结构性优化解决。
136
+
137
+ ## v2.39.0 — 2026-08-18
138
+
139
+ ### 优化(积分分析驱动)
140
+ - **闸门精简(Part 自检通过后跳过重叠项)**:分析发现 Step 7 质量闸门 12 项中 9 项与 Part1-5 自检清单完全重叠(闸门1↔Part1自检、闸门3/4/9↔Part2自检、闸门5↔Part3自检、闸门6/10↔Part4自检、闸门7↔Part5自检)。Part 自检全部通过后,闸门仅需补查 3 项(测试用例/整体字数/展示完整度),批量校验脚本从 16 个断言缩减为 7 个。
141
+ - **技能文件按需加载一次复用**:SKILL.md / exec-handbook.md / 各 Part SOP.md / gate-check-matrix.md 在管线首次加载后全程复用,禁止后续 Part 生成时重复 Read。全流程技能文件读取控制在 ≤8 次。
142
+ - **积分目标 ≤80 可达性确认**:基于升舱场景实测(126 积分),识别 3 大浪费源(Part3 apply 验证+回滚 28 积分、闸门重复 get-scenario 16 积分、技能文件重复读 14 积分),通过 v2.39 两条新规则可节省 ~62 积分,预期降至 ~64 积分。
143
+
144
+ ### 问题回答
145
+ - **Q: Part 已检验没有问题,是否不需要再检验?** → A: 是。Part 自检通过后,Step 7 闸门中与之重叠的 9 项自动视为通过,不再重复检查。仅补查 3 项非 Part 自检覆盖的内容。
146
+ - **Q: 质量检验和 Part 是否有冲突?** → A: 无冲突,但存在冗余。Part 自检是字段级校验(执行期),闸门是发布前汇总校验。两者检查内容 75% 重叠(9/12),v2.39 通过精简规则消除冗余。
147
+
148
+ ## v2.30.0 — 2026-08-17
149
+
150
+ ### 优化
151
+ - **Part 展示完成 → 立即弹窗确认**:移除「先输出文字请确认 → 用户输入'确认' → 再弹出确认窗」的中间文字闸门。Part 内容在对话中完整展示后立即弹出确认窗(render_ui / AskUserQuestion),弹窗即确认环节,用户直接通过弹窗选项作答,无需先回复"确认"
152
+ - **SKILL.md / interaction.md / prompt-engineer.md / prompt-optimizer.md / exec-handbook.md / workbuddy 适配器 / part2 SOP 同步更新**:各 Part 弹窗步骤与核心规则统一补充「展示检查通过 → 立即弹窗」时序约束;正文文字确认格式仅保留给无弹窗环境的降级场景(悟空/QClaw/Zework/纯文本)
153
+
154
+ ## v2.29.0 — 2026-08-17
155
+
156
+ ### 优化
157
+ - **登录自动化**:Step 0 检测到未登录时,AI 自动后台执行 `soke-cli auth login`(OAuth 设备流),自动打开浏览器并输出授权链接,前台一句话引导用户扫码,授权完成后自动重检并继续管线;不再要求用户手动运行命令
158
+ - **env-check.md 重写第 3 步**:移除「无法自动化、提示用户手动执行」的旧约定,改为「后台拉起 → 提取授权链接 → 引导扫码 → 授权完成重检」四步自动流程;补充授权链接带 `cli_redirect_uri` 回调参数不可截断的注意项
159
+ - **字段名对齐实测输出**:登录判定统一为 `config show` 的「用户凭证」,企业绑定统一为「corpid」(原 implementation_corp_id 字段实际不存在)
160
+ - **故障速查表更新**:登录时浏览器未打开 / 授权链接无法访问的修复方式对齐自动执行流程
161
+
162
+ ### 触发方式
163
+ - 创建型 / 微调型 / 同步型任务 Step 0 检测到 `用户凭证` 为空时自动触发,无需用户干预
164
+
165
+ ## v2.24.2 — 2026-08-07
166
+
167
+ ### 重构
168
+ - **SKILL.md 瘦身**:608 → 262 → 289 行(-57%),保留 Step 0-10 流程骨架,细节委托 exec-handbook.md
169
+ - **sync-engine.md 精简**:1154 → 294 行(-74%),从「执行手册+字段参考」双重身份精简为纯「字段参考手册」
170
+ - **exec-handbook.md 扩充**:521 → 588 行,新增「JSON 字段类型硬规则」和「状态快照与缓存规则」两章
171
+
172
+ ### 策略统一
173
+ - Part2 同步策略全局收口为「整包 `replace_ai_roles` 优先,失败降级逐个」
174
+ - 清理 5 个文件中的旧策略残留(platform-api-pitfalls / sync-engine / interaction / prompt-engineer / subs/part2/SOP)
175
+
176
+ ### 结构清理
177
+ - 删除 3 个僵尸目录:`coaching/role-generator`、`knowledge-architect`、`script-architect`
178
+ - 删除 5 个 `api_reference.md` 副本、10 个 example 文件、残留空目录
179
+ - `coaching/` 精简为 4 个有效技能
180
+
181
+ ### 新增
182
+ - SKILL.md 新增「参考规则」表,收录 8 个 references 文件
183
+ - SKILL.md 新增「闸门编号与确认模板映射」表(G1-G5 ↔ 模板 1-6)
184
+ - `references/exec-handbook.md` 新增 2 章节
185
+ - `scripts/validate_operations.py`(396 行,operations 校验工具)
186
+ - `references/exec-handbook.md` 新增「平台头像库 URL 对照表」
187
+
188
+ ### 交付准备
189
+ - 清除回归测试产物(part2-5 operations.json / state-snapshot.json / step1-create.json / kb/ 测试数据)
190
+ - 新增 README.md(入口说明 + 依赖清单 + 快速上手)
191
+ - 新增 CHANGELOG.md
192
+
193
+ ## v2.24.1 — 2026-08-06
194
+
195
+ - P0+P1 重构:部署缺失文件(exec-handbook.md / validate_operations.py)
196
+ - Part2 同步策略冲突修复
197
+ - 僵尸目录清理
198
+ - SKILL.md 瘦身
199
+ - sync-engine.md 关键段并入 exec-handbook.md
200
+
201
+ ## v2.24.0 — 2026-08-04
202
+
203
+ - 初始版本,从历史版本整合重构