Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Quantum-resistant, self-learning version control for AI agents with ReasoningBank intelligence and multi-agent coordination
.claude/skills/ruvnet-agentic-jujutsu/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 162% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 377% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 418% | 0% |
> Quantum-ready, self-learning version control designed for multiple AI agents working simultaneously without conflicts.
Use agentic-jujutsu when you need:
bashnpx agentic-jujutsu
javascriptconst { 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}`);
Track operations, learn patterns, and get intelligent suggestions:
javascript// 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) + '%');
Validation (v2.3.1):
Automatically identify successful operation sequences:
javascript// 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)}%`); });
Track improvement over time:
javascriptconst 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)}%`);
Multiple agents work concurrently without conflicts:
javascript// 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`);
Fast integrity verification with quantum-resistant cryptography:
javascriptconst { 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);
Automatic tracking of all operations:
javascript// 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);
Learn and improve deployment workflows:
javascriptasync 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' ); }
Coordinate review across multiple agents:
javascriptasync 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; }
Learn from failures to prevent future issues:
javascriptasync 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; } }
Implement a self-improving agent:
javascriptclass 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'); }
| Method | Description | Returns | |--------|-------------|---------| | new JjWrapper() | Create wrapper instance | JjWrapper | | status() | Get repository status | Promise<JjResult> | | newCommit(msg) | Create new commit | Promise<JjResult> | | log(limit) | Show commit history | Promise<JjCommit]> | | diff(from, to) | Show differences | Promise<JjDiff> | | branchCreate(name, rev?) | Create branch | Promise<JjResult> | | rebase(source, dest) | Rebase commits | Promise<JjResult> |
| Method | Description | Returns | |--------|-------------|---------| | startTrajectory(task) | Begin learning trajectory | string (trajectory ID) | | addToTrajectory() | Add recent operations | void | | finalizeTrajectory(score, critique?) | Complete trajectory (score: 0.0-1.0) | void | | getSuggestion(task) | Get AI recommendation | JSON: DecisionSuggestion | | getLearningStats() | Get learning metrics | JSON: LearningStats | | getPatterns() | Get discovered patterns | JSON: Pattern] | | queryTrajectories(task, limit) | Find similar trajectories | JSON: Trajectory] | | resetLearning() | Clear learned data | void |
| Method | Description | Returns | |--------|-------------|---------| | getStats() | Get operation statistics | JSON: Stats | | getOperations(limit) | Get recent operations | JjOperation] | | getUserOperations(limit) | Get user operations only | JjOperation] | | clearLog() | Clear operation log | void |
| Method | Description | Returns | |--------|-------------|---------| | generateQuantumFingerprint(data) | Generate SHA3-512 fingerprint | Buffer (64 bytes) | | verifyQuantumFingerprint(data, fp) | Verify fingerprint | boolean | | enableEncryption(key, pubKey?) | Enable HQC-128 encryption | void | | disableEncryption() | Disable encryption | void | | isEncryptionEnabled() | Check encryption status | boolean |
| Metric | Git | Agentic Jujutsu | |--------|-----|-----------------| | Concurrent commits | 15 ops$s | 350 ops$s (23x) | | Context switching | 500-1000ms | 50-100ms (10x) | | Conflict resolution | 30-40% auto | 87% auto (2.5x) | | Lock waiting | 50 min$day | 0 min (∞) | | Quantum fingerprints | N/A | <1ms |
javascript// ✅ 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
javascript// ✅ 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
javascript// ✅ 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(); }
javascript// ✅ 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 }
javascriptconst 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 }
javascripttry { 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))); }
javascriptconst patterns = JSON.parse(jj.getPatterns()); if (patterns.length === 0) { // Need more trajectories with >70% success // Record at least 3-5 successful trajectories }
javascriptconst { 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); }
javascriptasync 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); }
Status: ✅ Production Ready License: MIT Maintained: Active
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | pass→pass | 8,839 | 5,506 | -38% | 1 | 1 | 0% | 1,815 | 6,219 | +243% | 0 | 0 | — |
case-01 | fail→pass | 12,668 | 7,806 | -38% | 1 | 1 | 0% | 2,578 | 6,754 | +162% | 0 | 0 | — |
case-02 | fail→pass | 18,598 | 10,545 | -43% | 1 | 1 | 0% | 4,197 | 7,279 | +73% | 0 | 0 | — |
case-03 | fail→pass | 19,342 | 13,503 | -30% | 1 | 1 | 0% | 4,086 | 7,850 | +92% | 0 | 0 | — |
case-04 | pass→pass | 5,701 | 3,774 | -34% | 1 | 1 | 0% | 1,185 | 5,886 | +397% | 0 | 0 | — |
case-05 | fail→pass | 6,931 | 4,473 | -35% | 1 | 1 | 0% | 1,233 | 5,887 | +377% | 0 | 0 | — |
case-06 | fail→pass | 6,032 | 3,712 | -38% | 1 | 1 | 0% | 1,117 | 5,789 | +418% | 0 | 0 | — |
case-07 | fail→pass | 8,628 | 5,900 | -32% | 1 | 1 | 0% | 1,825 | 6,424 | +252% | 0 | 0 | — |
case-08 | fail→pass | 6,702 | 3,753 | -44% | 1 | 1 | 0% | 1,364 | 5,835 | +328% | 0 | 0 | — |
case-09 | fail→pass | 7,197 | 2,690 | -63% | 1 | 1 | 0% | 1,218 | 5,514 | +353% | 0 | 0 | — |
case-10 | fail→pass | 6,736 | 2,049 | -70% | 1 | 1 | 0% | 1,254 | 5,421 | +332% | 0 | 0 | — |
case-11 | fail→pass | 7,095 | 2,329 | -67% | 1 | 1 | 0% | 1,314 | 5,461 | +316% | 0 | 0 | — |
case-12 | fail→pass | 5,632 | 2,117 | -62% | 1 | 1 | 0% | 959 | 5,422 | +465% | 0 | 0 | — |
case-13 | fail→pass | 6,724 | 4,134 | -39% | 1 | 1 | 0% | 1,403 | 5,919 | +322% | 0 | 0 | — |
case-14 | fail→pass | 8,661 | 1,976 | -77% | 1 | 1 | 0% | 1,481 | 5,406 | +265% | 0 | 0 | — |
case-15 | fail→pass | 9,550 | 2,000 | -79% | 1 | 1 | 0% | 1,584 | 5,367 | +239% | 0 | 0 | — |
case-16 | fail→pass | 11,883 | 1,941 | -84% | 1 | 1 | 0% | 2,126 | 5,275 | +148% | 0 | 0 | — |
case-17 | fail→pass | 12,015 | 2,691 | -78% | 1 | 1 | 0% | 1,875 | 5,343 | +185% | 0 | 0 | — |
case-18 | fail→pass | 9,848 | 1,801 | -82% | 1 | 1 | 0% | 1,684 | 5,372 | +219% | 0 | 0 | — |
case-19 | fail→pass | 11,171 | 3,352 | -70% | 1 | 1 | 0% | 1,753 | 5,378 | +207% | 0 | 0 | — |
case-20 | pass→pass | 14,719 | 17,678 | +20% | 1 | 1 | 0% | 2,656 | 8,327 | +214% | 0 | 0 | — |
case-22 | pass→pass | 2,446 | 2,096 | -14% | 1 | 1 | 0% | 432 | 5,423 | +1155% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +82 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.