codymaster 4.4.5 → 4.5.2

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 (197) 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 +5 -1
  16. package/scripts/gate-0-secrets.js +63 -0
  17. package/scripts/gate-1-syntax.js +53 -0
  18. package/scripts/gate-5-dist-verify.js +55 -0
  19. package/scripts/gate-6-smoke-test.js +30 -0
  20. package/scripts/index-codebase.sh +552 -0
  21. package/scripts/mcp-bridge.js +284 -0
  22. package/scripts/postinstall.js +301 -0
  23. package/scripts/security-fixer.js +143 -0
  24. package/scripts/security-scan.js +55 -0
  25. package/scripts/test-gemini.js +13 -0
  26. package/scripts/todo-bridge.js +112 -0
  27. package/skills/_shared/helpers.md +50 -14
  28. package/skills/cm-autopilot/SKILL.md +29 -0
  29. package/skills/cm-autopilot/scripts/autopilot.py +190 -0
  30. package/skills/cm-continuity/SKILL.md +90 -28
  31. package/skills/cm-skill-chain/SKILL.md +47 -1
  32. package/skills/cm-start/SKILL.md +11 -2
  33. package/skills/boxme-git-config/SKILL.md +0 -56
  34. package/skills/boxme-local-dev/SKILL.md +0 -66
  35. package/skills/jobs-to-be-done/SKILL.md +0 -266
  36. package/skills/jobs-to-be-done/references/case-studies.md +0 -154
  37. package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
  38. package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
  39. package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
  40. package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
  41. package/skills/marketplace-report-crawler/SKILL.md +0 -176
  42. package/skills/marketplace-report-crawler/config/accounts.json +0 -41
  43. package/skills/marketplace-report-crawler/config/report-types.json +0 -422
  44. package/skills/marketplace-report-crawler/config/sessions.json +0 -3
  45. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
  46. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
  47. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
  48. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
  49. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
  50. package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
  51. package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
  52. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
  53. package/skills/medical-research/SKILL.md +0 -194
  54. package/skills/medical-research/scripts/evidence_checker.py +0 -288
  55. package/skills/mom-test/SKILL.md +0 -267
  56. package/skills/mom-test/references/avoiding-bad-data.md +0 -221
  57. package/skills/mom-test/references/case-studies.md +0 -306
  58. package/skills/mom-test/references/commitment-advancement.md +0 -219
  59. package/skills/mom-test/references/finding-conversations.md +0 -251
  60. package/skills/mom-test/references/processing-learning.md +0 -256
  61. package/skills/mom-test/references/question-patterns.md +0 -198
  62. package/skills/pandasai-analytics/SKILL.md +0 -251
  63. package/skills/release-it/SKILL.md +0 -235
  64. package/skills/release-it/references/anti-patterns.md +0 -279
  65. package/skills/release-it/references/capacity-planning.md +0 -285
  66. package/skills/release-it/references/chaos-engineering.md +0 -325
  67. package/skills/release-it/references/deployment-strategies.md +0 -331
  68. package/skills/release-it/references/observability.md +0 -301
  69. package/skills/release-it/references/stability-patterns.md +0 -355
  70. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
  71. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
  72. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
  73. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
  74. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
  75. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
  76. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
  77. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
  78. package/skills/skill-creator-ultra/README.md +0 -1242
  79. package/skills/skill-creator-ultra/SKILL.md +0 -388
  80. package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
  81. package/skills/skill-creator-ultra/agents/comparator.md +0 -202
  82. package/skills/skill-creator-ultra/agents/grader.md +0 -223
  83. package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
  84. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
  85. package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
  86. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
  87. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
  88. package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
  89. package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
  90. package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
  91. package/skills/skill-creator-ultra/install.ps1 +0 -289
  92. package/skills/skill-creator-ultra/install.sh +0 -313
  93. package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
  94. package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
  95. package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
  96. package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
  97. package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
  98. package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
  99. package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
  100. package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
  101. package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
  102. package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
  103. package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
  104. package/skills/skill-creator-ultra/resources/checklist.md +0 -243
  105. package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
  106. package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
  107. package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
  108. package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
  109. package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
  110. package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
  111. package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
  112. package/skills/skill-creator-ultra/resources/schemas.md +0 -430
  113. package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
  114. package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
  115. package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
  116. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
  117. package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
  118. package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
  119. package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
  120. package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
  121. package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
  122. package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
  123. package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
  124. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
  125. package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
  126. package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
  127. package/skills/tailwind-mastery/SKILL.md +0 -229
  128. package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
  129. package/skills/vercel-react-best-practices/README.md +0 -123
  130. package/skills/vercel-react-best-practices/SKILL.md +0 -143
  131. package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
  132. package/skills/vercel-react-best-practices/rules/_template.md +0 -28
  133. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  134. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  135. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  136. package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  137. package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  138. package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  139. package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  140. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  141. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  142. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  143. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  144. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  145. package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  146. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  147. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  148. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  149. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  150. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  151. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  152. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  153. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  154. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  155. package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  156. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  157. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  158. package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  159. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  160. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  161. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  162. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  163. package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  164. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  165. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  166. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  167. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  168. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  169. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  170. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  171. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  172. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  173. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  174. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  175. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  176. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  177. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  178. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  179. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  180. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  181. package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  182. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  183. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  184. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  185. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  186. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  187. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  188. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  189. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  190. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  191. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  192. package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  193. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  194. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  195. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  196. package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  197. 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()