/restore
Restore archived increments back to active folder
> /plugin marketplace add anton-abyzov/specweave > /plugin install sw@specweave
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/restore
Context preview
What this command does when you run it.
Restore archived increments back to active folder
Command definition
restore.mddescription: Restore archived increments back to active folder
disable-model-invocation: true
Restore Increment from Archive
Restore an archived increment back to the main increments folder. Useful when you need to reference, update, or continue work on an old increment.
Usage
# Restore specific increment
sw:restore 0031
# Restore multiple increments
sw:restore 0001 0002 0003
# List archived increments
sw:restore --list
Arguments
- `<increment-ids>`: Increment IDs to restore (e.g., "1", "0001", "0031")
- `--list`: List all archived increments without restoring
Examples
Example 1: Restore Specific Increment
sw:restore 0031
**Output**:
๐ฆ Restoring increment from archive...
Increment: 0031-external-tool-status-sync
Source: .specweave/increments/_archive/0031-external-tool-status-sync/
Target: .specweave/increments/0031-external-tool-status-sync/
Checking target location...
โ Target location is empty
โ
Restored: 0031-external-tool-status-sync
Location: .specweave/increments/0031-external-tool-status-sync/
๐ Archive Statistics:
Active: 33 increments (+ 1 restored)
Archived: 30 increments (- 1)
Next: sw:do 0031 (to continue work)
Example 2: List Archived Increments
sw:restore --list
**Output**:
๐ฆ Archived Increments:
.specweave/increments/_archive/
โโโ 0001-core-framework (152 days old)
โโโ 0002-plugin-system (148 days old)
โโโ 0003-auth-service (145 days old)
โโโ 0004-payment-integration (142 days old)
โโโ 0005-api-gateway (140 days old)
...
โโโ 0030-jira-integration (35 days old)
โโโ 0031-external-tool-status-sync (12 days old)
Total: 31 archived increments
To restore: sw:restore <increment-id>
Example 3: Restore Multiple Increments
sw:restore 0030 0031
**Output**:
๐ฆ Restoring increments from archive...
Restoring 0030-jira-integration...
โ
Restored
Restoring 0031-external-tool-status-sync...
โ
Restored
โ
Restored: 2 increments
๐ Archive Statistics:
Active: 34 increments (+ 2 restored)
Archived: 29 increments (- 2)
Error Handling
Increment Not Found in Archive
โ Error: Increment 0031 not found in archive
Archive location: .specweave/increments/_archive/
Available archived increments:
โข 0001-core-framework
โข 0002-plugin-system
โข 0003-auth-service
...
Use: sw:restore --list to see all
Target Location Already Exists
โ Error: Cannot restore 0031 - already exists in active folder
Conflict:
Archive: .specweave/increments/_archive/0031-external-tool-status-sync/
Active: .specweave/increments/0031-external-tool-status-sync/
Options:
1. Delete active version first (if it's a duplicate)
2. Resolve duplicates: sw:fix-duplicates
3. Archive active version: sw:archive 0031
4. Rename one version manually
Recommended: sw:fix-duplicates (auto-resolves conflicts)
Permission Errors
โ Error: Permission denied
Could not move:
From: .specweave/increments/_archive/0031-external-tool-status-sync/
To: .specweave/increments/0031-external-tool-status-sync/
Check:
โข File permissions
โข Disk space
โข Files not open in another program
Safety Checks
Before restoring, the system checks:
- โ
**Increment exists in archive**: Source folder exists
- โ
**Target location empty**: No conflict in main folder
- โ
**Valid increment structure**: Has required files (metadata.json)
- โ
**Disk space available**: Enough space for restored files
Related Commands
- `sw:archive <increment-id>` - Archive completed increments
- `sw:status` - View archive statistics
- `sw:fix-duplicates` - Auto-resolve duplicate increments
- `sw:do <increment-id>` - Resume work on restored increment
Implementation
import { Task } from '@claude/types';
const task = new Task('restore-increment', 'Restore increment from archive');
task.run(async () => {
const { IncrementArchiver } = await import('../../../dist/src/core/increment/increment-archiver.js');
const archiver = new IncrementArchiver(process.cwd());
// Parse arguments
const args = process.argv.slice(2);
// List mode
if (args.includes('--list')) {
const archived = await archiver.listArchived();
console.log('\n๐ฆ Archived Increments:\n');
if (archived.length === 0) {
console.log('No archived increments found.');
return;
}
console.log('.specweave/increments/_archive/');
archived.forEach(inc => {
console.log(`โโโ ${inc}`);
});
console.log(`\nTotal: ${archived.length} archived increments`);
console.log('\nTo restore: sw:restore <increment-id>');
return;
}
// Restore mode
const incrementIds = args.filter(arg => !arg.startsWith('--'));
if (incrementIds.length === 0) {
console.error('โ Error: No increment IDs provided');
console.log('\nUsage:');
console.log(' sw:restore <increment-id>');
console.log(' sw:restore --list');
return;
}
// Restore each increment
let restored = 0;
let errors = 0;
for (const id of incrementIds) {
try {
// Normalize ID to 4-digit format
const normalizedId = id.padStart(4, '0');
// Find archived increment
const archived = await archiver.listArchived();
const match = archived.find(inc => inc.startsWith(normalizedId));
if (!match) {
console.error(`โ Increment ${normalizedId} not found in archive`);
errors++;
continue;
}
// Restore increment
await archiver.restore(match);
console.log(`โ
Restored: ${match}`);
restored++;
} catch (error) {
console.error(`โ Failed to restore ${id}: ${error.message}`);
errors++;
}
}
// Show statistics
if (restored > 0 || errors > 0) {
console.log('\n๐ Restore Summary:');
if (restored > 0) {
console.log(` โ
Restored: ${restored} increment${restored > 1 ? 's' : ''}`);
}
if (errors > 0) {
console.log(` โ Errors: ${errors} incremeRead more
description: Restore archived increments back to active folder disable-model-invocation: true
Restore Increment from Archive
Restore an archived increment back to the main increments folder. Useful when you need to reference, update, or continue work on an old increment.
Usage
# Restore specific increment sw:restore 0031 # Restore multiple increments sw:restore 0001 0002 0003 # List archived increments sw:restore --list
Arguments
- `<increment-ids>`: Increment IDs to restore (e.g., "1", "0001", "0031")
- `--list`: List all archived increments without restoring
Examples
Example 1: Restore Specific Increment
sw:restore 0031
**Output**:
๐ฆ Restoring increment from archive... Increment: 0031-external-tool-status-sync Source: .specweave/increments/_archive/0031-external-tool-status-sync/ Target: .specweave/increments/0031-external-tool-status-sync/ Checking target location... โ Target location is empty โ Restored: 0031-external-tool-status-sync Location: .specweave/increments/0031-external-tool-status-sync/ ๐ Archive Statistics: Active: 33 increments (+ 1 restored) Archived: 30 increments (- 1) Next: sw:do 0031 (to continue work)
Example 2: List Archived Increments
sw:restore --list
**Output**:
๐ฆ Archived Increments: .specweave/increments/_archive/ โโโ 0001-core-framework (152 days old) โโโ 0002-plugin-system (148 days old) โโโ 0003-auth-service (145 days old) โโโ 0004-payment-integration (142 days old) โโโ 0005-api-gateway (140 days old) ... โโโ 0030-jira-integration (35 days old) โโโ 0031-external-tool-status-sync (12 days old) Total: 31 archived increments To restore: sw:restore <increment-id>
Example 3: Restore Multiple Increments
sw:restore 0030 0031
**Output**:
๐ฆ Restoring increments from archive... Restoring 0030-jira-integration... โ Restored Restoring 0031-external-tool-status-sync... โ Restored โ Restored: 2 increments ๐ Archive Statistics: Active: 34 increments (+ 2 restored) Archived: 29 increments (- 2)
Error Handling
Increment Not Found in Archive
โ Error: Increment 0031 not found in archive Archive location: .specweave/increments/_archive/ Available archived increments: โข 0001-core-framework โข 0002-plugin-system โข 0003-auth-service ... Use: sw:restore --list to see all
Target Location Already Exists
โ Error: Cannot restore 0031 - already exists in active folder Conflict: Archive: .specweave/increments/_archive/0031-external-tool-status-sync/ Active: .specweave/increments/0031-external-tool-status-sync/ Options: 1. Delete active version first (if it's a duplicate) 2. Resolve duplicates: sw:fix-duplicates 3. Archive active version: sw:archive 0031 4. Rename one version manually Recommended: sw:fix-duplicates (auto-resolves conflicts)
Permission Errors
โ Error: Permission denied Could not move: From: .specweave/increments/_archive/0031-external-tool-status-sync/ To: .specweave/increments/0031-external-tool-status-sync/ Check: โข File permissions โข Disk space โข Files not open in another program
Safety Checks
Before restoring, the system checks:
- โ **Increment exists in archive**: Source folder exists
- โ **Target location empty**: No conflict in main folder
- โ **Valid increment structure**: Has required files (metadata.json)
- โ **Disk space available**: Enough space for restored files
Related Commands
- `sw:archive <increment-id>` - Archive completed increments
- `sw:status` - View archive statistics
- `sw:fix-duplicates` - Auto-resolve duplicate increments
- `sw:do <increment-id>` - Resume work on restored increment
Implementation
import { Task } from '@claude/types';
const task = new Task('restore-increment', 'Restore increment from archive');
task.run(async () => {
const { IncrementArchiver } = await import('../../../dist/src/core/increment/increment-archiver.js');
const archiver = new IncrementArchiver(process.cwd());
// Parse arguments
const args = process.argv.slice(2);
// List mode
if (args.includes('--list')) {
const archived = await archiver.listArchived();
console.log('\n๐ฆ Archived Increments:\n');
if (archived.length === 0) {
console.log('No archived increments found.');
return;
}
console.log('.specweave/increments/_archive/');
archived.forEach(inc => {
console.log(`โโโ ${inc}`);
});
console.log(`\nTotal: ${archived.length} archived increments`);
console.log('\nTo restore: sw:restore <increment-id>');
return;
}
// Restore mode
const incrementIds = args.filter(arg => !arg.startsWith('--'));
if (incrementIds.length === 0) {
console.error('โ Error: No increment IDs provided');
console.log('\nUsage:');
console.log(' sw:restore <increment-id>');
console.log(' sw:restore --list');
return;
}
// Restore each increment
let restored = 0;
let errors = 0;
for (const id of incrementIds) {
try {
// Normalize ID to 4-digit format
const normalizedId = id.padStart(4, '0');
// Find archived increment
const archived = await archiver.listArchived();
const match = archived.find(inc => inc.startsWith(normalizedId));
if (!match) {
console.error(`โ Increment ${normalizedId} not found in archive`);
errors++;
continue;
}
// Restore increment
await archiver.restore(match);
console.log(`โ
Restored: ${match}`);
restored++;
} catch (error) {
console.error(`โ Failed to restore ${id}: ${error.message}`);
errors++;
}
}
// Show statistics
if (restored > 0 || errors > 0) {
console.log('\n๐ Restore Summary:');
if (restored > 0) {
console.log(` โ
Restored: ${restored} increment${restored > 1 ? 's' : ''}`);
}
if (errors > 0) {
console.log(` โ Errors: ${errors} incremeSpec-first AI development: describe a feature โ AI creates spec + plan + tasks, builds autonomously, syncs to GitHub/JIRA. Domain-expert skills for PM, Architect, Frontend, QA learn your patterns permanently. Claude Code, Codex, Cursor, Copilot & more.
Repo: anton-abyzov/specweave
Other commands on specweave.
- /abandon
Abandon an incomplete increment (requirements changed, obsolete)
Open command - /ado-cleanup-duplicates
Clean up duplicate Azure DevOps work items for a Feature. Finds work items with duplicate titles and closes all except the first created item.
Open command - /ado-clone
Clone Azure DevOps repositories to local workspace. Use after init if cloning was skipped, or to add repos later.
Open command - /ado-close
Close Azure DevOps work item when increment complete
Open command - /ado-create
Create Azure DevOps work item from SpecWeave increment
Open command - /ado-import-areas
Import Azure DevOps area paths from a project and map them to SpecWeave projects. Creates 2-level directory structure with area path-based organization.
Open command

