@nahisaho/katashiro 2.1.0 → 2.1.2

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.
Files changed (2) hide show
  1. package/AGENTS.md +87 -3
  2. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -81,6 +81,88 @@ import {
81
81
  } from '@nahisaho/katashiro';
82
82
  ```
83
83
 
84
+ ### ⚠️ 重要: 戻り値の型について
85
+
86
+ KATASHIROのAPIには**2種類の戻り値パターン**があります。コード生成時は必ず区別してください。
87
+
88
+ #### 1. 直接値を返すAPI(`isOk()` 不要)
89
+
90
+ 以下のAPIは**直接値を返す**ため、`isOk()` を使用しません:
91
+
92
+ | API | 戻り値の型 | 使用例 |
93
+ |-----|-----------|-------|
94
+ | `WebSearchClient.search()` | `Promise<SearchResult[]>` | `const results = await client.search(query);` |
95
+ | `TextAnalyzer.analyze()` | `Promise<{ keywords, complexity, sentiment, ... }>` | `const analysis = await analyzer.analyze(text);` |
96
+ | `EntityExtractor.extract()` | `Promise<ExtractedEntities>` | `const entities = await extractor.extract(text);` |
97
+ | `SummaryGenerator.generate()` | `Promise<string>` | `const summary = await summarizer.generate(text);` |
98
+ | `ReportGenerator.generate()` | `Promise<string>` | `const report = await reportGen.generate(config);` |
99
+
100
+ ```typescript
101
+ // ✅ 正しい使い方
102
+ const results = await searchClient.search('AI');
103
+ console.log(`${results.length}件の結果`);
104
+
105
+ const analysis = await analyzer.analyze(text);
106
+ console.log(`キーワード: ${analysis.keywords.join(', ')}`);
107
+
108
+ const entities = await extractor.extract(text);
109
+ console.log(`${entities.all.length}個のエンティティ`);
110
+
111
+ const summary = await summarizer.generate(text);
112
+ console.log(`${summary.length}文字の要約`);
113
+ ```
114
+
115
+ #### 2. `Result<T, E>` を返すAPI(`isOk()` 必須)
116
+
117
+ 以下のAPIは**Result型を返す**ため、`isOk()` でチェックが必要です:
118
+
119
+ | API | 戻り値の型 | 使用例 |
120
+ |-----|-----------|-------|
121
+ | `WebScraper.scrape()` | `Promise<Result<ScrapingResult, Error>>` | `if (isOk(page)) { page.value.content }` |
122
+ | `WebScraper.scrapeMultiple()` | `Promise<Result<ScrapingResult, Error>[]>` | 各要素を`isOk()`でチェック |
123
+ | `SummaryGenerator.summarize()` | `Promise<Result<string, Error>>` | `if (isOk(result)) { result.value }` |
124
+ | `SummaryGenerator.generateSummary()` | `Promise<Result<string, Error>>` | `if (isOk(result)) { result.value }` |
125
+ | `TextAnalyzer.summarize()` | `Promise<Result<Summary, Error>>` | `if (isOk(summary)) { summary.value }` |
126
+ | `FactChecker.checkWithSources()` | `Promise<Result<FactCheckResultDetail, Error>>` | `if (isOk(result)) { ... }` |
127
+ | `FactChecker.detectConflicts()` | `Promise<Result<ConflictDetectionResult, Error>>` | `if (isOk(result)) { ... }` |
128
+ | `DocumentParser.parse()` | `Promise<Result<ParsedDocument, Error>>` | `if (isOk(doc)) { doc.value }` |
129
+ | `PDFParser.parse()` | `Promise<Result<ParsedDocument, Error>>` | `if (isOk(doc)) { ... }` |
130
+ | `DOCXParser.parse()` | `Promise<Result<ParsedDocument, Error>>` | `if (isOk(doc)) { ... }` |
131
+ | `XLSXParser.parse()` | `Promise<Result<ParsedDocument, Error>>` | `if (isOk(doc)) { ... }` |
132
+ | `ApiClient.getSafe()` | `Promise<Result<T, Error>>` | `if (isOk(response)) { ... }` |
133
+ | `ApiClient.postSafe()` | `Promise<Result<T, Error>>` | `if (isOk(response)) { ... }` |
134
+ | `CodeInterpreter.execute()` | `Promise<Result<ExecutionResult, Error>>` | `if (isOk(result)) { ... }` |
135
+ | `TrendAnalyzer.analyze()` | `Promise<Result<TrendAnalysisResult, Error>>` | `if (isOk(result)) { ... }` |
136
+ | `DiagramGenerator.generate*()` | `Promise<Result<DiagramOutput, Error>>` | `if (isOk(diagram)) { ... }` |
137
+
138
+ ```typescript
139
+ // ✅ 正しい使い方(Result型のみ isOk() を使用)
140
+ const page = await scraper.scrape(url);
141
+ if (isOk(page)) {
142
+ console.log(page.value.content); // .value でアンラップ
143
+ } else {
144
+ console.error(page.error); // .error でエラー取得
145
+ }
146
+
147
+ // SummaryGenerator.summarize() もResult型
148
+ const summaryResult = await summarizer.summarize(text);
149
+ if (isOk(summaryResult)) {
150
+ console.log(summaryResult.value); // string
151
+ }
152
+
153
+ // ❌ 間違い(直接値を返すAPIに isOk() を使用)
154
+ const results = await searchClient.search('AI');
155
+ // if (isOk(results)) { ... } // エラー!results は配列
156
+
157
+ // ❌ 間違い(generate() と summarize() を混同)
158
+ const summary = await summarizer.generate(text); // これは直接string
159
+ // if (isOk(summary)) { ... } // エラー!summaryはstring
160
+ ```
161
+
162
+ > **注意**: `SummaryGenerator` には2つのメソッドがあります:
163
+ > - `generate()` → 直接 `string` を返す(`isOk()` 不要)
164
+ > - `summarize()` → `Result<string, Error>` を返す(`isOk()` 必須)
165
+
84
166
  ---
85
167
 
86
168
  ## 📝 課題タイプ別の実装パターン
@@ -109,10 +191,12 @@ async function solveResearchProblem(topic: string) {
109
191
 
110
192
  // 4. エンティティ抽出
111
193
  const extractor = new EntityExtractor();
112
- const allEntities = [];
194
+ const allEntities: Entity[] = [];
113
195
  for (const content of contents) {
114
- const entities = await extractor.extract(content);
115
- allEntities.push(...entities);
196
+ const extracted = await extractor.extract(content);
197
+ // extract() は ExtractedEntities オブジェクトを返す
198
+ // extracted.persons, extracted.organizations, extracted.urls など
199
+ allEntities.push(...extracted.all); // all プロパティで全エンティティ配列にアクセス
116
200
  }
117
201
 
118
202
  // 5. 要約生成
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nahisaho/katashiro",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "KATASHIRO - VS Code Agent Mode向け情報収集・分析・生成システム(オールインワンパッケージ)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",