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.
- package/CHANGELOG.md +33 -0
- package/README.md +29 -14
- package/commands/demo.md +1 -1
- package/dist/context-bus.js +70 -0
- package/dist/context-db.js +265 -0
- package/dist/continuity.js +12 -0
- package/dist/file-watcher.js +79 -0
- package/dist/index.js +152 -1
- package/dist/l0-indexer.js +158 -0
- package/dist/mcp-context-server.js +400 -0
- package/dist/migrate-json-to-sqlite.js +126 -0
- package/dist/skill-chain.js +19 -3
- package/dist/token-budget.js +108 -0
- package/dist/uri-resolver.js +203 -0
- package/package.json +7 -1
- package/skills/_shared/helpers.md +50 -14
- package/skills/cm-autopilot/SKILL.md +29 -0
- package/skills/cm-autopilot/scripts/autopilot.py +190 -0
- package/skills/cm-continuity/SKILL.md +90 -28
- package/skills/cm-quality-gate/SKILL.md +11 -1
- package/skills/cm-safe-deploy/SKILL.md +38 -2
- package/skills/cm-security-gate/SKILL.md +158 -34
- package/skills/cm-skill-chain/SKILL.md +47 -1
- package/skills/cm-start/SKILL.md +11 -2
- package/skills/cm-test-gate/SKILL.md +3 -0
- package/skills/boxme-git-config/SKILL.md +0 -56
- package/skills/boxme-local-dev/SKILL.md +0 -66
- package/skills/jobs-to-be-done/SKILL.md +0 -266
- package/skills/jobs-to-be-done/references/case-studies.md +0 -154
- package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
- package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
- package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
- package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
- package/skills/marketplace-report-crawler/SKILL.md +0 -176
- package/skills/marketplace-report-crawler/config/accounts.json +0 -41
- package/skills/marketplace-report-crawler/config/report-types.json +0 -422
- package/skills/marketplace-report-crawler/config/sessions.json +0 -3
- package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
- package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
- package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
- package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
- package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
- package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
- package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
- package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
- package/skills/medical-research/SKILL.md +0 -194
- package/skills/medical-research/scripts/evidence_checker.py +0 -288
- package/skills/mom-test/SKILL.md +0 -267
- package/skills/mom-test/references/avoiding-bad-data.md +0 -221
- package/skills/mom-test/references/case-studies.md +0 -306
- package/skills/mom-test/references/commitment-advancement.md +0 -219
- package/skills/mom-test/references/finding-conversations.md +0 -251
- package/skills/mom-test/references/processing-learning.md +0 -256
- package/skills/mom-test/references/question-patterns.md +0 -198
- package/skills/pandasai-analytics/SKILL.md +0 -251
- package/skills/release-it/SKILL.md +0 -235
- package/skills/release-it/references/anti-patterns.md +0 -279
- package/skills/release-it/references/capacity-planning.md +0 -285
- package/skills/release-it/references/chaos-engineering.md +0 -325
- package/skills/release-it/references/deployment-strategies.md +0 -331
- package/skills/release-it/references/observability.md +0 -301
- package/skills/release-it/references/stability-patterns.md +0 -355
- package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
- package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
- package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
- package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
- package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
- package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
- package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
- package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
- package/skills/skill-creator-ultra/README.md +0 -1242
- package/skills/skill-creator-ultra/SKILL.md +0 -388
- package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
- package/skills/skill-creator-ultra/agents/comparator.md +0 -202
- package/skills/skill-creator-ultra/agents/grader.md +0 -223
- package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
- package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
- package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
- package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
- package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
- package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
- package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
- package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
- package/skills/skill-creator-ultra/install.ps1 +0 -289
- package/skills/skill-creator-ultra/install.sh +0 -313
- package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
- package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
- package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
- package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
- package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
- package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
- package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
- package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
- package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
- package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
- package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
- package/skills/skill-creator-ultra/resources/checklist.md +0 -243
- package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
- package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
- package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
- package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
- package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
- package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
- package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
- package/skills/skill-creator-ultra/resources/schemas.md +0 -430
- package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
- package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
- package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
- package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
- package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
- package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
- package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
- package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
- package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
- package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
- package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
- package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
- package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
- package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
- package/skills/tailwind-mastery/SKILL.md +0 -229
- package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
- package/skills/vercel-react-best-practices/README.md +0 -123
- package/skills/vercel-react-best-practices/SKILL.md +0 -143
- package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
- package/skills/vercel-react-best-practices/rules/_template.md +0 -28
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
- package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- 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()
|