dsh-desktop-kit 0.0.0-stage → 2.0.0

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 (269) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -2
  3. package/client.js +4101 -0
  4. package/cordis.patch.yml +5 -0
  5. package/docs/ARCHITECTURE.md +114 -0
  6. package/docs/COMPATIBILITY.md +61 -0
  7. package/docs/INSTALL.md +84 -0
  8. package/docs/PRIVACY.md +50 -0
  9. package/docs/ROADMAP.md +57 -0
  10. package/docs/TOKENS.md +118 -0
  11. package/docs/TROUBLESHOOTING.md +68 -0
  12. package/docs/images/hero.png +0 -0
  13. package/index.js +84 -0
  14. package/package.json +70 -4
  15. package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
  16. package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
  17. package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
  18. package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
  19. package/plugins/dsh-gkb-ru-ui/package.json +28 -0
  20. package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
  21. package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
  22. package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
  23. package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
  24. package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
  25. package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
  26. package/plugins/dsh-peak-guard/README.md +70 -0
  27. package/plugins/dsh-peak-guard/client.js +741 -0
  28. package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
  29. package/plugins/dsh-peak-guard/icon.svg +12 -0
  30. package/plugins/dsh-peak-guard/index.js +2 -0
  31. package/plugins/dsh-peak-guard/locale/en.json +6 -0
  32. package/plugins/dsh-peak-guard/locale/ru.json +6 -0
  33. package/plugins/dsh-peak-guard/locale/zh.json +6 -0
  34. package/plugins/dsh-peak-guard/package.json +33 -0
  35. package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
  36. package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
  37. package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
  38. package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
  39. package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
  40. package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
  41. package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
  42. package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
  43. package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
  44. package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
  45. package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
  46. package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
  47. package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
  48. package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
  49. package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
  50. package/plugins/dsh-profile-transfer/README.md +62 -0
  51. package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
  52. package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
  53. package/plugins/dsh-profile-transfer/bootstrap/README-/320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/232/320/220.md +42 -0
  54. package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
  55. package/plugins/dsh-profile-transfer/bootstrap//320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/230/320/242/320/254.cmd +5 -0
  56. package/plugins/dsh-profile-transfer/client.js +806 -0
  57. package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
  58. package/plugins/dsh-profile-transfer/icon.svg +13 -0
  59. package/plugins/dsh-profile-transfer/index.js +375 -0
  60. package/plugins/dsh-profile-transfer/locale/en.json +6 -0
  61. package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
  62. package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
  63. package/plugins/dsh-profile-transfer/package.json +36 -0
  64. package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
  65. package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
  66. package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
  67. package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
  68. package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
  69. package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
  70. package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
  71. package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
  72. package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
  73. package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
  74. package/plugins/dsh-profile-transfer/transfer.js +1004 -0
  75. package/plugins/dsh-project-memory/README.md +71 -0
  76. package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
  77. package/plugins/dsh-project-memory/icon.svg +12 -0
  78. package/plugins/dsh-project-memory/index.js +1240 -0
  79. package/plugins/dsh-project-memory/locale/en.json +6 -0
  80. package/plugins/dsh-project-memory/locale/ru.json +6 -0
  81. package/plugins/dsh-project-memory/locale/zh.json +6 -0
  82. package/plugins/dsh-project-memory/package.json +26 -0
  83. package/plugins/dsh-session-move/README.md +67 -0
  84. package/plugins/dsh-session-move/client.js +719 -0
  85. package/plugins/dsh-session-move/cordis.patch.yml +5 -0
  86. package/plugins/dsh-session-move/icon.svg +14 -0
  87. package/plugins/dsh-session-move/index.js +497 -0
  88. package/plugins/dsh-session-move/locale/en.json +6 -0
  89. package/plugins/dsh-session-move/locale/ru.json +6 -0
  90. package/plugins/dsh-session-move/locale/zh.json +6 -0
  91. package/plugins/dsh-session-move/package.json +31 -0
  92. package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
  93. package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
  94. package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
  95. package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
  96. package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
  97. package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
  98. package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
  99. package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
  100. package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
  101. package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
  102. package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
  103. package/plugins/dsh-skill-autopilot/index.js +444 -0
  104. package/plugins/dsh-skill-autopilot/package.json +19 -0
  105. package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
  106. package/plugins/dsh-token-lab/lib/client.js +504 -0
  107. package/plugins/dsh-token-lab/lib/index.js +275 -0
  108. package/plugins/dsh-token-lab/package.json +26 -0
  109. package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
  110. package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
  111. package/skills/code-review-checklist/SKILL.md +55 -0
  112. package/skills/content-writing/README.md +87 -0
  113. package/skills/content-writing/SKILL.md +85 -0
  114. package/skills/content-writing/assets/checklists/fact-check.md +53 -0
  115. package/skills/content-writing/assets/checklists/publish.md +65 -0
  116. package/skills/content-writing/assets/checklists/social.md +40 -0
  117. package/skills/content-writing/assets/templates/article.md +47 -0
  118. package/skills/content-writing/assets/templates/brief.md +44 -0
  119. package/skills/content-writing/assets/templates/doctor-card.md +41 -0
  120. package/skills/content-writing/assets/templates/image-prompts.md +128 -0
  121. package/skills/content-writing/assets/templates/post-telegram.md +36 -0
  122. package/skills/content-writing/assets/templates/post-vk.md +42 -0
  123. package/skills/content-writing/assets/templates/press-release.md +56 -0
  124. package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
  125. package/skills/content-writing/assets/templates/service-card.md +46 -0
  126. package/skills/content-writing/references/anti-ai-style.md +248 -0
  127. package/skills/content-writing/references/editing.md +185 -0
  128. package/skills/content-writing/references/fact-checking.md +205 -0
  129. package/skills/content-writing/references/government-medical.md +246 -0
  130. package/skills/content-writing/references/images.md +212 -0
  131. package/skills/content-writing/references/journalism.md +252 -0
  132. package/skills/content-writing/references/process.md +123 -0
  133. package/skills/content-writing/references/quick-recipes.md +99 -0
  134. package/skills/content-writing/references/rules.md +85 -0
  135. package/skills/content-writing/references/science-popular.md +218 -0
  136. package/skills/content-writing/references/seo-content.md +172 -0
  137. package/skills/content-writing/references/social-media.md +253 -0
  138. package/skills/content-writing/references/sources.md +49 -0
  139. package/skills/content-writing/references/templates.md +291 -0
  140. package/skills/context-economy/SKILL.md +60 -0
  141. package/skills/context-economy/references/long-session.md +35 -0
  142. package/skills/context-economy/references/token-math.md +42 -0
  143. package/skills/context-economy/references/tool-recipes.md +34 -0
  144. package/skills/database-safety/SKILL.md +47 -0
  145. package/skills/debugging-playbook/SKILL.md +42 -0
  146. package/skills/design-critique/SKILL.md +65 -0
  147. package/skills/design-critique/references/a11y.md +25 -0
  148. package/skills/design-critique/references/diagnoses.md +33 -0
  149. package/skills/design-critique/references/quick-tests.md +30 -0
  150. package/skills/design-critique/references/report-template.md +63 -0
  151. package/skills/design-critique/references/rubric-fast.md +73 -0
  152. package/skills/dev-workflow/SKILL.md +48 -0
  153. package/skills/dev-workflow/references/definition-of-done.md +44 -0
  154. package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
  155. package/skills/dev-workflow/references/stages.md +67 -0
  156. package/skills/git-and-ci/SKILL.md +60 -0
  157. package/skills/pg-upgrade-verify/SKILL.md +67 -0
  158. package/skills/project-deep-dive/SKILL.md +45 -0
  159. package/skills/project-deep-dive/references/recon-commands.md +90 -0
  160. package/skills/project-deep-dive/references/section-templates.md +104 -0
  161. package/skills/project-deep-dive/references/tool-and-process.md +86 -0
  162. package/skills/project-memory-maintenance/SKILL.md +55 -0
  163. package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
  164. package/skills/project-memory-maintenance/references/journal-template.md +50 -0
  165. package/skills/project-memory-maintenance/references/section-rules.md +59 -0
  166. package/skills/release-and-deploy/SKILL.md +53 -0
  167. package/skills/requirements-and-planning/SKILL.md +49 -0
  168. package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
  169. package/skills/requirements-and-planning/references/process-steps.md +52 -0
  170. package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
  171. package/skills/security-review/SKILL.md +40 -0
  172. package/skills/seo/README.md +60 -0
  173. package/skills/seo/SKILL.md +77 -0
  174. package/skills/seo/assets/README.md +66 -0
  175. package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
  176. package/skills/seo/assets/scripts/README.md +179 -0
  177. package/skills/seo/assets/scripts/lib/args.mjs +105 -0
  178. package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
  179. package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
  180. package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
  181. package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
  182. package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
  183. package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
  184. package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
  185. package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
  186. package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
  187. package/skills/seo/assets/snippets/meta.blade.php +61 -0
  188. package/skills/seo/assets/snippets/robots.txt +61 -0
  189. package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
  190. package/skills/seo/assets/snippets/sitemap.xml +36 -0
  191. package/skills/seo/references/antipatterns.md +66 -0
  192. package/skills/seo/references/audit-checklist.md +319 -0
  193. package/skills/seo/references/content-seo.md +204 -0
  194. package/skills/seo/references/eeat-medical.md +219 -0
  195. package/skills/seo/references/measurement.md +250 -0
  196. package/skills/seo/references/on-page.md +214 -0
  197. package/skills/seo/references/page-templates.md +56 -0
  198. package/skills/seo/references/stack-recipes.md +695 -0
  199. package/skills/seo/references/structured-data.md +487 -0
  200. package/skills/seo/references/technical-seo.md +296 -0
  201. package/skills/service-desk-conventions/SKILL.md +52 -0
  202. package/skills/service-desk-db-safety/SKILL.md +63 -0
  203. package/skills/service-desk-release/SKILL.md +61 -0
  204. package/skills/service-desk-testing/SKILL.md +61 -0
  205. package/skills/service-desk-ui/SKILL.md +52 -0
  206. package/skills/skills-router/SKILL.md +53 -0
  207. package/skills/skills-router/references/applying-skills.md +25 -0
  208. package/skills/skills-router/references/routing-matrix.md +52 -0
  209. package/skills/testing-strategy/SKILL.md +52 -0
  210. package/skills/ui-design-system/SKILL.md +50 -0
  211. package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
  212. package/skills/ui-design-system/references/tokens-and-components.md +67 -0
  213. package/skills/ui-design-system/references/visual-qa.md +44 -0
  214. package/skills/web-research/SKILL.md +47 -0
  215. package/skills/web-research/references/answer-and-citations.md +60 -0
  216. package/skills/web-research/references/query-recipes.md +44 -0
  217. package/skills/wow-design/SKILL.md +89 -0
  218. package/skills/wow-design/assets/kit/README.md +195 -0
  219. package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
  220. package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
  221. package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
  222. package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
  223. package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
  224. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
  225. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
  226. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
  227. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
  228. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
  229. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
  230. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
  231. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
  232. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
  233. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
  234. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
  235. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
  236. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
  237. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
  238. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
  239. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
  240. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
  241. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
  242. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
  243. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
  244. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
  245. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
  246. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
  247. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
  248. package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
  249. package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
  250. package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
  251. package/skills/wow-design/assets/kit/showcase.html +1164 -0
  252. package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
  253. package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
  254. package/skills/wow-design/assets/scripts/README.md +312 -0
  255. package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
  256. package/skills/wow-design/assets/scripts/capture.mjs +337 -0
  257. package/skills/wow-design/assets/scripts/package.json +30 -0
  258. package/skills/wow-design/references/anti-patterns.md +252 -0
  259. package/skills/wow-design/references/critique-rubric.md +262 -0
  260. package/skills/wow-design/references/design-brief-template.md +48 -0
  261. package/skills/wow-design/references/inspiration.md +203 -0
  262. package/skills/wow-design/references/presets.md +99 -0
  263. package/skills/wow-design/references/principles.md +371 -0
  264. package/skills/wow-design/references/quick-presets.md +50 -0
  265. package/skills/wow-design/references/report-template.md +21 -0
  266. package/skills/wow-design/references/stack-recipes.md +96 -0
  267. package/skills/wow-design/references/visual-qa.md +82 -0
  268. package/skills/wow-design/references/wow-levers.md +43 -0
  269. package/tools/skill-cost.mjs +76 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * dsh-token-lab — Host half.
