codymaster 4.4.4 → 4.5.1

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 (190) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +29 -14
  3. package/commands/demo.md +1 -1
  4. package/dist/context-bus.js +70 -0
  5. package/dist/context-db.js +265 -0
  6. package/dist/continuity.js +12 -0
  7. package/dist/file-watcher.js +79 -0
  8. package/dist/index.js +152 -1
  9. package/dist/l0-indexer.js +158 -0
  10. package/dist/mcp-context-server.js +400 -0
  11. package/dist/migrate-json-to-sqlite.js +126 -0
  12. package/dist/skill-chain.js +19 -3
  13. package/dist/token-budget.js +108 -0
  14. package/dist/uri-resolver.js +203 -0
  15. package/package.json +7 -1
  16. package/skills/_shared/helpers.md +50 -14
  17. package/skills/cm-autopilot/SKILL.md +29 -0
  18. package/skills/cm-autopilot/scripts/autopilot.py +190 -0
  19. package/skills/cm-continuity/SKILL.md +90 -28
  20. package/skills/cm-quality-gate/SKILL.md +11 -1
  21. package/skills/cm-safe-deploy/SKILL.md +38 -2
  22. package/skills/cm-security-gate/SKILL.md +158 -34
  23. package/skills/cm-skill-chain/SKILL.md +47 -1
  24. package/skills/cm-start/SKILL.md +11 -2
  25. package/skills/cm-test-gate/SKILL.md +3 -0
  26. package/skills/boxme-git-config/SKILL.md +0 -56
  27. package/skills/boxme-local-dev/SKILL.md +0 -66
  28. package/skills/jobs-to-be-done/SKILL.md +0 -266
  29. package/skills/jobs-to-be-done/references/case-studies.md +0 -154
  30. package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
  31. package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
  32. package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
  33. package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
  34. package/skills/marketplace-report-crawler/SKILL.md +0 -176
  35. package/skills/marketplace-report-crawler/config/accounts.json +0 -41
  36. package/skills/marketplace-report-crawler/config/report-types.json +0 -422
  37. package/skills/marketplace-report-crawler/config/sessions.json +0 -3
  38. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
  39. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
  40. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
  41. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
  42. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
  43. package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
  44. package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
  45. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
  46. package/skills/medical-research/SKILL.md +0 -194
  47. package/skills/medical-research/scripts/evidence_checker.py +0 -288
  48. package/skills/mom-test/SKILL.md +0 -267
  49. package/skills/mom-test/references/avoiding-bad-data.md +0 -221
  50. package/skills/mom-test/references/case-studies.md +0 -306
  51. package/skills/mom-test/references/commitment-advancement.md +0 -219
  52. package/skills/mom-test/references/finding-conversations.md +0 -251
  53. package/skills/mom-test/references/processing-learning.md +0 -256
  54. package/skills/mom-test/references/question-patterns.md +0 -198
  55. package/skills/pandasai-analytics/SKILL.md +0 -251
  56. package/skills/release-it/SKILL.md +0 -235
  57. package/skills/release-it/references/anti-patterns.md +0 -279
  58. package/skills/release-it/references/capacity-planning.md +0 -285
  59. package/skills/release-it/references/chaos-engineering.md +0 -325
  60. package/skills/release-it/references/deployment-strategies.md +0 -331
  61. package/skills/release-it/references/observability.md +0 -301
  62. package/skills/release-it/references/stability-patterns.md +0 -355
  63. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
  64. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
  65. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
  66. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
  67. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
  68. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
  69. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
  70. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
  71. package/skills/skill-creator-ultra/README.md +0 -1242
  72. package/skills/skill-creator-ultra/SKILL.md +0 -388
  73. package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
  74. package/skills/skill-creator-ultra/agents/comparator.md +0 -202
  75. package/skills/skill-creator-ultra/agents/grader.md +0 -223
  76. package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
  77. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
  78. package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
  79. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
  80. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
  81. package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
  82. package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
  83. package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
  84. package/skills/skill-creator-ultra/install.ps1 +0 -289
  85. package/skills/skill-creator-ultra/install.sh +0 -313
  86. package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
  87. package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
  88. package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
  89. package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
  90. package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
  91. package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
  92. package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
  93. package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
  94. package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
  95. package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
  96. package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
  97. package/skills/skill-creator-ultra/resources/checklist.md +0 -243
  98. package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
  99. package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
  100. package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
  101. package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
  102. package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
  103. package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
  104. package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
  105. package/skills/skill-creator-ultra/resources/schemas.md +0 -430
  106. package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
  107. package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
  108. package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
  109. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
  110. package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
  111. package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
  112. package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
  113. package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
  114. package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
  115. package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
  116. package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
  117. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
  118. package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
  119. package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
  120. package/skills/tailwind-mastery/SKILL.md +0 -229
  121. package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
  122. package/skills/vercel-react-best-practices/README.md +0 -123
  123. package/skills/vercel-react-best-practices/SKILL.md +0 -143
  124. package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
  125. package/skills/vercel-react-best-practices/rules/_template.md +0 -28
  126. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  127. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  128. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  129. package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  130. package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  131. package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  132. package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  133. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  134. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  135. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  136. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  137. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  138. package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  139. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  140. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  141. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  142. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  143. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  144. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  145. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  146. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  147. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  148. package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  149. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  150. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  151. package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  152. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  153. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  154. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  155. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  156. package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  157. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  158. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  159. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  160. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  161. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  162. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  163. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  164. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  165. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  166. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  167. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  168. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  169. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  170. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  171. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  172. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  173. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  174. package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  175. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  176. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  177. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  178. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  179. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  180. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  181. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  182. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  183. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  184. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  185. package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  186. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  187. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  188. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  189. package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  190. package/skills/web-design-guidelines/SKILL.md +0 -39
