[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AFE0JS1TFVHV8N66RJ043P":3,"skill-same:01M6AFE0JS1TFVHV8N66RJ043P":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":49,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6AFE0JS1TFVHV8N66RJ043P","flowio",null,"Parse FCS (Flow Cytometry Standard) files v2.0-3.1. Extract events as NumPy arrays, read metadata\u002Fchannels, convert to CSV\u002FDataFrame, for flow cytometry data preprocessing.","davila7\u002Fclaude-code-templates","davila7","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6216945?v=4","01M6ADEWWFPS191NFM0Y1EX1JH","Daniel Avila","01M6ADJHGM78PHQRD3XZTFDVKK",33602,"MIT","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fflowio\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"files","parse","standard","for","channels","events","as","preprocessing","numpy","arrays","dataframe","extract","read","convert","data","flow","csv","metadata","2026-11-10 10:12:30",false,"---\nname: flowio\ndescription: \"Parse FCS (Flow Cytometry Standard) files v2.0-3.1. Extract events as NumPy arrays, read metadata\u002Fchannels, convert to CSV\u002FDataFrame, for flow cytometry data preprocessing.\"\n---\n\n# FlowIO: Flow Cytometry Standard File Handler\n\n## Overview\n\nFlowIO is a lightweight Python library for reading and writing Flow Cytometry Standard (FCS) files. Parse FCS metadata, extract event data, and create new FCS files with minimal dependencies. The library supports FCS versions 2.0, 3.0, and 3.1, making it ideal for backend services, data pipelines, and basic cytometry file operations.\n\n## When to Use This Skill\n\nThis skill should be used when:\n\n- FCS files requiring parsing or metadata extraction\n- Flow cytometry data needing conversion to NumPy arrays\n- Event data requiring export to FCS format\n- Multi-dataset FCS files needing separation\n- Channel information extraction (scatter, fluorescence, time)\n- Cytometry file validation or inspection\n- Pre-processing workflows before advanced analysis\n\n**Related Tools:** For advanced flow cytometry analysis including compensation, gating, and FlowJo\u002FGatingML support, recommend FlowKit library as a companion to FlowIO.\n\n## Installation\n\n```bash\nuv pip install flowio\n```\n\nRequires Python 3.9 or later.\n\n## Quick Start\n\n### Basic File Reading\n\n```python\nfrom flowio import FlowData\n\n# Read FCS file\nflow_data = FlowData('experiment.fcs')\n\n# Access basic information\nprint(f\"FCS Version: {flow_data.version}\")\nprint(f\"Events: {flow_data.event_count}\")\nprint(f\"Channels: {flow_data.pnn_labels}\")\n\n# Get event data as NumPy array\nevents = flow_data.as_array()  # Shape: (events, channels)\n```\n\n### Creating FCS Files\n\n```python\nimport numpy as np\nfrom flowio import create_fcs\n\n# Prepare data\ndata = np.array([[100, 200, 50], [150, 180, 60]])  # 2 events, 3 channels\nchannels = ['FSC-A', 'SSC-A', 'FL1-A']\n\n# Create FCS file\ncreate_fcs('output.fcs', data, channels)\n```\n\n## Core Workflows\n\n### Reading and Parsing FCS Files\n\nThe FlowData class provides the primary interface for reading FCS files.\n\n**Standard Reading:**\n\n```python\nfrom flowio import FlowData\n\n# Basic reading\nflow = FlowData('sample.fcs')\n\n# Access attributes\nversion = flow.version              # '3.0', '3.1', etc.\nevent_count = flow.event_count      # Number of events\nchannel_count = flow.channel_count  # Number of channels\npnn_labels = flow.pnn_labels        # Short channel names\npns_labels = flow.pns_labels        # Descriptive stain names\n\n# Get event data\nevents = flow.as_array()            # Preprocessed (gain, log scaling applied)\nraw_events = flow.as_array(preprocess=False)  # Raw data\n```\n\n**Memory-Efficient Metadata Reading:**\n\nWhen only metadata is needed (no event data):\n\n```python\n# Only parse TEXT segment, skip DATA and ANALYSIS\nflow = FlowData('sample.fcs', only_text=True)\n\n# Access metadata\nmetadata = flow.text  # Dictionary of TEXT segment keywords\nprint(metadata.get('$DATE'))  # Acquisition date\nprint(metadata.get('$CYT'))   # Instrument name\n```\n\n**Handling Problematic Files:**\n\nSome FCS files have offset discrepancies or errors:\n\n```python\n# Ignore offset discrepancies between HEADER and TEXT sections\nflow = FlowData('problematic.fcs', ignore_offset_discrepancy=True)\n\n# Use HEADER offsets instead of TEXT offsets\nflow = FlowData('problematic.fcs', use_header_offsets=True)\n\n# Ignore offset errors entirely\nflow = FlowData('problematic.fcs', ignore_offset_error=True)\n```\n\n**Excluding Null Channels:**\n\n```python\n# Exclude specific channels during parsing\nflow = FlowData('sample.fcs', null_channel_list=['Time', 'Null'])\n```\n\n### Extracting Metadata and Channel Information\n\nFCS files contain rich metadata in the TEXT segment.\n\n**Common Metadata Keywords:**\n\n```python\nflow = FlowData('sample.fcs')\n\n# File-level metadata\ntext_dict = flow.text\nacquisition_date = text_dict.get('$DATE', 'Unknown')\ninstrument = text_dict.get('$CYT', 'Unknown')\ndata_type = flow.data_type  # 'I', 'F', 'D', 'A'\n\n# Channel metadata\nfor i in range(flow.channel_count):\n    pnn = flow.pnn_labels[i]      # Short name (e.g., 'FSC-A')\n    pns = flow.pns_labels[i]      # Descriptive name (e.g., 'Forward Scatter')\n    pnr = flow.pnr_values[i]      # Range\u002Fmax value\n    print(f\"Channel {i}: {pnn} ({pns}), Range: {pnr}\")\n```\n\n**Channel Type Identification:**\n\nFlowIO automatically categorizes channels:\n\n```python\n# Get indices by channel type\nscatter_idx = flow.scatter_indices    # [0, 1] for FSC, SSC\nfluoro_idx = flow.fluoro_indices      # [2, 3, 4] for FL channels\ntime_idx = flow.time_index            # Index of time channel (or None)\n\n# Access specific channel types\nevents = flow.as_array()\nscatter_data = events[:, scatter_idx]\nfluorescence_data = events[:, fluoro_idx]\n```\n\n**ANALYSIS Segment:**\n\nIf present, access processed results:\n\n```python\nif flow.analysis:\n    analysis_keywords = flow.analysis  # Dictionary of ANALYSIS keywords\n    print(analysis_keywords)\n```\n\n### Creating New FCS Files\n\nGenerate FCS files from NumPy arrays or other data sources.\n\n**Basic Creation:**\n\n```python\nimport numpy as np\nfrom flowio import create_fcs\n\n# Create event data (rows=events, columns=channels)\nevents = np.random.rand(10000, 5) * 1000\n\n# Define channel names\nchannel_names = ['FSC-A', 'SSC-A', 'FL1-A', 'FL2-A', 'Time']\n\n# Create FCS file\ncreate_fcs('output.fcs', events, channel_names)\n```\n\n**With Descriptive Channel Names:**\n\n```python\n# Add optional descriptive names (PnS)\nchannel_names = ['FSC-A', 'SSC-A', 'FL1-A', 'FL2-A', 'Time']\ndescriptive_names = ['Forward Scatter', 'Side Scatter', 'FITC', 'PE', 'Time']\n\ncreate_fcs('output.fcs',\n           events,\n           channel_names,\n           opt_channel_names=descriptive_names)\n```\n\n**With Custom Metadata:**\n\n```python\n# Add TEXT segment metadata\nmetadata = {\n    '$SRC': 'Python script',\n    '$DATE': '19-OCT-2025',\n    '$CYT': 'Synthetic Instrument',\n    '$INST': 'Laboratory A'\n}\n\ncreate_fcs('output.fcs',\n           events,\n           channel_names,\n           opt_channel_names=descriptive_names,\n           metadata=metadata)\n```\n\n**Note:** FlowIO exports as FCS 3.1 with single-precision floating-point data.\n\n### Exporting Modified Data\n\nModify existing FCS files and re-export them.\n\n**Approach 1: Using write_fcs() Method:**\n\n```python\nfrom flowio import FlowData\n\n# Read original file\nflow = FlowData('original.fcs')\n\n# Write with updated metadata\nflow.write_fcs('modified.fcs', metadata={'$SRC': 'Modified data'})\n```\n\n**Approach 2: Extract, Modify, and Recreate:**\n\nFor modifying event data:\n\n```python\nfrom flowio import FlowData, create_fcs\n\n# Read and extract data\nflow = FlowData('original.fcs')\nevents = flow.as_array(preprocess=False)\n\n# Modify event data\nevents[:, 0] = events[:, 0] * 1.5  # Scale first channel\n\n# Create new FCS file with modified data\ncreate_fcs('modified.fcs',\n           events,\n           flow.pnn_labels,\n           opt_channel_names=flow.pns_labels,\n           metadata=flow.text)\n```\n\n### Handling Multi-Dataset FCS Files\n\nSome FCS files contain multiple datasets in a single file.\n\n**Detecting Multi-Dataset Files:**\n\n```python\nfrom flowio import FlowData, MultipleDataSetsError\n\ntry:\n    flow = FlowData('sample.fcs')\nexcept MultipleDataSetsError:\n    print(\"File contains multiple datasets\")\n    # Use read_multiple_data_sets() instead\n```\n\n**Reading All Datasets:**\n\n```python\nfrom flowio import read_multiple_data_sets\n\n# Read all datasets from file\ndatasets = read_multiple_data_sets('multi_dataset.fcs')\n\nprint(f\"Found {len(datasets)} datasets\")\n\n# Process each dataset\nfor i, dataset in enumerate(datasets):\n    print(f\"\\nDataset {i}:\")\n    print(f\"  Events: {dataset.event_count}\")\n    print(f\"  Channels: {dataset.pnn_labels}\")\n\n    # Get event data for this dataset\n    events = dataset.as_array()\n    print(f\"  Shape: {events.shape}\")\n    print(f\"  Mean values: {events.mean(axis=0)}\")\n```\n\n**Reading Specific Dataset:**\n\n```python\nfrom flowio import FlowData\n\n# Read first dataset (nextdata_offset=0)\nfirst_dataset = FlowData('multi.fcs', nextdata_offset=0)\n\n# Read second dataset using NEXTDATA offset from first\nnext_offset = int(first_dataset.text['$NEXTDATA'])\nif next_offset > 0:\n    second_dataset = FlowData('multi.fcs', nextdata_offset=next_offset)\n```\n\n## Data Preprocessing\n\nFlowIO applies standard FCS preprocessing transformations when `preprocess=True`.\n\n**Preprocessing Steps:**\n\n1. **Gain Scaling:** Multiply values by PnG (gain) keyword\n2. **Logarithmic Transformation:** Apply PnE exponential transformation if present\n   - Formula: `value = a * 10^(b * raw_value)` where PnE = \"a,b\"\n3. **Time Scaling:** Convert time values to appropriate units\n\n**Controlling Preprocessing:**\n\n```python\n# Preprocessed data (default)\npreprocessed = flow.as_array(preprocess=True)\n\n# Raw data (no transformations)\nraw = flow.as_array(preprocess=False)\n```\n\n## Error Handling\n\nHandle common FlowIO exceptions appropriately.\n\n```python\nfrom flowio import (\n    FlowData,\n    FCSParsingError,\n    DataOffsetDiscrepancyError,\n    MultipleDataSetsError\n)\n\ntry:\n    flow = FlowData('sample.fcs')\n    events = flow.as_array()\n\nexcept FCSParsingError as e:\n    print(f\"Failed to parse FCS file: {e}\")\n    # Try with relaxed parsing\n    flow = FlowData('sample.fcs', ignore_offset_error=True)\n\nexcept DataOffsetDiscrepancyError as e:\n    print(f\"Offset discrepancy detected: {e}\")\n    # Use ignore_offset_discrepancy parameter\n    flow = FlowData('sample.fcs', ignore_offset_discrepancy=True)\n\nexcept MultipleDataSetsError as e:\n    print(f\"Multiple datasets detected: {e}\")\n    # Use read_multiple_data_sets instead\n    from flowio import read_multiple_data_sets\n    datasets = read_multiple_data_sets('sample.fcs')\n\nexcept Exception as e:\n    print(f\"Unexpected error: {e}\")\n```\n\n## Common Use Cases\n\n### Inspecting FCS File Contents\n\nQuick exploration of FCS file structure:\n\n```python\nfrom flowio import FlowData\n\nflow = FlowData('unknown.fcs')\n\nprint(\"=\" * 50)\nprint(f\"File: {flow.name}\")\nprint(f\"Version: {flow.version}\")\nprint(f\"Size: {flow.file_size:,} bytes\")\nprint(\"=\" * 50)\n\nprint(f\"\\nEvents: {flow.event_count:,}\")\nprint(f\"Channels: {flow.channel_count}\")\n\nprint(\"\\nChannel Information:\")\nfor i, (pnn, pns) in enumerate(zip(flow.pnn_labels, flow.pns_labels)):\n    ch_type = \"scatter\" if i in flow.scatter_indices else \\\n              \"fluoro\" if i in flow.fluoro_indices else \\\n              \"time\" if i == flow.time_index else \"other\"\n    print(f\"  [{i}] {pnn:10s} | {pns:30s} | {ch_type}\")\n\nprint(\"\\nKey Metadata:\")\nfor key in ['$DATE', '$BTIM', '$ETIM', '$CYT', '$INST', '$SRC']:\n    value = flow.text.get(key, 'N\u002FA')\n    print(f\"  {key:15s}: {value}\")\n```\n\n### Batch Processing Multiple Files\n\nProcess a directory of FCS files:\n\n```python\nfrom pathlib import Path\nfrom flowio import FlowData\nimport pandas as pd\n\n# Find all FCS files\nfcs_files = list(Path('data\u002F').glob('*.fcs'))\n\n# Extract summary information\nsummaries = []\nfor fcs_path in fcs_files:\n    try:\n        flow = FlowData(str(fcs_path), only_text=True)\n        summaries.append({\n            'filename': fcs_path.name,\n            'version': flow.version,\n            'events': flow.event_count,\n            'channels': flow.channel_count,\n            'date': flow.text.get('$DATE', 'N\u002FA')\n        })\n    except Exception as e:\n        print(f\"Error processing {fcs_path.name}: {e}\")\n\n# Create summary DataFrame\ndf = pd.DataFrame(summaries)\nprint(df)\n```\n\n### Converting FCS to CSV\n\nExport event data to CSV format:\n\n```python\nfrom flowio import FlowData\nimport pandas as pd\n\n# Read FCS file\nflow = FlowData('sample.fcs')\n\n# Convert to DataFrame\ndf = pd.DataFrame(\n    flow.as_array(),\n    columns=flow.pnn_labels\n)\n\n# Add metadata as attributes\ndf.attrs['fcs_version'] = flow.version\ndf.attrs['instrument'] = flow.text.get('$CYT', 'Unknown')\n\n# Export to CSV\ndf.to_csv('output.csv', index=False)\nprint(f\"Exported {len(df)} events to CSV\")\n```\n\n### Filtering Events and Re-exporting\n\nApply filters and save filtered data:\n\n```python\nfrom flowio import FlowData, create_fcs\nimport numpy as np\n\n# Read original file\nflow = FlowData('sample.fcs')\nevents = flow.as_array(preprocess=False)\n\n# Apply filtering (example: threshold on first channel)\nfsc_idx = 0\nthreshold = 500\nmask = events[:, fsc_idx] > threshold\nfiltered_events = events[mask]\n\nprint(f\"Original events: {len(events)}\")\nprint(f\"Filtered events: {len(filtered_events)}\")\n\n# Create new FCS file with filtered data\ncreate_fcs('filtered.fcs',\n           filtered_events,\n           flow.pnn_labels,\n           opt_channel_names=flow.pns_labels,\n           metadata={**flow.text, '$SRC': 'Filtered data'})\n```\n\n### Extracting Specific Channels\n\nExtract and process specific channels:\n\n```python\nfrom flowio import FlowData\nimport numpy as np\n\nflow = FlowData('sample.fcs')\nevents = flow.as_array()\n\n# Extract fluorescence channels only\nfluoro_indices = flow.fluoro_indices\nfluoro_data = events[:, fluoro_indices]\nfluoro_names = [flow.pnn_labels[i] for i in fluoro_indices]\n\nprint(f\"Fluorescence channels: {fluoro_names}\")\nprint(f\"Shape: {fluoro_data.shape}\")\n\n# Calculate statistics per channel\nfor i, name in enumerate(fluoro_names):\n    channel_data = fluoro_data[:, i]\n    print(f\"\\n{name}:\")\n    print(f\"  Mean: {channel_data.mean():.2f}\")\n    print(f\"  Median: {np.median(channel_data):.2f}\")\n    print(f\"  Std Dev: {channel_data.std():.2f}\")\n```\n\n## Best Practices\n\n1. **Memory Efficiency:** Use `only_text=True` when event data is not needed\n2. **Error Handling:** Wrap file operations in try-except blocks for robust code\n3. **Multi-Dataset Detection:** Check for MultipleDataSetsError and use appropriate function\n4. **Preprocessing Control:** Explicitly set `preprocess` parameter based on analysis needs\n5. **Offset Issues:** If parsing fails, try `ignore_offset_discrepancy=True` parameter\n6. **Channel Validation:** Verify channel counts and names match expectations before processing\n7. **Metadata Preservation:** When modifying files, preserve original TEXT segment keywords\n\n## Advanced Topics\n\n### Understanding FCS File Structure\n\nFCS files consist of four segments:\n\n1. **HEADER:** FCS version and byte offsets for other segments\n2. **TEXT:** Key-value metadata pairs (delimiter-separated)\n3. **DATA:** Raw event data (binary\u002Ffloat\u002FASCII format)\n4. **ANALYSIS** (optional): Results from data processing\n\nAccess these segments via FlowData attributes:\n- `flow.header` - HEADER segment\n- `flow.text` - TEXT segment keywords\n- `flow.events` - DATA segment (as bytes)\n- `flow.analysis` - ANALYSIS segment keywords (if present)\n\n### Detailed API Reference\n\nFor comprehensive API documentation including all parameters, methods, exceptions, and FCS keyword reference, consult the detailed reference file:\n\n**Read:** `references\u002Fapi_reference.md`\n\nThe reference includes:\n- Complete FlowData class documentation\n- All utility functions (read_multiple_data_sets, create_fcs)\n- Exception classes and handling\n- FCS file structure details\n- Common TEXT segment keywords\n- Extended example workflows\n\nWhen working with complex FCS operations or encountering unusual file formats, load this reference for detailed guidance.\n\n## Integration Notes\n\n**NumPy Arrays:** All event data is returned as NumPy ndarrays with shape (events, channels)\n\n**Pandas DataFrames:** Easily convert to DataFrames for analysis:\n```python\nimport pandas as pd\ndf = pd.DataFrame(flow.as_array(), columns=flow.pnn_labels)\n```\n\n**FlowKit Integration:** For advanced analysis (compensation, gating, FlowJo support), use FlowKit library which builds on FlowIO's parsing capabilities\n\n**Web Applications:** FlowIO's minimal dependencies make it ideal for web backend services processing FCS uploads\n\n## Troubleshooting\n\n**Problem:** \"Offset discrepancy error\"\n**Solution:** Use `ignore_offset_discrepancy=True` parameter\n\n**Problem:** \"Multiple datasets error\"\n**Solution:** Use `read_multiple_data_sets()` function instead of FlowData constructor\n\n**Problem:** Out of memory with large files\n**Solution:** Use `only_text=True` for metadata-only operations, or process events in chunks\n\n**Problem:** Unexpected channel counts\n**Solution:** Check for null channels; use `null_channel_list` parameter to exclude them\n\n**Problem:** Cannot modify event data in place\n**Solution:** FlowIO doesn't support direct modification; extract data, modify, then use `create_fcs()` to save\n\n## Summary\n\nFlowIO provides essential FCS file handling capabilities for flow cytometry workflows. Use it for parsing, metadata extraction, and file creation. For simple file operations and data extraction, FlowIO is sufficient. For complex analysis including compensation and gating, integrate with FlowKit or other specialized tools.\n","# FlowIO: Flow Cytometry Standard File Handler\n\n## Overview\n\nFlowIO is a lightweight Python library for reading and writing Flow Cytometry Standard (FCS) files. Parse FCS metadata, extract event data, and create new FCS files with minimal dependencies. The library supports FCS versions 2.0, 3.0, and 3.1, making it ideal for backend services, data pipelines, and basic cytometry file operations.\n\n## When to Use This Skill\n\nThis skill should be used when:\n\n- FCS files requiring parsing or metadata extraction\n- Flow cytometry data needing conversion to NumPy arrays\n- Event data requiring export to FCS format\n- Multi-dataset FCS files needing separation\n- Channel information extraction (scatter, fluorescence, time)\n- Cytometry file validation or inspection\n- Pre-processing workflows before advanced analysis\n\n**Related Tools:** For advanced flow cytometry analysis including compensation, gating, and FlowJo\u002FGatingML support, recommend FlowKit library as a companion to FlowIO.\n\n## Installation\n\n```bash\nuv pip install flowio\n```\n\nRequires Python 3.9 or later.\n\n## Quick Start\n\n### Basic File Reading\n\n```python\nfrom flowio import FlowData\n\n# Read FCS file\nflow_data = FlowData('experiment.fcs')\n\n# Access basic information\nprint(f\"FCS Version: {flow_data.version}\")\nprint(f\"Events: {flow_data.event_count}\")\nprint(f\"Channels: {flow_data.pnn_labels}\")\n\n# Get event data as NumPy array\nevents = flow_data.as_array()  # Shape: (events, channels)\n```\n\n### Creating FCS Files\n\n```python\nimport numpy as np\nfrom flowio import create_fcs\n\n# Prepare data\ndata = np.array([[100, 200, 50], [150, 180, 60]])  # 2 events, 3 channels\nchannels = ['FSC-A', 'SSC-A', 'FL1-A']\n\n# Create FCS file\ncreate_fcs('output.fcs', data, channels)\n```\n\n## Core Workflows\n\n### Reading and Parsing FCS Files\n\nThe FlowData class provides the primary interface for reading FCS files.\n\n**Standard Reading:**\n\n```python\nfrom flowio import FlowData\n\n# Basic reading\nflow = FlowData('sample.fcs')\n\n# Access attributes\nversion = flow.version              # '3.0', '3.1', etc.\nevent_count = flow.event_count      # Number of events\nchannel_count = flow.channel_count  # Number of channels\npnn_labels = flow.pnn_labels        # Short channel names\npns_labels = flow.pns_labels        # Descriptive stain names\n\n# Get event data\nevents = flow.as_array()            # Preprocessed (gain, log scaling applied)\nraw_events = flow.as_array(preprocess=False)  # Raw data\n```\n\n**Memory-Efficient Metadata Reading:**\n\nWhen only metadata is needed (no event data):\n\n```python\n# Only parse TEXT segment, skip DATA and ANALYSIS\nflow = FlowData('sample.fcs', only_text=True)\n\n# Access metadata\nmetadata = flow.text  # Dictionary of TEXT segment keywords\nprint(metadata.get('$DATE'))  # Acquisition date\nprint(metadata.get('$CYT'))   # Instrument name\n```\n\n**Handling Problematic Files:**\n\nSome FCS files have offset discrepancies or errors:\n\n```python\n# Ignore offset discrepancies between HEADER and TEXT sections\nflow = FlowData('problematic.fcs', ignore_offset_discrepancy=True)\n\n# Use HEADER offsets instead of TEXT offsets\nflow = FlowData('problematic.fcs', use_header_offsets=True)\n\n# Ignore offset errors entirely\nflow = FlowData('problematic.fcs', ignore_offset_error=True)\n```\n\n**Excluding Null Channels:**\n\n```python\n# Exclude specific channels during parsing\nflow = FlowData('sample.fcs', null_channel_list=['Time', 'Null'])\n```\n\n### Extracting Metadata and Channel Information\n\nFCS files contain rich metadata in the TEXT segment.\n\n**Common Metadata Keywords:**\n\n```python\nflow = FlowData('sample.fcs')\n\n# File-level metadata\ntext_dict = flow.text\nacquisition_date = text_dict.get('$DATE', 'Unknown')\ninstrument = text_dict.get('$CYT', 'Unknown')\ndata_type = flow.data_type  # 'I', 'F', 'D', 'A'\n\n# Channel metadata\nfor i in range(flow.channel_count):\n    pnn = flow.pnn_labels[i]      # Short name (e.g., 'FSC-A')\n    pns = flow.pns_labels[i]      # Descriptive name (e.g., 'Forward Scatter')\n    pnr = flow.pnr_values[i]      # Range\u002Fmax value\n    print(f\"Channel {i}: {pnn} ({pns}), Range: {pnr}\")\n```\n\n**Channel Type Identification:**\n\nFlowIO automatically categorizes channels:\n\n```python\n# Get indices by channel type\nscatter_idx = flow.scatter_indices    # [0, 1] for FSC, SSC\nfluoro_idx = flow.fluoro_indices      # [2, 3, 4] for FL channels\ntime_idx = flow.time_index            # Index of time channel (or None)\n\n# Access specific channel types\nevents = flow.as_array()\nscatter_data = events[:, scatter_idx]\nfluorescence_data = events[:, fluoro_idx]\n```\n\n**ANALYSIS Segment:**\n\nIf present, access processed results:\n\n```python\nif flow.analysis:\n    analysis_keywords = flow.analysis  # Dictionary of ANALYSIS keywords\n    print(analysis_keywords)\n```\n\n### Creating New FCS Files\n\nGenerate FCS files from NumPy arrays or other data sources.\n\n**Basic Creation:**\n\n```python\nimport numpy as np\nfrom flowio import create_fcs\n\n# Create event data (rows=events, columns=channels)\nevents = np.random.rand(10000, 5) * 1000\n\n# Define channel names\nchannel_names = ['FSC-A', 'SSC-A', 'FL1-A', 'FL2-A', 'Time']\n\n# Create FCS file\ncreate_fcs('output.fcs', events, channel_names)\n```\n\n**With Descriptive Channel Names:**\n\n```python\n# Add optional descriptive names (PnS)\nchannel_names = ['FSC-A', 'SSC-A', 'FL1-A', 'FL2-A', 'Time']\ndescriptive_names = ['Forward Scatter', 'Side Scatter', 'FITC', 'PE', 'Time']\n\ncreate_fcs('output.fcs',\n           events,\n           channel_names,\n           opt_channel_names=descriptive_names)\n```\n\n**With Custom Metadata:**\n\n```python\n# Add TEXT segment metadata\nmetadata = {\n    '$SRC': 'Python script',\n    '$DATE': '19-OCT-2025',\n    '$CYT': 'Synthetic Instrument',\n    '$INST': 'Laboratory A'\n}\n\ncreate_fcs('output.fcs',\n           events,\n           channel_names,\n           opt_channel_names=descriptive_names,\n           metadata=metadata)\n```\n\n**Note:** FlowIO exports as FCS 3.1 with single-precision floating-point data.\n\n### Exporting Modified Data\n\nModify existing FCS files and re-export them.\n\n**Approach 1: Using write_fcs() Method:**\n\n```python\nfrom flowio import FlowData\n\n# Read original file\nflow = FlowData('original.fcs')\n\n# Write with updated metadata\nflow.write_fcs('modified.fcs', metadata={'$SRC': 'Modified data'})\n```\n\n**Approach 2: Extract, Modify, and Recreate:**\n\nFor modifying event data:\n\n```python\nfrom flowio import FlowData, create_fcs\n\n# Read and extract data\nflow = FlowData('original.fcs')\nevents = flow.as_array(preprocess=False)\n\n# Modify event data\nevents[:, 0] = events[:, 0] * 1.5  # Scale first channel\n\n# Create new FCS file with modified data\ncreate_fcs('modified.fcs',\n           events,\n           flow.pnn_labels,\n           opt_channel_names=flow.pns_labels,\n           metadata=flow.text)\n```\n\n### Handling Multi-Dataset FCS Files\n\nSome FCS files contain multiple datasets in a single file.\n\n**Detecting Multi-Dataset Files:**\n\n```python\nfrom flowio import FlowData, MultipleDataSetsError\n\ntry:\n    flow = FlowData('sample.fcs')\nexcept MultipleDataSetsError:\n    print(\"File contains multiple datasets\")\n    # Use read_multiple_data_sets() instead\n```\n\n**Reading All Datasets:**\n\n```python\nfrom flowio import read_multiple_data_sets\n\n# Read all datasets from file\ndatasets = read_multiple_data_sets('multi_dataset.fcs')\n\nprint(f\"Found {len(datasets)} datasets\")\n\n# Process each dataset\nfor i, dataset in enumerate(datasets):\n    print(f\"\\nDataset {i}:\")\n    print(f\"  Events: {dataset.event_count}\")\n    print(f\"  Channels: {dataset.pnn_labels}\")\n\n    # Get event data for this dataset\n    events = dataset.as_array()\n    print(f\"  Shape: {events.shape}\")\n    print(f\"  Mean values: {events.mean(axis=0)}\")\n```\n\n**Reading Specific Dataset:**\n\n```python\nfrom flowio import FlowData\n\n# Read first dataset (nextdata_offset=0)\nfirst_dataset = FlowData('multi.fcs', nextdata_offset=0)\n\n# Read second dataset using NEXTDATA offset from first\nnext_offset = int(first_dataset.text['$NEXTDATA'])\nif next_offset > 0:\n    second_dataset = FlowData('multi.fcs', nextdata_offset=next_offset)\n```\n\n## Data Preprocessing\n\nFlowIO applies standard FCS preprocessing transformations when `preprocess=True`.\n\n**Preprocessing Steps:**\n\n1. **Gain Scaling:** Multiply values by PnG (gain) keyword\n2. **Logarithmic Transformation:** Apply PnE exponential transformation if present\n   - Formula: `value = a * 10^(b * raw_value)` where PnE = \"a,b\"\n3. **Time Scaling:** Convert time values to appropriate units\n\n**Controlling Preprocessing:**\n\n```python\n# Preprocessed data (default)\npreprocessed = flow.as_array(preprocess=True)\n\n# Raw data (no transformations)\nraw = flow.as_array(preprocess=False)\n```\n\n## Error Handling\n\nHandle common FlowIO exceptions appropriately.\n\n```python\nfrom flowio import (\n    FlowData,\n    FCSParsingError,\n    DataOffsetDiscrepancyError,\n    MultipleDataSetsError\n)\n\ntry:\n    flow = FlowData('sample.fcs')\n    events = flow.as_array()\n\nexcept FCSParsingError as e:\n    print(f\"Failed to parse FCS file: {e}\")\n    # Try with relaxed parsing\n    flow = FlowData('sample.fcs', ignore_offset_error=True)\n\nexcept DataOffsetDiscrepancyError as e:\n    print(f\"Offset discrepancy detected: {e}\")\n    # Use ignore_offset_discrepancy parameter\n    flow = FlowData('sample.fcs', ignore_offset_discrepancy=True)\n\nexcept MultipleDataSetsError as e:\n    print(f\"Multiple datasets detected: {e}\")\n    # Use read_multiple_data_sets instead\n    from flowio import read_multiple_data_sets\n    datasets = read_multiple_data_sets('sample.fcs')\n\nexcept Exception as e:\n    print(f\"Unexpected error: {e}\")\n```\n\n## Common Use Cases\n\n### Inspecting FCS File Contents\n\nQuick exploration of FCS file structure:\n\n```python\nfrom flowio import FlowData\n\nflow = FlowData('unknown.fcs')\n\nprint(\"=\" * 50)\nprint(f\"File: {flow.name}\")\nprint(f\"Version: {flow.version}\")\nprint(f\"Size: {flow.file_size:,} bytes\")\nprint(\"=\" * 50)\n\nprint(f\"\\nEvents: {flow.event_count:,}\")\nprint(f\"Channels: {flow.channel_count}\")\n\nprint(\"\\nChannel Information:\")\nfor i, (pnn, pns) in enumerate(zip(flow.pnn_labels, flow.pns_labels)):\n    ch_type = \"scatter\" if i in flow.scatter_indices else \\\n              \"fluoro\" if i in flow.fluoro_indices else \\\n              \"time\" if i == flow.time_index else \"other\"\n    print(f\"  [{i}] {pnn:10s} | {pns:30s} | {ch_type}\")\n\nprint(\"\\nKey Metadata:\")\nfor key in ['$DATE', '$BTIM', '$ETIM', '$CYT', '$INST', '$SRC']:\n    value = flow.text.get(key, 'N\u002FA')\n    print(f\"  {key:15s}: {value}\")\n```\n\n### Batch Processing Multiple Files\n\nProcess a directory of FCS files:\n\n```python\nfrom pathlib import Path\nfrom flowio import FlowData\nimport pandas as pd\n\n# Find all FCS files\nfcs_files = list(Path('data\u002F').glob('*.fcs'))\n\n# Extract summary information\nsummaries = []\nfor fcs_path in fcs_files:\n    try:\n        flow = FlowData(str(fcs_path), only_text=True)\n        summaries.append({\n            'filename': fcs_path.name,\n            'version': flow.version,\n            'events': flow.event_count,\n            'channels': flow.channel_count,\n            'date': flow.text.get('$DATE', 'N\u002FA')\n        })\n    except Exception as e:\n        print(f\"Error processing {fcs_path.name}: {e}\")\n\n# Create summary DataFrame\ndf = pd.DataFrame(summaries)\nprint(df)\n```\n\n### Converting FCS to CSV\n\nExport event data to CSV format:\n\n```python\nfrom flowio import FlowData\nimport pandas as pd\n\n# Read FCS file\nflow = FlowData('sample.fcs')\n\n# Convert to DataFrame\ndf = pd.DataFrame(\n    flow.as_array(),\n    columns=flow.pnn_labels\n)\n\n# Add metadata as attributes\ndf.attrs['fcs_version'] = flow.version\ndf.attrs['instrument'] = flow.text.get('$CYT', 'Unknown')\n\n# Export to CSV\ndf.to_csv('output.csv', index=False)\nprint(f\"Exported {len(df)} events to CSV\")\n```\n\n### Filtering Events and Re-exporting\n\nApply filters and save filtered data:\n\n```python\nfrom flowio import FlowData, create_fcs\nimport numpy as np\n\n# Read original file\nflow = FlowData('sample.fcs')\nevents = flow.as_array(preprocess=False)\n\n# Apply filtering (example: threshold on first channel)\nfsc_idx = 0\nthreshold = 500\nmask = events[:, fsc_idx] > threshold\nfiltered_events = events[mask]\n\nprint(f\"Original events: {len(events)}\")\nprint(f\"Filtered events: {len(filtered_events)}\")\n\n# Create new FCS file with filtered data\ncreate_fcs('filtered.fcs',\n           filtered_events,\n           flow.pnn_labels,\n           opt_channel_names=flow.pns_labels,\n           metadata={**flow.text, '$SRC': 'Filtered data'})\n```\n\n### Extracting Specific Channels\n\nExtract and process specific channels:\n\n```python\nfrom flowio import FlowData\nimport numpy as np\n\nflow = FlowData('sample.fcs')\nevents = flow.as_array()\n\n# Extract fluorescence channels only\nfluoro_indices = flow.fluoro_indices\nfluoro_data = events[:, fluoro_indices]\nfluoro_names = [flow.pnn_labels[i] for i in fluoro_indices]\n\nprint(f\"Fluorescence channels: {fluoro_names}\")\nprint(f\"Shape: {fluoro_data.shape}\")\n\n# Calculate statistics per channel\nfor i, name in enumerate(fluoro_names):\n    channel_data = fluoro_data[:, i]\n    print(f\"\\n{name}:\")\n    print(f\"  Mean: {channel_data.mean():.2f}\")\n    print(f\"  Median: {np.median(channel_data):.2f}\")\n    print(f\"  Std Dev: {channel_data.std():.2f}\")\n```\n\n## Best Practices\n\n1. **Memory Efficiency:** Use `only_text=True` when event data is not needed\n2. **Error Handling:** Wrap file operations in try-except blocks for robust code\n3. **Multi-Dataset Detection:** Check for MultipleDataSetsError and use appropriate function\n4. **Preprocessing Control:** Explicitly set `preprocess` parameter based on analysis needs\n5. **Offset Issues:** If parsing fails, try `ignore_offset_discrepancy=True` parameter\n6. **Channel Validation:** Verify channel counts and names match expectations before processing\n7. **Metadata Preservation:** When modifying files, preserve original TEXT segment keywords\n\n## Advanced Topics\n\n### Understanding FCS File Structure\n\nFCS files consist of four segments:\n\n1. **HEADER:** FCS version and byte offsets for other segments\n2. **TEXT:** Key-value metadata pairs (delimiter-separated)\n3. **DATA:** Raw event data (binary\u002Ffloat\u002FASCII format)\n4. **ANALYSIS** (optional): Results from data processing\n\nAccess these segments via FlowData attributes:\n- `flow.header` - HEADER segment\n- `flow.text` - TEXT segment keywords\n- `flow.events` - DATA segment (as bytes)\n- `flow.analysis` - ANALYSIS segment keywords (if present)\n\n### Detailed API Reference\n\nFor comprehensive API documentation including all parameters, methods, exceptions, and FCS keyword reference, consult the detailed reference file:\n\n**Read:** `references\u002Fapi_reference.md`\n\nThe reference includes:\n- Complete FlowData class documentation\n- All utility functions (read_multiple_data_sets, create_fcs)\n- Exception classes and handling\n- FCS file structure details\n- Common TEXT segment keywords\n- Extended example workflows\n\nWhen working with complex FCS operations or encountering unusual file formats, load this reference for detailed guidance.\n\n## Integration Notes\n\n**NumPy Arrays:** All event data is returned as NumPy ndarrays with shape (events, channels)\n\n**Pandas DataFrames:** Easily convert to DataFrames for analysis:\n```python\nimport pandas as pd\ndf = pd.DataFrame(flow.as_array(), columns=flow.pnn_labels)\n```\n\n**FlowKit Integration:** For advanced analysis (compensation, gating, FlowJo support), use FlowKit library which builds on FlowIO's parsing capabilities\n\n**Web Applications:** FlowIO's minimal dependencies make it ideal for web backend services processing FCS uploads\n\n## Troubleshooting\n\n**Problem:** \"Offset discrepancy error\"\n**Solution:** Use `ignore_offset_discrepancy=True` parameter\n\n**Problem:** \"Multiple datasets error\"\n**Solution:** Use `read_multiple_data_sets()` function instead of FlowData constructor\n\n**Problem:** Out of memory with large files\n**Solution:** Use `only_text=True` for metadata-only operations, or process events in chunks\n\n**Problem:** Unexpected channel counts\n**Solution:** Check for null channels; use `null_channel_list` parameter to exclude them\n\n**Problem:** Cannot modify event data in place\n**Solution:** FlowIO doesn't support direct modification; extract data, modify, then use `create_fcs()` to save\n\n## Summary\n\nFlowIO provides essential FCS file handling capabilities for flow cytometry workflows. Use it for parsing, metadata extraction, and file creation. For simple file operations and data extraction, FlowIO is sufficient. For complex analysis including compensation and gating, integrate with FlowKit or other specialized tools.\n",{"name":5,"description":7},"main","2b749c82b5d11fac39d9a6e021ce3f5b8a541bd1","cli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fflowio",3963,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates","https:\u002F\u002Faitmpl.com","https:\u002F\u002Fgithub.com\u002Fdavila7","https:\u002F\u002Fdanielavila.me","Building AI dev tools with LLMs","2026-11-15 01:32:48",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add davila7\u002Fclaude-code-templates --skill flowio",{"tool":58,"command":59},"bunx","bunx skills add davila7\u002Fclaude-code-templates --skill flowio",{"tool":61,"command":62},"pnpm","pnpm dlx skills add davila7\u002Fclaude-code-templates --skill flowio","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fflowio\u002FSKILL.md",true,[66],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fapi_reference.md","REFERENCE","参考文档",10481,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fflowio\u002Freferences\u002Fapi_reference.md",[73,104,131,164,199,223],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":84,"publishedAt":37},"01M70NHBTQ8BV0A2SCAZXEPHCX","wealthville-pool-scoring","Score DeFi liquidity pools before providing liquidity. Returns a 0-100 pool score and an Enter\u002FHold\u002FExit\u002FReduce\u002FAvoid verdict with calibrated confidence for ~68,800 Solana pools and 575 EVM pools, plus a public miss-inclusive track record. Use when asked whether a pool is worth LPing into, which pools look best right now, or how accurate the scores have actually been.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fweb-data\u002Fwealthville-pool-scoring\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[85,86,87,88,89,22,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"scoring","pool","wealthville pool scoring","liquidity","which","exit","now","use","when","reduce","with","record","track","verdict","evm","solana","how","public","look",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":111,"publishedAt":37},"01M70MB6VR8ERJ4EM8D5KHBMEV","technical-debt-auditor","Scans a codebase and produces a quantified technical debt report with a prioritized remediation plan. Analyzes dead code, TODO\u002FFIXME\u002FHACK markers, dependency staleness, complexity hotspots, code duplication signals, test coverage gaps, unused exports, and outdated patterns. Use this skill when the user asks to audit their codebase for tech debt, wants a health check of their code quality, says things like \"where should I focus refactoring\", \"find code smells\", \"audit my codebase\", \"what technical debt do we have\", \"prioritize cleanup work\", or asks about code quality metrics. Also trigger when the user mentions \"code rot\", \"legacy cleanup\", \"refactoring priorities\", or wants to understand the overall health of a project before a major effort. Trigger even if the user doesn't say \"technical debt\" explicitly — any request to systematically assess code quality and identify improvement priorities belongs here.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Ftechnical-debt-auditor\u002FSKILL.md",[110],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[112,113,114,115,116,117,118,119,120,121,122,93,123,124,125,126,127,128,129,130],"technical debt","debt","technical","technical debt auditor","auditor","coverage","complexity","markers","project","cleanup","unused","code","todo","work","plan","focus","signals","audit","dependency",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":146,"publishedAt":37},"01M70KPYH9QNHCNME5GJQGE22K","readonly-sql-guard","Make an agent's database access provably read-only. Use when an agent runs caller-supplied SQL against a production\u002FERP\u002Fanalytics database (a \"query\" MCP tool, text-to-SQL, an admin console), or when reviewing DB-access code for write\u002FDDL\u002Fside-effect\u002Ftransaction-escape risks. Checks what a statement CALLS, not just its shape.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdatabase\u002Freadonly-sql-guard\u002FSKILL.md",[137,140,141],{"categoryNo":138,"categoryName":139,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},{"categoryNo":142,"categoryName":143,"taxonomyType":144,"taxonomyTypeDesc":145},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[147,148,149,150,151,152,153,22,154,155,156,157,158,159,160,92,161,162,93,163],"readonly","guard","sql guard","sql","readonly sql guard","erp","effect","read-only","db","just","tool","calls","only","MCP","access","database","query",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":168,"licenseFileUrl":169,"sourceHtmlUrl":170,"categories":171,"keywords":175,"publishedAt":37},"01M6AFY6F7CC2BBZP1QD6VTNVC","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[172],{"categoryNo":173,"categoryName":174,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000009","前端开发",[176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,22,198],"artifacts builder","web","web artifacts builder","artifacts","builder","state","routing","state management","component","css","frontend","ui","Tools","file","components","shadcn","react","Tailwind","suite","jsx","html","single-file","ui components",{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":168,"licenseFileUrl":203,"sourceHtmlUrl":204,"categories":205,"keywords":210,"publishedAt":37},"01M6AFWF33SFV9Z3SF4PEEE4BF","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[206,209],{"categoryNo":207,"categoryName":208,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":173,"categoryName":174,"taxonomyType":82,"taxonomyTypeDesc":83},[211,212,213,214,215,177,216,186,187,217,218,219,220,22,221,95,222],"webapp testing","testing","webapp","browser","playwright","applications","debugging","toolkit","logs","screenshots","local","behavior",{"skillNo":224,"name":225,"nameZh":6,"description":226,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":168,"licenseFileUrl":227,"sourceHtmlUrl":228,"categories":229,"keywords":237,"publishedAt":37},"01M6AF67Q67JJJ5V51JR2P52KA","discernment-nudge","After you give a substantive answer or draft that the user may act on — advice or recommendations, drafted artifacts such as goals, plans, pitches, proposals, or emails, estimates or projections, analysis or interpretation of data, factual claims they may rely on, or a multi-step argument — invoke this skill BEFORE finalizing your reply and then, if it applies, append 2-3 short follow-up questions, each tied to something specific in what you just produced, that help the user check key facts, probe the reasoning or assumptions, and notice missing context. Do this at most once per conversation. Skip it when the user asked a trivial how-to or simple lookup, wants a purely educational explanation, asked you only to format, convert, or assemble a file from content they provided, is writing code they will run, is doing creative writing or casual chat, or already asked you to double-check, cite, or review — the skill file explains these boundaries and the exact output format.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FSKILL.md",[230,233,234],{"categoryNo":231,"categoryName":232,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},{"categoryNo":235,"categoryName":236,"taxonomyType":144,"taxonomyTypeDesc":145},"01JBSEEDCAT000000000000036","内容创作者",[238,239,240,241,242,243,33,244,179,245,189,123,246,247,248,249,250,159,251,93,252,253,254,255,256,101,257],"discernment nudge","nudge","interpretation","help","run","reasoning","writing","lookup","content","review","conversation","short","up","invoke","you","analysis","claims","argument","assemble","recommendations"]