[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71G5JD24RC76W9DS8RVRTP7":3,"skill-same:01M71G5JD24RC76W9DS8RVRTP7":89},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M71G5JD24RC76W9DS8RVRTP7","datamol",null,"Pythonic wrapper around RDKit with simplified interface and sensible defaults. Preferred for standard drug discovery: SMILES parsing, standardization, descriptors, fingerprints, clustering, 3D conformers, parallel processing. Returns native rdkit.Chem.Mol objects. For advanced control or custom parameters, use rdkit directly.","JSGforever\u002Fskillguard","JSGforever","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F85541948?v=4","01M71FQD3E132VMR5F4TAYX3YS","01M71FQD4DYW0XJ4XQ4YQH75Y9",2,"GPL-3.0","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"clustering","use","custom","discovery","chem","pythonic","for","parsing","parallel","returns","Wrapper","native","Fingerprints","interface","rdkit","objects","advanced","processing","3D","2026-11-10 10:12:30",false,"---\nname: datamol\ndescription: \"Pythonic wrapper around RDKit with simplified interface and sensible defaults. Preferred for standard drug discovery: SMILES parsing, standardization, descriptors, fingerprints, clustering, 3D conformers, parallel processing. Returns native rdkit.Chem.Mol objects. For advanced control or custom parameters, use rdkit directly.\"\n---\n\n# Datamol Cheminformatics Skill\n\n## Overview\n\nDatamol is a Python library that provides a lightweight, Pythonic abstraction layer over RDKit for molecular cheminformatics. Simplify complex molecular operations with sensible defaults, efficient parallelization, and modern I\u002FO capabilities. All molecular objects are native `rdkit.Chem.Mol` instances, ensuring full compatibility with the RDKit ecosystem.\n\n**Key capabilities**:\n- Molecular format conversion (SMILES, SELFIES, InChI)\n- Structure standardization and sanitization\n- Molecular descriptors and fingerprints\n- 3D conformer generation and analysis\n- Clustering and diversity selection\n- Scaffold and fragment analysis\n- Chemical reaction application\n- Visualization and alignment\n- Batch processing with parallelization\n- Cloud storage support via fsspec\n\n## Installation and Setup\n\nGuide users to install datamol:\n\n```bash\nuv pip install datamol\n```\n\n**Import convention**:\n```python\nimport datamol as dm\n```\n\n## Core Workflows\n\n### 1. Basic Molecule Handling\n\n**Creating molecules from SMILES**:\n```python\nimport datamol as dm\n\n# Single molecule\nmol = dm.to_mol(\"CCO\")  # Ethanol\n\n# From list of SMILES\nsmiles_list = [\"CCO\", \"c1ccccc1\", \"CC(=O)O\"]\nmols = [dm.to_mol(smi) for smi in smiles_list]\n\n# Error handling\nmol = dm.to_mol(\"invalid_smiles\")  # Returns None\nif mol is None:\n    print(\"Failed to parse SMILES\")\n```\n\n**Converting molecules to SMILES**:\n```python\n# Canonical SMILES\nsmiles = dm.to_smiles(mol)\n\n# Isomeric SMILES (includes stereochemistry)\nsmiles = dm.to_smiles(mol, isomeric=True)\n\n# Other formats\ninchi = dm.to_inchi(mol)\ninchikey = dm.to_inchikey(mol)\nselfies = dm.to_selfies(mol)\n```\n\n**Standardization and sanitization** (always recommend for user-provided molecules):\n```python\n# Sanitize molecule\nmol = dm.sanitize_mol(mol)\n\n# Full standardization (recommended for datasets)\nmol = dm.standardize_mol(\n    mol,\n    disconnect_metals=True,\n    normalize=True,\n    reionize=True\n)\n\n# For SMILES strings directly\nclean_smiles = dm.standardize_smiles(smiles)\n```\n\n### 2. Reading and Writing Molecular Files\n\nRefer to `references\u002Fio_module.md` for comprehensive I\u002FO documentation.\n\n**Reading files**:\n```python\n# SDF files (most common in chemistry)\ndf = dm.read_sdf(\"compounds.sdf\", mol_column='mol')\n\n# SMILES files\ndf = dm.read_smi(\"molecules.smi\", smiles_column='smiles', mol_column='mol')\n\n# CSV with SMILES column\ndf = dm.read_csv(\"data.csv\", smiles_column=\"SMILES\", mol_column=\"mol\")\n\n# Excel files\ndf = dm.read_excel(\"compounds.xlsx\", sheet_name=0, mol_column=\"mol\")\n\n# Universal reader (auto-detects format)\ndf = dm.open_df(\"file.sdf\")  # Works with .sdf, .csv, .xlsx, .parquet, .json\n```\n\n**Writing files**:\n```python\n# Save as SDF\ndm.to_sdf(mols, \"output.sdf\")\n# Or from DataFrame\ndm.to_sdf(df, \"output.sdf\", mol_column=\"mol\")\n\n# Save as SMILES file\ndm.to_smi(mols, \"output.smi\")\n\n# Excel with rendered molecule images\ndm.to_xlsx(df, \"output.xlsx\", mol_columns=[\"mol\"])\n```\n\n**Remote file support** (S3, GCS, HTTP):\n```python\n# Read from cloud storage\ndf = dm.read_sdf(\"s3:\u002F\u002Fbucket\u002Fcompounds.sdf\")\ndf = dm.read_csv(\"https:\u002F\u002Fexample.com\u002Fdata.csv\")\n\n# Write to cloud storage\ndm.to_sdf(mols, \"s3:\u002F\u002Fbucket\u002Foutput.sdf\")\n```\n\n### 3. Molecular Descriptors and Properties\n\nRefer to `references\u002Fdescriptors_viz.md` for detailed descriptor documentation.\n\n**Computing descriptors for a single molecule**:\n```python\n# Get standard descriptor set\ndescriptors = dm.descriptors.compute_many_descriptors(mol)\n# Returns: {'mw': 46.07, 'logp': -0.03, 'hbd': 1, 'hba': 1,\n#           'tpsa': 20.23, 'n_aromatic_atoms': 0, ...}\n```\n\n**Batch descriptor computation** (recommended for datasets):\n```python\n# Compute for all molecules in parallel\ndesc_df = dm.descriptors.batch_compute_many_descriptors(\n    mols,\n    n_jobs=-1,      # Use all CPU cores\n    progress=True   # Show progress bar\n)\n```\n\n**Specific descriptors**:\n```python\n# Aromaticity\nn_aromatic = dm.descriptors.n_aromatic_atoms(mol)\naromatic_ratio = dm.descriptors.n_aromatic_atoms_proportion(mol)\n\n# Stereochemistry\nn_stereo = dm.descriptors.n_stereo_centers(mol)\nn_unspec = dm.descriptors.n_stereo_centers_unspecified(mol)\n\n# Flexibility\nn_rigid = dm.descriptors.n_rigid_bonds(mol)\n```\n\n**Drug-likeness filtering (Lipinski's Rule of Five)**:\n```python\n# Filter compounds\ndef is_druglike(mol):\n    desc = dm.descriptors.compute_many_descriptors(mol)\n    return (\n        desc['mw'] \u003C= 500 and\n        desc['logp'] \u003C= 5 and\n        desc['hbd'] \u003C= 5 and\n        desc['hba'] \u003C= 10\n    )\n\ndruglike_mols = [mol for mol in mols if is_druglike(mol)]\n```\n\n### 4. Molecular Fingerprints and Similarity\n\n**Generating fingerprints**:\n```python\n# ECFP (Extended Connectivity Fingerprint, default)\nfp = dm.to_fp(mol, fp_type='ecfp', radius=2, n_bits=2048)\n\n# Other fingerprint types\nfp_maccs = dm.to_fp(mol, fp_type='maccs')\nfp_topological = dm.to_fp(mol, fp_type='topological')\nfp_atompair = dm.to_fp(mol, fp_type='atompair')\n```\n\n**Similarity calculations**:\n```python\n# Pairwise distances within a set\ndistance_matrix = dm.pdist(mols, n_jobs=-1)\n\n# Distances between two sets\ndistances = dm.cdist(query_mols, library_mols, n_jobs=-1)\n\n# Find most similar molecules\nfrom scipy.spatial.distance import squareform\ndist_matrix = squareform(dm.pdist(mols))\n# Lower distance = higher similarity (Tanimoto distance = 1 - Tanimoto similarity)\n```\n\n### 5. Clustering and Diversity Selection\n\nRefer to `references\u002Fcore_api.md` for clustering details.\n\n**Butina clustering**:\n```python\n# Cluster molecules by structural similarity\nclusters = dm.cluster_mols(\n    mols,\n    cutoff=0.2,    # Tanimoto distance threshold (0=identical, 1=completely different)\n    n_jobs=-1      # Parallel processing\n)\n\n# Each cluster is a list of molecule indices\nfor i, cluster in enumerate(clusters):\n    print(f\"Cluster {i}: {len(cluster)} molecules\")\n    cluster_mols = [mols[idx] for idx in cluster]\n```\n\n**Important**: Butina clustering builds a full distance matrix - suitable for ~1000 molecules, not for 10,000+.\n\n**Diversity selection**:\n```python\n# Pick diverse subset\ndiverse_mols = dm.pick_diverse(\n    mols,\n    npick=100  # Select 100 diverse molecules\n)\n\n# Pick cluster centroids\ncentroids = dm.pick_centroids(\n    mols,\n    npick=50   # Select 50 representative molecules\n)\n```\n\n### 6. Scaffold Analysis\n\nRefer to `references\u002Ffragments_scaffolds.md` for complete scaffold documentation.\n\n**Extracting Murcko scaffolds**:\n```python\n# Get Bemis-Murcko scaffold (core structure)\nscaffold = dm.to_scaffold_murcko(mol)\nscaffold_smiles = dm.to_smiles(scaffold)\n```\n\n**Scaffold-based analysis**:\n```python\n# Group compounds by scaffold\nfrom collections import Counter\n\nscaffolds = [dm.to_scaffold_murcko(mol) for mol in mols]\nscaffold_smiles = [dm.to_smiles(s) for s in scaffolds]\n\n# Count scaffold frequency\nscaffold_counts = Counter(scaffold_smiles)\nmost_common = scaffold_counts.most_common(10)\n\n# Create scaffold-to-molecules mapping\nscaffold_groups = {}\nfor mol, scaf_smi in zip(mols, scaffold_smiles):\n    if scaf_smi not in scaffold_groups:\n        scaffold_groups[scaf_smi] = []\n    scaffold_groups[scaf_smi].append(mol)\n```\n\n**Scaffold-based train\u002Ftest splitting** (for ML):\n```python\n# Ensure train and test sets have different scaffolds\nscaffold_to_mols = {}\nfor mol, scaf in zip(mols, scaffold_smiles):\n    if scaf not in scaffold_to_mols:\n        scaffold_to_mols[scaf] = []\n    scaffold_to_mols[scaf].append(mol)\n\n# Split scaffolds into train\u002Ftest\nimport random\nscaffolds = list(scaffold_to_mols.keys())\nrandom.shuffle(scaffolds)\nsplit_idx = int(0.8 * len(scaffolds))\ntrain_scaffolds = scaffolds[:split_idx]\ntest_scaffolds = scaffolds[split_idx:]\n\n# Get molecules for each split\ntrain_mols = [mol for scaf in train_scaffolds for mol in scaffold_to_mols[scaf]]\ntest_mols = [mol for scaf in test_scaffolds for mol in scaffold_to_mols[scaf]]\n```\n\n### 7. Molecular Fragmentation\n\nRefer to `references\u002Ffragments_scaffolds.md` for fragmentation details.\n\n**BRICS fragmentation** (16 bond types):\n```python\n# Fragment molecule\nfragments = dm.fragment.brics(mol)\n# Returns: set of fragment SMILES with attachment points like '[1*]CCN'\n```\n\n**RECAP fragmentation** (11 bond types):\n```python\nfragments = dm.fragment.recap(mol)\n```\n\n**Fragment analysis**:\n```python\n# Find common fragments across compound library\nfrom collections import Counter\n\nall_fragments = []\nfor mol in mols:\n    frags = dm.fragment.brics(mol)\n    all_fragments.extend(frags)\n\nfragment_counts = Counter(all_fragments)\ncommon_frags = fragment_counts.most_common(20)\n\n# Fragment-based scoring\ndef fragment_score(mol, reference_fragments):\n    mol_frags = dm.fragment.brics(mol)\n    overlap = mol_frags.intersection(reference_fragments)\n    return len(overlap) \u002F len(mol_frags) if mol_frags else 0\n```\n\n### 8. 3D Conformer Generation\n\nRefer to `references\u002Fconformers_module.md` for detailed conformer documentation.\n\n**Generating conformers**:\n```python\n# Generate 3D conformers\nmol_3d = dm.conformers.generate(\n    mol,\n    n_confs=50,           # Number to generate (auto if None)\n    rms_cutoff=0.5,       # Filter similar conformers (Ångströms)\n    minimize_energy=True,  # Minimize with UFF force field\n    method='ETKDGv3'      # Embedding method (recommended)\n)\n\n# Access conformers\nn_conformers = mol_3d.GetNumConformers()\nconf = mol_3d.GetConformer(0)  # Get first conformer\npositions = conf.GetPositions()  # Nx3 array of atom coordinates\n```\n\n**Conformer clustering**:\n```python\n# Cluster conformers by RMSD\nclusters = dm.conformers.cluster(\n    mol_3d,\n    rms_cutoff=1.0,\n    centroids=False\n)\n\n# Get representative conformers\ncentroids = dm.conformers.return_centroids(mol_3d, clusters)\n```\n\n**SASA calculation**:\n```python\n# Calculate solvent accessible surface area\nsasa_values = dm.conformers.sasa(mol_3d, n_jobs=-1)\n\n# Access SASA from conformer properties\nconf = mol_3d.GetConformer(0)\nsasa = conf.GetDoubleProp('rdkit_free_sasa')\n```\n\n### 9. Visualization\n\nRefer to `references\u002Fdescriptors_viz.md` for visualization documentation.\n\n**Basic molecule grid**:\n```python\n# Visualize molecules\ndm.viz.to_image(\n    mols[:20],\n    legends=[dm.to_smiles(m) for m in mols[:20]],\n    n_cols=5,\n    mol_size=(300, 300)\n)\n\n# Save to file\ndm.viz.to_image(mols, outfile=\"molecules.png\")\n\n# SVG for publications\ndm.viz.to_image(mols, outfile=\"molecules.svg\", use_svg=True)\n```\n\n**Aligned visualization** (for SAR analysis):\n```python\n# Align molecules by common substructure\ndm.viz.to_image(\n    similar_mols,\n    align=True,  # Enable MCS alignment\n    legends=activity_labels,\n    n_cols=4\n)\n```\n\n**Highlighting substructures**:\n```python\n# Highlight specific atoms and bonds\ndm.viz.to_image(\n    mol,\n    highlight_atom=[0, 1, 2, 3],  # Atom indices\n    highlight_bond=[0, 1, 2]      # Bond indices\n)\n```\n\n**Conformer visualization**:\n```python\n# Display multiple conformers\ndm.viz.conformers(\n    mol_3d,\n    n_confs=10,\n    align_conf=True,\n    n_cols=3\n)\n```\n\n### 10. Chemical Reactions\n\nRefer to `references\u002Freactions_data.md` for reactions documentation.\n\n**Applying reactions**:\n```python\nfrom rdkit.Chem import rdChemReactions\n\n# Define reaction from SMARTS\nrxn_smarts = '[C:1](=[O:2])[OH:3]>>[C:1](=[O:2])[Cl:3]'\nrxn = rdChemReactions.ReactionFromSmarts(rxn_smarts)\n\n# Apply to molecule\nreactant = dm.to_mol(\"CC(=O)O\")  # Acetic acid\nproduct = dm.reactions.apply_reaction(\n    rxn,\n    (reactant,),\n    sanitize=True\n)\n\n# Convert to SMILES\nproduct_smiles = dm.to_smiles(product)\n```\n\n**Batch reaction application**:\n```python\n# Apply reaction to library\nproducts = []\nfor mol in reactant_mols:\n    try:\n        prod = dm.reactions.apply_reaction(rxn, (mol,))\n        if prod is not None:\n            products.append(prod)\n    except Exception as e:\n        print(f\"Reaction failed: {e}\")\n```\n\n## Parallelization\n\nDatamol includes built-in parallelization for many operations. Use `n_jobs` parameter:\n- `n_jobs=1`: Sequential (no parallelization)\n- `n_jobs=-1`: Use all available CPU cores\n- `n_jobs=4`: Use 4 cores\n\n**Functions supporting parallelization**:\n- `dm.read_sdf(..., n_jobs=-1)`\n- `dm.descriptors.batch_compute_many_descriptors(..., n_jobs=-1)`\n- `dm.cluster_mols(..., n_jobs=-1)`\n- `dm.pdist(..., n_jobs=-1)`\n- `dm.conformers.sasa(..., n_jobs=-1)`\n\n**Progress bars**: Many batch operations support `progress=True` parameter.\n\n## Common Workflows and Patterns\n\n### Complete Pipeline: Data Loading → Filtering → Analysis\n\n```python\nimport datamol as dm\nimport pandas as pd\n\n# 1. Load molecules\ndf = dm.read_sdf(\"compounds.sdf\")\n\n# 2. Standardize\ndf['mol'] = df['mol'].apply(lambda m: dm.standardize_mol(m) if m else None)\ndf = df[df['mol'].notna()]  # Remove failed molecules\n\n# 3. Compute descriptors\ndesc_df = dm.descriptors.batch_compute_many_descriptors(\n    df['mol'].tolist(),\n    n_jobs=-1,\n    progress=True\n)\n\n# 4. Filter by drug-likeness\ndruglike = (\n    (desc_df['mw'] \u003C= 500) &\n    (desc_df['logp'] \u003C= 5) &\n    (desc_df['hbd'] \u003C= 5) &\n    (desc_df['hba'] \u003C= 10)\n)\nfiltered_df = df[druglike]\n\n# 5. Cluster and select diverse subset\ndiverse_mols = dm.pick_diverse(\n    filtered_df['mol'].tolist(),\n    npick=100\n)\n\n# 6. Visualize results\ndm.viz.to_image(\n    diverse_mols,\n    legends=[dm.to_smiles(m) for m in diverse_mols],\n    outfile=\"diverse_compounds.png\",\n    n_cols=10\n)\n```\n\n### Structure-Activity Relationship (SAR) Analysis\n\n```python\n# Group by scaffold\nscaffolds = [dm.to_scaffold_murcko(mol) for mol in mols]\nscaffold_smiles = [dm.to_smiles(s) for s in scaffolds]\n\n# Create DataFrame with activities\nsar_df = pd.DataFrame({\n    'mol': mols,\n    'scaffold': scaffold_smiles,\n    'activity': activities  # User-provided activity data\n})\n\n# Analyze each scaffold series\nfor scaffold, group in sar_df.groupby('scaffold'):\n    if len(group) >= 3:  # Need multiple examples\n        print(f\"\\nScaffold: {scaffold}\")\n        print(f\"Count: {len(group)}\")\n        print(f\"Activity range: {group['activity'].min():.2f} - {group['activity'].max():.2f}\")\n\n        # Visualize with activities as legends\n        dm.viz.to_image(\n            group['mol'].tolist(),\n            legends=[f\"Activity: {act:.2f}\" for act in group['activity']],\n            align=True  # Align by common substructure\n        )\n```\n\n### Virtual Screening Pipeline\n\n```python\n# 1. Generate fingerprints for query and library\nquery_fps = [dm.to_fp(mol) for mol in query_actives]\nlibrary_fps = [dm.to_fp(mol) for mol in library_mols]\n\n# 2. Calculate similarities\nfrom scipy.spatial.distance import cdist\nimport numpy as np\n\ndistances = dm.cdist(query_actives, library_mols, n_jobs=-1)\n\n# 3. Find closest matches (min distance to any query)\nmin_distances = distances.min(axis=0)\nsimilarities = 1 - min_distances  # Convert distance to similarity\n\n# 4. Rank and select top hits\ntop_indices = np.argsort(similarities)[::-1][:100]  # Top 100\ntop_hits = [library_mols[i] for i in top_indices]\ntop_scores = [similarities[i] for i in top_indices]\n\n# 5. Visualize hits\ndm.viz.to_image(\n    top_hits[:20],\n    legends=[f\"Sim: {score:.3f}\" for score in top_scores[:20]],\n    outfile=\"screening_hits.png\"\n)\n```\n\n## Reference Documentation\n\nFor detailed API documentation, consult these reference files:\n\n- **`references\u002Fcore_api.md`**: Core namespace functions (conversions, standardization, fingerprints, clustering)\n- **`references\u002Fio_module.md`**: File I\u002FO operations (read\u002Fwrite SDF, CSV, Excel, remote files)\n- **`references\u002Fconformers_module.md`**: 3D conformer generation, clustering, SASA calculations\n- **`references\u002Fdescriptors_viz.md`**: Molecular descriptors and visualization functions\n- **`references\u002Ffragments_scaffolds.md`**: Scaffold extraction, BRICS\u002FRECAP fragmentation\n- **`references\u002Freactions_data.md`**: Chemical reactions and toy datasets\n\n## Best Practices\n\n1. **Always standardize molecules** from external sources:\n   ```python\n   mol = dm.standardize_mol(mol, disconnect_metals=True, normalize=True, reionize=True)\n   ```\n\n2. **Check for None values** after molecule parsing:\n   ```python\n   mol = dm.to_mol(smiles)\n   if mol is None:\n       # Handle invalid SMILES\n   ```\n\n3. **Use parallel processing** for large datasets:\n   ```python\n   result = dm.operation(..., n_jobs=-1, progress=True)\n   ```\n\n4. **Leverage fsspec** for cloud storage:\n   ```python\n   df = dm.read_sdf(\"s3:\u002F\u002Fbucket\u002Fcompounds.sdf\")\n   ```\n\n5. **Use appropriate fingerprints** for similarity:\n   - ECFP (Morgan): General purpose, structural similarity\n   - MACCS: Fast, smaller feature space\n   - Atom pairs: Considers atom pairs and distances\n\n6. **Consider scale limitations**:\n   - Butina clustering: ~1,000 molecules (full distance matrix)\n   - For larger datasets: Use diversity selection or hierarchical methods\n\n7. **Scaffold splitting for ML**: Ensure proper train\u002Ftest separation by scaffold\n\n8. **Align molecules** when visualizing SAR series\n\n## Error Handling\n\n```python\n# Safe molecule creation\ndef safe_to_mol(smiles):\n    try:\n        mol = dm.to_mol(smiles)\n        if mol is not None:\n            mol = dm.standardize_mol(mol)\n        return mol\n    except Exception as e:\n        print(f\"Failed to process {smiles}: {e}\")\n        return None\n\n# Safe batch processing\nvalid_mols = []\nfor smiles in smiles_list:\n    mol = safe_to_mol(smiles)\n    if mol is not None:\n        valid_mols.append(mol)\n```\n\n## Integration with Machine Learning\n\n```python\n# Feature generation\nX = np.array([dm.to_fp(mol) for mol in mols])\n\n# Or descriptors\ndesc_df = dm.descriptors.batch_compute_many_descriptors(mols, n_jobs=-1)\nX = desc_df.values\n\n# Train model\nfrom sklearn.ensemble import RandomForestRegressor\nmodel = RandomForestRegressor()\nmodel.fit(X, y_target)\n\n# Predict\npredictions = model.predict(X_test)\n```\n\n## Troubleshooting\n\n**Issue**: Molecule parsing fails\n- **Solution**: Use `dm.standardize_smiles()` first or try `dm.fix_mol()`\n\n**Issue**: Memory errors with clustering\n- **Solution**: Use `dm.pick_diverse()` instead of full clustering for large sets\n\n**Issue**: Slow conformer generation\n- **Solution**: Reduce `n_confs` or increase `rms_cutoff` to generate fewer conformers\n\n**Issue**: Remote file access fails\n- **Solution**: Ensure fsspec and appropriate cloud provider libraries are installed (s3fs, gcsfs, etc.)\n\n## Additional Resources\n\n- **Datamol Documentation**: https:\u002F\u002Fdocs.datamol.io\u002F\n- **RDKit Documentation**: https:\u002F\u002Fwww.rdkit.org\u002Fdocs\u002F\n- **GitHub Repository**: https:\u002F\u002Fgithub.com\u002Fdatamol-io\u002Fdatamol\n","# Datamol Cheminformatics Skill\n\n## Overview\n\nDatamol is a Python library that provides a lightweight, Pythonic abstraction layer over RDKit for molecular cheminformatics. Simplify complex molecular operations with sensible defaults, efficient parallelization, and modern I\u002FO capabilities. All molecular objects are native `rdkit.Chem.Mol` instances, ensuring full compatibility with the RDKit ecosystem.\n\n**Key capabilities**:\n- Molecular format conversion (SMILES, SELFIES, InChI)\n- Structure standardization and sanitization\n- Molecular descriptors and fingerprints\n- 3D conformer generation and analysis\n- Clustering and diversity selection\n- Scaffold and fragment analysis\n- Chemical reaction application\n- Visualization and alignment\n- Batch processing with parallelization\n- Cloud storage support via fsspec\n\n## Installation and Setup\n\nGuide users to install datamol:\n\n```bash\nuv pip install datamol\n```\n\n**Import convention**:\n```python\nimport datamol as dm\n```\n\n## Core Workflows\n\n### 1. Basic Molecule Handling\n\n**Creating molecules from SMILES**:\n```python\nimport datamol as dm\n\n# Single molecule\nmol = dm.to_mol(\"CCO\")  # Ethanol\n\n# From list of SMILES\nsmiles_list = [\"CCO\", \"c1ccccc1\", \"CC(=O)O\"]\nmols = [dm.to_mol(smi) for smi in smiles_list]\n\n# Error handling\nmol = dm.to_mol(\"invalid_smiles\")  # Returns None\nif mol is None:\n    print(\"Failed to parse SMILES\")\n```\n\n**Converting molecules to SMILES**:\n```python\n# Canonical SMILES\nsmiles = dm.to_smiles(mol)\n\n# Isomeric SMILES (includes stereochemistry)\nsmiles = dm.to_smiles(mol, isomeric=True)\n\n# Other formats\ninchi = dm.to_inchi(mol)\ninchikey = dm.to_inchikey(mol)\nselfies = dm.to_selfies(mol)\n```\n\n**Standardization and sanitization** (always recommend for user-provided molecules):\n```python\n# Sanitize molecule\nmol = dm.sanitize_mol(mol)\n\n# Full standardization (recommended for datasets)\nmol = dm.standardize_mol(\n    mol,\n    disconnect_metals=True,\n    normalize=True,\n    reionize=True\n)\n\n# For SMILES strings directly\nclean_smiles = dm.standardize_smiles(smiles)\n```\n\n### 2. Reading and Writing Molecular Files\n\nRefer to `references\u002Fio_module.md` for comprehensive I\u002FO documentation.\n\n**Reading files**:\n```python\n# SDF files (most common in chemistry)\ndf = dm.read_sdf(\"compounds.sdf\", mol_column='mol')\n\n# SMILES files\ndf = dm.read_smi(\"molecules.smi\", smiles_column='smiles', mol_column='mol')\n\n# CSV with SMILES column\ndf = dm.read_csv(\"data.csv\", smiles_column=\"SMILES\", mol_column=\"mol\")\n\n# Excel files\ndf = dm.read_excel(\"compounds.xlsx\", sheet_name=0, mol_column=\"mol\")\n\n# Universal reader (auto-detects format)\ndf = dm.open_df(\"file.sdf\")  # Works with .sdf, .csv, .xlsx, .parquet, .json\n```\n\n**Writing files**:\n```python\n# Save as SDF\ndm.to_sdf(mols, \"output.sdf\")\n# Or from DataFrame\ndm.to_sdf(df, \"output.sdf\", mol_column=\"mol\")\n\n# Save as SMILES file\ndm.to_smi(mols, \"output.smi\")\n\n# Excel with rendered molecule images\ndm.to_xlsx(df, \"output.xlsx\", mol_columns=[\"mol\"])\n```\n\n**Remote file support** (S3, GCS, HTTP):\n```python\n# Read from cloud storage\ndf = dm.read_sdf(\"s3:\u002F\u002Fbucket\u002Fcompounds.sdf\")\ndf = dm.read_csv(\"https:\u002F\u002Fexample.com\u002Fdata.csv\")\n\n# Write to cloud storage\ndm.to_sdf(mols, \"s3:\u002F\u002Fbucket\u002Foutput.sdf\")\n```\n\n### 3. Molecular Descriptors and Properties\n\nRefer to `references\u002Fdescriptors_viz.md` for detailed descriptor documentation.\n\n**Computing descriptors for a single molecule**:\n```python\n# Get standard descriptor set\ndescriptors = dm.descriptors.compute_many_descriptors(mol)\n# Returns: {'mw': 46.07, 'logp': -0.03, 'hbd': 1, 'hba': 1,\n#           'tpsa': 20.23, 'n_aromatic_atoms': 0, ...}\n```\n\n**Batch descriptor computation** (recommended for datasets):\n```python\n# Compute for all molecules in parallel\ndesc_df = dm.descriptors.batch_compute_many_descriptors(\n    mols,\n    n_jobs=-1,      # Use all CPU cores\n    progress=True   # Show progress bar\n)\n```\n\n**Specific descriptors**:\n```python\n# Aromaticity\nn_aromatic = dm.descriptors.n_aromatic_atoms(mol)\naromatic_ratio = dm.descriptors.n_aromatic_atoms_proportion(mol)\n\n# Stereochemistry\nn_stereo = dm.descriptors.n_stereo_centers(mol)\nn_unspec = dm.descriptors.n_stereo_centers_unspecified(mol)\n\n# Flexibility\nn_rigid = dm.descriptors.n_rigid_bonds(mol)\n```\n\n**Drug-likeness filtering (Lipinski's Rule of Five)**:\n```python\n# Filter compounds\ndef is_druglike(mol):\n    desc = dm.descriptors.compute_many_descriptors(mol)\n    return (\n        desc['mw'] \u003C= 500 and\n        desc['logp'] \u003C= 5 and\n        desc['hbd'] \u003C= 5 and\n        desc['hba'] \u003C= 10\n    )\n\ndruglike_mols = [mol for mol in mols if is_druglike(mol)]\n```\n\n### 4. Molecular Fingerprints and Similarity\n\n**Generating fingerprints**:\n```python\n# ECFP (Extended Connectivity Fingerprint, default)\nfp = dm.to_fp(mol, fp_type='ecfp', radius=2, n_bits=2048)\n\n# Other fingerprint types\nfp_maccs = dm.to_fp(mol, fp_type='maccs')\nfp_topological = dm.to_fp(mol, fp_type='topological')\nfp_atompair = dm.to_fp(mol, fp_type='atompair')\n```\n\n**Similarity calculations**:\n```python\n# Pairwise distances within a set\ndistance_matrix = dm.pdist(mols, n_jobs=-1)\n\n# Distances between two sets\ndistances = dm.cdist(query_mols, library_mols, n_jobs=-1)\n\n# Find most similar molecules\nfrom scipy.spatial.distance import squareform\ndist_matrix = squareform(dm.pdist(mols))\n# Lower distance = higher similarity (Tanimoto distance = 1 - Tanimoto similarity)\n```\n\n### 5. Clustering and Diversity Selection\n\nRefer to `references\u002Fcore_api.md` for clustering details.\n\n**Butina clustering**:\n```python\n# Cluster molecules by structural similarity\nclusters = dm.cluster_mols(\n    mols,\n    cutoff=0.2,    # Tanimoto distance threshold (0=identical, 1=completely different)\n    n_jobs=-1      # Parallel processing\n)\n\n# Each cluster is a list of molecule indices\nfor i, cluster in enumerate(clusters):\n    print(f\"Cluster {i}: {len(cluster)} molecules\")\n    cluster_mols = [mols[idx] for idx in cluster]\n```\n\n**Important**: Butina clustering builds a full distance matrix - suitable for ~1000 molecules, not for 10,000+.\n\n**Diversity selection**:\n```python\n# Pick diverse subset\ndiverse_mols = dm.pick_diverse(\n    mols,\n    npick=100  # Select 100 diverse molecules\n)\n\n# Pick cluster centroids\ncentroids = dm.pick_centroids(\n    mols,\n    npick=50   # Select 50 representative molecules\n)\n```\n\n### 6. Scaffold Analysis\n\nRefer to `references\u002Ffragments_scaffolds.md` for complete scaffold documentation.\n\n**Extracting Murcko scaffolds**:\n```python\n# Get Bemis-Murcko scaffold (core structure)\nscaffold = dm.to_scaffold_murcko(mol)\nscaffold_smiles = dm.to_smiles(scaffold)\n```\n\n**Scaffold-based analysis**:\n```python\n# Group compounds by scaffold\nfrom collections import Counter\n\nscaffolds = [dm.to_scaffold_murcko(mol) for mol in mols]\nscaffold_smiles = [dm.to_smiles(s) for s in scaffolds]\n\n# Count scaffold frequency\nscaffold_counts = Counter(scaffold_smiles)\nmost_common = scaffold_counts.most_common(10)\n\n# Create scaffold-to-molecules mapping\nscaffold_groups = {}\nfor mol, scaf_smi in zip(mols, scaffold_smiles):\n    if scaf_smi not in scaffold_groups:\n        scaffold_groups[scaf_smi] = []\n    scaffold_groups[scaf_smi].append(mol)\n```\n\n**Scaffold-based train\u002Ftest splitting** (for ML):\n```python\n# Ensure train and test sets have different scaffolds\nscaffold_to_mols = {}\nfor mol, scaf in zip(mols, scaffold_smiles):\n    if scaf not in scaffold_to_mols:\n        scaffold_to_mols[scaf] = []\n    scaffold_to_mols[scaf].append(mol)\n\n# Split scaffolds into train\u002Ftest\nimport random\nscaffolds = list(scaffold_to_mols.keys())\nrandom.shuffle(scaffolds)\nsplit_idx = int(0.8 * len(scaffolds))\ntrain_scaffolds = scaffolds[:split_idx]\ntest_scaffolds = scaffolds[split_idx:]\n\n# Get molecules for each split\ntrain_mols = [mol for scaf in train_scaffolds for mol in scaffold_to_mols[scaf]]\ntest_mols = [mol for scaf in test_scaffolds for mol in scaffold_to_mols[scaf]]\n```\n\n### 7. Molecular Fragmentation\n\nRefer to `references\u002Ffragments_scaffolds.md` for fragmentation details.\n\n**BRICS fragmentation** (16 bond types):\n```python\n# Fragment molecule\nfragments = dm.fragment.brics(mol)\n# Returns: set of fragment SMILES with attachment points like '[1*]CCN'\n```\n\n**RECAP fragmentation** (11 bond types):\n```python\nfragments = dm.fragment.recap(mol)\n```\n\n**Fragment analysis**:\n```python\n# Find common fragments across compound library\nfrom collections import Counter\n\nall_fragments = []\nfor mol in mols:\n    frags = dm.fragment.brics(mol)\n    all_fragments.extend(frags)\n\nfragment_counts = Counter(all_fragments)\ncommon_frags = fragment_counts.most_common(20)\n\n# Fragment-based scoring\ndef fragment_score(mol, reference_fragments):\n    mol_frags = dm.fragment.brics(mol)\n    overlap = mol_frags.intersection(reference_fragments)\n    return len(overlap) \u002F len(mol_frags) if mol_frags else 0\n```\n\n### 8. 3D Conformer Generation\n\nRefer to `references\u002Fconformers_module.md` for detailed conformer documentation.\n\n**Generating conformers**:\n```python\n# Generate 3D conformers\nmol_3d = dm.conformers.generate(\n    mol,\n    n_confs=50,           # Number to generate (auto if None)\n    rms_cutoff=0.5,       # Filter similar conformers (Ångströms)\n    minimize_energy=True,  # Minimize with UFF force field\n    method='ETKDGv3'      # Embedding method (recommended)\n)\n\n# Access conformers\nn_conformers = mol_3d.GetNumConformers()\nconf = mol_3d.GetConformer(0)  # Get first conformer\npositions = conf.GetPositions()  # Nx3 array of atom coordinates\n```\n\n**Conformer clustering**:\n```python\n# Cluster conformers by RMSD\nclusters = dm.conformers.cluster(\n    mol_3d,\n    rms_cutoff=1.0,\n    centroids=False\n)\n\n# Get representative conformers\ncentroids = dm.conformers.return_centroids(mol_3d, clusters)\n```\n\n**SASA calculation**:\n```python\n# Calculate solvent accessible surface area\nsasa_values = dm.conformers.sasa(mol_3d, n_jobs=-1)\n\n# Access SASA from conformer properties\nconf = mol_3d.GetConformer(0)\nsasa = conf.GetDoubleProp('rdkit_free_sasa')\n```\n\n### 9. Visualization\n\nRefer to `references\u002Fdescriptors_viz.md` for visualization documentation.\n\n**Basic molecule grid**:\n```python\n# Visualize molecules\ndm.viz.to_image(\n    mols[:20],\n    legends=[dm.to_smiles(m) for m in mols[:20]],\n    n_cols=5,\n    mol_size=(300, 300)\n)\n\n# Save to file\ndm.viz.to_image(mols, outfile=\"molecules.png\")\n\n# SVG for publications\ndm.viz.to_image(mols, outfile=\"molecules.svg\", use_svg=True)\n```\n\n**Aligned visualization** (for SAR analysis):\n```python\n# Align molecules by common substructure\ndm.viz.to_image(\n    similar_mols,\n    align=True,  # Enable MCS alignment\n    legends=activity_labels,\n    n_cols=4\n)\n```\n\n**Highlighting substructures**:\n```python\n# Highlight specific atoms and bonds\ndm.viz.to_image(\n    mol,\n    highlight_atom=[0, 1, 2, 3],  # Atom indices\n    highlight_bond=[0, 1, 2]      # Bond indices\n)\n```\n\n**Conformer visualization**:\n```python\n# Display multiple conformers\ndm.viz.conformers(\n    mol_3d,\n    n_confs=10,\n    align_conf=True,\n    n_cols=3\n)\n```\n\n### 10. Chemical Reactions\n\nRefer to `references\u002Freactions_data.md` for reactions documentation.\n\n**Applying reactions**:\n```python\nfrom rdkit.Chem import rdChemReactions\n\n# Define reaction from SMARTS\nrxn_smarts = '[C:1](=[O:2])[OH:3]>>[C:1](=[O:2])[Cl:3]'\nrxn = rdChemReactions.ReactionFromSmarts(rxn_smarts)\n\n# Apply to molecule\nreactant = dm.to_mol(\"CC(=O)O\")  # Acetic acid\nproduct = dm.reactions.apply_reaction(\n    rxn,\n    (reactant,),\n    sanitize=True\n)\n\n# Convert to SMILES\nproduct_smiles = dm.to_smiles(product)\n```\n\n**Batch reaction application**:\n```python\n# Apply reaction to library\nproducts = []\nfor mol in reactant_mols:\n    try:\n        prod = dm.reactions.apply_reaction(rxn, (mol,))\n        if prod is not None:\n            products.append(prod)\n    except Exception as e:\n        print(f\"Reaction failed: {e}\")\n```\n\n## Parallelization\n\nDatamol includes built-in parallelization for many operations. Use `n_jobs` parameter:\n- `n_jobs=1`: Sequential (no parallelization)\n- `n_jobs=-1`: Use all available CPU cores\n- `n_jobs=4`: Use 4 cores\n\n**Functions supporting parallelization**:\n- `dm.read_sdf(..., n_jobs=-1)`\n- `dm.descriptors.batch_compute_many_descriptors(..., n_jobs=-1)`\n- `dm.cluster_mols(..., n_jobs=-1)`\n- `dm.pdist(..., n_jobs=-1)`\n- `dm.conformers.sasa(..., n_jobs=-1)`\n\n**Progress bars**: Many batch operations support `progress=True` parameter.\n\n## Common Workflows and Patterns\n\n### Complete Pipeline: Data Loading → Filtering → Analysis\n\n```python\nimport datamol as dm\nimport pandas as pd\n\n# 1. Load molecules\ndf = dm.read_sdf(\"compounds.sdf\")\n\n# 2. Standardize\ndf['mol'] = df['mol'].apply(lambda m: dm.standardize_mol(m) if m else None)\ndf = df[df['mol'].notna()]  # Remove failed molecules\n\n# 3. Compute descriptors\ndesc_df = dm.descriptors.batch_compute_many_descriptors(\n    df['mol'].tolist(),\n    n_jobs=-1,\n    progress=True\n)\n\n# 4. Filter by drug-likeness\ndruglike = (\n    (desc_df['mw'] \u003C= 500) &\n    (desc_df['logp'] \u003C= 5) &\n    (desc_df['hbd'] \u003C= 5) &\n    (desc_df['hba'] \u003C= 10)\n)\nfiltered_df = df[druglike]\n\n# 5. Cluster and select diverse subset\ndiverse_mols = dm.pick_diverse(\n    filtered_df['mol'].tolist(),\n    npick=100\n)\n\n# 6. Visualize results\ndm.viz.to_image(\n    diverse_mols,\n    legends=[dm.to_smiles(m) for m in diverse_mols],\n    outfile=\"diverse_compounds.png\",\n    n_cols=10\n)\n```\n\n### Structure-Activity Relationship (SAR) Analysis\n\n```python\n# Group by scaffold\nscaffolds = [dm.to_scaffold_murcko(mol) for mol in mols]\nscaffold_smiles = [dm.to_smiles(s) for s in scaffolds]\n\n# Create DataFrame with activities\nsar_df = pd.DataFrame({\n    'mol': mols,\n    'scaffold': scaffold_smiles,\n    'activity': activities  # User-provided activity data\n})\n\n# Analyze each scaffold series\nfor scaffold, group in sar_df.groupby('scaffold'):\n    if len(group) >= 3:  # Need multiple examples\n        print(f\"\\nScaffold: {scaffold}\")\n        print(f\"Count: {len(group)}\")\n        print(f\"Activity range: {group['activity'].min():.2f} - {group['activity'].max():.2f}\")\n\n        # Visualize with activities as legends\n        dm.viz.to_image(\n            group['mol'].tolist(),\n            legends=[f\"Activity: {act:.2f}\" for act in group['activity']],\n            align=True  # Align by common substructure\n        )\n```\n\n### Virtual Screening Pipeline\n\n```python\n# 1. Generate fingerprints for query and library\nquery_fps = [dm.to_fp(mol) for mol in query_actives]\nlibrary_fps = [dm.to_fp(mol) for mol in library_mols]\n\n# 2. Calculate similarities\nfrom scipy.spatial.distance import cdist\nimport numpy as np\n\ndistances = dm.cdist(query_actives, library_mols, n_jobs=-1)\n\n# 3. Find closest matches (min distance to any query)\nmin_distances = distances.min(axis=0)\nsimilarities = 1 - min_distances  # Convert distance to similarity\n\n# 4. Rank and select top hits\ntop_indices = np.argsort(similarities)[::-1][:100]  # Top 100\ntop_hits = [library_mols[i] for i in top_indices]\ntop_scores = [similarities[i] for i in top_indices]\n\n# 5. Visualize hits\ndm.viz.to_image(\n    top_hits[:20],\n    legends=[f\"Sim: {score:.3f}\" for score in top_scores[:20]],\n    outfile=\"screening_hits.png\"\n)\n```\n\n## Reference Documentation\n\nFor detailed API documentation, consult these reference files:\n\n- **`references\u002Fcore_api.md`**: Core namespace functions (conversions, standardization, fingerprints, clustering)\n- **`references\u002Fio_module.md`**: File I\u002FO operations (read\u002Fwrite SDF, CSV, Excel, remote files)\n- **`references\u002Fconformers_module.md`**: 3D conformer generation, clustering, SASA calculations\n- **`references\u002Fdescriptors_viz.md`**: Molecular descriptors and visualization functions\n- **`references\u002Ffragments_scaffolds.md`**: Scaffold extraction, BRICS\u002FRECAP fragmentation\n- **`references\u002Freactions_data.md`**: Chemical reactions and toy datasets\n\n## Best Practices\n\n1. **Always standardize molecules** from external sources:\n   ```python\n   mol = dm.standardize_mol(mol, disconnect_metals=True, normalize=True, reionize=True)\n   ```\n\n2. **Check for None values** after molecule parsing:\n   ```python\n   mol = dm.to_mol(smiles)\n   if mol is None:\n       # Handle invalid SMILES\n   ```\n\n3. **Use parallel processing** for large datasets:\n   ```python\n   result = dm.operation(..., n_jobs=-1, progress=True)\n   ```\n\n4. **Leverage fsspec** for cloud storage:\n   ```python\n   df = dm.read_sdf(\"s3:\u002F\u002Fbucket\u002Fcompounds.sdf\")\n   ```\n\n5. **Use appropriate fingerprints** for similarity:\n   - ECFP (Morgan): General purpose, structural similarity\n   - MACCS: Fast, smaller feature space\n   - Atom pairs: Considers atom pairs and distances\n\n6. **Consider scale limitations**:\n   - Butina clustering: ~1,000 molecules (full distance matrix)\n   - For larger datasets: Use diversity selection or hierarchical methods\n\n7. **Scaffold splitting for ML**: Ensure proper train\u002Ftest separation by scaffold\n\n8. **Align molecules** when visualizing SAR series\n\n## Error Handling\n\n```python\n# Safe molecule creation\ndef safe_to_mol(smiles):\n    try:\n        mol = dm.to_mol(smiles)\n        if mol is not None:\n            mol = dm.standardize_mol(mol)\n        return mol\n    except Exception as e:\n        print(f\"Failed to process {smiles}: {e}\")\n        return None\n\n# Safe batch processing\nvalid_mols = []\nfor smiles in smiles_list:\n    mol = safe_to_mol(smiles)\n    if mol is not None:\n        valid_mols.append(mol)\n```\n\n## Integration with Machine Learning\n\n```python\n# Feature generation\nX = np.array([dm.to_fp(mol) for mol in mols])\n\n# Or descriptors\ndesc_df = dm.descriptors.batch_compute_many_descriptors(mols, n_jobs=-1)\nX = desc_df.values\n\n# Train model\nfrom sklearn.ensemble import RandomForestRegressor\nmodel = RandomForestRegressor()\nmodel.fit(X, y_target)\n\n# Predict\npredictions = model.predict(X_test)\n```\n\n## Troubleshooting\n\n**Issue**: Molecule parsing fails\n- **Solution**: Use `dm.standardize_smiles()` first or try `dm.fix_mol()`\n\n**Issue**: Memory errors with clustering\n- **Solution**: Use `dm.pick_diverse()` instead of full clustering for large sets\n\n**Issue**: Slow conformer generation\n- **Solution**: Reduce `n_confs` or increase `rms_cutoff` to generate fewer conformers\n\n**Issue**: Remote file access fails\n- **Solution**: Ensure fsspec and appropriate cloud provider libraries are installed (s3fs, gcsfs, etc.)\n\n## Additional Resources\n\n- **Datamol Documentation**: https:\u002F\u002Fdocs.datamol.io\u002F\n- **RDKit Documentation**: https:\u002F\u002Fwww.rdkit.org\u002Fdocs\u002F\n- **GitHub Repository**: https:\u002F\u002Fgithub.com\u002Fdatamol-io\u002Fdatamol\n",{"name":5,"description":7},"main","f2ec4b3b9133d34eeaf9b38e4b0a97e8e5705a7f","benchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol",0,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard","https:\u002F\u002Fgithub.com\u002FJSGforever","2026-08-29 18:27:56",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add JSGforever\u002Fskillguard --skill datamol",{"tool":55,"command":56},"bunx","bunx skills add JSGforever\u002Fskillguard --skill datamol",{"tool":58,"command":59},"pnpm","pnpm dlx skills add JSGforever\u002Fskillguard --skill datamol","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002FSKILL.md",true,[63,69,73,77,81,85],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fconformers_module.md","REFERENCE","参考文档",5022,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Fconformers_module.md",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fcore_api.md",4242,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Fcore_api.md",{"path":74,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fdescriptors_viz.md",7366,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Fdescriptors_viz.md",{"path":78,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Ffragments_scaffolds.md",5808,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Ffragments_scaffolds.md",{"path":82,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fio_module.md",4315,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Fio_module.md",{"path":86,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Freactions_data.md",6656,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__Microck--claude-scientific-skills\u002Fscientific-skills\u002Fdatamol\u002Freferences\u002Freactions_data.md",[90,122,138,165,187,207],{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":101,"publishedAt":37},"01M71HY2SNXBA9Q00WZDTZQ31Z","skillguard-codex-scanner","Hybrid deterministic+LLM agent-skill security scanner. Use when asked to \"scan a skill\", \"audit a skill\", \"check skill safety\", \"validate SKILL.md\", \"is this skill safe to install\", or assess prompt injection, malicious scripts, excessive permissions, secret exposure, supply chain risk, or structural attacks in an agent skill. Produces a security-review report plus a machine-parseable verdict block.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fsrc\u002Fskillguard\u002Fstatic_scanner\u002Fskillguard-codex-scanner\u002FSKILL.md",[96],{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121],"scanner","skillguard codex scanner","skillguard","codex","chain","skill security","security-review","review report","structural","secret","prompt injection","security scanner","when","review","malicious","permissions","exposure","audit","scripts","safe",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":126,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":134,"publishedAt":37},"01M71HY0SPKTT3S27BC2HPAC5M","data-exfiltrator","Analyzes data files","MIT","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Fsmoke-one-skill\u002Fasset1__cisco-ai-defense--data-exfiltrator\u002FSKILL.md",[129],{"categoryNo":130,"categoryName":131,"taxonomyType":132,"taxonomyTypeDesc":133},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[135,136,137],"data","data exfiltrator","files",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":37},"01M71HXVS9EMN44BGDW215FZ72","real-time-collaboration-engine","Build real-time collaborative editing with WebSockets, OT\u002FCRDT conflict resolution, and presence awareness. Implements cursor tracking, optimistic updates, and offline sync. Use for collaborative editors, whiteboards, video editing. Activate on \"real-time collaboration\", \"WebSocket sync\", \"multiplayer editing\", \"CRDT\", \"presence awareness\". NOT for simple chat, request-response APIs, or single-user apps.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--real-time-collaboration-engine\u002FSKILL.md",[],[145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164],"time","real time collaboration engine","real time collaboration","collaboration","engine","real time","Video","reliability","video editing","performance","conflict resolution","presence","access","apps","updates","Bash","activate","optimizer","react","streaming",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":174,"publishedAt":37},"01M71HXP6CTY4KFN0QVMMN0V7J","react-performance-optimizer","Optimize React apps for 60fps performance. Implements memoization, virtualization, code splitting, bundle optimization. Use for slow renders, large lists, bundle bloat. Activate on \"React performance\", \"slow render\", \"useMemo\", \"bundle size\", \"virtualization\". NOT for backend optimization, non-React frameworks, or premature optimization.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--react-performance-optimizer\u002FSKILL.md",[171],{"categoryNo":172,"categoryName":173,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000009","前端开发",[154,175,162,163,176,177,178,179,180,181,145,182,183,158,160,184,161,164,185,186],"react performance optimizer","react performance","performance optimizer","app","nextjs","expert","re","render","2025","code","router","strategies",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":194,"publishedAt":37},"01M71HXH7QXSQB4QTDZ7SP7YXQ","llm-streaming-response-handler","Build production LLM streaming UIs with Server-Sent Events, real-time token display, cancellation, error recovery. Handles OpenAI\u002FAnthropic\u002FClaude streaming APIs. Use for chatbots, AI assistants, real-time text generation. Activate on \"LLM streaming\", \"SSE\", \"token stream\", \"chat UI\", \"real-time AI\". NOT for batch processing, non-streaming APIs, or WebSocket bidirectional chat.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--llm-streaming-response-handler\u002FSKILL.md",[193],{"categoryNo":172,"categoryName":173,"taxonomyType":99,"taxonomyTypeDesc":100},[195,164,196,197,35,198,154,145,199,200,201,160,161,162,202,163,203,204,205,206],"llm streaming response handler","handler","error","retry","chat ui","error recovery","critical","batch","display","text","server","read",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":220,"publishedAt":37},"01M71HXCB0E1YRKYW1Y8T0Y106","github-actions-pipeline-builder","Build production CI\u002FCD pipelines with GitHub Actions. Implements matrix builds, caching, deployments, testing, security scanning. Use for automated testing, deployments, release workflows. Activate on \"GitHub Actions\", \"CI\u002FCD\", \"workflow\", \"deployment pipeline\", \"automated testing\". NOT for Jenkins\u002FCircleCI, manual deployments, or non-GitHub repositories.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--github-actions-pipeline-builder\u002FSKILL.md",[213,216,219],{"categoryNo":214,"categoryName":215,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":217,"categoryName":218,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},[221,222,223,224,225,226,227,152,180,228,229,230,161,186,231,206,232,233,234,235],"github actions pipeline builder","actions","github actions","pipeline builder","github","builder","pipeline","testing","ci","workflows","run","release","write","edit","git"]