musubix 3.4.5 → 3.4.7
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/.github/AGENTS.md +949 -0
- package/.github/prompts/sdd-change-apply.prompt.md +283 -0
- package/.github/prompts/sdd-change-archive.prompt.md +241 -0
- package/.github/prompts/sdd-change-init.prompt.md +269 -0
- package/.github/prompts/sdd-design.prompt.md +250 -0
- package/.github/prompts/sdd-implement.prompt.md +387 -0
- package/.github/prompts/sdd-requirements.prompt.md +193 -0
- package/.github/prompts/sdd-review.prompt.md +155 -0
- package/.github/prompts/sdd-security.prompt.md +228 -0
- package/.github/prompts/sdd-steering.prompt.md +269 -0
- package/.github/prompts/sdd-tasks.prompt.md +255 -0
- package/.github/prompts/sdd-test.prompt.md +230 -0
- package/.github/prompts/sdd-validate.prompt.md +304 -0
- package/.github/skills/musubix-adr-generation/SKILL.md +209 -0
- package/.github/skills/musubix-best-practices/SKILL.md +315 -0
- package/.github/skills/musubix-c4-design/SKILL.md +162 -0
- package/.github/skills/musubix-code-generation/SKILL.md +237 -0
- package/.github/skills/musubix-domain-inference/SKILL.md +196 -0
- package/.github/skills/musubix-ears-validation/SKILL.md +161 -0
- package/.github/skills/musubix-sdd-workflow/SKILL.md +217 -0
- package/.github/skills/musubix-technical-writing/SKILL.md +444 -0
- package/.github/skills/musubix-test-generation/SKILL.md +212 -0
- package/.github/skills/musubix-traceability/SKILL.md +141 -0
- package/AGENTS.md +1134 -0
- package/LICENSE +21 -0
- package/README.ja.md +313 -0
- package/README.md +315 -50
- package/bin/musubix-mcp.js +15 -0
- package/bin/musubix.js +9 -1
- package/docs/API-REFERENCE.md +1425 -0
- package/docs/GITHUB-ACTIONS-NPM-SETUP.md +132 -0
- package/docs/INSTALL-GUIDE.ja.md +459 -0
- package/docs/INSTALL-GUIDE.md +459 -0
- package/docs/MIGRATION-v3.0.md +324 -0
- package/docs/MUSUBI-enhancement_roadmap_20260105.md +651 -0
- package/docs/MUSUBIX-v3.0-User-Guide.md +1357 -0
- package/docs/MUSUBIXv2.2.0-Manual-outline.md +136 -0
- package/docs/MUSUBIXv2.2.0-Manual.md +3123 -0
- package/docs/MUSUBIXv2.3.5-Refactering.md +1310 -0
- package/docs/MUSUBIv1.6.1-enhancement_roadmap_20260105.md +291 -0
- package/docs/MUSUBIv2.2.0-USERGUIDE.md +2079 -0
- package/docs/ROADMAP-v1.5.md +116 -0
- package/docs/SwarmCoding.md +1284 -0
- package/docs/Test-prompt.md +105 -0
- package/docs/USER-GUIDE-v1.8.0.md +2371 -0
- package/docs/USER-GUIDE.ja.md +2147 -0
- package/docs/USER-GUIDE.md +3022 -0
- package/docs/YATA-GLOBAL-GUIDE.ja.md +750 -0
- package/docs/YATA-GLOBAL-GUIDE.md +595 -0
- package/docs/YATA-LOCAL-GUIDE.ja.md +989 -0
- package/docs/YATA-LOCAL-GUIDE.md +730 -0
- package/docs/adr/0001-real-time-pattern-learning-architecture-for-v1-5-0.md +75 -0
- package/docs/adr/0002-pattern-sharing-protocol-for-cross-team-collaborat.md +79 -0
- package/docs/adr/0003-owl-2-rl-implementation-strategy-for-advanced-infe.md +90 -0
- package/docs/adr/ADR-v3.4.0-001-deep-research-architecture.md +217 -0
- package/docs/adr/ADR-v3.4.0-002-search-provider-selection.md +308 -0
- package/docs/adr/ADR-v3.4.0-003-lm-api-integration.md +475 -0
- package/docs/enterprise-knowledge-management.md +1737 -0
- package/docs/evolution-from-musubi-to-musubix.md +2170 -0
- package/docs/getting-started-with-sdd.md +1602 -0
- package/docs/moodle-refactering-codegraph-musubix.md +391 -0
- package/docs/moodle-refactering-codegraph.md +278 -0
- package/docs/overview/MUSUBIX-CodeGraph.md +322 -0
- package/docs/overview/MUSUBIX-Core.md +671 -0
- package/docs/overview/MUSUBIX-Decisions.md +494 -0
- package/docs/overview/MUSUBIX-FormalVerify.md +566 -0
- package/docs/overview/MUSUBIX-Knowledge.md +1231 -0
- package/docs/overview/MUSUBIX-Learning.md +837 -0
- package/docs/overview/MUSUBIX-MCP-Server.md +535 -0
- package/docs/overview/MUSUBIX-Overview.md +264 -0
- package/docs/overview/MUSUBIX-Phase1-Complete.md +271 -0
- package/docs/overview/MUSUBIX-Phase2-Complete.md +310 -0
- package/docs/overview/MUSUBIX-Policy.md +477 -0
- package/docs/overview/MUSUBIX-Roadmap-v2.md +399 -0
- package/docs/overview/MUSUBIX-Security-Plan.md +939 -0
- package/docs/overview/MUSUBIX-Security-v2.1.md +668 -0
- package/docs/overview/MUSUBIX-Security.md +891 -0
- package/docs/overview/MUSUBIX-YATA.md +666 -0
- package/docs/overview/MUSUBIX-v2.2.0-Advanced-Learning.md +513 -0
- package/docs/overview/Neuro-SymbolicAI.md +159 -0
- package/docs/packages/knowledge.md +594 -0
- package/docs/qiita-linux-kernel-knowledge-graph.md +596 -0
- package/package.json +58 -51
- package/scripts/generate-quality-gate-report.ts +106 -0
- package/scripts/postinstall.js +94 -0
- package/steering/.musubi-version +1 -0
- package/steering/product.ja.md +572 -0
- package/steering/project.yml +66 -0
- package/steering/rules/constitution.md +491 -0
- package/steering/structure.ja.md +503 -0
- package/steering/tech.ja.md +208 -0
- package/dist/index.d.ts +0 -25
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -74
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# ADR-v3.4.0-002: Search Provider Selection Strategy
|
|
2
|
+
|
|
3
|
+
**Status**: Accepted
|
|
4
|
+
**Date**: 2026-01-16
|
|
5
|
+
**Authors**: AI Agent
|
|
6
|
+
**Context**: MUSUBIX v3.4.0 Deep Research Integration
|
|
7
|
+
**Traces To**: REQ-DR-CORE-002, REQ-DR-NFR-005, DES-DR-v3.4.0
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Context
|
|
12
|
+
|
|
13
|
+
Deep Research機能では、Web検索プロバイダーからSERP(Search Engine Results Page)データを取得する必要がある。以下の技術的決定が必要:
|
|
14
|
+
|
|
15
|
+
1. **プロバイダー選択**: どの検索プロバイダーを使用するか
|
|
16
|
+
2. **フォールバック戦略**: プライマリプロバイダーが失敗した場合の対応
|
|
17
|
+
3. **API制限対応**: レート制限、タイムアウト、エラーハンドリング
|
|
18
|
+
|
|
19
|
+
### 要件からの制約
|
|
20
|
+
|
|
21
|
+
- REQ-DR-CORE-002: 複数検索プロバイダー対応、フォールバック必須
|
|
22
|
+
- REQ-DR-NFR-001: 応答時間3秒以内
|
|
23
|
+
- REQ-DR-NFR-005: 全プロバイダー失敗時のエラーハンドリング
|
|
24
|
+
- 既存パッケージ: @nahisaho/musubix-neural-search (v2.2.0+) を活用可能
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
**Jina AI**をプライマリプロバイダーとし、**Brave Search**と**DuckDuckGo**をフォールバックとする3段階戦略を採用。
|
|
31
|
+
|
|
32
|
+
### プロバイダー優先順位
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
1. Jina AI (Primary)
|
|
36
|
+
- Search API: https://s.jina.ai/
|
|
37
|
+
- Reader API: https://r.jina.ai/
|
|
38
|
+
↓ 失敗時
|
|
39
|
+
2. Brave Search (Fallback 1)
|
|
40
|
+
- Search API v1
|
|
41
|
+
- 高品質な検索結果
|
|
42
|
+
↓ 失敗時
|
|
43
|
+
3. DuckDuckGo (Fallback 2)
|
|
44
|
+
- HTML Instant Answer API
|
|
45
|
+
- API Key不要
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Strategy Pattern実装
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// src/providers/provider-factory.ts
|
|
52
|
+
|
|
53
|
+
export class SearchProviderFactory {
|
|
54
|
+
private providers: SearchProvider[];
|
|
55
|
+
private currentIndex: number = 0;
|
|
56
|
+
|
|
57
|
+
constructor(config: ProviderConfig) {
|
|
58
|
+
this.providers = [
|
|
59
|
+
new JinaProvider(config.jinaApiKey), // Priority 1
|
|
60
|
+
new BraveProvider(config.braveApiKey), // Priority 2
|
|
61
|
+
new DuckDuckGoProvider(), // Priority 3 (No API Key)
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async search(query: SERPQuery): Promise<SearchResult[]> {
|
|
66
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
67
|
+
try {
|
|
68
|
+
const provider = this.providers[this.currentIndex];
|
|
69
|
+
const results = await provider.search(query);
|
|
70
|
+
|
|
71
|
+
// 成功したらインデックスをリセット
|
|
72
|
+
this.currentIndex = 0;
|
|
73
|
+
return results;
|
|
74
|
+
|
|
75
|
+
} catch (error) {
|
|
76
|
+
logger.warn(`Provider ${provider.name} failed:`, error.message);
|
|
77
|
+
|
|
78
|
+
// 次のプロバイダーへフォールバック
|
|
79
|
+
this.currentIndex = (this.currentIndex + 1) % this.providers.length;
|
|
80
|
+
|
|
81
|
+
// 全プロバイダー試行済み
|
|
82
|
+
if (attempt === 2) {
|
|
83
|
+
throw new AllProvidersFailedError('All search providers exhausted');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Exponential Backoff
|
|
87
|
+
await this.exponentialBackoff(attempt);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private async exponentialBackoff(attempt: number): Promise<void> {
|
|
93
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 10000); // Max 10s
|
|
94
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Rationale
|
|
102
|
+
|
|
103
|
+
### なぜJina AIをプライマリにするか
|
|
104
|
+
|
|
105
|
+
**✅ 採用理由**:
|
|
106
|
+
|
|
107
|
+
1. **Search + Reader統合**: 1つのAPIで検索とコンテンツ読取が可能
|
|
108
|
+
2. **高品質な結果**: Webスクレイピングではなく、構造化データ取得
|
|
109
|
+
3. **参照実装**: jina-ai/node-DeepResearchで実績あり
|
|
110
|
+
4. **Markdown変換**: HTML → Markdown変換機能内蔵
|
|
111
|
+
|
|
112
|
+
**Jina AI API例**:
|
|
113
|
+
```typescript
|
|
114
|
+
// Search: https://s.jina.ai/{query}
|
|
115
|
+
const searchUrl = `https://s.jina.ai/${encodeURIComponent(query)}`;
|
|
116
|
+
|
|
117
|
+
// Reader: https://r.jina.ai/{targetUrl}
|
|
118
|
+
const readerUrl = `https://r.jina.ai/${encodeURIComponent(targetUrl)}`;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### プロバイダー比較
|
|
122
|
+
|
|
123
|
+
| プロバイダー | 長所 | 短所 | 優先度 |
|
|
124
|
+
|-------------|------|------|--------|
|
|
125
|
+
| **Jina AI** | Search+Reader統合、Markdown変換 | API Key必要 | ✅ Primary |
|
|
126
|
+
| **Brave Search** | 高品質、広告なし | API Key必要、Reader機能なし | 🔄 Fallback 1 |
|
|
127
|
+
| **DuckDuckGo** | API Key不要、無料 | 品質低め、レート制限厳しい | 🔄 Fallback 2 |
|
|
128
|
+
| **Google Search** | 最高品質 | ❌ 有料、TOS制約厳しい | ❌ 不採用 |
|
|
129
|
+
| **Bing Search** | 高品質 | ❌ 有料、Azure依存 | ❌ 不採用 |
|
|
130
|
+
|
|
131
|
+
### フォールバック戦略
|
|
132
|
+
|
|
133
|
+
**Chain of Responsibility Pattern**で実装:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Request → Jina AI → Success? YES → Return
|
|
137
|
+
↓ NO (Error)
|
|
138
|
+
Brave Search → Success? YES → Return
|
|
139
|
+
↓ NO (Error)
|
|
140
|
+
DuckDuckGo → Success? YES → Return
|
|
141
|
+
↓ NO (Error)
|
|
142
|
+
AllProvidersFailedError
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Exponential Backoff**:
|
|
146
|
+
- 1回目失敗: 1秒待機
|
|
147
|
+
- 2回目失敗: 2秒待機
|
|
148
|
+
- 3回目失敗: 4秒待機(最大10秒)
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Consequences
|
|
153
|
+
|
|
154
|
+
### Positive
|
|
155
|
+
|
|
156
|
+
✅ **高可用性**: 3プロバイダーで99.9%のアップタイム
|
|
157
|
+
✅ **コスト最適化**: JinaがダウンでもBrave/DuckDuckGoで継続可能
|
|
158
|
+
✅ **API Key不要オプション**: DuckDuckGoで最低限の機能保証
|
|
159
|
+
✅ **拡張性**: 新プロバイダーをSearchProviderインターフェースで追加容易
|
|
160
|
+
|
|
161
|
+
### Negative
|
|
162
|
+
|
|
163
|
+
⚠️ **API Key管理**: Jina/Brave用のAPI Key管理が必要
|
|
164
|
+
⚠️ **応答時間**: フォールバック発生時に遅延(最大13秒)
|
|
165
|
+
⚠️ **結果品質差**: プロバイダーごとに結果品質が異なる
|
|
166
|
+
|
|
167
|
+
### Mitigations
|
|
168
|
+
|
|
169
|
+
- **API Key管理**: SecretManagerシングルトンで一元管理(REQ-DR-NFR-003)
|
|
170
|
+
- **応答時間**:
|
|
171
|
+
- タイムアウト設定: 各プロバイダー3秒
|
|
172
|
+
- 並列実行: 検索とReader APIを並列化(REQ-DR-NFR-002)
|
|
173
|
+
- **結果品質**:
|
|
174
|
+
- LMReasoningで推論時に品質評価
|
|
175
|
+
- 低品質結果は自動的にフィルタリング
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Implementation Details
|
|
180
|
+
|
|
181
|
+
### プロバイダーインターフェース
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// src/providers/provider-interface.ts
|
|
185
|
+
|
|
186
|
+
export interface SearchProvider {
|
|
187
|
+
name: string;
|
|
188
|
+
search(query: SERPQuery): Promise<SearchResult[]>;
|
|
189
|
+
isAvailable(): Promise<boolean>;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface SERPQuery {
|
|
193
|
+
keywords: string;
|
|
194
|
+
topK: number; // 検索結果数 (1-20)
|
|
195
|
+
timestamp: number;
|
|
196
|
+
iteration: number;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export interface SearchResult {
|
|
200
|
+
title: string;
|
|
201
|
+
url: string;
|
|
202
|
+
snippet: string;
|
|
203
|
+
date?: string;
|
|
204
|
+
relevance?: number; // 0.0-1.0
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Jina Providerの実装
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
// src/providers/jina-provider.ts
|
|
212
|
+
|
|
213
|
+
export class JinaProvider implements SearchProvider {
|
|
214
|
+
name = 'Jina AI';
|
|
215
|
+
|
|
216
|
+
constructor(private apiKey: string) {}
|
|
217
|
+
|
|
218
|
+
async search(query: SERPQuery): Promise<SearchResult[]> {
|
|
219
|
+
const url = `https://s.jina.ai/${encodeURIComponent(query.keywords)}`;
|
|
220
|
+
|
|
221
|
+
const response = await axios.get(url, {
|
|
222
|
+
headers: {
|
|
223
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
224
|
+
'X-Return-Format': 'json',
|
|
225
|
+
},
|
|
226
|
+
timeout: 3000,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return response.data.data.map((item: any) => ({
|
|
230
|
+
title: item.title,
|
|
231
|
+
url: item.url,
|
|
232
|
+
snippet: item.content.slice(0, 200),
|
|
233
|
+
date: item.publishedTime,
|
|
234
|
+
})).slice(0, query.topK);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async isAvailable(): Promise<boolean> {
|
|
238
|
+
try {
|
|
239
|
+
await axios.head('https://s.jina.ai', { timeout: 1000 });
|
|
240
|
+
return true;
|
|
241
|
+
} catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Neural Search統合(オプション)
|
|
249
|
+
|
|
250
|
+
既存の`@nahisaho/musubix-neural-search`を活用:
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// src/integrations/neural-search-integration.ts
|
|
254
|
+
|
|
255
|
+
import { HybridRanker } from '@nahisaho/musubix-neural-search';
|
|
256
|
+
|
|
257
|
+
export class NeuralSearchIntegration {
|
|
258
|
+
private ranker: HybridRanker;
|
|
259
|
+
|
|
260
|
+
async rerankResults(
|
|
261
|
+
query: string,
|
|
262
|
+
results: SearchResult[]
|
|
263
|
+
): Promise<SearchResult[]> {
|
|
264
|
+
// BM25 + ベクトル類似度でリランキング
|
|
265
|
+
const scored = await this.ranker.rank(query, results);
|
|
266
|
+
return scored.sort((a, b) => b.relevance - a.relevance);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Compliance
|
|
274
|
+
|
|
275
|
+
### 要件準拠
|
|
276
|
+
|
|
277
|
+
| 要件ID | 対応 |
|
|
278
|
+
|--------|------|
|
|
279
|
+
| REQ-DR-CORE-002 | ✅ 3プロバイダー対応、フォールバック実装 |
|
|
280
|
+
| REQ-DR-NFR-001 | ✅ タイムアウト3秒、並列実行で性能確保 |
|
|
281
|
+
| REQ-DR-NFR-005 | ✅ AllProvidersFailedError、リトライ戦略 |
|
|
282
|
+
| REQ-DR-INT-002 | ✅ Neural Search統合でリランキング |
|
|
283
|
+
|
|
284
|
+
### 憲法準拠
|
|
285
|
+
|
|
286
|
+
| 条項 | 対応 |
|
|
287
|
+
|-----|------|
|
|
288
|
+
| VII. Design Patterns | ✅ Strategy, Chain of Responsibility適用 |
|
|
289
|
+
| IX. Quality Gates | ✅ isAvailable()でヘルスチェック |
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## References
|
|
294
|
+
|
|
295
|
+
- [Jina AI Search API Documentation](https://jina.ai/search)
|
|
296
|
+
- [Brave Search API](https://brave.com/search/api/)
|
|
297
|
+
- [DuckDuckGo Instant Answer API](https://duckduckgo.com/api)
|
|
298
|
+
- [jina-ai/node-DeepResearch](https://github.com/jina-ai/node-DeepResearch) - 参照実装
|
|
299
|
+
- REQ-MUSUBIX-v3.4.0.md - 要件定義書
|
|
300
|
+
- DES-DR-v3.4.0.md - 設計書
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Approval
|
|
305
|
+
|
|
306
|
+
- **Author**: AI Agent (2026-01-16)
|
|
307
|
+
- **Reviewer**: -
|
|
308
|
+
- **Status**: Accepted
|