@nahisaho/satori 0.25.5 ā 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -1
- package/bin/satori.js +761 -33
- package/package.json +32 -2
- package/src/.github/skills/scientific-academic-writing/SKILL.md +10 -0
- package/src/.github/skills/scientific-active-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-adaptive-experiments/SKILL.md +10 -0
- package/src/.github/skills/scientific-advanced-imaging/SKILL.md +10 -0
- package/src/.github/skills/scientific-advanced-visualization/SKILL.md +10 -0
- package/src/.github/skills/scientific-anomaly-detection/SKILL.md +10 -0
- package/src/.github/skills/scientific-automl/SKILL.md +10 -0
- package/src/.github/skills/scientific-bayesian-statistics/SKILL.md +10 -0
- package/src/.github/skills/scientific-biobank-cohort/SKILL.md +10 -0
- package/src/.github/skills/scientific-biosignal-processing/SKILL.md +10 -0
- package/src/.github/skills/scientific-causal-inference/SKILL.md +10 -0
- package/src/.github/skills/scientific-causal-ml/SKILL.md +10 -0
- package/src/.github/skills/scientific-clinical-nlp/SKILL.md +10 -0
- package/src/.github/skills/scientific-clinical-pharmacology/SKILL.md +10 -0
- package/src/.github/skills/scientific-clinical-standards/SKILL.md +11 -0
- package/src/.github/skills/scientific-crispr-design/SKILL.md +10 -0
- package/src/.github/skills/scientific-critical-review/SKILL.md +10 -1
- package/src/.github/skills/scientific-data-preprocessing/SKILL.md +10 -0
- package/src/.github/skills/scientific-data-profiling/SKILL.md +10 -0
- package/src/.github/skills/scientific-data-simulation/SKILL.md +10 -0
- package/src/.github/skills/scientific-data-submission/SKILL.md +10 -0
- package/src/.github/skills/scientific-deep-chemistry/SKILL.md +10 -0
- package/src/.github/skills/scientific-deep-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-doe/SKILL.md +10 -0
- package/src/.github/skills/scientific-eda-correlation/SKILL.md +10 -0
- package/src/.github/skills/scientific-ensemble-methods/SKILL.md +10 -0
- package/src/.github/skills/scientific-explainable-ai/SKILL.md +10 -0
- package/src/.github/skills/scientific-feature-importance/SKILL.md +10 -0
- package/src/.github/skills/scientific-federated-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-geospatial-analysis/SKILL.md +10 -0
- package/src/.github/skills/scientific-glycomics/SKILL.md +10 -0
- package/src/.github/skills/scientific-gpu-singlecell/SKILL.md +10 -0
- package/src/.github/skills/scientific-hgnc-nomenclature/SKILL.md +10 -0
- package/src/.github/skills/scientific-hypothesis-pipeline/SKILL.md +10 -1
- package/src/.github/skills/scientific-image-analysis/SKILL.md +10 -0
- package/src/.github/skills/scientific-interactive-dashboard/SKILL.md +10 -0
- package/src/.github/skills/scientific-lab-automation/SKILL.md +10 -0
- package/src/.github/skills/scientific-latex-formatter/SKILL.md +10 -0
- package/src/.github/skills/scientific-lipidomics/SKILL.md +10 -0
- package/src/.github/skills/scientific-materials-characterization/SKILL.md +10 -0
- package/src/.github/skills/scientific-md-simulation/SKILL.md +10 -0
- package/src/.github/skills/scientific-medical-imaging/SKILL.md +10 -0
- package/src/.github/skills/scientific-metabolic-atlas/SKILL.md +11 -0
- package/src/.github/skills/scientific-metabolic-flux/SKILL.md +10 -0
- package/src/.github/skills/scientific-metabolomics-network/SKILL.md +10 -0
- package/src/.github/skills/scientific-metagenome-assembled-genomes/SKILL.md +10 -0
- package/src/.github/skills/scientific-missing-data-analysis/SKILL.md +10 -0
- package/src/.github/skills/scientific-ml-classification/SKILL.md +10 -0
- package/src/.github/skills/scientific-ml-regression/SKILL.md +10 -0
- package/src/.github/skills/scientific-model-monitoring/SKILL.md +10 -0
- package/src/.github/skills/scientific-multi-task-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-nci60-screening/SKILL.md +10 -0
- package/src/.github/skills/scientific-network-visualization/SKILL.md +10 -0
- package/src/.github/skills/scientific-neural-architecture-search/SKILL.md +10 -0
- package/src/.github/skills/scientific-neuroscience-electrophysiology/SKILL.md +10 -0
- package/src/.github/skills/scientific-paper-quality/SKILL.md +10 -0
- package/src/.github/skills/scientific-pca-tsne/SKILL.md +10 -0
- package/src/.github/skills/scientific-peer-review-response/SKILL.md +10 -0
- package/src/.github/skills/scientific-perturbation-analysis/SKILL.md +10 -0
- package/src/.github/skills/scientific-phylogenetics/SKILL.md +10 -0
- package/src/.github/skills/scientific-pipeline-scaffold/SKILL.md +10 -0
- package/src/.github/skills/scientific-plant-biology/SKILL.md +10 -0
- package/src/.github/skills/scientific-presentation-design/SKILL.md +10 -0
- package/src/.github/skills/scientific-process-optimization/SKILL.md +10 -0
- package/src/.github/skills/scientific-publication-figures/SKILL.md +10 -0
- package/src/.github/skills/scientific-quantum-computing/SKILL.md +10 -0
- package/src/.github/skills/scientific-radiology-ai/SKILL.md +10 -0
- package/src/.github/skills/scientific-reinforcement-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-reproducible-reporting/SKILL.md +10 -0
- package/src/.github/skills/scientific-research-methodology/SKILL.md +10 -0
- package/src/.github/skills/scientific-revision-tracker/SKILL.md +10 -0
- package/src/.github/skills/scientific-scatac-signac/SKILL.md +10 -0
- package/src/.github/skills/scientific-scvi-integration/SKILL.md +10 -0
- package/src/.github/skills/scientific-semi-supervised-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-spatial-multiomics/SKILL.md +10 -0
- package/src/.github/skills/scientific-spectral-signal/SKILL.md +10 -0
- package/src/.github/skills/scientific-squidpy-advanced/SKILL.md +11 -0
- package/src/.github/skills/scientific-statistical-simulation/SKILL.md +10 -0
- package/src/.github/skills/scientific-statistical-testing/SKILL.md +10 -0
- package/src/.github/skills/scientific-streaming-analytics/SKILL.md +10 -0
- package/src/.github/skills/scientific-supplementary-generator/SKILL.md +10 -0
- package/src/.github/skills/scientific-symbolic-mathematics/SKILL.md +10 -0
- package/src/.github/skills/scientific-time-series/SKILL.md +10 -0
- package/src/.github/skills/scientific-time-series-forecasting/SKILL.md +10 -0
- package/src/.github/skills/scientific-toxicology-env/SKILL.md +10 -0
- package/src/.github/skills/scientific-transfer-learning/SKILL.md +10 -0
- package/src/.github/skills/scientific-uncertainty-quantification/SKILL.md +10 -0
package/bin/satori.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
5
|
|
|
6
6
|
const COMMAND = process.argv[2];
|
|
7
7
|
const SUBCOMMAND = process.argv[3];
|
|
@@ -71,50 +71,410 @@ SATORI ā Agent Skills for Science
|
|
|
71
71
|
|
|
72
72
|
Usage:
|
|
73
73
|
satori init [--force] [--dry-run] Install .github/ skills into current directory
|
|
74
|
+
satori skill search <query> Search skills by keyword
|
|
75
|
+
satori skill info <name> Show detailed skill information
|
|
74
76
|
satori pipeline suggest Interactive pipeline recommendation
|
|
75
77
|
satori pipeline list List all available pipelines
|
|
78
|
+
satori validate [--verbose] Validate all SKILL.md files
|
|
79
|
+
satori stats Show skill/TU coverage statistics
|
|
76
80
|
satori help Show this help message
|
|
77
81
|
satori --version, -v Show version number
|
|
78
82
|
|
|
79
83
|
Options:
|
|
80
84
|
--force Overwrite existing .github/ directory
|
|
81
85
|
--dry-run Preview what would be installed without making changes
|
|
86
|
+
--verbose Show detailed validation output
|
|
82
87
|
`);
|
|
83
88
|
}
|
|
84
89
|
|
|
85
90
|
// āā Pipeline Suggest āā
|
|
86
91
|
|
|
87
92
|
const PIPELINES = [
|
|
88
|
-
{
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
{
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
{
|
|
112
|
-
|
|
113
|
-
|
|
93
|
+
{
|
|
94
|
+
id: 1,
|
|
95
|
+
name: '仮説ę¤čؼāč«ęå',
|
|
96
|
+
domain: 'general',
|
|
97
|
+
keywords: ['仮説', 'ēµ±čØ', 'č«ę', 'hypothesis'],
|
|
98
|
+
skills:
|
|
99
|
+
'hypothesis-engine ā data-preprocessing ā statistical-testing ā ml-classification ā publication-figures ā academic-writing ā critical-review',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 2,
|
|
103
|
+
name: 'ććŖć¢ć³ćāčØåŗ',
|
|
104
|
+
domain: 'genomics',
|
|
105
|
+
keywords: ['ććŖć¢ć³ć', 'variant', 'VCF', 'WGS', 'WES'],
|
|
106
|
+
skills:
|
|
107
|
+
'variant-interpretation ā pharmacogenomics ā precision-oncology ā clinical-decision-support ā clinical-reporting',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: 3,
|
|
111
|
+
name: 'ćć©ć³ć¹ćÆćŖććć¼ć ',
|
|
112
|
+
domain: 'genomics',
|
|
113
|
+
keywords: ['RNA-seq', 'ćć©ć³ć¹ćÆćŖććć¼ć ', 'DEG', 'ēŗē¾'],
|
|
114
|
+
skills: 'rnaseq-analysis ā pathway-enrichment ā network-analysis ā publication-figures',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 4,
|
|
118
|
+
name: 'ćØććøć§ććć£ćÆć¹',
|
|
119
|
+
domain: 'genomics',
|
|
120
|
+
keywords: ['ćØćć²ćć ', 'ChIP-seq', 'ATAC-seq', 'ć”ćć«å'],
|
|
121
|
+
skills: 'epigenomics-chromatin ā regulatory-genomics ā noncoding-rna ā gene-regulation',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: 5,
|
|
125
|
+
name: 'AlphaFold ę§é č§£ę',
|
|
126
|
+
domain: 'structural',
|
|
127
|
+
keywords: ['AlphaFold', 'ćæć³ććÆč³Ŗę§é ', '3D', 'protein structure'],
|
|
128
|
+
skills: 'alphafold-structures ā protein-structure-analysis ā molecular-docking',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 6,
|
|
132
|
+
name: 'ćØććć³ć¹åę',
|
|
133
|
+
domain: 'literature',
|
|
134
|
+
keywords: ['ć”ćæć¢ććŖć·ć¹', 'systematic review', 'ęē®', 'ćØććć³ć¹'],
|
|
135
|
+
skills:
|
|
136
|
+
'deep-research ā literature-search ā meta-analysis ā evidence-synthesis ā academic-writing ā critical-review',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: 7,
|
|
140
|
+
name: 'åµč¬ćć¤ćć©ć¤ć³',
|
|
141
|
+
domain: 'pharma',
|
|
142
|
+
keywords: ['åµč¬', 'drug discovery', 'ADMET', 'ćććć³ć°'],
|
|
143
|
+
skills:
|
|
144
|
+
'drug-target-profiling ā compound-screening ā molecular-docking ā admet-pharmacokinetics ā drug-repurposing',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 8,
|
|
148
|
+
name: 'ML/XAI ćć¤ćć©ć¤ć³',
|
|
149
|
+
domain: 'ml',
|
|
150
|
+
keywords: ['ę©ę¢°å¦ēæ', 'ML', 'SHAP', 'XAI', 'äŗęø¬ć¢ćć«'],
|
|
151
|
+
skills:
|
|
152
|
+
'data-preprocessing ā ml-classification ā ml-regression ā explainable-ai ā fairness-bias ā publication-figures',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: 9,
|
|
156
|
+
name: 'ē°å¢ć»ēę
å¦',
|
|
157
|
+
domain: 'ecology',
|
|
158
|
+
keywords: ['ēę
', 'ēē©å¤ę§ę§', 'SDM', 'ē°å¢', 'ecology'],
|
|
159
|
+
skills: 'environmental-ecology ā biodiversity-conservation ā species-distribution ā time-series-forecasting',
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: 10,
|
|
163
|
+
name: 'čØē®ęęē§å¦',
|
|
164
|
+
domain: 'materials',
|
|
165
|
+
keywords: ['ęę', 'materials', 'DFT', 'ē©ę§'],
|
|
166
|
+
skills: 'computational-materials ā cheminformatics ā molecular-dynamics ā ml-regression',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 11,
|
|
170
|
+
name: 'å»č¬åå®å
Øę§',
|
|
171
|
+
domain: 'pharma',
|
|
172
|
+
keywords: ['ę害äŗč±”', 'ćć”ć¼ćć³ććøć©ć³ć¹', 'å®å
Øę§', 'adverse'],
|
|
173
|
+
skills: 'pharmacovigilance ā pharmacogenomics ā regulatory-science',
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: 12,
|
|
177
|
+
name: 'åøå°ē¾ę£',
|
|
178
|
+
domain: 'clinical',
|
|
179
|
+
keywords: ['åøå°ē¾ę£', 'rare disease', 'Orphanet'],
|
|
180
|
+
skills: 'rare-disease-genetics ā gene-panel-design ā variant-interpretation ā clinical-reporting',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: 13,
|
|
184
|
+
name: 'ććć²ćććÆć¹',
|
|
185
|
+
domain: 'oncology',
|
|
186
|
+
keywords: ['ćć', 'cancer', 'TMB', 'ä½ē“°čå¤ē°'],
|
|
187
|
+
skills: 'cancer-genomics ā precision-oncology ā biomarker-discovery ā clinical-reporting',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: 14,
|
|
191
|
+
name: 'GWASć»éå£éŗä¼å¦',
|
|
192
|
+
domain: 'genomics',
|
|
193
|
+
keywords: ['GWAS', 'éå£éŗä¼å¦', 'population genetics', 'biobank'],
|
|
194
|
+
skills: 'biobank-cohort ā population-genetics ā statistical-testing ā publication-figures',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 15,
|
|
198
|
+
name: 'ć·ć³ć°ć«ć»ć«',
|
|
199
|
+
domain: 'genomics',
|
|
200
|
+
keywords: ['ć·ć³ć°ć«ć»ć«', 'single-cell', 'scRNA-seq', '空éćć©ć³ć¹ćÆćŖććć¼ć '],
|
|
201
|
+
skills: 'cellxgene-census ā scvi-integration ā spatial-transcriptomics ā gene-regulation',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
id: 16,
|
|
205
|
+
name: 'ććććŖććÆć¹',
|
|
206
|
+
domain: 'omics',
|
|
207
|
+
keywords: ['ććććŖććÆć¹', 'proteomics', 'č³Ŗéåę'],
|
|
208
|
+
skills: 'proteomics ā protein-structure-analysis ā network-analysis',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: 17,
|
|
212
|
+
name: 'ć”ćæććććÆć¹',
|
|
213
|
+
domain: 'omics',
|
|
214
|
+
keywords: ['ć”ćæććććÆć¹', 'metabolomics', '代č¬ē©', 'čč³Ŗ'],
|
|
215
|
+
skills: 'metabolomics ā lipidomics ā systems-biology ā network-analysis',
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
id: 18,
|
|
219
|
+
name: 'ćć¤ćÆććć¤ćŖć¼ć ',
|
|
220
|
+
domain: 'ecology',
|
|
221
|
+
keywords: ['ćć¤ćÆććć¤ćŖć¼ć ', 'metagenome', '16S', 'č
øå
ē“°č'],
|
|
222
|
+
skills: 'microbiome-metagenomics ā metagenome-assembled-genomes ā phylogenetics ā environmental-ecology',
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: 19,
|
|
226
|
+
name: 'ćć¹ć¦ć§ć¤ć»KG',
|
|
227
|
+
domain: 'systems',
|
|
228
|
+
keywords: ['ćć¹ć¦ć§ć¤', 'ćć¬ććøć°ć©ć', 'knowledge graph', 'pathway'],
|
|
229
|
+
skills: 'gene-id-mapping ā pathway-enrichment ā ontology-integration ā network-analysis ā knowledge-graph',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 20,
|
|
233
|
+
name: 'č¾²ę„ć»é£å',
|
|
234
|
+
domain: 'agriculture',
|
|
235
|
+
keywords: ['č¾²ę„', 'é£å', 'agriculture', 'food safety'],
|
|
236
|
+
skills: 'agricultural-science ā food-science-nutrition ā environmental-ecology',
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 21,
|
|
240
|
+
name: 'čØåŗę
å ±å¦',
|
|
241
|
+
domain: 'clinical',
|
|
242
|
+
keywords: ['čØåŗ', 'EHR', 'FHIR', 'OMOP', 'é»åć«ć«ć'],
|
|
243
|
+
skills: 'clinical-standards ā clinical-nlp ā clinical-reporting ā healthcare-ai ā survival-clinical',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: 22,
|
|
247
|
+
name: 'ćććć£ćÆć¹ć»IoT',
|
|
248
|
+
domain: 'engineering',
|
|
249
|
+
keywords: ['ćććć£ćÆć¹', 'IoT', 'ćććć', 'robotics'],
|
|
250
|
+
skills: 'robotics-automation ā lab-automation ā lab-data-management ā interactive-dashboard',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
id: 23,
|
|
254
|
+
name: 'å®éØčØē»ć»ēµ±čØ',
|
|
255
|
+
domain: 'general',
|
|
256
|
+
keywords: ['å®éØčØē»', 'DOE', 'ę¤åŗå', 'ćµć³ćć«ćµć¤ćŗ'],
|
|
257
|
+
skills: 'experimental-design ā statistical-testing ā reproducibility-assessment ā publication-figures',
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
id: 24,
|
|
261
|
+
name: 'ē§å¦ēåÆč¦å',
|
|
262
|
+
domain: 'general',
|
|
263
|
+
keywords: ['åÆč¦å', 'visualization', 'ććć·ć„ćć¼ć', 'dashboard'],
|
|
264
|
+
skills: 'publication-figures ā interactive-dashboard',
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
id: 25,
|
|
268
|
+
name: 'å¦č”åŗē',
|
|
269
|
+
domain: 'literature',
|
|
270
|
+
keywords: ['č«ęę稿', 'journal', 'ć°ć©ć³ć', 'grant'],
|
|
271
|
+
skills: 'academic-writing ā critical-review ā citation-network',
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
id: 26,
|
|
275
|
+
name: 'ē§å¦ęč²',
|
|
276
|
+
domain: 'education',
|
|
277
|
+
keywords: ['ęč²', 'education', 'ć«ćŖćć„ć©ć '],
|
|
278
|
+
skills: 'science-education ā reproducibility-assessment',
|
|
279
|
+
},
|
|
280
|
+
// āā ćÆćć¹ćć”ć¤ć³ćć¤ćć©ć¤ć³ āā
|
|
281
|
+
{
|
|
282
|
+
id: 'A',
|
|
283
|
+
name: 'ć²ćć åµč¬ēµ±å',
|
|
284
|
+
domain: 'cross-domain',
|
|
285
|
+
keywords: ['ć²ćć åµč¬', 'GWAS', 'åµč¬ćæć¼ć²ćć', 'drug target', 'biobank'],
|
|
286
|
+
skills:
|
|
287
|
+
'biobank-cohort ā population-genetics ā drug-target-profiling ā compound-screening ā molecular-docking ā admet-pharmacokinetics',
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
id: 'B',
|
|
291
|
+
name: 'AI é§åčØåŗęęę±ŗå®',
|
|
292
|
+
domain: 'cross-domain',
|
|
293
|
+
keywords: ['čØåŗAI', 'äŗå¾äŗęø¬', 'SHAP', 'ę£č
', 'clinical AI'],
|
|
294
|
+
skills: 'clinical-decision-support ā healthcare-ai ā explainable-ai ā pharmacovigilance ā regulatory-science',
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 'C',
|
|
298
|
+
name: 'ē ē©¶čŖåå',
|
|
299
|
+
domain: 'cross-domain',
|
|
300
|
+
keywords: ['ē ē©¶čŖåå', 'č«ęå', '仮説', 'research automation'],
|
|
301
|
+
skills:
|
|
302
|
+
'deep-research ā hypothesis-pipeline ā pipeline-scaffold ā data-preprocessing ā statistical-testing ā publication-figures ā academic-writing ā systematic-review',
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
id: 'D',
|
|
306
|
+
name: 'ćć«ććŖććÆć¹ē¾ę£č§£ę',
|
|
307
|
+
domain: 'cross-domain',
|
|
308
|
+
keywords: ['ćć«ććŖććÆć¹', 'ē¾ę£', 'scRNA-seq', 'GRN', 'multi-omics'],
|
|
309
|
+
skills:
|
|
310
|
+
'single-cell-genomics ā spatial-transcriptomics ā disease-research ā systems-biology ā multi-omics ā network-analysis',
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
id: 'E',
|
|
314
|
+
name: 'åå„åč¬ē©ēę³',
|
|
315
|
+
domain: 'cross-domain',
|
|
316
|
+
keywords: ['åå„åå»ē', 'PGx', 'Star ć¢ć¬ć«', 'ęäøéęé©å', 'pharmacogenomics'],
|
|
317
|
+
skills:
|
|
318
|
+
'variant-interpretation ā pharmacogenomics ā drug-target-profiling ā admet-pharmacokinetics ā clinical-decision-support ā pharmacovigilance',
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
id: 'F',
|
|
322
|
+
name: 'ćć¤ćŖć¤ć³ćć©ććć£ćÆć¹å®å
Ø',
|
|
323
|
+
domain: 'cross-domain',
|
|
324
|
+
keywords: ['ćć¤ćŖć¤ć³ćć©ććć£ćÆć¹', 'FASTQ', 'é
åč§£ę', 'ēµ±åćć¤ćć©ć¤ć³'],
|
|
325
|
+
skills:
|
|
326
|
+
'bioinformatics ā single-cell-genomics ā biobank-cohort ā multi-omics ā population-genetics ā systems-biology ā hypothesis-pipeline ā academic-writing',
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: 'G',
|
|
330
|
+
name: 'ććē²¾åÆå»ē End-to-End',
|
|
331
|
+
domain: 'cross-domain',
|
|
332
|
+
keywords: ['ććē²¾åÆå»ē', 'GDC', 'DepMap', 'ē²¾åÆč
«ēå¦', 'TCGA'],
|
|
333
|
+
skills:
|
|
334
|
+
'gdc-portal ā cancer-genomics ā depmap-dependencies ā civic-evidence ā pharos-targets ā compound-screening ā precision-oncology ā clinical-decision-support ā healthcare-ai ā survival-clinical',
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
id: 'H',
|
|
338
|
+
name: 'ćć«ććŖććÆć¹ēø¦ęēµ±å',
|
|
339
|
+
domain: 'cross-domain',
|
|
340
|
+
keywords: ['ēø¦ęēµ±å', 'ćØćć²ćć ', 'ććććŖć¼ć ', 'ćć¹ć¦ć§ć¤', 'VEP'],
|
|
341
|
+
skills:
|
|
342
|
+
'genome-sequence-tools ā bioinformatics ā variant-effect-prediction ā epigenomics-chromatin ā regulatory-genomics ā cellxgene-census ā scvi-integration ā uniprot-proteome ā alphafold-structures ā protein-interaction-network ā pathway-enrichment ā reactome-pathways ā network-visualization',
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
id: 'I',
|
|
346
|
+
name: 'ē°å¢ć”ćæćć»ćć¤ćÆććć¤ćŖć¼ć One Health',
|
|
347
|
+
domain: 'cross-domain',
|
|
348
|
+
keywords: ['One Health', 'ē°å¢ć”ćæć', 'åå£', 'å¾®ēē©ē¾¤é', 'SDM'],
|
|
349
|
+
skills:
|
|
350
|
+
'environmental-ecology ā environmental-geodata ā geospatial-analysis ā microbiome-metagenomics ā metagenome-assembled-genomes ā phylogenetics ā metabolomics-databases ā metabolomics-network ā metabolic-modeling ā toxicology-env ā publication-figures',
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
id: 'J',
|
|
354
|
+
name: 'AI é§åćććŖć¢ć«ćŗć¤ć³ćć©ććć£ćÆć¹',
|
|
355
|
+
domain: 'cross-domain',
|
|
356
|
+
keywords: ['ćććŖć¢ć«ćŗć¤ć³ćć©ććć£ćÆć¹', 'GNN', 'č½åå¦ēæ', 'Materials Project', 'ęęę¢ē“¢'],
|
|
357
|
+
skills:
|
|
358
|
+
'computational-materials ā cheminformatics ā automl ā graph-neural-networks ā uncertainty-quantification ā active-learning ā doe ā bayesian-statistics ā adaptive-experiments ā materials-characterization ā advanced-visualization',
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
id: 'K',
|
|
362
|
+
name: 'ē ē©¶ć©ć¤ććµć¤ćÆć«å®å
ØčŖåå',
|
|
363
|
+
domain: 'cross-domain',
|
|
364
|
+
keywords: ['ē ē©¶ć©ć¤ććµć¤ćÆć«', 'ć©ćčŖåå', 'LIMS', 'ććć·ć„ćć¼ć', 'ć°ć©ć³ć'],
|
|
365
|
+
skills:
|
|
366
|
+
'lab-automation ā lab-data-management ā streaming-analytics ā model-monitoring ā data-profiling ā advanced-visualization ā interactive-dashboard ā scientific-schematics ā reproducible-reporting ā paper-quality ā latex-formatter ā peer-review-response ā grant-writing ā preprint-archive',
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
id: 'L',
|
|
370
|
+
name: 'AI é§åćØććć³ć¹åę',
|
|
371
|
+
domain: 'cross-domain',
|
|
372
|
+
keywords: ['ćØććć³ć¹åęAI', 'DLęē®', 'AutoML', 'ć¹ćÆćŖć¼ćć³ć°'],
|
|
373
|
+
skills:
|
|
374
|
+
'deep-research ā literature-search ā text-mining-nlp ā deep-learning ā transfer-learning ā automl ā meta-analysis ā explainable-ai ā systematic-review ā academic-writing',
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
id: 'M',
|
|
378
|
+
name: 'ćććć«ćć¬ć¤ć¤ć¼ć²ćć åµč¬',
|
|
379
|
+
domain: 'cross-domain',
|
|
380
|
+
keywords: ['ććć²ćć åµč¬', 'ICGC', 'ChEMBL', 'ćØćć²ćć '],
|
|
381
|
+
skills:
|
|
382
|
+
'gdc-portal ā cancer-genomics ā icgc-cancer-data ā ensembl-genomics ā variant-effect-prediction ā epigenomics-chromatin ā gwas-catalog ā pharos-targets ā chembl-assay-mining ā compound-screening',
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
id: 'N',
|
|
386
|
+
name: 'čØåŗāč¦å¶āåŗēććŖć„ć¼ćć§ć¼ć³',
|
|
387
|
+
domain: 'cross-domain',
|
|
388
|
+
keywords: ['ććŖć„ć¼ćć§ć¼ć³', 'EHR', 'č¦å¶å ±å', 'å¦č”åŗē', 'HL7'],
|
|
389
|
+
skills:
|
|
390
|
+
'clinical-standards ā clinical-nlp ā clinical-reporting ā healthcare-ai ā pharmacovigilance ā regulatory-science ā reproducible-reporting ā paper-quality ā latex-formatter ā peer-review-response',
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
id: 'O',
|
|
394
|
+
name: 'ć·ć³ć°ć«ć»ć«ććććŖć¼ć ēµ±å',
|
|
395
|
+
domain: 'cross-domain',
|
|
396
|
+
keywords: ['ć·ć³ć°ć«ć»ć«ććććŖć¼ć ', 'č³Ŗéåę', '代č¬ć¢ćć«', 'MOFA+'],
|
|
397
|
+
skills:
|
|
398
|
+
'single-cell-genomics ā spatial-transcriptomics ā proteomics-mass-spectrometry ā structural-proteomics ā alphafold-structures ā metabolomics-databases ā metabolic-modeling ā systems-biology ā multi-omics',
|
|
399
|
+
},
|
|
400
|
+
// āā ć¤ć³ćć¹ććŖć¼ćć¤ćć©ć¤ć³ āā
|
|
401
|
+
{
|
|
402
|
+
id: 'Ind-1',
|
|
403
|
+
name: '製č¬ä¼ę„ć¬ć®ć„ć©ććŖć¼',
|
|
404
|
+
domain: 'industry',
|
|
405
|
+
keywords: ['製č¬', 'CTD', 'ć¬ć®ć„ć©ććŖć¼', 'č¦å¶ē³č«', 'regulatory'],
|
|
406
|
+
skills:
|
|
407
|
+
'drug-target-profiling ā molecular-docking ā admet-pharmacokinetics ā clinical-trials-analytics ā pharmacovigilance ā regulatory-science ā reproducible-reporting ā paper-quality',
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
id: 'Ind-2',
|
|
411
|
+
name: 'č¾²ę„ćć¤ćŖććÆćććøć¼',
|
|
412
|
+
domain: 'industry',
|
|
413
|
+
keywords: ['č¾²ę„ćć¤ćŖ', 'åå£å¾®ēē©', 'CRISPR', 'åå “', 'ć²ćć ē·Øé'],
|
|
414
|
+
skills:
|
|
415
|
+
'environmental-ecology ā microbiome-metagenomics ā geospatial-analysis ā plant-biology ā crispr-design ā gene-expression-transcriptomics ā doe ā publication-figures',
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
id: 'Ind-3',
|
|
419
|
+
name: 'čØåŗę¤ę»å®¤ćÆć¼ćÆććć¼',
|
|
420
|
+
domain: 'industry',
|
|
421
|
+
keywords: ['čØåŗę¤ę»', 'NGS', 'ACMG', 'PGx', 'čØåŗć¬ćć¼ć'],
|
|
422
|
+
skills:
|
|
423
|
+
'genome-sequence-tools ā variant-interpretation ā pharmacogenomics ā clinical-decision-support ā clinical-standards ā clinical-nlp ā clinical-reporting',
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
id: 'Ind-4',
|
|
427
|
+
name: 'é£åå®å
Øć»ęÆę§č©ä¾”',
|
|
428
|
+
domain: 'industry',
|
|
429
|
+
keywords: ['é£åå®å
Ø', 'ęÆę§', 'ę®ēč¾²č¬', 'ćć¼ćć»ć¼ććć£', 'food safety'],
|
|
430
|
+
skills:
|
|
431
|
+
'microbiome-metagenomics ā rrna-taxonomy ā metabolomics-databases ā metabolomics-network ā toxicology-env ā data-profiling ā regulatory-science ā publication-figures',
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
id: 'Ind-5',
|
|
435
|
+
name: 'ę³å»ć»å
¬č”č”ē',
|
|
436
|
+
domain: 'industry',
|
|
437
|
+
keywords: ['ę³å»å¦', 'å
¬č”č”ē', 'ć¢ć¦ććć¬ć¤ćÆ', 'ćµć¼ćć¤ć©ć³ć¹', 'forensic'],
|
|
438
|
+
skills:
|
|
439
|
+
'variant-interpretation ā population-genetics ā infectious-disease ā phylogenetics ā immunoinformatics ā epidemiology-public-health ā public-health-data ā biobank-cohort',
|
|
440
|
+
},
|
|
441
|
+
// āā ć”ć½ćććøć¼ćć¤ćć©ć¤ć³ āā
|
|
442
|
+
{
|
|
443
|
+
id: 'M-α',
|
|
444
|
+
name: 'ćć¤ćŗęØč«ćÆć¼ćÆććć¼',
|
|
445
|
+
domain: 'methodology',
|
|
446
|
+
keywords: ['ćć¤ćŗ', 'MCMC', 'äŗå¾ååø', 'Bayesian', 'äŗåååø'],
|
|
447
|
+
skills:
|
|
448
|
+
'data-preprocessing ā bayesian-statistics ā statistical-simulation ā uncertainty-quantification ā doe ā adaptive-experiments',
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
id: 'M-β',
|
|
452
|
+
name: 'å ęęØč«ćć¤ćć©ć¤ć³',
|
|
453
|
+
domain: 'methodology',
|
|
454
|
+
keywords: ['å ęęØč«', 'DAG', 'å¾åć¹ć³ć¢', 'CATE', 'causal'],
|
|
455
|
+
skills:
|
|
456
|
+
'data-preprocessing ā missing-data-analysis ā causal-inference ā causal-ml ā explainable-ai ā statistical-testing ā publication-figures',
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
id: 'M-γ',
|
|
460
|
+
name: 'ęē³»åäŗęø¬ćć¤ćć©ć¤ć³',
|
|
461
|
+
domain: 'methodology',
|
|
462
|
+
keywords: ['ęē³»å', 'Prophet', 'ARIMA', 'LSTM', 'ē°åøøę¤ē„', 'forecasting'],
|
|
463
|
+
skills:
|
|
464
|
+
'data-preprocessing ā time-series ā time-series-forecasting ā anomaly-detection ā streaming-analytics ā model-monitoring',
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
id: 'M-Ī“',
|
|
468
|
+
name: 'ććć¹ććć¤ćć³ć°ć»NLP',
|
|
469
|
+
domain: 'methodology',
|
|
470
|
+
keywords: ['ććć¹ććć¤ćć³ć°', 'NLP', 'PubTator', 'å¼ēØććććÆć¼ćÆ', 'NER'],
|
|
471
|
+
skills:
|
|
472
|
+
'deep-research ā literature-search ā text-mining-nlp ā biomedical-pubtator ā clinical-nlp ā semantic-scholar ā citation-checker',
|
|
473
|
+
},
|
|
114
474
|
];
|
|
115
475
|
|
|
116
476
|
function pipelineSuggest() {
|
|
117
|
-
const readline = require('readline');
|
|
477
|
+
const readline = require('node:readline');
|
|
118
478
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
119
479
|
|
|
120
480
|
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
@@ -162,6 +522,7 @@ function pipelineSuggest() {
|
|
|
162
522
|
console.log(` ... ä» ${scored.length - 5} ä»¶`);
|
|
163
523
|
}
|
|
164
524
|
console.log('詳瓰㯠docs/SATORI_PIPELINE_EXAMPLES.md ćåē
§ćć¦ćć ććć');
|
|
525
|
+
console.log('å
Øćć¤ćć©ć¤ć³äøč¦§ćÆ `satori pipeline list` ć§ē¢ŗčŖć§ćć¾ćć');
|
|
165
526
|
}
|
|
166
527
|
|
|
167
528
|
rl.close();
|
|
@@ -169,14 +530,42 @@ function pipelineSuggest() {
|
|
|
169
530
|
}
|
|
170
531
|
|
|
171
532
|
function pipelineList() {
|
|
172
|
-
|
|
173
|
-
|
|
533
|
+
const domain = PIPELINES.filter((p) => typeof p.id === 'number');
|
|
534
|
+
const cross = PIPELINES.filter((p) => p.domain === 'cross-domain');
|
|
535
|
+
const industry = PIPELINES.filter((p) => p.domain === 'industry');
|
|
536
|
+
const methodology = PIPELINES.filter((p) => p.domain === 'methodology');
|
|
537
|
+
|
|
538
|
+
console.log(`\nš SATORI ćć¤ćć©ć¤ć³äøč¦§ (å
Ø ${PIPELINES.length} ćć¤ćć©ć¤ć³)\n`);
|
|
539
|
+
|
|
540
|
+
console.log('āā ćć”ć¤ć³ćć¤ćć©ć¤ć³ (26) āā\n');
|
|
541
|
+
for (const p of domain) {
|
|
174
542
|
console.log(` #${String(p.id).padStart(2, ' ')} ${p.name}`);
|
|
175
543
|
console.log(` ${p.skills}`);
|
|
176
544
|
console.log('');
|
|
177
545
|
}
|
|
178
|
-
|
|
179
|
-
console.log('
|
|
546
|
+
|
|
547
|
+
console.log('āā ćÆćć¹ćć”ć¤ć³ćć¤ćć©ć¤ć³ (15) āā\n');
|
|
548
|
+
for (const p of cross) {
|
|
549
|
+
console.log(` #${p.id} ${p.name}`);
|
|
550
|
+
console.log(` ${p.skills}`);
|
|
551
|
+
console.log('');
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
console.log('āā ć¤ć³ćć¹ććŖć¼ćć¤ćć©ć¤ć³ (5) āā\n');
|
|
555
|
+
for (const p of industry) {
|
|
556
|
+
console.log(` #${p.id} ${p.name}`);
|
|
557
|
+
console.log(` ${p.skills}`);
|
|
558
|
+
console.log('');
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
console.log('āā ć”ć½ćććøć¼ćć¤ćć©ć¤ć³ (4) āā\n');
|
|
562
|
+
for (const p of methodology) {
|
|
563
|
+
console.log(` #${p.id} ${p.name}`);
|
|
564
|
+
console.log(` ${p.skills}`);
|
|
565
|
+
console.log('');
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
console.log('詳瓰㯠docs/SATORI_PIPELINE_EXAMPLES.md ćåē
§ćć¦ćć ććć');
|
|
180
569
|
}
|
|
181
570
|
|
|
182
571
|
function showVersion() {
|
|
@@ -184,10 +573,343 @@ function showVersion() {
|
|
|
184
573
|
console.log(pkg.version);
|
|
185
574
|
}
|
|
186
575
|
|
|
576
|
+
// āā Validate āā
|
|
577
|
+
|
|
578
|
+
function parseFrontmatter(content) {
|
|
579
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
580
|
+
if (!match) return null;
|
|
581
|
+
const yaml = match[1];
|
|
582
|
+
const name = yaml.match(/^name:\s*(.+)$/m)?.[1]?.trim();
|
|
583
|
+
const hasDescription = /^description:/m.test(yaml);
|
|
584
|
+
return { name, hasDescription };
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function validate() {
|
|
588
|
+
const verbose = FLAGS.includes('--verbose');
|
|
589
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
590
|
+
|
|
591
|
+
if (!fs.existsSync(skillsDir)) {
|
|
592
|
+
console.error('Error: skills directory not found:', skillsDir);
|
|
593
|
+
process.exit(1);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
const dirs = fs
|
|
597
|
+
.readdirSync(skillsDir)
|
|
598
|
+
.filter((d) => d.startsWith('scientific-'))
|
|
599
|
+
.sort();
|
|
600
|
+
let pass = 0;
|
|
601
|
+
let fail = 0;
|
|
602
|
+
const errors = [];
|
|
603
|
+
|
|
604
|
+
for (const dir of dirs) {
|
|
605
|
+
const filePath = path.join(skillsDir, dir, 'SKILL.md');
|
|
606
|
+
const issues = [];
|
|
607
|
+
|
|
608
|
+
if (!fs.existsSync(filePath)) {
|
|
609
|
+
issues.push('SKILL.md ćč¦ć¤ććć¾ćć');
|
|
610
|
+
} else {
|
|
611
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
612
|
+
const fm = parseFrontmatter(content);
|
|
613
|
+
|
|
614
|
+
if (!fm) issues.push('YAML Frontmatter ćććć¾ćć');
|
|
615
|
+
else {
|
|
616
|
+
if (!fm.name) issues.push('Frontmatter ć« name ćććć¾ćć');
|
|
617
|
+
else if (fm.name !== dir) issues.push(`name äøäøč“: "${fm.name}" (ęå¾
å¤: "${dir}")`);
|
|
618
|
+
if (!fm.hasDescription) issues.push('Frontmatter ć« description ćććć¾ćć');
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
if (!/^# .+$/m.test(content)) issues.push('H1 ćæć¤ćć«ćććć¾ćć');
|
|
622
|
+
if (!/^## When to Use/m.test(content)) issues.push('## When to Use ć»ćÆć·ć§ć³ćććć¾ćć');
|
|
623
|
+
if (!/^## Quick Start/m.test(content)) issues.push('## Quick Start ć»ćÆć·ć§ć³ćććć¾ćć');
|
|
624
|
+
if (!/```(?:python|markdown|json)/.test(content)) issues.push('ć³ć¼ćććććÆćććć¾ćć');
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
if (issues.length === 0) {
|
|
628
|
+
pass++;
|
|
629
|
+
if (verbose) console.log(` ā ${dir}`);
|
|
630
|
+
} else {
|
|
631
|
+
fail++;
|
|
632
|
+
errors.push({ dir, issues });
|
|
633
|
+
if (verbose) {
|
|
634
|
+
console.log(` ā ${dir}`);
|
|
635
|
+
for (const issue of issues) console.log(` - ${issue}`);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
console.log(`\nš SKILL.md ę¤čؼēµę: ${pass} pass / ${fail} fail (å
Ø ${dirs.length} ć¹ćć«)`);
|
|
641
|
+
|
|
642
|
+
if (errors.length > 0 && !verbose) {
|
|
643
|
+
console.log('\nåé”ć®ććć¹ćć«:');
|
|
644
|
+
for (const e of errors) {
|
|
645
|
+
console.log(` ā ${e.dir}: ${e.issues.join(', ')}`);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (fail > 0) {
|
|
650
|
+
console.log('\n詳瓰㯠--verbose ćŖćć·ć§ć³ć§ē¢ŗčŖćć¦ćć ććć');
|
|
651
|
+
process.exit(1);
|
|
652
|
+
} else {
|
|
653
|
+
console.log('\nā å
Øć¹ćć«ć®ę¤čؼć«ęåćć¾ććć');
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// āā Stats āā
|
|
658
|
+
|
|
659
|
+
function stats() {
|
|
660
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
661
|
+
|
|
662
|
+
if (!fs.existsSync(skillsDir)) {
|
|
663
|
+
console.error('Error: skills directory not found:', skillsDir);
|
|
664
|
+
process.exit(1);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
const dirs = fs
|
|
668
|
+
.readdirSync(skillsDir)
|
|
669
|
+
.filter((d) => d.startsWith('scientific-'))
|
|
670
|
+
.sort();
|
|
671
|
+
const totalSkills = dirs.length;
|
|
672
|
+
let tuLinked = 0;
|
|
673
|
+
let totalCodeBlocks = 0;
|
|
674
|
+
const tuPattern = /ToolUniverse|å©ēØåÆč½ćć¼ć«|SMCP/i;
|
|
675
|
+
const tuKeyPattern = /`([A-Z][a-zA-Z]*_[a-z]+_[a-z_]+)`/g;
|
|
676
|
+
const allTuKeys = new Set();
|
|
677
|
+
|
|
678
|
+
for (const dir of dirs) {
|
|
679
|
+
const filePath = path.join(skillsDir, dir, 'SKILL.md');
|
|
680
|
+
if (!fs.existsSync(filePath)) continue;
|
|
681
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
682
|
+
|
|
683
|
+
if (tuPattern.test(content)) tuLinked++;
|
|
684
|
+
|
|
685
|
+
const codeBlocks = content.match(/```(?:python|markdown|json)/g);
|
|
686
|
+
if (codeBlocks) totalCodeBlocks += codeBlocks.length;
|
|
687
|
+
|
|
688
|
+
for (const m of content.matchAll(tuKeyPattern)) {
|
|
689
|
+
allTuKeys.add(m[1]);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
const coverage = ((tuLinked / totalSkills) * 100).toFixed(1);
|
|
694
|
+
const pkg = require(path.join(PACKAGE_ROOT, 'package.json'));
|
|
695
|
+
|
|
696
|
+
console.log(`
|
|
697
|
+
š SATORI v${pkg.version} ā ēµ±čØ
|
|
698
|
+
|
|
699
|
+
ć¹ćć«ē·ę°: ${totalSkills}
|
|
700
|
+
ćć¤ćć©ć¤ć³ę°: ${PIPELINES.length}
|
|
701
|
+
TU é£ęŗć¹ćć«: ${tuLinked} (${coverage}%)
|
|
702
|
+
TU ęŖé£ęŗ: ${totalSkills - tuLinked}
|
|
703
|
+
ć¦ćć¼ćÆ TU ćć¼: ${allTuKeys.size}
|
|
704
|
+
ć³ć¼ćććććÆē·ę°: ${totalCodeBlocks}
|
|
705
|
+
`);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// āā Skill Search / Info āā
|
|
709
|
+
|
|
710
|
+
function loadAllSkills() {
|
|
711
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
712
|
+
if (!fs.existsSync(skillsDir)) {
|
|
713
|
+
console.error('Error: skills directory not found:', skillsDir);
|
|
714
|
+
process.exit(1);
|
|
715
|
+
}
|
|
716
|
+
const dirs = fs
|
|
717
|
+
.readdirSync(skillsDir)
|
|
718
|
+
.filter((d) => d.startsWith('scientific-'))
|
|
719
|
+
.sort();
|
|
720
|
+
const skills = [];
|
|
721
|
+
for (const dir of dirs) {
|
|
722
|
+
const filePath = path.join(skillsDir, dir, 'SKILL.md');
|
|
723
|
+
if (!fs.existsSync(filePath)) continue;
|
|
724
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
725
|
+
const fm = parseFrontmatter(content);
|
|
726
|
+
const descMatch = content.match(/^description:\s*\|?\s*\n([\s\S]*?)(?=\n\w|\n---)/m);
|
|
727
|
+
const description = descMatch ? descMatch[1].replace(/^\s+/gm, '').trim() : fm?.hasDescription ? '' : '';
|
|
728
|
+
const tuKeyPattern = /`([A-Z][a-zA-Z]*_[a-z]+_[a-z_]+)`/g;
|
|
729
|
+
const tuKeys = [];
|
|
730
|
+
for (const m of content.matchAll(tuKeyPattern)) {
|
|
731
|
+
tuKeys.push(m[1]);
|
|
732
|
+
}
|
|
733
|
+
const h1Match = content.match(/^# (.+)$/m);
|
|
734
|
+
const title = h1Match ? h1Match[1].trim() : dir;
|
|
735
|
+
skills.push({ dir, name: fm?.name || dir, title, description, content, tuKeys });
|
|
736
|
+
}
|
|
737
|
+
return skills;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
function skillSearch() {
|
|
741
|
+
const query = process.argv.slice(4).join(' ').toLowerCase();
|
|
742
|
+
if (!query) {
|
|
743
|
+
console.error('Error: ę¤ē“¢ćÆćØćŖćęå®ćć¦ćć ććć');
|
|
744
|
+
console.log('Usage: satori skill search <query>');
|
|
745
|
+
process.exit(1);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
const skills = loadAllSkills();
|
|
749
|
+
const scored = skills
|
|
750
|
+
.map((s) => {
|
|
751
|
+
let score = 0;
|
|
752
|
+
// ååć®å®å
Øäøč“
|
|
753
|
+
if (s.name.toLowerCase() === query) score += 10;
|
|
754
|
+
// ååć«å«ć¾ćć
|
|
755
|
+
else if (s.name.toLowerCase().includes(query)) score += 5;
|
|
756
|
+
// ćæć¤ćć«ć«å«ć¾ćć
|
|
757
|
+
if (s.title.toLowerCase().includes(query)) score += 3;
|
|
758
|
+
// čŖ¬ęć«å«ć¾ćć
|
|
759
|
+
if (s.description.toLowerCase().includes(query)) score += 2;
|
|
760
|
+
// TU ćć¼ć«å«ć¾ćć
|
|
761
|
+
for (const k of s.tuKeys) {
|
|
762
|
+
if (k.toLowerCase().includes(query)) score += 1;
|
|
763
|
+
}
|
|
764
|
+
return { ...s, score };
|
|
765
|
+
})
|
|
766
|
+
.filter((s) => s.score > 0)
|
|
767
|
+
.sort((a, b) => b.score - a.score);
|
|
768
|
+
|
|
769
|
+
console.log(`\nš "${process.argv.slice(4).join(' ')}" ć®ę¤ē“¢ēµę\n`);
|
|
770
|
+
if (scored.length === 0) {
|
|
771
|
+
console.log('ā 該å½ććć¹ćć«ćč¦ć¤ććć¾ććć§ććć');
|
|
772
|
+
console.log('');
|
|
773
|
+
console.log('ćć³ć: č±čŖåļ¼ä¾: deep-learning, cancer-genomicsļ¼ć');
|
|
774
|
+
console.log(' ę„ę¬čŖćć¼ćÆć¼ćļ¼ä¾: åµč¬, ę©ę¢°å¦ēæļ¼ć§ę¤ē“¢ćć¦ćæć¦ćć ććć');
|
|
775
|
+
} else {
|
|
776
|
+
const top = scored.slice(0, 10);
|
|
777
|
+
for (const s of top) {
|
|
778
|
+
const desc = s.description ? s.description.split('\n')[0].substring(0, 60) : '';
|
|
779
|
+
console.log(` š ${s.name}`);
|
|
780
|
+
if (desc) console.log(` ${desc}`);
|
|
781
|
+
console.log('');
|
|
782
|
+
}
|
|
783
|
+
if (scored.length > 10) {
|
|
784
|
+
console.log(` ... ä» ${scored.length - 10} ä»¶`);
|
|
785
|
+
}
|
|
786
|
+
console.log(`åčØ ${scored.length} ä»¶ćććććć¾ććć`);
|
|
787
|
+
console.log('詳瓰㯠`satori skill info <name>` ć§ē¢ŗčŖć§ćć¾ćć');
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
function skillInfo() {
|
|
792
|
+
const name = process.argv[4];
|
|
793
|
+
if (!name) {
|
|
794
|
+
console.error('Error: ć¹ćć«åćęå®ćć¦ćć ććć');
|
|
795
|
+
console.log('Usage: satori skill info <name>');
|
|
796
|
+
console.log('ć¹ćć«ę¤ē“¢ćÆ `satori skill search <query>` ć使ć£ć¦ćć ććć');
|
|
797
|
+
process.exit(1);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
801
|
+
// scientific- ćć¬ćć£ććÆć¹ćčŖåč£å®
|
|
802
|
+
const dirName = name.startsWith('scientific-') ? name : `scientific-${name}`;
|
|
803
|
+
const filePath = path.join(skillsDir, dirName, 'SKILL.md');
|
|
804
|
+
|
|
805
|
+
if (!fs.existsSync(filePath)) {
|
|
806
|
+
console.error(`Error: ć¹ćć« "${name}" ćč¦ć¤ććć¾ććć`);
|
|
807
|
+
console.log('');
|
|
808
|
+
// éØåäøč“åč£ćę示
|
|
809
|
+
if (fs.existsSync(skillsDir)) {
|
|
810
|
+
const dirs = fs
|
|
811
|
+
.readdirSync(skillsDir)
|
|
812
|
+
.filter((d) => d.startsWith('scientific-') && d.includes(name))
|
|
813
|
+
.slice(0, 5);
|
|
814
|
+
if (dirs.length > 0) {
|
|
815
|
+
console.log('ććććć¦:');
|
|
816
|
+
for (const d of dirs) {
|
|
817
|
+
console.log(` - ${d.replace('scientific-', '')}`);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
process.exit(1);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
825
|
+
const fm = parseFrontmatter(content);
|
|
826
|
+
const h1Match = content.match(/^# (.+)$/m);
|
|
827
|
+
const title = h1Match ? h1Match[1].trim() : dirName;
|
|
828
|
+
|
|
829
|
+
// čŖ¬ęę½åŗ
|
|
830
|
+
const descMatch = content.match(/^description:\s*\|?\s*\n([\s\S]*?)(?=\n\w|\n---)/m);
|
|
831
|
+
const description = descMatch ? descMatch[1].replace(/^\s+/gm, '').trim() : '';
|
|
832
|
+
|
|
833
|
+
// When to Use ć»ćÆć·ć§ć³ę½åŗ
|
|
834
|
+
const whenMatch = content.match(/^## When to Use\s*\n([\s\S]*?)(?=\n## )/m);
|
|
835
|
+
const whenToUse = whenMatch ? whenMatch[1].trim() : '';
|
|
836
|
+
|
|
837
|
+
// TU ćć¼ć«
|
|
838
|
+
const tuKeyPattern = /`([A-Z][a-zA-Z]*_[a-z]+_[a-z_]+)`/g;
|
|
839
|
+
const tuKeys = new Set();
|
|
840
|
+
for (const m of content.matchAll(tuKeyPattern)) {
|
|
841
|
+
tuKeys.add(m[1]);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// tu_tools from frontmatter
|
|
845
|
+
const tuToolMatches = content.match(/^tu_tools:\s*\n([\s\S]*?)(?=\n---|\n[a-z])/m);
|
|
846
|
+
const tuToolNames = [];
|
|
847
|
+
if (tuToolMatches) {
|
|
848
|
+
const toolLines = tuToolMatches[1].matchAll(/name:\s*(.+)/g);
|
|
849
|
+
for (const m of toolLines) {
|
|
850
|
+
tuToolNames.push(m[1].trim());
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// é¢é£ćć¤ćć©ć¤ć³
|
|
855
|
+
const shortName = dirName.replace('scientific-', '');
|
|
856
|
+
const relatedPipelines = PIPELINES.filter((p) => p.skills.includes(shortName));
|
|
857
|
+
|
|
858
|
+
console.log(`\nš ${title}`);
|
|
859
|
+
console.log(` åå: ${fm?.name || dirName}`);
|
|
860
|
+
if (description) {
|
|
861
|
+
console.log(` čŖ¬ę: ${description}`);
|
|
862
|
+
}
|
|
863
|
+
console.log('');
|
|
864
|
+
|
|
865
|
+
if (whenToUse) {
|
|
866
|
+
console.log('āā When to Use āā');
|
|
867
|
+
console.log(whenToUse);
|
|
868
|
+
console.log('');
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
if (tuKeys.size > 0 || tuToolNames.length > 0) {
|
|
872
|
+
console.log('āā ToolUniverse é£ęŗ āā');
|
|
873
|
+
if (tuToolNames.length > 0) {
|
|
874
|
+
for (const t of tuToolNames) {
|
|
875
|
+
console.log(` š§ ${t}`);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
if (tuKeys.size > 0) {
|
|
879
|
+
console.log(` TU ćć¼: ${[...tuKeys].join(', ')}`);
|
|
880
|
+
}
|
|
881
|
+
console.log('');
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
if (relatedPipelines.length > 0) {
|
|
885
|
+
console.log('āā é¢é£ćć¤ćć©ć¤ć³ āā');
|
|
886
|
+
for (const p of relatedPipelines.slice(0, 5)) {
|
|
887
|
+
console.log(` š #${p.id}: ${p.name}`);
|
|
888
|
+
}
|
|
889
|
+
if (relatedPipelines.length > 5) {
|
|
890
|
+
console.log(` ... ä» ${relatedPipelines.length - 5} ä»¶`);
|
|
891
|
+
}
|
|
892
|
+
console.log('');
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
console.log(`ćć”ć¤ć«: src/.github/skills/${dirName}/SKILL.md`);
|
|
896
|
+
}
|
|
897
|
+
|
|
187
898
|
switch (COMMAND) {
|
|
188
899
|
case 'init':
|
|
189
900
|
init();
|
|
190
901
|
break;
|
|
902
|
+
case 'skill':
|
|
903
|
+
if (SUBCOMMAND === 'search') {
|
|
904
|
+
skillSearch();
|
|
905
|
+
} else if (SUBCOMMAND === 'info') {
|
|
906
|
+
skillInfo();
|
|
907
|
+
} else {
|
|
908
|
+
console.error(`Unknown skill subcommand: ${SUBCOMMAND || '(none)'}`);
|
|
909
|
+
console.log('Usage: satori skill search <query> | satori skill info <name>');
|
|
910
|
+
process.exit(1);
|
|
911
|
+
}
|
|
912
|
+
break;
|
|
191
913
|
case 'pipeline':
|
|
192
914
|
if (SUBCOMMAND === 'suggest') {
|
|
193
915
|
pipelineSuggest();
|
|
@@ -199,6 +921,12 @@ switch (COMMAND) {
|
|
|
199
921
|
process.exit(1);
|
|
200
922
|
}
|
|
201
923
|
break;
|
|
924
|
+
case 'validate':
|
|
925
|
+
validate();
|
|
926
|
+
break;
|
|
927
|
+
case 'stats':
|
|
928
|
+
stats();
|
|
929
|
+
break;
|
|
202
930
|
case 'help':
|
|
203
931
|
case '--help':
|
|
204
932
|
case '-h':
|