3
+ *
4
+ * Reads the exact token measurement of the live session from `ctx.tokenMeter`
5
+ * (the same estimator the request path uses), groups the surface nodes by
6
+ * message kind and returns a compact report for the sidebar panel. Also prices
7
+ * the skill library: what the whole `~/.dsh/skills` tree costs if loaded, and
8
+ * what the compact cores cost.
9
+ */
10
+ import fs from "node:fs";
11
+ import os from "node:os";
12
+ import path from "node:path";
13
+
14
+ export const inject = ["connection"];
15
+
16
+ const ROUTE_BASE = "/api/dsh-token-lab";
17
+ const NAMESPACE = "dsh-token-lab";
18
+ const DEFAULT_CONTEXT_WINDOW = 128_000;
19
+
20
+ const GROUPS = {
21
+ "system/message": { id: "system", label: "Системный промпт", color: "#2F4858" },
22
+ "developer/message": { id: "developer", label: "Память и правила", color: "#5B4B8A" },
23
+ "user/message": { id: "user", label: "Ваши сообщения", color: "#0E6E5E" },
24
+ "assistant/message": { id: "assistant", label: "Ответы модели", color: "#2C5F8A" },
25
+ "tool/result": { id: "tool", label: "Результаты инструментов", color: "#B36A43" },
26
+ other: { id: "other", label: "Прочее", color: "#7A7F87" },
27
+ };
28
+
29
+ function dshHome() {
30
+ return process.env.DSH_HOME ?? path.join(os.homedir(), ".dsh");
31
+ }
32
+
33
+ function approxTokens(bytes) {
34
+ return Math.max(40, Math.round(bytes / 3.2));
35
+ }
36
+
37
+ function humanName(skill) {
38
+ return skill.replaceAll("-", " ");
39
+ }
40
+
41
+ function scanSkills() {
42
+ const directory = path.join(dshHome(), "skills");
43
+ const skills = [];
44
+ let entries = [];
45
+ try {
46
+ entries = fs.readdirSync(directory, { withFileTypes: true });
47
+ } catch {
48
+ return { skills, totalBytes: 0, totalTokens: 0 };
49
+ }
50
+ for (const entry of entries) {
51
+ if (!entry.isDirectory()) continue;
52
+ const file = path.join(directory, entry.name, "SKILL.md");
53
+ try {
54
+ const stat = fs.statSync(file);
55
+ const tokens = approxTokens(stat.size);
56
+ skills.push({ name: entry.name, title: humanName(entry.name), bytes: stat.size, tokens });
57
+ } catch {
58
+ /* not a skill folder */
59
+ }
60
+ }
61
+ skills.sort((left, right) => right.tokens - left.tokens);
62
+ return {
63
+ skills,
64
+ totalBytes: skills.reduce((sum, skill) => sum + skill.bytes, 0),
65
+ totalTokens: skills.reduce((sum, skill) => sum + skill.tokens, 0),
66
+ };
67
+ }
68
+
69
+ function readAutopilot() {
70
+ try {
71
+ const parsed = JSON.parse(fs.readFileSync(path.join(dshHome(), "dsh-autopilot.json"), "utf8"));
72
+ return { mode: parsed?.mode === "off" ? "off" : "on", maxSkills: Number(parsed?.maxSkills) || 3 };
73
+ } catch {
74
+ return { mode: "on", maxSkills: 3 };
75
+ }
76
+ }
77
+
78
+ function messageText(message) {
79
+ if (!message) return "";
80
+ const content = message.content;
81
+ if (typeof content === "string") return content;
82
+ if (!Array.isArray(content)) return "";
83
+ const parts = [];
84
+ for (const block of content) {
85
+ if (block && block.type === "text" && typeof block.text === "string" && block.text.trim().length > 0) {
86
+ parts.push(block.text.trim());
87
+ }
88
+ }
89
+ return parts.join(" ").replace(/\s+/gu, " ").trim();
90
+ }
91
+
92
+ function pickSession(sessions, sessionId) {
93
+ if (!sessions) return undefined;
94
+ if (typeof sessionId === "string" && sessionId.length > 0) {
95
+ const direct = sessions.get(sessionId);
96
+ if (direct) return direct;
97
+ }
98
+ const list = sessions.list();
99
+ return list[list.length - 1];
100
+ }
101
+
102
+ function toolNameMap(session) {
103
+ const names = new Map();
104
+ try {
105
+ for (const event of session.snapshotEvents()) {
106
+ if (event.type === "tool/call" && event.data?.callId && event.data?.name) {
107
+ names.set(String(event.data.callId), { name: String(event.data.name), hint: argumentHint(event.data.arguments) });
108
+ }
109
+ }
110
+ } catch {
111
+ /* cold or truncated log: labels stay generic */
112
+ }
113
+ return names;
114
+ }
115
+
116
+ function argumentHint(raw) {
117
+ let args = raw;
118
+ if (typeof raw === "string") {
119
+ try {
120
+ args = JSON.parse(raw);
121
+ } catch {
122
+ return "";
123
+ }
124
+ }
125
+ if (!args || typeof args !== "object") return "";
126
+ for (const key of ["service", "method", "path", "url", "query", "action", "name", "command", "file_path", "pattern"]) {
127
+ const value = args[key];
128
+ if (typeof value === "string" && value.trim().length > 0) return value.trim().slice(0, 32);
129
+ }
130
+ return "";
131
+ }
132
+
133
+ function toolLabel(names, message) {
134
+ const callId = message?.source?.callId ?? message?.toolCallId;
135
+ const entry = callId ? names.get(String(callId)) : undefined;
136
+ if (!entry) return "Результат инструмента";
137
+ return entry.hint ? `Результат · ${entry.name} · ${entry.hint}` : `Результат · ${entry.name}`;
138
+ }
139
+
140
+ function buildReport(ctx, sessionId) {
141
+ const sessions = ctx.get("sessions");
142
+ const meter = ctx.get("tokenMeter");
143
+ const session = pickSession(sessions, sessionId);
144
+ if (!session) {
145
+ const error = new Error("нет активной сессии");
146
+ error.code = "tokenlab/no-session";
147
+ throw error;
148
+ }
149
+ if (!meter) {
150
+ const error = new Error("сервис tokenMeter недоступен в этой сборке DSH");
151
+ error.code = "tokenlab/no-meter";
152
+ throw error;
153
+ }
154
+ const measurement = meter.measure(session);
155
+ const toolNames = toolNameMap(session);
156
+ const groups = new Map();
157
+ const nodes = [];
158
+ for (const node of measurement.nodes) {
159
+ let event;
160
+ try {
161
+ event = session.eventAt(node.seq);
162
+ } catch {
163
+ event = undefined;
164
+ }
165
+ const type = event?.type ?? "other";
166
+ const group = GROUPS[type] ?? GROUPS.other;
167
+ const bucket = groups.get(group.id) ?? { ...group, tokens: 0, count: 0, items: [] };
168
+ bucket.tokens += node.tokens;
169
+ bucket.count += 1;
170
+ const message = event ? safeDerive(session, event) : undefined;
171
+ const text = type === "tool/result" ? toolLabel(toolNames, message) : messageText(message);
172
+ if (bucket.items.length < 3 && text.length > 0) {
173
+ bucket.items.push({ seq: Number(node.seq), tokens: node.tokens, text: text.slice(0, 120) });
174
+ }
175
+ groups.set(group.id, bucket);
176
+ nodes.push({
177
+ seq: Number(node.seq),
178
+ tokens: node.tokens,
179
+ type,
180
+ group: group.id,
181
+ label: text.slice(0, 80),
182
+ });
183
+ }
184
+ const groupList = [...groups.values()]
185
+ .map((group) => ({ ...group, items: group.items.sort((a, b) => b.tokens - a.tokens) }))
186
+ .sort((left, right) => right.tokens - left.tokens);
187
+ const top = [...nodes].sort((left, right) => right.tokens - left.tokens).slice(0, 6);
188
+ let contextWindow = Number(session.requestContext()?.contextWindow) || DEFAULT_CONTEXT_WINDOW;
189
+ const total = measurement.totalTokens;
190
+ const series = [];
191
+ let running = 0;
192
+ const stride = Math.max(1, Math.ceil(nodes.length / 48));
193
+ for (let index = 0; index < nodes.length; index += stride) {
194
+ running += nodes.slice(index, index + stride).reduce((sum, node) => sum + node.tokens, 0);
195
+ series.push(running);
196
+ }
197
+ series.push(total);
198
+ const library = scanSkills();
199
+ const autopilot = readAutopilot();
200
+ const average = library.skills.length > 0 ? Math.round(library.totalTokens / library.skills.length) : 0;
201
+ const typical = average * 3;
202
+ const heaviest = library.skills.slice(0, 6);
203
+ return {
204
+ sessionId: String(session.id),
205
+ title: session.header?.cwd ? path.basename(session.header.cwd) : "",
206
+ totalTokens: total,
207
+ surfaceTokens: measurement.surfaceTokens,
208
+ surfaceDeltaTokens: measurement.surfaceDeltaTokens,
209
+ baseline: {
210
+ kind: measurement.baseline?.kind ?? "none",
211
+ tokens: measurement.baseline?.tokens ?? 0,
212
+ usage: measurement.baseline?.usage ?? null,
213
+ },
214
+ contextWindow,
215
+ pressure: contextWindow > 0 ? Math.min(1, total / contextWindow) : 0,
216
+ groups: groupList,
217
+ top,
218
+ series,
219
+ nodes: nodes.length,
220
+ library: {
221
+ count: library.skills.length,
222
+ totalTokens: library.totalTokens,
223
+ typicalTokens: typical,
224
+ heaviest,
225
+ },
226
+ autopilot,
227
+ generatedAt: new Date().toISOString(),
228
+ };
229
+ }
230
+
231
+ function safeDerive(session, event) {
232
+ try {
233
+ return session.deriveEventMessage(event);
234
+ } catch {
235
+ return event?.data?.message;
236
+ }
237
+ }
238
+
239
+ function okEnvelope(rpcId, value) {
240
+ return Response.json({ type: "server-response", rpcId, result: { ok: true, value } });
241
+ }
242
+
243
+ function errorEnvelope(rpcId, code, message) {
244
+ return Response.json({ type: "server-response", rpcId, result: { ok: false, error: { code, message } } });
245
+ }
246
+
247
+ export function apply(ctx) {
248
+ const register = (operation, handler) => {
249
+ const route = {
250
+ path: `${ROUTE_BASE}/${operation}`,
251
+ methods: ["POST"],
252
+ requestBody: "buffered",
253
+ fetch: async (request) => {
254
+ let rpcId = "invalid-request";
255
+ try {
256
+ const body = await request.json();
257
+ rpcId = typeof body?.rpcId === "string" ? body.rpcId : rpcId;
258
+ if (body?.type !== "client-request" || body?.method !== `${NAMESPACE}/${operation}`) {
259
+ return errorEnvelope(rpcId, "tokenlab/bad-request", "некорректный конверт Connection");
260
+ }
261
+ const value = await handler(body?.payload ?? {});
262
+ return okEnvelope(rpcId, value);
263
+ } catch (error) {
264
+ const code = typeof error?.code === "string" ? error.code : "tokenlab/internal";
265
+ if (code === "tokenlab/internal") ctx.logger?.warn?.(`[token-lab] ${operation} failed: ${String(error)}`);
266
+ return errorEnvelope(rpcId, code, error instanceof Error ? error.message : String(error));
267
+ }
268
+ },
269
+ };
270
+ ctx.effect(() => ctx.connection.fetch.register(route), `token-lab: ${operation}`);
271
+ };
272
+
273
+ register("report", async (payload) => buildReport(ctx, payload?.sessionId));
274
+ register("ping", async () => ({ ok: true, home: dshHome() }));
275
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "dsh-token-lab",
3
+ "version": "1.0.0",
4
+ "description": "Live token laboratory for DSH: context composition, top token consumers, skill-library cost and context-window pressure in one sidebar tile.",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "exports": {
8
+ ".": {
9
+ "default": "./lib/index.js"
10
+ },
11
+ "./client": {
12
+ "default": "./lib/client.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "dsh": {
17
+ "manifestVersion": 1,
18
+ "bundle": {
19
+ "patch": "./cordis.patch.yml"
20
+ },
21
+ "client": {
22
+ "platform": "web",
23
+ "inject": []
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: code-review-checklist
3
+ description: "Ревью перед сдачей/релизом: блокеры, важное, мелочи, Definition of Done — данные, права, тесты, стиль, деплой."
4
+ whenToUse: "Перед коммитом/релизом, когда считаешь задачу готовой или ревьюишь чужой код; после конфликтов и хотфиксов."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Чек-лист ревью кода
9
+
10
+ ## 0. Когда применять
11
+ - Перед коммитом/релизом и перед ответом «готово».
12
+ - Ревью чужого кода, после конфликта или хотфикса.
13
+ - Нужен приоритет: что блокирует, что потом.
14
+
15
+ ## 1. Главное
16
+ **Порядок:** `git status --short` → `git diff --stat` → `git diff` → находки по приоритетам → блокеры → гейт.
17
+
18
+ **Блокеры (не сдавать):**
19
+ - Деструктив с БД (`migrate:fresh`, `db:wipe`, `TRUNCATE`, `dropdb`) без явного разрешения и бэкапа.
20
+ - Секреты/пароли/ключи в коде, логах, коммите, памяти.
21
+ - Маршрут без `auth`/права (`permission:*`) или без проверки admin/user/guest; IDOR; эскалация прав.
22
+ - SQL-конкатенация; пользовательский HTML без экранирования/санитайзера (`{!! !!}`, `innerHTML`, `v-html`).
23
+ - Загрузка без whitelist/лимита/безопасной отдачи (attachment); исполняемые файлы в webroot.
24
+ - Красные тесты/ухудшенный baseline; баг без регрессионного теста.
25
+ - Рискованная миграция/массовая правка без плана отката.
26
+ - `APP_DEBUG=true`, дебаг-код или временные логи в проде.
27
+
28
+ **Важное:**
29
+ - Миграции аддитивные, с `down()`, не редактируют применённые; многозаписные — в транзакции, гонки — `lockForUpdate()`.
30
+ - Массовые `UPDATE/DELETE` с условием; проверены на копии.
31
+ - Валидация всех входных данных на сервере (тип/длина/диапазон/формат); клиентская — только UX.
32
+ - Ошибки/пустые состояния; тексты пользователю по-русски и понятны.
33
+ - Нет N+1, мёртвого кода, дублирования; имена понятные.
34
+ - Тесты: feature на сценарий/права/валидацию + unit на логику; новые падают без правки.
35
+ - Полный PHPUnit-набор зелёный; линтер (`php -l`, Pint) и статанализ без новых ошибок.
36
+ - UI: скриншоты/Playwright «до/после», светлая/тёмная, mobile.
37
+ - Версия поднята (feature=minor, fix=patch); сборка и миграции проверены на копии (`pg-upgrade-verify`).
38
+ - План выкатки/отката, бэкап; документация/память обновлены.
39
+
40
+ **Мелочи:**
41
+ - Форматирование, комментарии, мёртвые импорты, `TODO` без тикета, размер диффа, сообщение коммита.
42
+
43
+ **Команды:** `git diff --check`, `git status --short`, тесты/линтер проекта.
44
+
45
+ ## 2. Куда грузить дальше
46
+ Смежные: `security-review`, `database-safety`, `testing-strategy`, `release-and-deploy`.
47
+
48
+ ## 3. Гейт перед сдачей — Definition of Done
49
+ - [ ] Блокеров нет; важное закрыто или вынесено с причиной.
50
+ - [ ] Дифф минимален и по задаче; нет случайных файлов, секретов, дебага.
51
+ - [ ] Тесты/линтер/статанализ зелёные; baseline не хуже.
52
+ - [ ] Данные: бэкап/аддитивные миграции/план отката.
53
+ - [ ] UI: скриншоты 1440/768/390, light/dark (если интерфейс).
54
+ - [ ] Версия/CHANGELOG/память обновлены.
55
+ - [ ] Отчёт: сделано, как проверено, риски.
@@ -0,0 +1,87 @@
1
+ # content-writing — профессиональный автор/журналист
2
+
3
+ Скилл для написания и редактирования текстов для публикации: статьи, посты в соцсетях
4
+ (ВК, Telegram, ОК, Дзен), блоги, материалы для государственных и медицинских сайтов, пресс-релизы,
5
+ научпоп. Живой человеческий стиль, факт-чек, иллюстрации, SEO.
6
+
7
+ ## Когда использовать
8
+
9
+ - «Напиши статью/пост/пресс-релиз/текст для сайта».
10
+ - «Отредактируй, сделай живее, убери канцелярит/ИИ-штампы».
11
+ - «Нужен научпоп-текст / объясни сложное простыми словами».
12
+ - «Материал для госсайта / больницы / пациентам» (YMYL).
13
+ - «Подбери картинку к публикации / сгенерируй иллюстрацию».
14
+
15
+ ## Установка
16
+
17
+ Скилл лежит в workspace, ставится копированием в профиль:
18
+
19
+ ```powershell
20
+ Copy-Item -Recurse -Force `
21
+ "%USERPROFILE%\Documents\deepseek-harness\default-workspace\projects\writing-skill" `
22
+ "%USERPROFILE%\.dsh\skills\content-writing"
23
+ ```
24
+
25
+ После установки DSH подхватывает скилл автоматически; вызывается через `skill` (name: `content-writing`)
26
+ или вручную — упоминанием в задаче.
27
+
28
+ ## Быстрый старт
29
+
30
+ | Задача | Что читать | Время |
31
+ |---|---|---|
32
+ | Пост на 1 экран | `SKILL.md` §3 (лайт-режим) + `references/social-media.md` | 10 мин |
33
+ | Статья на сайт | `SKILL.md` §1 (шаги 1–9) + `references/journalism.md` + `references/seo-content.md` | 1–3 ч |
34
+ | Медицина/госсайт | `references/government-medical.md` + `assets/checklists/publish.md` | 1–3 ч |
35
+ | Научпоп | `references/science-popular.md` + `references/fact-checking.md` | 1–2 ч |
36
+ | Редактура готового | `references/anti-ai-style.md` + `references/editing.md` | 30–60 мин |
37
+ | Картинки | `references/images.md` + `assets/templates/image-prompts.md` (+ скилл `img`) | 15–30 мин |
38
+
39
+ ## Состав
40
+
41
+ ```
42
+ SKILL.md — контракт, процесс 9 шагов, правила, чек-листы, шаблоны брифа/отчёта
43
+ references/
44
+ journalism.md — новость, репортаж, интервью, аналитика, лонгрид, колонка, цитаты
45
+ social-media.md — ВК, Telegram, ОК, Дзен, Rutube: форматы, хуки, календарь
46
+ government-medical.md — госсайты, официальный стиль, доступность, YMYL, закон, приватность
47
+ science-popular.md — научпоп: иерархия доказательств, цифры/риск, аналогии, ограничения
48
+ anti-ai-style.md — маркеры ИИ, ритм, конкретика, правка, честная оговорка про детекторы
49
+ images.md — типы визуала, права, этика, форматы, генерация (FLUX/RealVisXL)
50
+ seo-content.md — мост к SEO-скиллу: интент, структура, title/H2, E-E-A-T, обновление
51
+ fact-checking.md — иерархия источников, проверка цифр/цитат/законов, противоречия
52
+ templates.md — шаблоны: бриф, статья, новость, релиз, посты, карусель, «плохо → хорошо»
53
+ editing.md — вычитка, типографика, стоп-слова, единый стиль издания
54
+ assets/
55
+ templates/ — brief, article, post-vk, post-telegram, press-release,
56
+ science-pop-note, doctor-card, service-card, image-prompts
57
+ checklists/ — publish.md, fact-check.md, social.md
58
+ ```
59
+
60
+ ## Связка со скиллами
61
+
62
+ - **`seo`** — обязателен для текстов на сайте: полный SEO-процесс, JSON-LD, аудит.
63
+ - **`img`** — локальная генерация иллюстраций (FLUX/RealVisXL) и проверка результата.
64
+ - **`wow-design`** — если текст идёт в вёрстку/лендинг.
65
+ - **`office`** — если материал сдаётся в Word/PowerPoint/PDF.
66
+ - **`requirements-and-planning`** — контент-план, серия материалов, цели и критерии.
67
+
68
+ ## Принципы, которые нельзя нарушать
69
+
70
+ 1. Не выдумывать факты, цитаты, исследования, отзывы.
71
+ 2. Каждый факт проверяем; медицина — YMYL-режим (автор-врач, даты, источники, дисклеймер).
72
+ 3. Приватность: пациенты/сотрудники — только с согласия.
73
+ 4. Права на изображения — обязательны.
74
+ 5. Живой стиль — ради ясности и пользы, а не ради «обхода детекторов».
75
+ 6. Отчёт: что сделано, откуда факты, что не проверено, риски.
76
+
77
+ ## Стандарты и источники
78
+
79
+ Полный список — `SKILL.md` §11. Ключевые: Reuters Standards & Values, BBC Editorial Guidelines,
80
+ Science Media Centre (10 best practice guidelines), IFCN Code of Principles, ГОСТ Р 52872-2019,
81
+ 38-ФЗ/323-ФЗ/152-ФЗ, клинические рекомендации Минздрава, Дзен/Telegram/VK справки.
82
+
83
+ ## Статус
84
+
85
+ - Версия: 1.0
86
+ - Проверено: 04.11.2026
87
+ - Требования законов и лимиты платформ перепроверять на дату публикации.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: content-writing
3
+ description: "Тексты для публикации: статьи, посты ВК/Telegram/Дзен, научпоп, гос- и медсайты (YMYL), пресс-релизы — факт-чек, живой стиль, картинки, SEO"
4
+ whenToUse: "Написать, переписать или отредактировать текст для публикации: статья, пост, пресс-релиз, научпоп, гос/медсайт; подобрать иллюстрации"
5
+ user-invocable: true
6
+ ---
7
+
8
+ # content-writing — автор и редактор
9
+
10
+ > Сначала зачем и кому, потом факты, потом текст, потом правка. Реалии РФ 2026: ВК, Telegram, ОК, Дзен,
11
+ > госсайты, медицинский YMYL.
12
+
13
+ ## 0. Когда применять
14
+
15
+ - Статья, новость, лонгрид, интервью, репортаж, колонка; посты ВК/Telegram/ОК/Дзен; пресс-релиз; научпоп;
16
+ гос-/медсайт; карточки, анонсы.
17
+ - Редактура: «сделай живее», «убери канцелярит/AI-штампы», «сократи», «приведи к стилю издания».
18
+ - Иллюстрации и права — здесь; SEO (`seo`), вёрстка (`wow-design`), код — не сюда.
19
+
20
+ ## 1. Главное
21
+
22
+ ### Контракт (полностью — `rules.md` §1)
23
+
24
+ 1. **Не выдумывай.** Нет источника — нет утверждения; нет дословной цитаты — нет кавычек.
25
+ 2. **Факт — с источником и датой**; неопределённость честно: «данных мало», «гипотеза».
26
+ 3. **Медицина/наука — YMYL.** Без обещаний излечения; автор-врач, даты, источники, дисклеймер.
27
+ 4. **Приватность.** Пациенты, дети, сотрудники — только письменное согласие (152-ФЗ, 323-ФЗ).
28
+ 5. **Авторское право.** Чужие текст/фото — только с правом; цитата — с атрибуцией.
29
+ 6. **Репутация и честность.** Сомнительное — на согласование; живой язык — для ясности; детекторы ИИ
30
+ и академчестность не обходить.
31
+
32
+ ### Алгоритм: 9 шагов (детали — `process.md`)
33
+
34
+ 1. **Бриф** — кому, канал, цель, тон, объём, ограничения, CTA; нет брифа — 3–5 вопросов.
35
+ 2. **Факты** — 5–15 единиц с источниками; свежее — `web-research` (2 источника, дата); ~70% до письма.
36
+ 3. **Скелет** — одна мысль, 3–5 тезисов, лид «что и почему важно», 3–8 заголовков, H2-оглавление.
37
+ 4. **Черновик** — быстро, целиком; абзац 2–5 предложений; на 10–20% длиннее цели.
38
+ 5. **Факт-чек** — таблица «утверждение → источник → статус»; арифметика, цитаты, ссылки.
39
+ 6. **Редактура** — −10–20%; канцелярит → глагол, пассив → актив; конкретика; вслух.
40
+ 7. **Стиль** — ритм, конкретика, голос, без AI-штампов, типографика издания.
41
+ 8. **Иллюстрации** — смысл, права (`img`), формат (1080×1350, 1200×630, 16:9, 9:16), alt, этика.
42
+ 9. **SEO и сдача** — title 50–60, description 140–160, H1, alt, JSON-LD; проверка в вёрстке; отчёт.
43
+
44
+ ### Достоверность — жёстко (полностью — `rules.md` §2)
45
+
46
+ - Спорное — 2 независимых источника или первоисточник + эксперт; цифра без контекста — манипуляция.
47
+ - Цитата дословно, пересказ без кавычек; анонимка — исключение с причиной.
48
+ - Корреляция ≠ причинность; заголовок не врёт; даты полные.
49
+
50
+ ### Антипаттерны
51
+
52
+ AI-штампы — `anti-ai-style.md` §2; кликбейт — `journalism.md` §10; обещания излечения —
53
+ `government-medical.md` §5; ключевики — `seo-content.md` §9.
54
+
55
+ ## 2. Куда грузить дальше
56
+
57
+ Файлы — в `references/`; токены примерные.
58
+
59
+ | Нужно | Файл | ≈токенов |
60
+ |---|---|---|
61
+ | Полная методика, 9 шагов | `process.md` | 3.5k |
62
+ | Контракт, достоверность, антипаттерны | `rules.md` | 2.8k |
63
+ | Быстрый пост, бриф, отчёт, гейт | `quick-recipes.md` | 2k |
64
+ | Новость, репортаж, интервью, лонгрид | `journalism.md` | 6.5k |
65
+ | ВК, Telegram, ОК, Дзен, Rutube | `social-media.md` | 7k |
66
+ | Госсайт, больница, YMYL, закон | `government-medical.md` | 6.5k |
67
+ | Научпоп, риск, аналогии | `science-popular.md` | 6k |
68
+ | AI-штампы, ритм, живой стиль | `anti-ai-style.md` | 6.5k |
69
+ | Иллюстрации, права, промпты | `images.md` | 5.5k |
70
+ | Статья под поиск, E-E-A-T | `seo-content.md` | 4k |
71
+ | Факт-чек, источники, цифры | `fact-checking.md` | 5k |
72
+ | Шаблоны, каркасы, чек-листы | `templates.md` + `../assets/` | 4.5–7k |
73
+ | Вычитка, типографика | `editing.md` | 4k |
74
+ | Законы, стандарты, площадки | `sources.md` | 1k |
75
+
76
+ ## 3. Гейт перед сдачей
77
+
78
+ P0 — без этого не сдавать:
79
+ - [ ] Факты, цифры, имена, даты сверены; `[ПРОВЕРИТЬ]` нет; ссылки открываются.
80
+ - [ ] Цитаты дословны; заголовок и лид не обещают лишнего; CTA один.
81
+ - [ ] Медицина: автор, даты, источники, дисклеймер; права на фото и согласия есть.
82
+ - [ ] Сайт: title, description, один H1, alt, даты, автор, JSON-LD (см. `seo`).
83
+ - [ ] Отчёт сдан: источники, что не проверено, риски.
84
+
85
+ P1/P2 — `quick-recipes.md` §4 и `assets/checklists/publish.md`.
@@ -0,0 +1,53 @@
1
+ # Чек-лист факт-чека (быстрый)
2
+
3
+ Полная методика — `references/fact-checking.md`. Здесь — рабочий минимум перед публикацией.
4
+
5
+ ## Таблица фактов
6
+
7
+ | № | Утверждение | Тип | Источник | Дата проверки | Статус |
8
+ |---|---|---|---|---|---|
9
+ | 1 | | число | | | |
10
+ | 2 | | дата | | | |
11
+ | 3 | | цитата | | | |
12
+ | 4 | | документ | | | |
13
+
14
+ Статусы: **подтверждено · требует уточнения · опровергнуто · удалено**.
15
+
16
+ ## Проверки
17
+
18
+ **Цифры**
19
+ - [ ] Источник, период, регион, база, единицы.
20
+ - [ ] Арифметика сходится (части = целое, % = 100).
21
+ - [ ] Абсолютный и относительный риск — оба.
22
+ - [ ] Цифра не устарела.
23
+
24
+ **Даты**
25
+ - [ ] Год, месяц, число; «с какого числа» и «какого года».
26
+ - [ ] Не путать принятие/публикацию/вступление в силу.
27
+
28
+ **Имена и должности**
29
+ - [ ] ФИО по официальному написанию; должность актуальна.
30
+ - [ ] Организация — полное официальное название.
31
+
32
+ **Цитаты**
33
+ - [ ] Дословно по записи/расшифровке.
34
+ - [ ] Атрибуция: кто, должность, где и когда.
35
+ - [ ] Правили — согласовано; пересказ — без кавычек.
36
+
37
+ **Законы**
38
+ - [ ] Номер, дата, статья; действующая редакция.
39
+ - [ ] Официальное опубликование.
40
+
41
+ **Медицина/наука**
42
+ - [ ] Первоисточник, дизайн, выборка, ограничения.
43
+ - [ ] Нет обещаний; формулировка «может/связано» сохранена.
44
+ - [ ] Источник — клинреки/инструкция/обзор, а не форум.
45
+
46
+ **Ссылки**
47
+ - [ ] Все открываются и ведут туда, куда обещано.
48
+ - [ ] Нет `[ПРОВЕРИТЬ]` и заглушек.
49
+
50
+ ## Если найдена ошибка
51
+ - [ ] Убрать/исправить до публикации.
52
+ - [ ] Если уже опубликовано — исправить открыто, с пометкой «исправлено» и датой.
53
+ - [ ] Сообщить ответственному; зафиксировать в отчёте.
@@ -0,0 +1,65 @@
1
+ # Чек-лист публикации (P0/P1)
2
+
3
+ > Перед сдачей/публикацией. P0 — не публиковать, пока не закрыто. P1 — исправить или явно вынести
4
+ > в отчёт с причиной.
5
+
6
+ ## P0 — блокирующие
7
+
8
+ **Факты**
9
+ - [ ] Все цифры, даты, имена, должности сверены с первоисточником.
10
+ - [ ] Цитаты дословны и атрибутированы; пересказы без кавычек.
11
+ - [ ] Законодательные ссылки — с номером/датой/статьёй и актуальным статусом.
12
+ - [ ] Нет `[ПРОВЕРИТЬ]`, заглушек, «TODO», выдуманных фактов и ссылок.
13
+ - [ ] Ссылки открываются и ведут туда, куда обещано.
14
+
15
+ **Текст**
16
+ - [ ] Лид отвечает на главный вопрос в первых 2–4 предложениях.
17
+ - [ ] Заголовок честный, конкретный, не кликбейт.
18
+ - [ ] Понятно, кому и зачем текст; CTA один.
19
+ - [ ] Нет противоречий внутри текста (даты, цифры, термины).
20
+
21
+ **Медицина/гос**
22
+ - [ ] Автор (врач) и/или ответственный указаны; дата публикации/проверки.
23
+ - [ ] Источники: клинреки/Минздрав/ВОЗ/инструкции — для медицинских утверждений.
24
+ - [ ] Дисклеймер («не заменяет консультацию врача»).
25
+ - [ ] Нет обещаний излечения, гарантий, запугивания, «врачи скрывают».
26
+ - [ ] Есть «когда обращаться к врачу»; срочное — 103/112.
27
+ - [ ] Правовые требования (реклама медуслуг 38-ФЗ, ПП 1006, ПДн) проверены.
28
+ - [ ] Согласование ответственным получено.
29
+
30
+ **Права и приватность**
31
+ - [ ] Изображения: права есть (своё/лицензия/сгенерировано), источник указан.
32
+ - [ ] Пациенты/сотрудники/дети — согласия на фото и данные.
33
+ - [ ] Нет лишних персональных данных (адреса, телефоны, документы в кадре).
34
+
35
+ ## P1 — качество
36
+
37
+ **Стиль**
38
+ - [ ] Прочитано вслух; нет спотыканий.
39
+ - [ ] Нет AI-штампов из `references/anti-ai-style.md` §2.
40
+ - [ ] Ритм неровный; абзацы 2–5 предложений.
41
+ - [ ] Конкретика вместо общих слов; минимум 3 проверяемых факта.
42
+ - [ ] Типографика: кавычки, тире, числа, даты, единицы.
43
+
44
+ **Визуал**
45
+ - [ ] Картинка по смыслу; размер/пропорция под канал.
46
+ - [ ] Alt описательный; подпись с источником; текст на картинке читается.
47
+ - [ ] Для сайта: превью 1200×630 для ссылок.
48
+
49
+ **Сайт/SEO (если публикуем на сайте)**
50
+ - [ ] `title` 50–60 знаков, уникальный; `description` 140–160.
51
+ - [ ] Один `H1`; H2 по иерархии.
52
+ - [ ] 2–6 внутренних ссылок, описательные анкоры.
53
+ - [ ] FAQ из реальных вопросов (если есть).
54
+ - [ ] JSON-LD при публикации; поля = контенту.
55
+ - [ ] Проверено на мобильном в реальной вёрстке.
56
+
57
+ **Соцсети (если пост)**
58
+ - [ ] Длина и формат под площадку; хук в первых строках.
59
+ - [ ] Хэштеги/рубрика по редполитике.
60
+ - [ ] Превью ссылки проверено.
61
+
62
+ ## После публикации
63
+ - [ ] Ссылка открывается; превью и картинка на месте.
64
+ - [ ] Отчёт заказчику/Lead'у отправлен.
65
+ - [ ] Если были исправления — зафиксированы с датой.