agentic-jujutsu について
agentic-jujutsuは、AIエージェント向けのバージョン管理ツールです。リポジトリ操作をまとめ、記録したタスク履歴からパターンを学習して提案を生成します。複数エージェントの協調や反復作業の改善に使えます。
主な機能
- 01状態・コミット・ブランチ操作のラッパー
- 02操作と利用統計の記録
- 03タスク履歴からのパターン学習
- 04過去の履歴に基づく提案
- 05複数エージェントの並行作業
- 06SHA3-512整合性フィンガープリント
活用シーン
- 01複数エージェントによるコード変更
- 02デプロイ履歴を基にしたワークフロー改善
- 03類似タスクの検索と失敗分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ proffesor-for-testing/ agentic-qe --skill agentic-jujutsuインストール後、Claude Code で/agentic-jujutsuを入力して読み込まれたか確認します。
詳細
エージェント型 Jujutsu - AI エージェント向けバージョン管理
複数の AI エージェントが同時に競合なく作業できるように設計された、量子耐性を備えた自己学習型バージョン管理システムです。
このスキルを使用する場面
次のような場合は、agentic-jujutsu を使用してください。
- ✅ 複数の AI エージェントが同時にコードを変更する場合
- ✅ ロックフリーのバージョン管理が必要な場合(Git より 23 倍高速)
- ✅ 経験から改善する自己学習型 AI が必要な場合
- ✅ 将来に備えた保護のため、量子耐性セキュリティが必要な場合
- ✅ 自動競合解決が必要な場合(成功率 87%)
- ✅ パターン認識とインテリジェントな提案が必要な場合
- ✅ ブロックせずに複数エージェントを連携させる場合
クイックスタート
インストール
npx agentic-jujutsu
基本的な使い方
const { JjWrapper } = require('agentic-jujutsu');
const jj = new JjWrapper();
// Basic operations
await jj.status();
await jj.newCommit('Add feature');
await jj.log(10);
// Self-learning trajectory
const id = jj.startTrajectory('Implement authentication');
await jj.branchCreate('feature/auth');
await jj.newCommit('Add auth');
jj.addToTrajectory();
jj.finalizeTrajectory(0.9, 'Clean implementation');
// Get AI suggestions
const suggestion = JSON.parse(jj.getSuggestion('Add logout feature'));
console.log(`Confidence: ${suggestion.confidence}`);
主な機能
1. ReasoningBank による自己学習
操作を追跡してパターンを学習し、インテリジェントな提案を取得します。
// Start learning trajectory
const trajectoryId = jj.startTrajectory('Deploy to production');
// Perform operations (automatically tracked)
await jj.execute(['git', 'push', 'origin', 'main']);
await jj.branchCreate('release/v1.0');
await jj.newCommit('Release v1.0');
// Record operations to trajectory
jj.addToTrajectory();
// Finalize with success score (0.0-1.0) and critique
jj.finalizeTrajectory(0.95, 'Deployment successful, no issues');
// Later: Get AI-powered suggestions for similar tasks
const suggestion = JSON.parse(jj.getSuggestion('Deploy to staging'));
console.log('AI Recommendation:', suggestion.reasoning);
console.log('Confidence:', (suggestion.confidence * 100).toFixed(1) + '%');
console.log('Expected Success:', (suggestion.expectedSuccessRate * 100).toFixed(1) + '%');
検証(v2.3.1):
- ✅ タスクは空でないこと(最大 10KB)
- ✅ 成功スコアは 0.0~1.0 であること
- ✅ 完了前に操作が記録されていること
- ✅ コンテキストが空でないこと
2. パターンの検出
成功した操作シーケンスを自動的に特定します。
// Get discovered patterns
const patterns = JSON.parse(jj.getPatterns());
patterns.forEach(pattern => {
console.log(`Pattern: ${pattern.name}`);
console.log(` Success rate: ${(pattern.successRate * 100).toFixed(1)}%`);
console.log(` Used ${pattern.observationCount} times`);
console.log(` Operations: ${pattern.operationSequence.join(' → ')}`);
console.log(` Confidence: ${(pattern.confidence * 100).toFixed(1)}%`);
});
3. 学習統計
時間の経過に伴う改善状況を追跡します。
const stats = JSON.parse(jj.getLearningStats());
console.log('Learning Progress:');
console.log(` Total trajectories: ${stats.totalTrajectories}`);
console.log(` Patterns discovered: ${stats.totalPatterns}`);
console.log(` Average success: ${(stats.avgSuccessRate * 100).toFixed(1)}%`);
console.log(` Improvement rate: ${(stats.improvementRate * 100).toFixed(1)}%`);
console.log(` Prediction accuracy: ${(stats.predictionAccuracy * 100).toFixed(1)}%`);
4. マルチエージェント連携
複数のエージェントが競合なく同時に作業します。
// Agent 1: Developer
const dev = new JjWrapper();
dev.startTrajectory('Implement feature');
await dev.newCommit('Add feature X');
dev.addToTrajectory();
dev.finalizeTrajectory(0.85);
// Agent 2: Reviewer (learns from Agent 1)
const reviewer = new JjWrapper();
const suggestion = JSON.parse(reviewer.getSuggestion('Review feature X'));
if (suggestion.confidence > 0.7) {
console.log('High confidence approach:', suggestion.reasoning);
}
// Agent 3: Tester (benefits from both)
const tester = new JjWrapper();
const similar = JSON.parse(tester.queryTrajectories('test feature', 5));
console.log(`Found ${similar.length} similar test approaches`);
5. 量子耐性セキュリティ(v2.3.0 以降)
量子耐性暗号を用いて整合性を高速に検証します。
const { generateQuantumFingerprint, verifyQuantumFingerprint } = require('agentic-jujutsu');
// Generate SHA3-512 fingerprint (NIST FIPS 202)
const data = Buffer.from('commit-data');
const fingerprint = generateQuantumFingerprint(data);
console.log('Fingerprint:', fingerprint.toString('hex'));
// Verify integrity (<1ms)
const isValid = verifyQuantumFingerprint(data, fingerprint);
console.log('Valid:', isValid);
// HQC-128 encryption for trajectories
const crypto = require('crypto');
const key = crypto.randomBytes(32).toString('base64');
jj.enableEncryption(key);
6. AgentDB による操作の追跡
すべての操作を自動的に追跡します。
// Operations are tracked automatically
await jj.status();
await jj.newCommit('Fix bug');
await jj.rebase('main');
// Get operation statistics
const stats = JSON.parse(jj.getStats());
console.log(`Total operations: ${stats.total_operations}`);
console.log(`Success rate: ${(stats.success_rate * 100).toFixed(1)}%`);
console.log(`Avg duration: ${stats.avg_duration_ms.toFixed(2)}ms`);
// Query recent operations
const ops = jj.getOperations(10);
ops.forEach(op => {
console.log(`${op.operationType}: ${op.command}`);
console.log(` Duration: ${op.durationMs}ms, Success: ${op.success}`);
});
// Get user operations (excludes snapshots)
const userOps = jj.getUserOperations(20);
高度な使用例
使用例 1:適応型ワークフローの最適化
デプロイのワークフローを学習して改善します。
async function adaptiveDeployment(jj, environment) {
// Get AI suggestion based on past deployments
const suggestion = JSON.parse(jj.getSuggestion(`Deploy to ${environment}`));
console.log(`Deploying with ${(suggestion.confidence * 100).toFixed(0)}% confidence`);
console.log(`Expected duration: ${suggestion.estimatedDurationMs}ms`);
// Start tracking
jj.startTrajectory(`Deploy to ${environment}`);
// Execute recommended operations
for (const op of suggestion.recommendedOperations) {
console.log(`Executing: ${op}`);
await executeOperation(op);
}
jj.addToTrajectory();
// Record outcome
const success = await verifyDeployment();
jj.finalizeTrajectory(
success ? 0.95 : 0.5,
success ? 'Deployment successful' : 'Issues detected'
);
}
使用例 2:マルチエージェントによるコードレビュー
複数のエージェント間でレビューを調整します。
async function coordinatedReview(agents) {
const reviews = await Promise.all(agents.map(async (agent) => {
const jj = new JjWrapper();
// Start review trajectory
jj.startTrajectory(`Review by ${agent.name}`);
// Get AI suggestion for review approach
const suggestion = JSON.parse(jj.getSuggestion('Code review'));
// Perform review
const diff = await jj.diff('@', '@-');
const issues = await agent.analyze(diff);
jj.addToTrajectory();
jj.finalizeTrajectory(
issues.length === 0 ? 0.9 : 0.6,
`Found ${issues.length} issues`
);
return { agent: agent.name, issues, suggestion };
}));
// Aggregate learning from all agents
return reviews;
}
使用例 3:エラーパターンの検出
失敗から学習して、今後の問題を防ぎます。
async function smartMerge(jj, branch) {
// Query similar merge attempts
const similar = JSON.parse(jj.queryTrajectories(`merge ${branch}`, 10));
// Analyze past failures
const failures = similar.filter(t => t.successScore < 0.5);
if (failures.length > 0) {
console.log('⚠️ Similar merges failed in the past:');
failures.forEach(f => {
if (f.critique) {
console.log(` - ${f.critique}`);
}
});
}
// Get AI recommendation
const suggestion = JSON.parse(jj.getSuggestion(`merge ${branch}`));
if (suggestion.confidence < 0.7) {
console.log('⚠️ Low confidence. Recommended steps:');
suggestion.recommendedOperations.forEach(op => console.log(` - ${op}`));
}
// Execute merge with tracking
jj.startTrajectory(`Merge ${branch}`);
try {
await jj.execute(['merge', branch]);
jj.addToTrajectory();
jj.finalizeTrajectory(0.9, 'Merge successful');
} catch (err) {
jj.addToTrajectory();
jj.finalizeTrajectory(0.3, `Merge failed: ${err.message}`);
throw err;
}
}
使用例 4:継続的な学習ループ
自己改善型エージェントを実装します。
class SelfImprovingAgent {
constructor() {
this.jj = new JjWrapper();
}
async performTask(taskDescription) {
// Get AI suggestion
const suggestion = JSON.parse(this.jj.getSuggestion(taskDescription));
console.log(`Task: ${taskDescription}`);
console.log(`AI Confidence: ${(suggestion.confidence * 100).toFixed(1)}%`);
console.log(`Expected Success: ${(suggestion.expectedSuccessRate * 100).toFixed(1)}%`);
// Start trajectory
this.jj.startTrajectory(taskDescription);
// Execute with recommended approach
const startTime = Date.now();
let success = false;
try {
for (const op of suggestion.recommendedOperations) {
await this.execute(op);
}
success = true;
} catch (err) {
console.error('Task failed:', err.message);
}
const duration = Date.now() - startTime;
// Record learning
this.jj.addToTrajectory();
this.jj.finalizeTrajectory(
success ? 0.9 : 0.4,
success
? `Completed in ${duration}ms using ${suggestion.recommendedOperations.length} operations`
: `Failed after ${duration}ms`
);
// Check improvement
const stats = JSON.parse(this.jj.getLearningStats());
console.log(`Improvement rate: ${(stats.improvementRate * 100).toFixed(1)}%`);
return success;
}
async execute(operation) {
// Execute operation logic
}
}
// Usage
const agent = new SelfImprovingAgent();
// Agent improves over time
for (let i = 1; i <= 10; i++) {
console.log(`\n--- Attempt ${i} ---`);
await agent.performTask('Deploy application');
}
API リファレンス
主なメソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
new JjWrapper() | ラッパーインスタンスを作成 | JjWrapper |
status() | リポジトリの状態を取得 | Promise |
newCommit(msg) | 新しいコミットを作成 | Promise |
log(limit) | コミット履歴を表示 | Promise<JjCommit[]> |
diff(from, to) | 差分を表示 | Promise |
branchCreate(name, rev?) | ブランチを作成 | Promise |
rebase(source, dest) | コミットをリベース | Promise |
ReasoningBank のメソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
startTrajectory(task) | 学習トラジェクトリを開始 | string (trajectory ID) |
addToTrajectory() | 直近の操作を追加 | void |
finalizeTrajectory(score, critique?) | トラジェクトリを完了(スコア:0.0~1.0) | void |
getSuggestion(task) | AI の推奨事項を取得 | JSON: DecisionSuggestion |
getLearningStats() | 学習指標を取得 | JSON: LearningStats |
getPatterns() | 検出されたパターンを取得 | JSON: Pattern[] |
queryTrajectories(task, limit) | 類似するトラジェクトリを検索 | JSON: Trajectory[] |
resetLearning() | 学習データを消去 | void |
AgentDB のメソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
getStats() | 操作統計を取得 | JSON: Stats |
getOperations(limit) | 最近の操作を取得 | JjOperation[] |
getUserOperations(limit) | ユーザーの操作のみを取得 | JjOperation[] |
clearLog() | 操作ログを消去 | void |
量子セキュリティのメソッド(v2.3.0 以降)
| メソッド | 説明 | 戻り値 |
|---|---|---|
generateQuantumFingerprint(data) | SHA3-512 フィンガープリントを生成 | Buffer (64 bytes) |
verifyQuantumFingerprint(data, fp) | フィンガープリントを検証 | boolean |
enableEncryption(key, pubKey?) | HQC-128 暗号化を有効化 | void |
disableEncryption() | 暗号化を無効化 | void |
isEncryptionEnabled() | 暗号化の状態を確認 | boolean |
パフォーマンス特性
| 指標 | Git | Agentic Jujutsu |
|---|---|---|
| 同時コミット数 | 15 ops/s | 350 ops/s(23倍) |
| コンテキスト切り替え | 500-1000ms | 50-100ms(10倍) |
| コンフリクト解決 | 30-40% 自動 | 87% 自動(2.5倍) |
| ロック待ち時間 | 50 分/日 | 0 分(∞) |
| 量子フィンガープリント | 該当なし | <1ms |
ベストプラクティス
1. 軌跡の管理
// ✅ Good: Meaningful task descriptions
jj.startTrajectory('Implement user authentication with JWT');
// ❌ Bad: Vague descriptions
jj.startTrajectory('fix stuff');
// ✅ Good: Honest success scores
jj.finalizeTrajectory(0.7, 'Works but needs refactoring');
// ❌ Bad: Always 1.0
jj.finalizeTrajectory(1.0, 'Perfect!'); // Prevents learning
2. パターン認識
// ✅ Good: Let patterns emerge naturally
for (let i = 0; i < 10; i++) {
jj.startTrajectory('Deploy feature');
await deploy();
jj.addToTrajectory();
jj.finalizeTrajectory(wasSuccessful ? 0.9 : 0.5);
}
// ❌ Bad: Not recording outcomes
await deploy(); // No learning
3. マルチエージェントの連携
// ✅ Good: Concurrent operations
const agents = ['agent1', 'agent2', 'agent3'];
await Promise.all(agents.map(async (agent) => {
const jj = new JjWrapper();
// Each agent works independently
await jj.newCommit(`Changes by ${agent}`);
}));
// ❌ Bad: Sequential with locks
for (const agent of agents) {
await agent.waitForLock(); // Not needed!
await agent.commit();
}
4. エラー処理
// ✅ Good: Record failures with details
try {
await jj.execute(['complex-operation']);
jj.finalizeTrajectory(0.9);
} catch (err) {
jj.finalizeTrajectory(0.3, `Failed: ${err.message}. Root cause: ...`);
}
// ❌ Bad: Silent failures
try {
await jj.execute(['operation']);
} catch (err) {
// No learning from failure
}
検証ルール(v2.3.1+)
タスクの説明
- ✅ 空または空白文字のみにはできません
- ✅ 最大長:10,000 バイト
- ✅ 自動的にトリミングされます
成功スコア
- ✅ 有限値である必要があります(NaN または Infinity ではないこと)
- ✅ 0.0 以上 1.0 以下(両端を含む)である必要があります
操作
- ✅ 確定する前に、少なくとも 1 つの操作が必要です
コンテキスト
- ✅ 空にはできません
- ✅ キーを空または空白文字のみにはできません
- ✅ キーは最大 1,000 バイト、値は最大 10,000 バイトです
トラブルシューティング
問題:信頼度の低い提案
const suggestion = JSON.parse(jj.getSuggestion('new task'));
if (suggestion.confidence < 0.5) {
// Not enough data - check learning stats
const stats = JSON.parse(jj.getLearningStats());
console.log(`Need more data. Current trajectories: ${stats.totalTrajectories}`);
// Recommend: Record 5-10 trajectories first
}
問題:検証エラー
try {
jj.startTrajectory(''); // Empty task
} catch (err) {
if (err.message.includes('Validation error')) {
console.log('Invalid input:', err.message);
// Use non-empty, meaningful task description
}
}
try {
jj.finalizeTrajectory(1.5); // Score > 1.0
} catch (err) {
// Use score between 0.0 and 1.0
jj.finalizeTrajectory(Math.max(0, Math.min(1, score)));
}
問題:パターンが見つからない
const patterns = JSON.parse(jj.getPatterns());
if (patterns.length === 0) {
// Need more trajectories with >70% success
// Record at least 3-5 successful trajectories
}
例
例 1:シンプルな学習ワークフロー
const { JjWrapper } = require('agentic-jujutsu');
async function learnFromWork() {
const jj = new JjWrapper();
// Start tracking
jj.startTrajectory('Add user profile feature');
// Do work
await jj.branchCreate('feature/user-profile');
await jj.newCommit('Add user profile model');
await jj.newCommit('Add profile API endpoints');
await jj.newCommit('Add profile UI');
// Record operations
jj.addToTrajectory();
// Finalize with result
jj.finalizeTrajectory(0.85, 'Feature complete, minor styling issues remain');
// Next time, get suggestions
const suggestion = JSON.parse(jj.getSuggestion('Add settings page'));
console.log('AI suggests:', suggestion.reasoning);
}
例 2:マルチエージェントスウォーム
async function agentSwarm(taskList) {
const agents = taskList.map((task, i) => ({
name: `agent-${i}`,
jj: new JjWrapper(),
task
}));
// All agents work concurrently (no conflicts!)
const results = await Promise.all(agents.map(async (agent) => {
agent.jj.startTrajectory(agent.task);
// Get AI suggestion
const suggestion = JSON.parse(agent.jj.getSuggestion(agent.task));
// Execute task
const success = await executeTask(agent, suggestion);
agent.jj.addToTrajectory();
agent.jj.finalizeTrajectory(success ? 0.9 : 0.5);
return { agent: agent.name, success };
}));
console.log('Results:', results);
}
関連ドキュメント
- NPM パッケージ:https://npmjs.com/package/agentic-jujutsu
- GitHub:https://github.com/ruvnet/agentic-flow/tree/main/packages/agentic-jujutsu
- 完全版 README:パッケージの README.md を参照してください
- 検証ガイド:docs/VALIDATION_FIXES_v2.3.1.md
- AgentDB ガイド:docs/AGENTDB_GUIDE.md
バージョン履歴
- v2.3.2 - ドキュメントを更新
- v2.3.1 - ReasoningBank の検証を修正
- v2.3.0 - @qudag/napi-core による量子耐性セキュリティ
- v2.1.0 - ReasoningBank による自己学習型 AI
- v2.0.0 - jj バイナリを組み込んだ依存関係ゼロのインストール
ステータス:✅ 本番環境対応 ライセンス:MIT メンテナンス状況:継続中
コメント
Markdown 対応