musubix 3.6.0 → 3.7.3
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/build-fix/SKILL.md +124 -0
- package/.github/skills/checkpoint/SKILL.md +131 -0
- package/.github/skills/codemap/SKILL.md +120 -0
- package/.github/skills/codemap/templates/codemap-index.md +142 -0
- package/.github/skills/codemap/templates/package-codemap.md +160 -0
- package/.github/skills/context-optimizer/SKILL.md +109 -0
- package/.github/skills/context-optimizer/contexts/dev.md +40 -0
- package/.github/skills/context-optimizer/contexts/research.md +55 -0
- package/.github/skills/context-optimizer/contexts/review.md +49 -0
- package/.github/skills/e2e-runner/SKILL.md +145 -0
- package/.github/skills/eval-harness/SKILL.md +111 -0
- package/.github/skills/eval-harness/examples/capability-eval.md +158 -0
- package/.github/skills/eval-harness/examples/human-grader-template.md +326 -0
- package/.github/skills/eval-harness/examples/regression-eval.md +228 -0
- package/.github/skills/learning-hooks/SKILL.md +101 -0
- package/.github/skills/learning-hooks/templates/learned-skill-template.md +79 -0
- package/.github/skills/musubix-adr-generation/SKILL.md +74 -0
- package/.github/skills/musubix-best-practices/SKILL.md +85 -0
- package/.github/skills/musubix-c4-design/SKILL.md +86 -0
- package/.github/skills/musubix-code-generation/SKILL.md +90 -0
- package/.github/skills/musubix-domain-inference/SKILL.md +82 -0
- package/.github/skills/musubix-ears-validation/SKILL.md +74 -0
- package/.github/skills/musubix-sdd-workflow/SKILL.md +95 -0
- package/.github/skills/musubix-technical-writing/SKILL.md +108 -0
- package/.github/skills/musubix-test-generation/SKILL.md +88 -0
- package/.github/skills/musubix-traceability/SKILL.md +94 -0
- package/.github/skills/refactor-cleaner/SKILL.md +105 -0
- package/.github/skills/session-manager/SKILL.md +119 -0
- package/.github/skills/session-manager/scripts/session-end.sh +175 -0
- package/.github/skills/session-manager/scripts/session-start.sh +87 -0
- package/.github/skills/verification-loop/SKILL.md +111 -0
- package/.github/skills/verification-loop/scripts/verify.sh +305 -0
- package/AGENTS.md +333 -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/CODEMAPS/CODEMAP.md +1 -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/adr/ADR-v3.7.0-001-everything-claude-code-integration.md +102 -0
- package/docs/enterprise-knowledge-management.md +1737 -0
- package/docs/evolution-from-musubi-to-musubix.md +2170 -0
- package/docs/experiments/EXPERIMENT-ASSISTANT-AXIS-DRIFT-DETECTION.md +155 -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/musubix-v3.6.0-fastrender-insights.md +625 -0
- package/docs/qiita-linux-kernel-knowledge-graph.md +596 -0
- package/docs/qiita-musubix-assistant-axis.md +380 -0
- package/package.json +58 -52
- package/scripts/generate-quality-gate-report.ts +106 -0
- package/scripts/postinstall.js +94 -0
- package/scripts/register-release-knowledge.ts +127 -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,475 @@
|
|
|
1
|
+
# ADR-v3.4.0-003: LM API Integration 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-004, REQ-DR-INT-001, DES-DR-v3.4.0
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Context
|
|
12
|
+
|
|
13
|
+
Deep Research機能では、Web検索結果を推論・分析してナレッジを抽出する必要がある。以下の技術的決定が必要:
|
|
14
|
+
|
|
15
|
+
1. **LM API選択**: どのLLM APIを使用するか
|
|
16
|
+
2. **統合方法**: VS Code Extension APIとの統合方法
|
|
17
|
+
3. **Expert Delegation統合**: 既存の@nahisaho/musubix-expert-delegation (v3.2.0+) の活用
|
|
18
|
+
|
|
19
|
+
### 要件からの制約
|
|
20
|
+
|
|
21
|
+
- REQ-DR-CORE-004: LM APIによる推論・評価・質問生成
|
|
22
|
+
- REQ-DR-INT-001: Expert Delegation統合(EARS変換、設計レビュー等)
|
|
23
|
+
- 憲法Article II: CLI Interface必須
|
|
24
|
+
- VS Code環境: GitHub Copilot via LM API使用
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
**VS Code LM API**(Language Model API)を直接使用し、**Expert Delegation**をラッパーとして活用する2層構造を採用。
|
|
31
|
+
|
|
32
|
+
### アーキテクチャ
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
┌─────────────────────────────────────────────────────┐
|
|
36
|
+
│ Deep Research (Application Layer) │
|
|
37
|
+
│ - LMReasoning │
|
|
38
|
+
│ - QuestionGenerator │
|
|
39
|
+
│ - AnswerEvaluator │
|
|
40
|
+
└────────────────┬────────────────────────────────────┘
|
|
41
|
+
│
|
|
42
|
+
↓
|
|
43
|
+
┌─────────────────────────────────────────────────────┐
|
|
44
|
+
│ Expert Delegation (Middleware Layer) │
|
|
45
|
+
│ - DelegationEngine.delegate() │
|
|
46
|
+
│ - ExpertManager (7 specialists) │
|
|
47
|
+
│ - VSCodeLMProvider │
|
|
48
|
+
└────────────────┬────────────────────────────────────┘
|
|
49
|
+
│
|
|
50
|
+
↓
|
|
51
|
+
┌─────────────────────────────────────────────────────┐
|
|
52
|
+
│ VS Code LM API (Platform Layer) │
|
|
53
|
+
│ - vscode.lm.selectChatModels() │
|
|
54
|
+
│ - model.sendRequest() │
|
|
55
|
+
└─────────────────────────────────────────────────────┘
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 実装戦略
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
// src/reasoning/lm-reasoning.ts
|
|
62
|
+
|
|
63
|
+
import { DelegationEngine } from '@nahisaho/musubix-expert-delegation';
|
|
64
|
+
import * as vscode from 'vscode';
|
|
65
|
+
|
|
66
|
+
export class LMReasoning {
|
|
67
|
+
constructor(
|
|
68
|
+
private lmProvider: VSCodeLMProvider,
|
|
69
|
+
private expertDelegation: DelegationEngine
|
|
70
|
+
) {}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 反射的質問生成
|
|
74
|
+
* REQ-DR-CORE-009
|
|
75
|
+
*/
|
|
76
|
+
async generateQuestions(
|
|
77
|
+
query: string,
|
|
78
|
+
currentKnowledge: KnowledgeBase
|
|
79
|
+
): Promise<ReflectiveQuestion[]> {
|
|
80
|
+
const prompt = `
|
|
81
|
+
Original query: ${query}
|
|
82
|
+
|
|
83
|
+
Current knowledge: ${currentKnowledge.getSummary()}
|
|
84
|
+
|
|
85
|
+
Generate 3-5 specific follow-up questions to fill knowledge gaps.
|
|
86
|
+
Format: JSON array of {question, reason, priority}
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
// 直接LM APIを使用
|
|
90
|
+
const response = await this.lmProvider.generateText({
|
|
91
|
+
messages: [{ role: 'user', content: prompt }],
|
|
92
|
+
maxTokens: 500,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return JSON.parse(response.text);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 回答評価
|
|
100
|
+
* REQ-DR-CORE-004
|
|
101
|
+
*/
|
|
102
|
+
async evaluateAnswer(
|
|
103
|
+
query: string,
|
|
104
|
+
answer: AnswerAction,
|
|
105
|
+
knowledge: KnowledgeBase
|
|
106
|
+
): Promise<EvaluationResult> {
|
|
107
|
+
const prompt = `
|
|
108
|
+
Evaluate if this answer is definitive and complete:
|
|
109
|
+
|
|
110
|
+
Query: ${query}
|
|
111
|
+
Answer: ${answer.answer}
|
|
112
|
+
Knowledge base: ${knowledge.size()} items
|
|
113
|
+
|
|
114
|
+
Return JSON: {
|
|
115
|
+
isDefinitive: boolean,
|
|
116
|
+
confidence: number,
|
|
117
|
+
missingAspects: string[],
|
|
118
|
+
recommendations: string[]
|
|
119
|
+
}
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
// 直接LM APIを使用
|
|
123
|
+
const response = await this.lmProvider.generateText({
|
|
124
|
+
messages: [{ role: 'user', content: prompt }],
|
|
125
|
+
maxTokens: 300,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return JSON.parse(response.text);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* EARS変換(Expert Delegation経由)
|
|
133
|
+
* REQ-DR-INT-001, REQ-DR-INT-009
|
|
134
|
+
*/
|
|
135
|
+
async convertToEARS(finding: Finding): Promise<string> {
|
|
136
|
+
// Expert Delegationを使用
|
|
137
|
+
const result = await this.expertDelegation.delegate({
|
|
138
|
+
prompt: `Convert to EARS format: ${finding.statement}`,
|
|
139
|
+
expertType: 'ears-analyst',
|
|
140
|
+
mode: 'advisory',
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
return result.content;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Rationale
|
|
151
|
+
|
|
152
|
+
### なぜVS Code LM APIを直接使用するか
|
|
153
|
+
|
|
154
|
+
**✅ 採用理由**:
|
|
155
|
+
|
|
156
|
+
1. **GitHub Copilot統合**: VS Code環境でCopilotを直接利用可能
|
|
157
|
+
2. **ゼロコスト**: 追加のAPI Key不要(Copilotライセンス内)
|
|
158
|
+
3. **既存インフラ活用**: Expert Delegationが既にVS Code LM APIをラップ済み
|
|
159
|
+
4. **モデル選択柔軟性**: `selectChatModels()`でモデル切り替え可能
|
|
160
|
+
|
|
161
|
+
**VS Code LM API例**:
|
|
162
|
+
```typescript
|
|
163
|
+
import * as vscode from 'vscode';
|
|
164
|
+
|
|
165
|
+
const models = await vscode.lm.selectChatModels({
|
|
166
|
+
vendor: 'copilot',
|
|
167
|
+
family: 'gpt-4',
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const model = models[0];
|
|
171
|
+
const response = await model.sendRequest(
|
|
172
|
+
[{ role: vscode.LanguageModelChatMessageRole.User, content: prompt }],
|
|
173
|
+
{ maxTokens: 500 },
|
|
174
|
+
token
|
|
175
|
+
);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### LM Provider比較
|
|
179
|
+
|
|
180
|
+
| プロバイダー | 長所 | 短所 | 判定 |
|
|
181
|
+
|-------------|------|------|------|
|
|
182
|
+
| **VS Code LM API** | Copilot統合、API Key不要 | VS Code環境依存 | ✅ 採用 |
|
|
183
|
+
| **OpenAI API** | 高品質、独立動作 | ❌ 有料、API Key管理必要 | ❌ 不採用 |
|
|
184
|
+
| **Azure OpenAI** | エンタープライズ対応 | ❌ 有料、Azure依存 | ❌ 不採用 |
|
|
185
|
+
| **Anthropic Claude** | 長文対応 | ❌ 有料、API Key管理必要 | ❌ 不採用 |
|
|
186
|
+
| **Ollama (Local)** | プライバシー、無料 | ❌ GPU必要、品質低い | ❌ 不採用 |
|
|
187
|
+
|
|
188
|
+
### Expert Delegationの役割
|
|
189
|
+
|
|
190
|
+
**既存パッケージを活用**して以下の機能を委譲:
|
|
191
|
+
|
|
192
|
+
| 機能 | Expert Type | 用途 |
|
|
193
|
+
|------|------------|------|
|
|
194
|
+
| **EARS変換** | `ears-analyst` | 調査結果をEARS形式要件に変換 |
|
|
195
|
+
| **設計レビュー** | `design-reviewer` | 生成した設計のSOLID準拠チェック |
|
|
196
|
+
| **セキュリティ分析** | `security-analyst` | 調査結果からセキュリティリスク検出 |
|
|
197
|
+
| **アーキテクチャ分析** | `architect` | 技術選択肢の評価 |
|
|
198
|
+
|
|
199
|
+
**Adapter Pattern**で統合:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// src/integrations/expert-integration.ts
|
|
203
|
+
|
|
204
|
+
export class ExpertIntegration {
|
|
205
|
+
constructor(private delegation: DelegationEngine) {}
|
|
206
|
+
|
|
207
|
+
async convertToEARS(finding: string): Promise<string> {
|
|
208
|
+
const result = await this.delegation.delegate({
|
|
209
|
+
prompt: `Convert to EARS format: ${finding}`,
|
|
210
|
+
expertType: 'ears-analyst',
|
|
211
|
+
mode: 'advisory',
|
|
212
|
+
});
|
|
213
|
+
return result.content;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async reviewDesign(designDoc: string): Promise<string> {
|
|
217
|
+
const result = await this.delegation.delegate({
|
|
218
|
+
prompt: `Review this design for SOLID principles: ${designDoc}`,
|
|
219
|
+
expertType: 'design-reviewer',
|
|
220
|
+
mode: 'advisory',
|
|
221
|
+
});
|
|
222
|
+
return result.content;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async analyzeSecurityRisks(findings: Finding[]): Promise<SecurityAnalysis> {
|
|
226
|
+
const result = await this.delegation.delegate({
|
|
227
|
+
prompt: `Analyze security risks: ${JSON.stringify(findings)}`,
|
|
228
|
+
expertType: 'security-analyst',
|
|
229
|
+
mode: 'advisory',
|
|
230
|
+
});
|
|
231
|
+
return JSON.parse(result.content);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Consequences
|
|
239
|
+
|
|
240
|
+
### Positive
|
|
241
|
+
|
|
242
|
+
✅ **ゼロコスト**: GitHub Copilotライセンス内で動作
|
|
243
|
+
✅ **既存資産活用**: Expert Delegation (v3.2.0+) をそのまま利用
|
|
244
|
+
✅ **テスト容易性**: VSCodeLMProviderをMockして単体テスト可能
|
|
245
|
+
✅ **専門知識**: 7種のExpertタイプで高品質な分析
|
|
246
|
+
|
|
247
|
+
### Negative
|
|
248
|
+
|
|
249
|
+
⚠️ **VS Code依存**: CLI実行時もVS Code環境が必要
|
|
250
|
+
⚠️ **モデル制限**: Copilotが提供するモデルに限定
|
|
251
|
+
⚠️ **トークン制限**: Copilotの利用制限に準拠
|
|
252
|
+
|
|
253
|
+
### Mitigations
|
|
254
|
+
|
|
255
|
+
- **VS Code依存**:
|
|
256
|
+
- CLIは`npx`でVS Code Extension Hostから実行
|
|
257
|
+
- 将来的にはOpenAI APIへのフォールバック実装
|
|
258
|
+
- **モデル制限**:
|
|
259
|
+
- `selectChatModels()`でGPT-4を優先選択
|
|
260
|
+
- 利用不可時はGPT-3.5へフォールバック
|
|
261
|
+
- **トークン制限**:
|
|
262
|
+
- TokenTrackerで予算管理(REQ-DR-CORE-006)
|
|
263
|
+
- 予算80%消費時に警告
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Implementation Details
|
|
268
|
+
|
|
269
|
+
### VSCodeLMProviderラッパー
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// src/providers/vscode-lm-provider.ts
|
|
273
|
+
|
|
274
|
+
import * as vscode from 'vscode';
|
|
275
|
+
|
|
276
|
+
export interface LMProvider {
|
|
277
|
+
generateText(request: LMRequest): Promise<LMResponse>;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export interface LMRequest {
|
|
281
|
+
messages: { role: string; content: string }[];
|
|
282
|
+
maxTokens: number;
|
|
283
|
+
temperature?: number;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export interface LMResponse {
|
|
287
|
+
text: string;
|
|
288
|
+
tokensUsed: number;
|
|
289
|
+
model: string;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export class VSCodeLMProvider implements LMProvider {
|
|
293
|
+
private modelSelector: { vendor: string; family: string };
|
|
294
|
+
|
|
295
|
+
constructor(modelSelector = { vendor: 'copilot', family: 'gpt-4' }) {
|
|
296
|
+
this.modelSelector = modelSelector;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
async generateText(request: LMRequest): Promise<LMResponse> {
|
|
300
|
+
// モデル選択
|
|
301
|
+
const models = await vscode.lm.selectChatModels(this.modelSelector);
|
|
302
|
+
|
|
303
|
+
if (models.length === 0) {
|
|
304
|
+
throw new Error('No LM models available');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const model = models[0];
|
|
308
|
+
|
|
309
|
+
// メッセージ変換
|
|
310
|
+
const messages = request.messages.map(msg =>
|
|
311
|
+
new vscode.LanguageModelChatMessage(
|
|
312
|
+
msg.role === 'user'
|
|
313
|
+
? vscode.LanguageModelChatMessageRole.User
|
|
314
|
+
: vscode.LanguageModelChatMessageRole.Assistant,
|
|
315
|
+
msg.content
|
|
316
|
+
)
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
// リクエスト送信
|
|
320
|
+
const response = await model.sendRequest(
|
|
321
|
+
messages,
|
|
322
|
+
{ maxTokens: request.maxTokens, temperature: request.temperature },
|
|
323
|
+
new vscode.CancellationTokenSource().token
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
// レスポンス収集
|
|
327
|
+
let text = '';
|
|
328
|
+
for await (const chunk of response.text) {
|
|
329
|
+
text += chunk;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return {
|
|
333
|
+
text,
|
|
334
|
+
tokensUsed: this.estimateTokens(text),
|
|
335
|
+
model: model.name,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private estimateTokens(text: string): number {
|
|
340
|
+
// 簡易推定: 4文字 = 1トークン
|
|
341
|
+
return Math.ceil(text.length / 4);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### トークン予算管理
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
// src/utils/token-tracker.ts
|
|
350
|
+
|
|
351
|
+
export class TokenTracker {
|
|
352
|
+
private usages: TokenUsage[] = [];
|
|
353
|
+
private budget: number;
|
|
354
|
+
private warningEmitted = false;
|
|
355
|
+
|
|
356
|
+
constructor(budget: number) {
|
|
357
|
+
this.budget = budget;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
trackUsage(operation: string, tokens: number): void {
|
|
361
|
+
this.usages.push({ operation, tokens, timestamp: Date.now() });
|
|
362
|
+
|
|
363
|
+
// 80%警告
|
|
364
|
+
if (this.getUsed() >= this.budget * 0.8 && !this.warningEmitted) {
|
|
365
|
+
console.warn(`⚠️ Token budget 80% consumed (${this.getUsed()}/${this.budget})`);
|
|
366
|
+
this.warningEmitted = true;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// 100%エラー
|
|
370
|
+
if (this.isExceeded()) {
|
|
371
|
+
throw new TokenBudgetExceededError(this.getUsed(), this.budget);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
getUsed(): number {
|
|
376
|
+
return this.usages.reduce((sum, u) => sum + u.tokens, 0);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
getRemaining(): number {
|
|
380
|
+
return Math.max(0, this.budget - this.getUsed());
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
isExceeded(): boolean {
|
|
384
|
+
return this.getUsed() >= this.budget;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Compliance
|
|
392
|
+
|
|
393
|
+
### 要件準拠
|
|
394
|
+
|
|
395
|
+
| 要件ID | 対応 |
|
|
396
|
+
|--------|------|
|
|
397
|
+
| REQ-DR-CORE-004 | ✅ LM APIで推論・評価実装 |
|
|
398
|
+
| REQ-DR-CORE-006 | ✅ TokenTrackerで予算管理 |
|
|
399
|
+
| REQ-DR-INT-001 | ✅ Expert Delegation統合 |
|
|
400
|
+
|
|
401
|
+
### 憲法準拠
|
|
402
|
+
|
|
403
|
+
| 条項 | 対応 |
|
|
404
|
+
|-----|------|
|
|
405
|
+
| II. CLI Interface | ✅ CLIから実行可能 |
|
|
406
|
+
| VII. Design Patterns | ✅ Adapter, Strategy適用 |
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Testing Strategy
|
|
411
|
+
|
|
412
|
+
### Mock LM Provider
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
// src/test/mocks/mock-lm-provider.ts
|
|
416
|
+
|
|
417
|
+
export class MockLMProvider implements LMProvider {
|
|
418
|
+
private responses: Map<string, string> = new Map();
|
|
419
|
+
|
|
420
|
+
setResponse(prompt: string, response: string): void {
|
|
421
|
+
this.responses.set(prompt, response);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
async generateText(request: LMRequest): Promise<LMResponse> {
|
|
425
|
+
const prompt = request.messages[0].content;
|
|
426
|
+
const text = this.responses.get(prompt) || '{"default": "response"}';
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
text,
|
|
430
|
+
tokensUsed: Math.ceil(text.length / 4),
|
|
431
|
+
model: 'mock-model',
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### テストケース
|
|
438
|
+
|
|
439
|
+
```typescript
|
|
440
|
+
describe('LMReasoning', () => {
|
|
441
|
+
it('should generate reflective questions', async () => {
|
|
442
|
+
const mockProvider = new MockLMProvider();
|
|
443
|
+
mockProvider.setResponse(
|
|
444
|
+
'Original query: ...',
|
|
445
|
+
JSON.stringify([
|
|
446
|
+
{ question: 'What is X?', reason: '...', priority: 10 }
|
|
447
|
+
])
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
const reasoning = new LMReasoning(mockProvider, expertDelegation);
|
|
451
|
+
const questions = await reasoning.generateQuestions('test', knowledge);
|
|
452
|
+
|
|
453
|
+
expect(questions).toHaveLength(1);
|
|
454
|
+
expect(questions[0].question).toBe('What is X?');
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## References
|
|
462
|
+
|
|
463
|
+
- [VS Code Language Model API](https://code.visualstudio.com/api/extension-guides/language-model)
|
|
464
|
+
- [GitHub Copilot Extensions](https://github.com/features/copilot)
|
|
465
|
+
- [@nahisaho/musubix-expert-delegation](../../packages/expert-delegation/README.md)
|
|
466
|
+
- REQ-MUSUBIX-v3.4.0.md - 要件定義書
|
|
467
|
+
- DES-DR-v3.4.0.md - 設計書
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Approval
|
|
472
|
+
|
|
473
|
+
- **Author**: AI Agent (2026-01-16)
|
|
474
|
+
- **Reviewer**: -
|
|
475
|
+
- **Status**: Accepted
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# ADR-v3.7.0-001: Everything Claude Code知見の統合
|
|
2
|
+
|
|
3
|
+
**ステータス**: Proposed
|
|
4
|
+
**日付**: 2026-01-25
|
|
5
|
+
**決定者**: MUSUBIX Team
|
|
6
|
+
|
|
7
|
+
## コンテキスト
|
|
8
|
+
|
|
9
|
+
MUSUBIX v3.6.0でCursor FastRenderプロジェクトからの知見(トリアージシステム、非交渉事項エンジン、リソースリミッター等)を統合しました。
|
|
10
|
+
|
|
11
|
+
v3.7.0では、Anthropicハッカソン優勝者が公開している`affaan-m/everything-claude-code`リポジトリを分析し、Claude Codeの本格運用で必要とされる機能を特定しました。
|
|
12
|
+
|
|
13
|
+
## 問題
|
|
14
|
+
|
|
15
|
+
現在のMUSUBIXには以下の機能が不足しています:
|
|
16
|
+
|
|
17
|
+
1. **セッション永続性**: セッション間でコンテキストが失われる
|
|
18
|
+
2. **戦略的圧縮**: 自動圧縮が論理的な区切りを考慮しない
|
|
19
|
+
3. **継続学習フック**: セッション終了時のパターン自動抽出がない
|
|
20
|
+
4. **評価フレームワーク**: pass@k等の標準的AI評価メトリクスがない
|
|
21
|
+
5. **検証ループ**: 継続的な品質検証の仕組みがない
|
|
22
|
+
6. **チェックポイント**: 作業状態の保存・復元機能がない
|
|
23
|
+
|
|
24
|
+
## 決定
|
|
25
|
+
|
|
26
|
+
以下の9つの新パッケージを段階的に追加します:
|
|
27
|
+
|
|
28
|
+
### Phase 1: Core Session Management (v3.7.0)
|
|
29
|
+
| パッケージ | 優先度 | 機能 |
|
|
30
|
+
|-----------|--------|------|
|
|
31
|
+
| `session-manager` | P0 | セッション永続化、SessionStart/End/PreCompact Hook |
|
|
32
|
+
| `context-optimizer` | P1 | 戦略的圧縮提案、ツール呼び出しカウンター |
|
|
33
|
+
| `learning-hooks` | P1 | 継続学習、パターン自動抽出 |
|
|
34
|
+
|
|
35
|
+
### Phase 2: Evaluation Framework (v3.7.1)
|
|
36
|
+
| パッケージ | 優先度 | 機能 |
|
|
37
|
+
|-----------|--------|------|
|
|
38
|
+
| `eval-harness` | P1 | pass@k評価、Capability/Regression Eval |
|
|
39
|
+
| `verification-loop` | P2 | 6フェーズ検証、継続的検証 |
|
|
40
|
+
| `checkpoint` | P2 | 状態保存・復元、比較機能 |
|
|
41
|
+
|
|
42
|
+
### Phase 3: Code Intelligence (v3.7.2)
|
|
43
|
+
| パッケージ | 優先度 | 機能 |
|
|
44
|
+
|-----------|--------|------|
|
|
45
|
+
| `codemap` | P3 | リポジトリ構造分析、コードマップ生成 |
|
|
46
|
+
| `refactor-cleaner` | P3 | デッドコード検出・削除 |
|
|
47
|
+
| `context-injection` | P4 | 動的コンテキストモード |
|
|
48
|
+
|
|
49
|
+
## 理由
|
|
50
|
+
|
|
51
|
+
### everything-claude-codeを参照元に選んだ理由
|
|
52
|
+
|
|
53
|
+
1. **実績**: Anthropicハッカソン優勝者が10ヶ月以上の本番使用で検証
|
|
54
|
+
2. **網羅性**: エージェント、スキル、フック、コマンド、ルールを体系化
|
|
55
|
+
3. **ベストプラクティス**: Token最適化、Memory永続化、Eval手法を文書化
|
|
56
|
+
4. **コミュニティ採用**: GitHubスター数が多く、実用性が証明済み
|
|
57
|
+
|
|
58
|
+
### MUSUBIXとの差別化
|
|
59
|
+
|
|
60
|
+
everything-claude-codeは「設定ファイル集」であり、MUSUBIXは「プログラム可能なフレームワーク」です。
|
|
61
|
+
|
|
62
|
+
| 観点 | everything-claude-code | MUSUBIX v3.7.0 |
|
|
63
|
+
|------|----------------------|----------------|
|
|
64
|
+
| 形態 | Markdown設定ファイル | TypeScriptパッケージ |
|
|
65
|
+
| 拡張性 | 手動編集 | API経由でプログラム可能 |
|
|
66
|
+
| 統合 | Claude Code専用 | MCP標準で汎用 |
|
|
67
|
+
| 検証 | 手動 | 自動テスト5000+ |
|
|
68
|
+
| 方法論 | 暗黙的 | MUSUBI SDD明示的 |
|
|
69
|
+
|
|
70
|
+
## 代替案
|
|
71
|
+
|
|
72
|
+
### 案A: everything-claude-codeをそのまま採用
|
|
73
|
+
- **却下理由**: TypeScript統合不可、テスト自動化困難
|
|
74
|
+
|
|
75
|
+
### 案B: 別リポジトリとして分離
|
|
76
|
+
- **却下理由**: パッケージ間連携が困難、monorepoの利点喪失
|
|
77
|
+
|
|
78
|
+
### 案C: 段階的統合(採用)
|
|
79
|
+
- **理由**: 既存アーキテクチャとの整合性維持、段階的検証可能
|
|
80
|
+
|
|
81
|
+
## 影響
|
|
82
|
+
|
|
83
|
+
### ポジティブ
|
|
84
|
+
- Claude Code/Copilotとの親和性向上
|
|
85
|
+
- セッション間の継続性確保
|
|
86
|
+
- AI評価の標準化
|
|
87
|
+
|
|
88
|
+
### ネガティブ
|
|
89
|
+
- パッケージ数増加(28 → 37)
|
|
90
|
+
- 新しい概念の学習コスト
|
|
91
|
+
- ドキュメント更新負荷
|
|
92
|
+
|
|
93
|
+
## 関連決定
|
|
94
|
+
|
|
95
|
+
- ADR-v3.6.0-001: FastRender知見の統合
|
|
96
|
+
- ADR-v3.5.0-001: Assistant Axis導入
|
|
97
|
+
- ADR-v3.0.0-001: Git-Native Knowledge System
|
|
98
|
+
|
|
99
|
+
## 参考資料
|
|
100
|
+
|
|
101
|
+
- [REQ-v3.7.0-everything-claude-code-integration.md](storage/specs/REQ-v3.7.0-everything-claude-code-integration.md)
|
|
102
|
+
- [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code)
|