mirror of
https://github.com/Fission-AI/OpenSpec.git
synced 2026-09-14 20:16:53 +08:00
210 lines
7.2 KiB
Markdown
210 lines
7.2 KiB
Markdown
# CLI Archive Command Specification
|
|
|
|
## Purpose
|
|
The archive command moves completed changes from the active changes directory to the archive folder with date-based naming, following OpenSpec conventions.
|
|
|
|
## Command Syntax
|
|
```bash
|
|
openspec archive [change-name] [--yes|-y]
|
|
```
|
|
|
|
Options:
|
|
- `--yes`, `-y`: Skip confirmation prompts (for automation)
|
|
## Requirements
|
|
### Requirement: Change Selection
|
|
|
|
The command SHALL support both interactive and direct change selection methods.
|
|
|
|
#### Scenario: Interactive selection
|
|
|
|
- **WHEN** no change-name is provided
|
|
- **THEN** display interactive list of available changes (excluding archive/)
|
|
- **AND** allow user to select one
|
|
|
|
#### Scenario: Direct selection
|
|
|
|
- **WHEN** change-name is provided
|
|
- **THEN** use that change directly
|
|
- **AND** validate it exists
|
|
|
|
### Requirement: Task Completion Check
|
|
|
|
The command SHALL verify task completion status before archiving to prevent premature archival.
|
|
|
|
#### Scenario: Incomplete tasks found
|
|
|
|
- **WHEN** incomplete tasks are found (marked with `- [ ]`)
|
|
- **THEN** display all incomplete tasks to the user
|
|
- **AND** prompt for confirmation to continue
|
|
- **AND** default to "No" for safety
|
|
|
|
#### Scenario: All tasks complete
|
|
|
|
- **WHEN** all tasks are complete OR no tasks.md exists
|
|
- **THEN** proceed with archiving without prompting
|
|
|
|
### Requirement: Archive Process
|
|
|
|
The archive operation SHALL follow a structured process to safely move changes to the archive.
|
|
|
|
#### Scenario: Performing archive
|
|
|
|
- **WHEN** archiving a change
|
|
- **THEN** execute these steps:
|
|
1. Create archive/ directory if it doesn't exist
|
|
2. Generate target name as `YYYY-MM-DD-[change-name]` using current date
|
|
3. Check if target directory already exists
|
|
4. Update main specs from the change's future state specs (see Spec Update Process below)
|
|
5. Move the entire change directory to the archive location
|
|
|
|
#### Scenario: Archive already exists
|
|
|
|
- **WHEN** target archive already exists
|
|
- **THEN** fail with error message
|
|
- **AND** do not overwrite existing archive
|
|
|
|
#### Scenario: Successful archive
|
|
|
|
- **WHEN** move succeeds
|
|
- **THEN** display success message with archived name and list of updated specs
|
|
|
|
### Requirement: Spec Update Process
|
|
|
|
Before moving the change to archive, the command SHALL apply delta changes to main specs to reflect the deployed reality.
|
|
|
|
#### Scenario: Applying delta changes
|
|
|
|
- **WHEN** archiving a change with delta-based specs
|
|
- **THEN** parse and apply delta changes as defined in openspec-conventions
|
|
- **AND** validate all operations before applying
|
|
|
|
#### Scenario: Validating delta changes
|
|
|
|
- **WHEN** processing delta changes
|
|
- **THEN** perform validations as specified in openspec-conventions
|
|
- **AND** if validation fails, show specific errors and abort
|
|
|
|
#### Scenario: Conflict detection
|
|
|
|
- **WHEN** applying deltas would create duplicate requirement headers
|
|
- **THEN** abort with error message showing the conflict
|
|
- **AND** suggest manual resolution
|
|
|
|
### Requirement: Confirmation Behavior
|
|
|
|
The spec update confirmation SHALL provide clear visibility into changes before they are applied.
|
|
|
|
#### Scenario: Displaying confirmation
|
|
|
|
- **WHEN** prompting for confirmation
|
|
- **THEN** display a clear summary showing:
|
|
- Which specs will be created (new capabilities)
|
|
- Which specs will be updated (existing capabilities)
|
|
- The source path for each spec
|
|
- **AND** format the confirmation prompt as:
|
|
```
|
|
The following specs will be updated:
|
|
|
|
NEW specs to be created:
|
|
- cli-archive (from changes/add-archive-command/specs/cli-archive/spec.md)
|
|
|
|
EXISTING specs to be updated:
|
|
- cli-init (from changes/update-init-command/specs/cli-init/spec.md)
|
|
|
|
Update 2 specs and archive 'add-archive-command'? [y/N]:
|
|
```
|
|
#### Scenario: Handling confirmation response
|
|
|
|
- **WHEN** waiting for user confirmation
|
|
- **THEN** default to "No" for safety (require explicit "y" or "yes")
|
|
- **AND** skip confirmation when `--yes` or `-y` flag is provided
|
|
|
|
#### Scenario: User declines confirmation
|
|
|
|
- **WHEN** user declines the confirmation
|
|
- **THEN** abort the entire archive operation
|
|
- **AND** display message: "Archive cancelled. No changes were made."
|
|
- **AND** exit with non-zero status code
|
|
|
|
### Requirement: Error Conditions
|
|
|
|
The command SHALL handle various error conditions gracefully.
|
|
|
|
#### Scenario: Handling errors
|
|
|
|
- **WHEN** errors occur
|
|
- **THEN** handle the following conditions:
|
|
- Missing openspec/changes/ directory
|
|
- Change not found
|
|
- Archive target already exists
|
|
- File system permissions issues
|
|
|
|
### Requirement: Skip Specs Option
|
|
|
|
The archive command SHALL support a `--skip-specs` flag that skips all spec update operations and proceeds directly to archiving.
|
|
|
|
#### Scenario: Skipping spec updates with flag
|
|
|
|
- **WHEN** executing `openspec archive <change> --skip-specs`
|
|
- **THEN** skip spec discovery and update confirmation
|
|
- **AND** proceed directly to moving the change to archive
|
|
- **AND** display a message indicating specs were skipped
|
|
|
|
### Requirement: Non-blocking confirmation
|
|
|
|
The archive operation SHALL proceed when the user declines spec updates instead of cancelling the entire operation.
|
|
|
|
#### Scenario: User declines spec update confirmation
|
|
|
|
- **WHEN** the user declines spec update confirmation
|
|
- **THEN** skip spec updates
|
|
- **AND** continue with the archive operation
|
|
- **AND** display a success message indicating specs were not updated
|
|
|
|
### Requirement: Display Output
|
|
|
|
The command SHALL provide clear feedback about delta operations.
|
|
|
|
#### Scenario: Showing delta application
|
|
|
|
- **WHEN** applying delta changes
|
|
- **THEN** display for each spec:
|
|
- Number of requirements added
|
|
- Number of requirements modified
|
|
- Number of requirements removed
|
|
- Number of requirements renamed
|
|
- **AND** use standard output symbols (+ ~ - →) as defined in openspec-conventions:
|
|
```
|
|
Applying changes to specs/user-auth/spec.md:
|
|
+ 2 added
|
|
~ 3 modified
|
|
- 1 removed
|
|
→ 1 renamed
|
|
```
|
|
|
|
### Requirement: Archive Validation
|
|
|
|
The archive command SHALL validate changes before applying them to ensure data integrity.
|
|
|
|
#### Scenario: Pre-archive validation
|
|
|
|
- **WHEN** executing `openspec archive change-name`
|
|
- **THEN** validate the change structure first
|
|
- **AND** only proceed if validation passes
|
|
- **AND** show validation errors if it fails
|
|
|
|
#### Scenario: Force archive without validation
|
|
|
|
- **WHEN** executing `openspec archive change-name --no-validate`
|
|
- **THEN** skip validation (unsafe mode)
|
|
- **AND** show warning about skipping validation
|
|
|
|
## Why These Decisions
|
|
|
|
**Interactive selection**: Reduces typing and helps users see available changes
|
|
**Task checking**: Prevents accidental archiving of incomplete work
|
|
**Date prefixing**: Maintains chronological order and prevents naming conflicts
|
|
**No overwrite**: Preserves historical archives and prevents data loss
|
|
**Spec updates before archiving**: Specs in the main directory represent current reality; when a change is deployed and archived, its future state specs become the new reality and must replace the main specs
|
|
**Confirmation for spec updates**: Provides visibility into what will change, prevents accidental overwrites, and ensures users understand the impact before specs are modified
|
|
**--yes flag for automation**: Allows CI/CD pipelines to archive without interactive prompts while maintaining safety by default for manual use |