@nahisaho/satori 0.25.4 → 0.26.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 +415 -2
- 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 +32 -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 +50 -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/README.md
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
**SATORI** は、科学データ解析のための **GitHub Copilot Agent Skills** コレクションです。
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@nahisaho/satori)
|
|
6
|
+
[](https://github.com/nahisaho/satori/actions/workflows/ci.yml)
|
|
6
7
|
[](LICENCE)
|
|
7
8
|
|
|
8
9
|
## Overview
|
|
9
10
|
|
|
10
|
-
このディレクトリには、Exp-01〜13 で蓄積した科学データ解析技法を Agent Skills として体系化した **190 個**のスキルを格納しています。Copilot
|
|
11
|
+
このディレクトリには、Exp-01〜13 で蓄積した科学データ解析技法を Agent Skills として体系化した **190 個**のスキルを格納しています。Copilot がプロンプトの文脈に応じて適切なスキルを自動ロードし、各実験で確立した解析パターンを再利用します。全 190 スキルが [ToolUniverse](https://github.com/mims-harvard/ToolUniverse) SMCP 経由で 1,200 以上の外部科学データベースツールと連携可能です。
|
|
11
12
|
|
|
12
13
|
### パイプラインフロー
|
|
13
14
|
|
|
@@ -702,6 +703,18 @@ satori init
|
|
|
702
703
|
|
|
703
704
|
`.github/skills/` がカレントディレクトリにコピーされ、Copilot Agent Mode で即座に利用できます。
|
|
704
705
|
|
|
706
|
+
### CLI コマンド一覧
|
|
707
|
+
|
|
708
|
+
| コマンド | 説明 |
|
|
709
|
+
|---|---|
|
|
710
|
+
| `satori init [--force] [--dry-run]` | `.github/skills/` をカレントディレクトリにインストール |
|
|
711
|
+
| `satori pipeline suggest` | キーワードでインタラクティブにパイプラインを推薦 |
|
|
712
|
+
| `satori pipeline list` | 全 26 ドメインパイプラインを一覧表示 |
|
|
713
|
+
| `satori validate [--verbose]` | 全 190 SKILL.md を自動検証 |
|
|
714
|
+
| `satori stats` | スキル数・TU カバレッジなどの統計表示 |
|
|
715
|
+
| `satori help` | ヘルプ表示 |
|
|
716
|
+
| `satori --version` | バージョン表示 |
|
|
717
|
+
|
|
705
718
|
---
|
|
706
719
|
|
|
707
720
|
## 使い方
|
|
@@ -979,6 +992,49 @@ Skills は `.github/skills/` に配置されているため、Copilot が自動
|
|
|
979
992
|
|
|
980
993
|
---
|
|
981
994
|
|
|
995
|
+
## 開発
|
|
996
|
+
|
|
997
|
+
### 前提条件
|
|
998
|
+
|
|
999
|
+
- Node.js >= 18
|
|
1000
|
+
|
|
1001
|
+
### セットアップ
|
|
1002
|
+
|
|
1003
|
+
```bash
|
|
1004
|
+
git clone https://github.com/nahisaho/satori.git
|
|
1005
|
+
cd satori
|
|
1006
|
+
npm install
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
### テスト
|
|
1010
|
+
|
|
1011
|
+
```bash
|
|
1012
|
+
npm test # 全テスト実行 (1,359 テスト)
|
|
1013
|
+
npm run test:unit # CLI ユニットテストのみ (24 テスト)
|
|
1014
|
+
npm run test:validation # SKILL.md 検証テストのみ (1,335 テスト)
|
|
1015
|
+
npm run test:coverage # カバレッジ付き実行
|
|
1016
|
+
npm run test:watch # ウォッチモード
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
### リント・フォーマット
|
|
1020
|
+
|
|
1021
|
+
```bash
|
|
1022
|
+
npm run lint # Biome lint チェック
|
|
1023
|
+
npm run lint:fix # 自動修正
|
|
1024
|
+
npm run format # コードフォーマット
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
### CI
|
|
1028
|
+
|
|
1029
|
+
GitHub Actions で以下の 4 ジョブが `main` ブランチへの push / PR 時に実行されます:
|
|
1030
|
+
|
|
1031
|
+
- **test**: Node.js 18/20/22 マトリクスでの全テスト実行
|
|
1032
|
+
- **validate-skills**: 全 SKILL.md フォーマット検証
|
|
1033
|
+
- **cli-smoke**: CLI コマンドのスモークテスト
|
|
1034
|
+
- **lint**: Biome によるコード品質チェック
|
|
1035
|
+
|
|
1036
|
+
---
|
|
1037
|
+
|
|
982
1038
|
## 参考
|
|
983
1039
|
|
|
984
1040
|
- [SATORI 使い方ガイド](../../docs/qiita-satori-guide.md)
|
package/bin/satori.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
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
|
+
const SUBCOMMAND = process.argv[3];
|
|
7
8
|
const FLAGS = process.argv.slice(3);
|
|
8
9
|
|
|
9
10
|
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
@@ -70,24 +71,436 @@ SATORI — Agent Skills for Science
|
|
|
70
71
|
|
|
71
72
|
Usage:
|
|
72
73
|
satori init [--force] [--dry-run] Install .github/ skills into current directory
|
|
74
|
+
satori pipeline suggest Interactive pipeline recommendation
|
|
75
|
+
satori pipeline list List all available pipelines
|
|
76
|
+
satori validate [--verbose] Validate all SKILL.md files
|
|
77
|
+
satori stats Show skill/TU coverage statistics
|
|
73
78
|
satori help Show this help message
|
|
74
79
|
satori --version, -v Show version number
|
|
75
80
|
|
|
76
81
|
Options:
|
|
77
82
|
--force Overwrite existing .github/ directory
|
|
78
83
|
--dry-run Preview what would be installed without making changes
|
|
84
|
+
--verbose Show detailed validation output
|
|
79
85
|
`);
|
|
80
86
|
}
|
|
81
87
|
|
|
88
|
+
// ── Pipeline Suggest ──
|
|
89
|
+
|
|
90
|
+
const PIPELINES = [
|
|
91
|
+
{
|
|
92
|
+
id: 1,
|
|
93
|
+
name: '仮説検証→論文化',
|
|
94
|
+
domain: 'general',
|
|
95
|
+
keywords: ['仮説', '統計', '論文', 'hypothesis'],
|
|
96
|
+
skills:
|
|
97
|
+
'hypothesis-engine → data-preprocessing → statistical-testing → ml-classification → publication-figures → academic-writing → critical-review',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 2,
|
|
101
|
+
name: 'バリアント→臨床',
|
|
102
|
+
domain: 'genomics',
|
|
103
|
+
keywords: ['バリアント', 'variant', 'VCF', 'WGS', 'WES'],
|
|
104
|
+
skills:
|
|
105
|
+
'variant-interpretation → pharmacogenomics → precision-oncology → clinical-decision-support → clinical-reporting',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: 3,
|
|
109
|
+
name: 'トランスクリプトーム',
|
|
110
|
+
domain: 'genomics',
|
|
111
|
+
keywords: ['RNA-seq', 'トランスクリプトーム', 'DEG', '発現'],
|
|
112
|
+
skills: 'rnaseq-analysis → pathway-enrichment → network-analysis → publication-figures',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: 4,
|
|
116
|
+
name: 'エピジェネティクス',
|
|
117
|
+
domain: 'genomics',
|
|
118
|
+
keywords: ['エピゲノム', 'ChIP-seq', 'ATAC-seq', 'メチル化'],
|
|
119
|
+
skills: 'epigenomics-chromatin → regulatory-genomics → noncoding-rna → gene-regulation',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 5,
|
|
123
|
+
name: 'AlphaFold 構造解析',
|
|
124
|
+
domain: 'structural',
|
|
125
|
+
keywords: ['AlphaFold', 'タンパク質構造', '3D', 'protein structure'],
|
|
126
|
+
skills: 'alphafold-structures → protein-structure-analysis → molecular-docking',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: 6,
|
|
130
|
+
name: 'エビデンス合成',
|
|
131
|
+
domain: 'literature',
|
|
132
|
+
keywords: ['メタアナリシス', 'systematic review', '文献', 'エビデンス'],
|
|
133
|
+
skills:
|
|
134
|
+
'deep-research → literature-search → meta-analysis → evidence-synthesis → academic-writing → critical-review',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: 7,
|
|
138
|
+
name: '創薬パイプライン',
|
|
139
|
+
domain: 'pharma',
|
|
140
|
+
keywords: ['創薬', 'drug discovery', 'ADMET', 'ドッキング'],
|
|
141
|
+
skills:
|
|
142
|
+
'drug-target-profiling → compound-screening → molecular-docking → admet-pharmacokinetics → drug-repurposing',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: 8,
|
|
146
|
+
name: 'ML/XAI パイプライン',
|
|
147
|
+
domain: 'ml',
|
|
148
|
+
keywords: ['機械学習', 'ML', 'SHAP', 'XAI', '予測モデル'],
|
|
149
|
+
skills:
|
|
150
|
+
'data-preprocessing → ml-classification → ml-regression → explainable-ai → fairness-bias → publication-figures',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 9,
|
|
154
|
+
name: '環境・生態学',
|
|
155
|
+
domain: 'ecology',
|
|
156
|
+
keywords: ['生態', '生物多様性', 'SDM', '環境', 'ecology'],
|
|
157
|
+
skills: 'environmental-ecology → biodiversity-conservation → species-distribution → time-series-forecasting',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: 10,
|
|
161
|
+
name: '計算材料科学',
|
|
162
|
+
domain: 'materials',
|
|
163
|
+
keywords: ['材料', 'materials', 'DFT', '物性'],
|
|
164
|
+
skills: 'computational-materials → cheminformatics → molecular-dynamics → ml-regression',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 11,
|
|
168
|
+
name: '医薬品安全性',
|
|
169
|
+
domain: 'pharma',
|
|
170
|
+
keywords: ['有害事象', 'ファーマコビジランス', '安全性', 'adverse'],
|
|
171
|
+
skills: 'pharmacovigilance → pharmacogenomics → regulatory-science',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: 12,
|
|
175
|
+
name: '希少疾患',
|
|
176
|
+
domain: 'clinical',
|
|
177
|
+
keywords: ['希少疾患', 'rare disease', 'Orphanet'],
|
|
178
|
+
skills: 'rare-disease-genetics → gene-panel-design → variant-interpretation → clinical-reporting',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: 13,
|
|
182
|
+
name: 'がんゲノミクス',
|
|
183
|
+
domain: 'oncology',
|
|
184
|
+
keywords: ['がん', 'cancer', 'TMB', '体細胞変異'],
|
|
185
|
+
skills: 'cancer-genomics → precision-oncology → biomarker-discovery → clinical-reporting',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 14,
|
|
189
|
+
name: 'GWAS・集団遺伝学',
|
|
190
|
+
domain: 'genomics',
|
|
191
|
+
keywords: ['GWAS', '集団遺伝学', 'population genetics', 'biobank'],
|
|
192
|
+
skills: 'biobank-cohort → population-genetics → statistical-testing → publication-figures',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
id: 15,
|
|
196
|
+
name: 'シングルセル',
|
|
197
|
+
domain: 'genomics',
|
|
198
|
+
keywords: ['シングルセル', 'single-cell', 'scRNA-seq', '空間トランスクリプトーム'],
|
|
199
|
+
skills: 'cellxgene-census → scvi-integration → spatial-transcriptomics → gene-regulation',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: 16,
|
|
203
|
+
name: 'プロテオミクス',
|
|
204
|
+
domain: 'omics',
|
|
205
|
+
keywords: ['プロテオミクス', 'proteomics', '質量分析'],
|
|
206
|
+
skills: 'proteomics → protein-structure-analysis → network-analysis',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: 17,
|
|
210
|
+
name: 'メタボロミクス',
|
|
211
|
+
domain: 'omics',
|
|
212
|
+
keywords: ['メタボロミクス', 'metabolomics', '代謝物', '脂質'],
|
|
213
|
+
skills: 'metabolomics → lipidomics → systems-biology → network-analysis',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: 18,
|
|
217
|
+
name: 'マイクロバイオーム',
|
|
218
|
+
domain: 'ecology',
|
|
219
|
+
keywords: ['マイクロバイオーム', 'metagenome', '16S', '腸内細菌'],
|
|
220
|
+
skills: 'microbiome-metagenomics → metagenome-assembled-genomes → phylogenetics → environmental-ecology',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 19,
|
|
224
|
+
name: 'パスウェイ・KG',
|
|
225
|
+
domain: 'systems',
|
|
226
|
+
keywords: ['パスウェイ', 'ナレッジグラフ', 'knowledge graph', 'pathway'],
|
|
227
|
+
skills: 'gene-id-mapping → pathway-enrichment → ontology-integration → network-analysis → knowledge-graph',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
id: 20,
|
|
231
|
+
name: '農業・食品',
|
|
232
|
+
domain: 'agriculture',
|
|
233
|
+
keywords: ['農業', '食品', 'agriculture', 'food safety'],
|
|
234
|
+
skills: 'agricultural-science → food-science-nutrition → environmental-ecology',
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
id: 21,
|
|
238
|
+
name: '臨床情報学',
|
|
239
|
+
domain: 'clinical',
|
|
240
|
+
keywords: ['臨床', 'EHR', 'FHIR', 'OMOP', '電子カルテ'],
|
|
241
|
+
skills: 'clinical-standards → clinical-nlp → clinical-reporting → healthcare-ai → survival-clinical',
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 22,
|
|
245
|
+
name: 'ロボティクス・IoT',
|
|
246
|
+
domain: 'engineering',
|
|
247
|
+
keywords: ['ロボティクス', 'IoT', 'ロボット', 'robotics'],
|
|
248
|
+
skills: 'robotics-automation → lab-automation → lab-data-management → interactive-dashboard',
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
id: 23,
|
|
252
|
+
name: '実験計画・統計',
|
|
253
|
+
domain: 'general',
|
|
254
|
+
keywords: ['実験計画', 'DOE', '検出力', 'サンプルサイズ'],
|
|
255
|
+
skills: 'experimental-design → statistical-testing → reproducibility-assessment → publication-figures',
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: 24,
|
|
259
|
+
name: '科学的可視化',
|
|
260
|
+
domain: 'general',
|
|
261
|
+
keywords: ['可視化', 'visualization', 'ダッシュボード', 'dashboard'],
|
|
262
|
+
skills: 'publication-figures → interactive-dashboard',
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
id: 25,
|
|
266
|
+
name: '学術出版',
|
|
267
|
+
domain: 'literature',
|
|
268
|
+
keywords: ['論文投稿', 'journal', 'グラント', 'grant'],
|
|
269
|
+
skills: 'academic-writing → critical-review → citation-network',
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
id: 26,
|
|
273
|
+
name: '科学教育',
|
|
274
|
+
domain: 'education',
|
|
275
|
+
keywords: ['教育', 'education', 'カリキュラム'],
|
|
276
|
+
skills: 'science-education → reproducibility-assessment',
|
|
277
|
+
},
|
|
278
|
+
];
|
|
279
|
+
|
|
280
|
+
function pipelineSuggest() {
|
|
281
|
+
const readline = require('node:readline');
|
|
282
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
283
|
+
|
|
284
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
285
|
+
|
|
286
|
+
(async () => {
|
|
287
|
+
console.log('\n🔬 SATORI Pipeline Suggest — インタラクティブパイプライン推薦\n');
|
|
288
|
+
console.log('研究内容を入力すると、最適なパイプラインを提案します。');
|
|
289
|
+
console.log('(Ctrl+C で終了)\n');
|
|
290
|
+
|
|
291
|
+
const input = await ask('何を解析しますか? キーワードや研究テーマを入力してください:\n> ');
|
|
292
|
+
const query = input.toLowerCase();
|
|
293
|
+
|
|
294
|
+
// Score each pipeline by keyword match
|
|
295
|
+
const scored = PIPELINES.map((p) => {
|
|
296
|
+
let score = 0;
|
|
297
|
+
for (const kw of p.keywords) {
|
|
298
|
+
if (query.includes(kw.toLowerCase())) score += 2;
|
|
299
|
+
}
|
|
300
|
+
// Partial match on name
|
|
301
|
+
if (query.includes(p.name.toLowerCase()) || p.name.toLowerCase().includes(query)) score += 1;
|
|
302
|
+
return { ...p, score };
|
|
303
|
+
})
|
|
304
|
+
.filter((p) => p.score > 0)
|
|
305
|
+
.sort((a, b) => b.score - a.score);
|
|
306
|
+
|
|
307
|
+
console.log('');
|
|
308
|
+
if (scored.length === 0) {
|
|
309
|
+
console.log('❌ 該当するパイプラインが見つかりませんでした。');
|
|
310
|
+
console.log('');
|
|
311
|
+
console.log('利用可能なキーワード例:');
|
|
312
|
+
console.log(' 遺伝子/バリアント, 創薬/ADMET, RNA-seq, がん, 機械学習/ML,');
|
|
313
|
+
console.log(' メタボロミクス, マイクロバイオーム, 環境/生態, 材料, 臨床/EHR,');
|
|
314
|
+
console.log(' 文献/メタアナリシス, 可視化, 論文, AlphaFold, シングルセル');
|
|
315
|
+
console.log('');
|
|
316
|
+
console.log('全パイプライン一覧は `satori pipeline list` で確認できます。');
|
|
317
|
+
} else {
|
|
318
|
+
console.log(`✅ ${scored.length} 件のパイプラインが見つかりました:\n`);
|
|
319
|
+
const top = scored.slice(0, 5);
|
|
320
|
+
for (const p of top) {
|
|
321
|
+
console.log(` 📋 Pipeline #${p.id}: ${p.name}`);
|
|
322
|
+
console.log(` スキル連鎖: ${p.skills}`);
|
|
323
|
+
console.log('');
|
|
324
|
+
}
|
|
325
|
+
if (scored.length > 5) {
|
|
326
|
+
console.log(` ... 他 ${scored.length - 5} 件`);
|
|
327
|
+
}
|
|
328
|
+
console.log('詳細は docs/SATORI_PIPELINE_EXAMPLES.md を参照してください。');
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
rl.close();
|
|
332
|
+
})();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function pipelineList() {
|
|
336
|
+
console.log('\n📋 SATORI パイプライン一覧 (26 ドメインパイプライン)\n');
|
|
337
|
+
for (const p of PIPELINES) {
|
|
338
|
+
console.log(` #${String(p.id).padStart(2, ' ')} ${p.name}`);
|
|
339
|
+
console.log(` ${p.skills}`);
|
|
340
|
+
console.log('');
|
|
341
|
+
}
|
|
342
|
+
console.log('クロスドメイン (15), 産業特化 (5), 方法論特化 (4) パイプラインは');
|
|
343
|
+
console.log('docs/SATORI_PIPELINE_EXAMPLES.md を参照してください。');
|
|
344
|
+
}
|
|
345
|
+
|
|
82
346
|
function showVersion() {
|
|
83
347
|
const pkg = require(path.join(PACKAGE_ROOT, 'package.json'));
|
|
84
348
|
console.log(pkg.version);
|
|
85
349
|
}
|
|
86
350
|
|
|
351
|
+
// ── Validate ──
|
|
352
|
+
|
|
353
|
+
function parseFrontmatter(content) {
|
|
354
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
355
|
+
if (!match) return null;
|
|
356
|
+
const yaml = match[1];
|
|
357
|
+
const name = yaml.match(/^name:\s*(.+)$/m)?.[1]?.trim();
|
|
358
|
+
const hasDescription = /^description:/m.test(yaml);
|
|
359
|
+
return { name, hasDescription };
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function validate() {
|
|
363
|
+
const verbose = FLAGS.includes('--verbose');
|
|
364
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
365
|
+
|
|
366
|
+
if (!fs.existsSync(skillsDir)) {
|
|
367
|
+
console.error('Error: skills directory not found:', skillsDir);
|
|
368
|
+
process.exit(1);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const dirs = fs
|
|
372
|
+
.readdirSync(skillsDir)
|
|
373
|
+
.filter((d) => d.startsWith('scientific-'))
|
|
374
|
+
.sort();
|
|
375
|
+
let pass = 0;
|
|
376
|
+
let fail = 0;
|
|
377
|
+
const errors = [];
|
|
378
|
+
|
|
379
|
+
for (const dir of dirs) {
|
|
380
|
+
const filePath = path.join(skillsDir, dir, 'SKILL.md');
|
|
381
|
+
const issues = [];
|
|
382
|
+
|
|
383
|
+
if (!fs.existsSync(filePath)) {
|
|
384
|
+
issues.push('SKILL.md が見つかりません');
|
|
385
|
+
} else {
|
|
386
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
387
|
+
const fm = parseFrontmatter(content);
|
|
388
|
+
|
|
389
|
+
if (!fm) issues.push('YAML Frontmatter がありません');
|
|
390
|
+
else {
|
|
391
|
+
if (!fm.name) issues.push('Frontmatter に name がありません');
|
|
392
|
+
else if (fm.name !== dir) issues.push(`name 不一致: "${fm.name}" (期待値: "${dir}")`);
|
|
393
|
+
if (!fm.hasDescription) issues.push('Frontmatter に description がありません');
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (!/^# .+$/m.test(content)) issues.push('H1 タイトルがありません');
|
|
397
|
+
if (!/^## When to Use/m.test(content)) issues.push('## When to Use セクションがありません');
|
|
398
|
+
if (!/^## Quick Start/m.test(content)) issues.push('## Quick Start セクションがありません');
|
|
399
|
+
if (!/```(?:python|markdown|json)/.test(content)) issues.push('コードブロックがありません');
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (issues.length === 0) {
|
|
403
|
+
pass++;
|
|
404
|
+
if (verbose) console.log(` ✔ ${dir}`);
|
|
405
|
+
} else {
|
|
406
|
+
fail++;
|
|
407
|
+
errors.push({ dir, issues });
|
|
408
|
+
if (verbose) {
|
|
409
|
+
console.log(` ✘ ${dir}`);
|
|
410
|
+
for (const issue of issues) console.log(` - ${issue}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
console.log(`\n📋 SKILL.md 検証結果: ${pass} pass / ${fail} fail (全 ${dirs.length} スキル)`);
|
|
416
|
+
|
|
417
|
+
if (errors.length > 0 && !verbose) {
|
|
418
|
+
console.log('\n問題のあるスキル:');
|
|
419
|
+
for (const e of errors) {
|
|
420
|
+
console.log(` ✘ ${e.dir}: ${e.issues.join(', ')}`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (fail > 0) {
|
|
425
|
+
console.log('\n詳細は --verbose オプションで確認してください。');
|
|
426
|
+
process.exit(1);
|
|
427
|
+
} else {
|
|
428
|
+
console.log('\n✔ 全スキルの検証に成功しました。');
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// ── Stats ──
|
|
433
|
+
|
|
434
|
+
function stats() {
|
|
435
|
+
const skillsDir = path.join(SOURCE_DIR, 'skills');
|
|
436
|
+
|
|
437
|
+
if (!fs.existsSync(skillsDir)) {
|
|
438
|
+
console.error('Error: skills directory not found:', skillsDir);
|
|
439
|
+
process.exit(1);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const dirs = fs
|
|
443
|
+
.readdirSync(skillsDir)
|
|
444
|
+
.filter((d) => d.startsWith('scientific-'))
|
|
445
|
+
.sort();
|
|
446
|
+
const totalSkills = dirs.length;
|
|
447
|
+
let tuLinked = 0;
|
|
448
|
+
let totalCodeBlocks = 0;
|
|
449
|
+
const tuPattern = /ToolUniverse|利用可能ツール|SMCP/i;
|
|
450
|
+
const tuKeyPattern = /`([A-Z][a-zA-Z]*_[a-z]+_[a-z_]+)`/g;
|
|
451
|
+
const allTuKeys = new Set();
|
|
452
|
+
|
|
453
|
+
for (const dir of dirs) {
|
|
454
|
+
const filePath = path.join(skillsDir, dir, 'SKILL.md');
|
|
455
|
+
if (!fs.existsSync(filePath)) continue;
|
|
456
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
457
|
+
|
|
458
|
+
if (tuPattern.test(content)) tuLinked++;
|
|
459
|
+
|
|
460
|
+
const codeBlocks = content.match(/```(?:python|markdown|json)/g);
|
|
461
|
+
if (codeBlocks) totalCodeBlocks += codeBlocks.length;
|
|
462
|
+
|
|
463
|
+
for (const m of content.matchAll(tuKeyPattern)) {
|
|
464
|
+
allTuKeys.add(m[1]);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
const coverage = ((tuLinked / totalSkills) * 100).toFixed(1);
|
|
469
|
+
const pkg = require(path.join(PACKAGE_ROOT, 'package.json'));
|
|
470
|
+
|
|
471
|
+
console.log(`
|
|
472
|
+
📊 SATORI v${pkg.version} — 統計
|
|
473
|
+
|
|
474
|
+
スキル総数: ${totalSkills}
|
|
475
|
+
パイプライン数: ${PIPELINES.length}
|
|
476
|
+
TU 連携スキル: ${tuLinked} (${coverage}%)
|
|
477
|
+
TU 未連携: ${totalSkills - tuLinked}
|
|
478
|
+
ユニーク TU キー: ${allTuKeys.size}
|
|
479
|
+
コードブロック総数: ${totalCodeBlocks}
|
|
480
|
+
`);
|
|
481
|
+
}
|
|
482
|
+
|
|
87
483
|
switch (COMMAND) {
|
|
88
484
|
case 'init':
|
|
89
485
|
init();
|
|
90
486
|
break;
|
|
487
|
+
case 'pipeline':
|
|
488
|
+
if (SUBCOMMAND === 'suggest') {
|
|
489
|
+
pipelineSuggest();
|
|
490
|
+
} else if (SUBCOMMAND === 'list') {
|
|
491
|
+
pipelineList();
|
|
492
|
+
} else {
|
|
493
|
+
console.error(`Unknown pipeline subcommand: ${SUBCOMMAND || '(none)'}`);
|
|
494
|
+
console.log('Usage: satori pipeline suggest | satori pipeline list');
|
|
495
|
+
process.exit(1);
|
|
496
|
+
}
|
|
497
|
+
break;
|
|
498
|
+
case 'validate':
|
|
499
|
+
validate();
|
|
500
|
+
break;
|
|
501
|
+
case 'stats':
|
|
502
|
+
stats();
|
|
503
|
+
break;
|
|
91
504
|
case 'help':
|
|
92
505
|
case '--help':
|
|
93
506
|
case '-h':
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nahisaho/satori",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "SATORI — Agent Skills for Science. GitHub Copilot Agent Skills collection for scientific data analysis.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,17 @@
|
|
|
11
11
|
"src/.github/"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"test": "
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:unit": "vitest run tests/unit/",
|
|
17
|
+
"test:validation": "vitest run tests/validation/",
|
|
18
|
+
"test:coverage": "vitest run --coverage",
|
|
19
|
+
"validate:skills": "vitest run tests/validation/skill-format.test.js",
|
|
20
|
+
"validate:tu": "vitest run tests/validation/tu-coverage.test.js",
|
|
21
|
+
"lint": "biome check bin/ tests/ vitest.config.js",
|
|
22
|
+
"lint:fix": "biome check --write bin/ tests/ vitest.config.js",
|
|
23
|
+
"format": "biome format --write bin/ tests/ vitest.config.js",
|
|
24
|
+
"prepare": "husky"
|
|
15
25
|
},
|
|
16
26
|
"keywords": [
|
|
17
27
|
"copilot",
|
|
@@ -25,5 +35,25 @@
|
|
|
25
35
|
"repository": {
|
|
26
36
|
"type": "git",
|
|
27
37
|
"url": "git+https://github.com/nahisaho/satori.git"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@biomejs/biome": "^2.3.15",
|
|
44
|
+
"husky": "^9.1.7",
|
|
45
|
+
"lint-staged": "^16.2.7",
|
|
46
|
+
"vitest": "^4.0.18"
|
|
47
|
+
},
|
|
48
|
+
"lint-staged": {
|
|
49
|
+
"bin/**/*.js": [
|
|
50
|
+
"biome check --write"
|
|
51
|
+
],
|
|
52
|
+
"tests/**/*.js": [
|
|
53
|
+
"biome check --write"
|
|
54
|
+
],
|
|
55
|
+
"vitest.config.js": [
|
|
56
|
+
"biome check --write"
|
|
57
|
+
]
|
|
28
58
|
}
|
|
29
59
|
}
|
|
@@ -5,6 +5,10 @@ description: |
|
|
|
5
5
|
Elsevier 系のジャーナル形式に対応した論文構成・セクション設計・文章パターンを提供。
|
|
6
6
|
「論文を書いて」「Abstract を作成して」「Methods セクションを書いて」で発火。
|
|
7
7
|
assets/ に主要ジャーナル形式の Markdown テンプレートを同梱。
|
|
8
|
+
tu_tools:
|
|
9
|
+
- key: crossref
|
|
10
|
+
name: Crossref
|
|
11
|
+
description: 論文メタデータ検索・引用情報取得
|
|
8
12
|
---
|
|
9
13
|
|
|
10
14
|
# Scientific Academic Writing
|
|
@@ -464,6 +468,12 @@ needed and take full responsibility for the content of the publication.
|
|
|
464
468
|
[SI 内でのみ引用した文献]
|
|
465
469
|
```
|
|
466
470
|
|
|
471
|
+
## ToolUniverse 連携
|
|
472
|
+
|
|
473
|
+
| TU Key | ツール名 | 連携内容 |
|
|
474
|
+
|--------|---------|--------|
|
|
475
|
+
| `crossref` | Crossref | 論文メタデータ検索・引用情報取得 |
|
|
476
|
+
|
|
467
477
|
## References
|
|
468
478
|
|
|
469
479
|
### Output Files
|
|
@@ -5,6 +5,10 @@ description: |
|
|
|
5
5
|
Query-by-Committee・期待モデル変化・プール型/ストリーム型・
|
|
6
6
|
バッチアクティブラーニング・停止基準判定・
|
|
7
7
|
モデル改善パイプライン。
|
|
8
|
+
tu_tools:
|
|
9
|
+
- key: openml
|
|
10
|
+
name: OpenML
|
|
11
|
+
description: 能動学習データセット・評価指標
|
|
8
12
|
---
|
|
9
13
|
|
|
10
14
|
# Scientific Active Learning
|
|
@@ -287,3 +291,9 @@ eda-correlation → active-learning → ml-classification
|
|
|
287
291
|
| `al_history.csv` | AL ラウンド履歴 | → 停止判定 |
|
|
288
292
|
| `selected_samples.csv` | 選択サンプル | → ラベル付け |
|
|
289
293
|
| `strategy_comparison.csv` | 戦略比較 | → advanced-visualization |
|
|
294
|
+
|
|
295
|
+
## ToolUniverse 連携
|
|
296
|
+
|
|
297
|
+
| TU Key | ツール名 | 連携内容 |
|
|
298
|
+
|--------|---------|--------|
|
|
299
|
+
| `openml` | OpenML | 能動学習データセット・評価指標 |
|
|
@@ -4,6 +4,10 @@ description: |
|
|
|
4
4
|
適応的実験計画スキル。多腕バンディット (Thompson Sampling/UCB)・
|
|
5
5
|
ベイズ適応設計・逐次検定 (SPRT)・
|
|
6
6
|
Response-Adaptive Randomization・早期停止規則。
|
|
7
|
+
tu_tools:
|
|
8
|
+
- key: biotools
|
|
9
|
+
name: bio.tools
|
|
10
|
+
description: 適応的実験設計ツール検索
|
|
7
11
|
---
|
|
8
12
|
|
|
9
13
|
# Scientific Adaptive Experiments
|
|
@@ -285,3 +289,9 @@ def bayesian_adaptive_dose_finding(dose_levels, n_patients=30,
|
|
|
285
289
|
| `bandit_summary.csv` | バンディット結果 | → 最適アーム |
|
|
286
290
|
| `sprt_history.csv` | SPRT 検定履歴 | → 判定結果 |
|
|
287
291
|
| `dose_finding.csv` | 用量探索結果 | → MTD 推定 |
|
|
292
|
+
|
|
293
|
+
## ToolUniverse 連携
|
|
294
|
+
|
|
295
|
+
| TU Key | ツール名 | 連携内容 |
|
|
296
|
+
|--------|---------|--------|
|
|
297
|
+
| `biotools` | bio.tools | 適応的実験設計ツール検索 |
|
|
@@ -4,6 +4,10 @@ description: |
|
|
|
4
4
|
高度バイオイメージング解析スキル。CellProfiler によるモフォロジカル
|
|
5
5
|
プロファイリング・Cell Painting 解析、Cellpose による深層学習
|
|
6
6
|
セルセグメンテーション、napari によるインタラクティブ 3D 可視化。
|
|
7
|
+
tu_tools:
|
|
8
|
+
- key: biotools
|
|
9
|
+
name: bio.tools
|
|
10
|
+
description: 高度イメージングツール検索
|
|
7
11
|
---
|
|
8
12
|
|
|
9
13
|
# Scientific Advanced Imaging
|
|
@@ -380,3 +384,9 @@ fluorescence-microscopy ──┘ drug-target-profiling
|
|
|
380
384
|
| `results/features.csv` | 形態学的特徴量マトリクス | → cheminformatics |
|
|
381
385
|
| `results/cell_painting.csv` | Cell Painting プロファイル | → drug-target-profiling |
|
|
382
386
|
| `results/model/` | 微調整 Cellpose モデル | — |
|
|
387
|
+
|
|
388
|
+
## ToolUniverse 連携
|
|
389
|
+
|
|
390
|
+
| TU Key | ツール名 | 連携内容 |
|
|
391
|
+
|--------|---------|--------|
|
|
392
|
+
| `biotools` | bio.tools | 高度イメージングツール検索 |
|
|
@@ -4,6 +4,10 @@ description: |
|
|
|
4
4
|
科学データ高度可視化スキル。Plotly インタラクティブ 3D ・
|
|
5
5
|
Altair 宣言的可視化・Seaborn 統計プロット・
|
|
6
6
|
アニメーション・Parallel Coordinates・出版品質図。
|
|
7
|
+
tu_tools:
|
|
8
|
+
- key: biotools
|
|
9
|
+
name: bio.tools
|
|
10
|
+
description: 高度可視化ツール検索
|
|
7
11
|
---
|
|
8
12
|
|
|
9
13
|
# Scientific Advanced Visualization
|
|
@@ -308,3 +312,9 @@ eda-correlation → advanced-visualization → presentation-design
|
|
|
308
312
|
| `publication_fig.pdf` | 出版品質図 | → presentation |
|
|
309
313
|
| `parallel_coordinates.html` | 多変量可視化 | → reporting |
|
|
310
314
|
| `animation.html` | アニメーション | → presentation |
|
|
315
|
+
|
|
316
|
+
## ToolUniverse 連携
|
|
317
|
+
|
|
318
|
+
| TU Key | ツール名 | 連携内容 |
|
|
319
|
+
|--------|---------|--------|
|
|
320
|
+
| `biotools` | bio.tools | 高度可視化ツール検索 |
|