@@ -1,83 +0,0 @@
1
- #!/bin/bash
2
- # ============================================================================
3
- # Marketplace Report Folder Structure Generator
4
- # ============================================================================
5
- # Usage: bash setup-folders.sh [output_root] [yearMonth]
6
- # Example: bash setup-folders.sh ./data 202602
7
- #
8
- # Creates organized folder tree:
9
- # {root}/{Platform}/{Brand}/{report_type}/
10
- # Files will be saved as: {YYYYMM}_{Brand}_{report_type}.{ext}
11
- # ============================================================================
12
-
13
- set -e
14
-
15
- # --- Configuration ---
16
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
17
- CONFIG_DIR="${SCRIPT_DIR}/../config"
18
- OUTPUT_ROOT="${1:-/Users/todyle/Builder/Boxme/AutomateReport/data}"
19
- YEAR_MONTH="${2:-$(date -v-1m +%Y%m 2>/dev/null || date -d '-1 month' +%Y%m)}"
20
-
21
- echo "=============================================="
22
- echo "📁 Marketplace Report Folder Generator"
23
- echo "=============================================="
24
- echo "📂 Output Root: ${OUTPUT_ROOT}"
25
- echo "📅 Period: ${YEAR_MONTH}"
26
- echo ""
27
-
28
- # --- Read configs using Node.js (cross-platform JSON parsing) ---
29
- if ! command -v node &> /dev/null; then
30
- echo "❌ Node.js is required. Please install it first."
31
- exit 1
32
- fi
33
-
34
- # Extract accounts and report types from JSON configs
35
- ACCOUNTS=$(node -e "
36
- const accounts = require('${CONFIG_DIR}/accounts.json').accounts;
37
- const reportTypes = require('${CONFIG_DIR}/report-types.json').reportTypes;
38
-
39
- // For each active account, list platform + report types
40
- accounts.filter(a => a.active).forEach(account => {
41
- account.platforms.forEach(platform => {
42
- const reports = reportTypes
43
- .filter(r => r.platform === platform && r.status !== 'disabled')
44
- .map(r => r.id);
45
- // Deduplicate report IDs
46
- const uniqueReports = [...new Set(reports)];
47
- uniqueReports.forEach(reportId => {
48
- console.log(\`\${platform}|\${account.brandSlug}|\${reportId}\`);
49
- });
50
- });
51
- });
52
- ")
53
-
54
- # --- Create folders ---
55
- FOLDER_COUNT=0
56
-
57
- echo "$ACCOUNTS" | while IFS='|' read -r platform brand reportType; do
58
- # Capitalize platform name for folder
59
- PLATFORM_DIR=$(echo "$platform" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')
60
-
61
- FOLDER_PATH="${OUTPUT_ROOT}/${PLATFORM_DIR}/${brand}/${reportType}"
62
-
63
- if [ ! -d "$FOLDER_PATH" ]; then
64
- mkdir -p "$FOLDER_PATH"
65
- echo " ✅ Created: ${PLATFORM_DIR}/${brand}/${reportType}/"
66
- else
67
- echo " ⏭️ Exists: ${PLATFORM_DIR}/${brand}/${reportType}/"
68
- fi
69
-
70
- FOLDER_COUNT=$((FOLDER_COUNT + 1))
71
- done
72
-
73
- echo ""
74
- echo "=============================================="
75
- echo "✅ Folder structure ready!"
76
- echo ""
77
- echo "📝 File naming convention:"
78
- echo " {YYYYMM}_{Brand}_{report_type}.{ext}"
79
- echo " Example: ${YEAR_MONTH}_Vita_Dairy_platform_income.xlsx"
80
- echo ""
81
- echo "📂 Full path example:"
82
- echo " ${OUTPUT_ROOT}/Shopee/Vita_Dairy/platform_income/${YEAR_MONTH}_Vita_Dairy_platform_income.xlsx"
83
- echo "=============================================="
@@ -1,194 +0,0 @@
1
- ---
2
- name: medical-research
3
- description: Evidence-based medical writing protocol for OB/GYN research articles. Ensures citation standards, Level of Evidence grading, anti-hallucination rules, and clinical accuracy markers. Use when generating or reviewing medical content.
4
- allowed-tools: Read, Write, Edit, Bash
5
- version: 1.0
6
- priority: HIGH
7
- ---
8
-
9
- # Medical Research — Evidence-Based Writing Protocol
10
-
11
- > **Mandatory** when writing medical articles for the OB/GYN RND system.
12
-
13
- ---
14
-
15
- ## 1. Evidence Grading — Oxford CEBM
16
-
17
- Every recommendation/protocol in articles **MUST** include Level of Evidence:
18
-
19
- | Level | Evidence Type | In-Article Notation |
20
- |-------|--------------|---------------------|
21
- | **I** | Systematic Review / Meta-analysis / Large RCT | `[LoE: I]` |
22
- | **II** | Small RCT / High-quality Cohort study | `[LoE: II]` |
23
- | **III** | Case-control study / Retrospective Cohort | `[LoE: III]` |
24
- | **IV** | Case series / Cross-sectional | `[LoE: IV]` |
25
- | **V** | Expert opinion / Consensus | `[LoE: V]` |
26
-
27
- **Rules:**
28
- - Each pathology article (Tier 2) must have **at least 3 recommendations with LoE**
29
- - Each technique article (Tier 3) must have **at least 2 recommendations with LoE**
30
- - Each foundation article (Tier 1) must have **at least 1 LoE**
31
- - Include LoE **inline** right after the recommendation, e.g.: `Aspirin 150mg from week 12 for high-risk group [LoE: I — ASPRE trial 2017]`
32
-
33
- ---
34
-
35
- ## 2. Citation Standard — Mandatory References
36
-
37
- ### Accepted Sources (in priority order)
38
-
39
- | Priority | Source | Citation Example |
40
- |----------|--------|-----------------|
41
- | **P0** | National MoH Guidelines | `[MoH 2023 — Diagnosis and Treatment Guidelines]` |
42
- | **P1** | ACOG Practice Bulletin | `[ACOG PB #234, 2024]` |
43
- | **P1** | ASRM Committee Opinion | `[ASRM CO 2023]` |
44
- | **P1** | ESHRE Guideline | `[ESHRE Guideline 2024]` |
45
- | **P2** | WHO Recommendation | `[WHO 2023]` |
46
- | **P2** | Cochrane Systematic Review | `[Cochrane 2023]` |
47
- | **P3** | NICE / RCOG | `[NICE NG000, 2024]` |
48
- | **P3** | UpToDate / Standard Textbook | `[Williams Obstetrics 26th Ed]` |
49
-
50
- ### Citation Rules
51
-
52
- - Each article **MUST** have a `## REFERENCES` section at the end
53
- - Each pathology article (T2) must cite **≥ 3 different guidelines**
54
- - Each technique article (T3) must cite **≥ 2 guidelines**
55
- - Each foundation article (T1) must cite **≥ 2 guidelines**
56
- - Cite **inline** within text, e.g.: `According to ACOG PB #234 (2024), IVF success rate in women > 40 is 15-20%`
57
- - **DO NOT** accept vague citations: ~~"According to research"~~, ~~"Experts suggest"~~
58
-
59
- ---
60
-
61
- ## 3. Anti-Hallucination Rules — No Fabrication
62
-
63
- > 🔴 **CRITICAL:** The most important rules for medical content.
64
-
65
- | Rule | Description | Violation Example |
66
- |------|-------------|-------------------|
67
- | **No fabricated statistics** | Do not invent percentages or statistical figures | ❌ "Success rate 87.3%" (no source) |
68
- | **No fabricated drugs** | Only list real medications with correct dosages | ❌ Inventing non-existent brand names |
69
- | **No fabricated guidelines** | Only cite real, existing guidelines | ❌ "ACOG PB #999" (doesn't exist) |
70
- | **No fabricated studies** | Do not create fake author names/years | ❌ "According to Smith et al. (2024)..." (fabricated) |
71
- | **When uncertain → state clearly** | Write "Data varies..." or use ranges | ✅ "Rate ~10-20% (varies by study)" |
72
-
73
- ### Safe Phrases When Exact Data Is Missing
74
-
75
- ```
76
- ✅ "Rate ranges from X-Y% depending on the study"
77
- ✅ "Based on available literature, estimated at approximately..."
78
- ✅ "Local data is limited; international reports indicate..."
79
- ✅ "Further research needed to confirm"
80
- ❌ "Exactly XX.X%" (when no specific source exists)
81
- ```
82
-
83
- ---
84
-
85
- ## 4. Clinical Safety Markers — Medical Markup
86
-
87
- Each pathology article (T2) **MUST** include all 4 markers:
88
-
89
- | Marker | Purpose | Format |
90
- |--------|---------|--------|
91
- | `> 💊 CLINICAL NOTE` | Most important practice consideration | Blockquote |
92
- | `> ⚠️ RED FLAG` | When urgent intervention / referral is needed | Blockquote |
93
- | `> 📚 REFERENCE` | Primary guideline for this topic | Blockquote |
94
- | `> ⚕️ DISCLAIMER` | Specialist consultation required | Blockquote at end |
95
-
96
- ### Mandatory Disclaimer (end of each article)
97
-
98
- ```markdown
99
- > ⚕️ **DISCLAIMER:** This article is for medical reference purposes only.
100
- > All diagnostic and treatment decisions **require specialist physician guidance**.
101
- > Do not self-apply protocols without specific clinical evaluation.
102
- ```
103
-
104
- ---
105
-
106
- ## 5. Cross-Reference Protocol
107
-
108
- ### Inter-Article Links
109
-
110
- - When mentioning a pathology/technique with its own article → **MUST include article code**
111
- - Format: `→ See details: [VSN-04] Endometriosis`
112
- - Section `## CROSS-LINKS` must list all related articles
113
-
114
- ### ICD-10
115
-
116
- - Pathology articles (T2) with ICD-10 codes → **MUST include in header**
117
- - Format: `> **ICD-10:** N97.0 | **Group:** VSN`
118
-
119
- ---
120
-
121
- ## 6. Medical Writing Audit — 8-Dimension Evaluation
122
-
123
- When reviewing medical articles, score across 8 dimensions (1-10):
124
-
125
- | Dimension | Question | Passing Standard |
126
- |-----------|----------|-----------------|
127
- | **1. Evidence Quality** | Are LoE markers on key recommendations? | ≥ 3 LoE markers |
128
- | **2. Citation Depth** | Are specific guidelines cited? | ≥ 3 different sources |
129
- | **3. Clinical Accuracy** | Are drug doses, metrics correct? | No medical errors |
130
- | **4. Structure** | Correct template, all sections present? | 100% sections with content |
131
- | **5. ICD-10 Compliance** | Correct ICD-10 code present? | Header has ICD-10 |
132
- | **6. Safety Markers** | Red Flag, Disclaimer present? | 4/4 markers |
133
- | **7. Cross-References** | Links to related articles? | ≥ 2 cross-links |
134
- | **8. Word Count** | Meets minimum length? | T1≥1500, T2≥2000, T3≥1500 |
135
-
136
- **Scoring:**
137
- - **72-80:** Excellent — publish ready
138
- - **56-71:** Good — minor revisions needed
139
- - **40-55:** Average — needs more evidence
140
- - **< 40:** Fail — rewrite
141
-
142
- ---
143
-
144
- ## 7. Template Enhancement Rules
145
-
146
- When creating new articles, inject these additional requirements into the prompt:
147
-
148
- ### For Pathology Articles (T2)
149
-
150
- ```
151
- EVIDENCE-BASED REQUIREMENTS:
152
- 1. Each treatment recommendation includes [LoE: I-V] + source
153
- 2. "DIAGNOSIS" section must have a test table with "Source Guideline" column
154
- 3. "TREATMENT" section must cite specific protocols (ACOG/MoH/ASRM)
155
- 4. End of article has "## REFERENCES" listing ≥ 3 guidelines
156
- 5. End of article has medical DISCLAIMER
157
- 6. DO NOT fabricate statistics — use estimated ranges when exact data is unavailable
158
- ```
159
-
160
- ### For Technique Articles (T3)
161
-
162
- ```
163
- EVIDENCE-BASED REQUIREMENTS:
164
- 1. Each procedure step cites source protocol (ASRM/ESHRE/MoH)
165
- 2. Drug tables must have a "Guideline" column
166
- 3. Success rates must cite source + confidence interval
167
- 4. End of article has "## REFERENCES" ≥ 2 guidelines
168
- 5. End of article has medical DISCLAIMER
169
- ```
170
-
171
- ---
172
-
173
- ## Verification Script
174
-
175
- Run after article generation to check quality:
176
-
177
- ```bash
178
- python3 ~/.gemini/antigravity/skills/medical-research/scripts/evidence_checker.py <output_dir>
179
- ```
180
-
181
- Script checks: References, LoE markers, ICD-10, Disclaimer, word count, cross-links.
182
-
183
- ---
184
-
185
- ## Quick Diagnostic
186
-
187
- | Question | If NO | Action |
188
- |----------|-------|--------|
189
- | Has REFERENCES section? | Article lacks sources | Add ≥ 3 guidelines |
190
- | Has LoE for recommendations? | Unclear reliability | Assign LoE I-V |
191
- | Has ICD-10 in header? | Missing coding | Add ICD-10 |
192
- | Has RED FLAG? | Missing clinical warning | Add ⚠️ marker |
193
- | Has DISCLAIMER? | Legal risk | Add disclaimer at end |
194
- | Do statistics have sources? | Suspected hallucination | Convert to estimated ranges |
@@ -1,288 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Medical Research Evidence Checker
4
- Validates generated medical articles against evidence-based writing standards.
5
-
6
- Usage:
7
- python3 evidence_checker.py <output_dir> # Check all .md files
8
- python3 evidence_checker.py <output_dir> --strict # Fail on warnings too
9
- python3 evidence_checker.py <file.md> # Check single file
10
- """
11
- import argparse
12
- import re
13
- import sys
14
- from dataclasses import dataclass, field
15
- from pathlib import Path
16
-
17
-
18
- # === Thresholds ===
19
- MIN_WORDS = {"T1": 1500, "T2": 2000, "T3": 1500}
20
- MIN_REFERENCES = {"T1": 2, "T2": 3, "T3": 2}
21
- MIN_LOE_MARKERS = {"T1": 1, "T2": 3, "T3": 2}
22
-
23
- GUIDELINE_ORGS = [
24
- "ACOG", "ASRM", "ESHRE", "WHO", "BYT", "NICE", "RCOG",
25
- "Cochrane", "FIGO", "ISUOG", "RANZCOG", "SOGC",
26
- ]
27
-
28
- TIER_MAP = {
29
- "F-": "T1",
30
- "VSN-": "T2", "VSM-": "T2", "NTI-": "T2", "BT-": "T2",
31
- "TC-": "T2", "VT-": "T2", "CTC-": "T2", "AD-": "T2",
32
- "VU-": "T2", "TK1-": "T2", "TK2-": "T2", "TK3-": "T2",
33
- "TNC-": "T2", "SSL-": "T2", "HSS-": "T2", "VNPK-": "T2",
34
- "SMTD-": "T2", "SLTT-": "T2", "UPKSS-": "T2", "PLHP-": "T2",
35
- "KTHT-": "T3", "PD-": "T3", "PHO-": "T3", "TDP-": "T3",
36
- "DT-": "T3",
37
- }
38
-
39
-
40
- @dataclass
41
- class CheckResult:
42
- file: str
43
- tier: str = "T2"
44
- word_count: int = 0
45
- has_references: bool = False
46
- reference_count: int = 0
47
- guideline_refs: list = field(default_factory=list)
48
- loe_count: int = 0
49
- has_icd10: bool = False
50
- has_red_flag: bool = False
51
- has_disclaimer: bool = False
52
- has_cross_links: bool = False
53
- errors: list = field(default_factory=list)
54
- warnings: list = field(default_factory=list)
55
-
56
- @property
57
- def score(self) -> int:
58
- s = 0
59
- min_words = MIN_WORDS.get(self.tier, 1500)
60
- min_refs = MIN_REFERENCES.get(self.tier, 2)
61
- min_loe = MIN_LOE_MARKERS.get(self.tier, 1)
62
-
63
- # Word count (0-10)
64
- if self.word_count >= min_words:
65
- s += 10
66
- elif self.word_count >= min_words * 0.7:
67
- s += 6
68
- elif self.word_count >= min_words * 0.5:
69
- s += 3
70
-
71
- # References (0-10)
72
- if self.reference_count >= min_refs:
73
- s += 10
74
- elif self.reference_count >= 1:
75
- s += 5
76
-
77
- # Guideline orgs (0-10)
78
- if len(self.guideline_refs) >= min_refs:
79
- s += 10
80
- elif len(self.guideline_refs) >= 1:
81
- s += 5
82
-
83
- # LoE markers (0-10)
84
- if self.loe_count >= min_loe:
85
- s += 10
86
- elif self.loe_count >= 1:
87
- s += 5
88
-
89
- # ICD-10 (0-10) — only for T2
90
- if self.tier == "T2":
91
- s += 10 if self.has_icd10 else 0
92
- else:
93
- s += 10 # N/A for T1/T3
94
-
95
- # Red flag (0-10) — only for T2
96
- if self.tier == "T2":
97
- s += 10 if self.has_red_flag else 0
98
- else:
99
- s += 10
100
-
101
- # Disclaimer (0-10)
102
- s += 10 if self.has_disclaimer else 0
103
-
104
- # Cross-links (0-10)
105
- s += 10 if self.has_cross_links else 0
106
-
107
- return s
108
-
109
- @property
110
- def grade(self) -> str:
111
- s = self.score
112
- if s >= 72:
113
- return "✅ XUẤT SẮC"
114
- if s >= 56:
115
- return "🟡 TỐT"
116
- if s >= 40:
117
- return "🟠 TRUNG BÌNH"
118
- return "❌ FAIL"
119
-
120
-
121
- def detect_tier(filename: str) -> str:
122
- for prefix, tier in TIER_MAP.items():
123
- if filename.startswith(prefix):
124
- return tier
125
- return "T2"
126
-
127
-
128
- def check_file(filepath: Path) -> CheckResult:
129
- content = filepath.read_text(encoding="utf-8")
130
- filename = filepath.stem
131
- result = CheckResult(file=str(filepath), tier=detect_tier(filename))
132
-
133
- # Word count
134
- result.word_count = len(content.split())
135
- min_words = MIN_WORDS.get(result.tier, 1500)
136
- if result.word_count < min_words:
137
- result.errors.append(f"Word count {result.word_count} < {min_words} minimum")
138
-
139
- # References section
140
- ref_patterns = [
141
- r"##\s*\d*\.?\s*TÀI LIỆU THAM KHẢO",
142
- r"##\s*\d*\.?\s*REFERENCES",
143
- r"##\s*\d*\.?\s*THAM KHẢO",
144
- ]
145
- result.has_references = any(re.search(p, content, re.IGNORECASE) for p in ref_patterns)
146
- if not result.has_references:
147
- result.errors.append("Missing '## TÀI LIỆU THAM KHẢO' section")
148
-
149
- # Count reference lines (lines starting with - or * or number in ref section)
150
- ref_section = ""
151
- for p in ref_patterns:
152
- match = re.search(p, content, re.IGNORECASE)
153
- if match:
154
- ref_section = content[match.start():]
155
- # Find next ## to limit scope
156
- next_section = re.search(r"\n##\s", ref_section[5:])
157
- if next_section:
158
- ref_section = ref_section[:next_section.start() + 5]
159
- break
160
- ref_lines = re.findall(r"^\s*[-*\d]+\.?\s+.+", ref_section, re.MULTILINE)
161
- result.reference_count = len(ref_lines)
162
-
163
- # Guideline references (anywhere in text)
164
- found_orgs = set()
165
- for org in GUIDELINE_ORGS:
166
- if re.search(rf"\b{org}\b", content, re.IGNORECASE):
167
- found_orgs.add(org)
168
- result.guideline_refs = sorted(found_orgs)
169
-
170
- min_refs = MIN_REFERENCES.get(result.tier, 2)
171
- if len(found_orgs) < min_refs:
172
- result.warnings.append(
173
- f"Only {len(found_orgs)} guideline org(s) cited, need ≥ {min_refs}"
174
- )
175
-
176
- # Level of Evidence markers
177
- loe_matches = re.findall(r"\[LoE:\s*[IViv]+", content)
178
- result.loe_count = len(loe_matches)
179
- min_loe = MIN_LOE_MARKERS.get(result.tier, 1)
180
- if result.loe_count < min_loe:
181
- result.warnings.append(f"Only {result.loe_count} LoE marker(s), need ≥ {min_loe}")
182
-
183
- # ICD-10 (for T2)
184
- icd_pattern = r"ICD-10\s*:\s*[A-Z]\d"
185
- result.has_icd10 = bool(re.search(icd_pattern, content))
186
- if result.tier == "T2" and not result.has_icd10:
187
- result.warnings.append("No ICD-10 code found (expected for pathology article)")
188
-
189
- # Red flag marker
190
- red_flag_patterns = [r"CỜ ĐỎ", r"⚠️.*CỜ ĐỎ", r"RED FLAG"]
191
- result.has_red_flag = any(re.search(p, content) for p in red_flag_patterns)
192
- if result.tier == "T2" and not result.has_red_flag:
193
- result.warnings.append("Missing '⚠️ CỜ ĐỎ' section")
194
-
195
- # Disclaimer
196
- disclaimer_patterns = [
197
- r"DISCLAIMER",
198
- r"cần chỉ định của bác sĩ",
199
- r"bác sĩ chuyên khoa",
200
- r"⚕️",
201
- ]
202
- result.has_disclaimer = any(re.search(p, content, re.IGNORECASE) for p in disclaimer_patterns)
203
- if not result.has_disclaimer:
204
- result.errors.append("Missing medical disclaimer")
205
-
206
- # Cross-links
207
- cross_patterns = [r"CROSS.?LINK", r"Xem chi tiết", r"→\s*Xem", r"Xem thêm"]
208
- result.has_cross_links = any(re.search(p, content, re.IGNORECASE) for p in cross_patterns)
209
- if not result.has_cross_links:
210
- result.warnings.append("No cross-links to related articles")
211
-
212
- return result
213
-
214
-
215
- def main():
216
- parser = argparse.ArgumentParser(description="🏥 Medical Research Evidence Checker")
217
- parser.add_argument("path", help="File or directory to check")
218
- parser.add_argument("--strict", action="store_true", help="Treat warnings as errors")
219
- args = parser.parse_args()
220
-
221
- target = Path(args.path)
222
- if target.is_file():
223
- files = [target]
224
- elif target.is_dir():
225
- files = sorted(target.rglob("*.md"))
226
- else:
227
- print(f"❌ Path not found: {target}")
228
- sys.exit(1)
229
-
230
- if not files:
231
- print(f"⚠️ No .md files found in {target}")
232
- sys.exit(0)
233
-
234
- results = [check_file(f) for f in files]
235
-
236
- # === Summary Table ===
237
- print("\n" + "=" * 80)
238
- print("🏥 MEDICAL RESEARCH EVIDENCE CHECK")
239
- print("=" * 80)
240
- print(f"\n📁 Checked: {len(results)} file(s)\n")
241
-
242
- print(f"{'File':<30} {'Tier':<5} {'Words':<7} {'Refs':<5} {'LoE':<5} {'Score':<7} {'Grade'}")
243
- print("-" * 80)
244
-
245
- total_errors = 0
246
- total_warnings = 0
247
-
248
- for r in results:
249
- fname = Path(r.file).stem[:28]
250
- print(f"{fname:<30} {r.tier:<5} {r.word_count:<7} {r.reference_count:<5} {r.loe_count:<5} {r.score}/80 {r.grade}")
251
- total_errors += len(r.errors)
252
- total_warnings += len(r.warnings)
253
-
254
- # === Detail Errors ===
255
- print(f"\n{'=' * 80}")
256
- print(f"📊 Total: {total_errors} error(s), {total_warnings} warning(s)")
257
- print(f"{'=' * 80}")
258
-
259
- if total_errors > 0 or total_warnings > 0:
260
- for r in results:
261
- if r.errors or r.warnings:
262
- print(f"\n📄 {Path(r.file).stem}")
263
- for e in r.errors:
264
- print(f" ❌ {e}")
265
- for w in r.warnings:
266
- print(f" ⚠️ {w}")
267
-
268
- # === Score Summary ===
269
- if results:
270
- avg_score = sum(r.score for r in results) / len(results)
271
- print(f"\n📈 Average Score: {avg_score:.1f}/80")
272
-
273
- excellent = sum(1 for r in results if r.score >= 72)
274
- good = sum(1 for r in results if 56 <= r.score < 72)
275
- avg = sum(1 for r in results if 40 <= r.score < 56)
276
- fail = sum(1 for r in results if r.score < 40)
277
- print(f" ✅ Xuất sắc: {excellent} | 🟡 Tốt: {good} | 🟠 TB: {avg} | ❌ Fail: {fail}")
278
-
279
- # Exit code
280
- if args.strict and (total_errors > 0 or total_warnings > 0):
281
- sys.exit(1)
282
- elif total_errors > 0:
283
- sys.exit(1)
284
- sys.exit(0)
285
-
286
-
287
- if __name__ == "__main__":
288
- main()