Update the cli-completion spec to match the actual implementation: - Change `completion zsh` to `completion generate [shell]` command structure - Update uninstall behavior to reflect confirmation prompt cancels entire operation - Change "not installed" uninstall exit code from 0 to 1 - Update shell detection error message to match implementation - Replace Purpose placeholder with actual description
12 KiB
cli-completion Specification
Purpose
Provide shell completion scripts for the OpenSpec CLI, enabling tab-completion for commands, flags, and dynamic values (change IDs, spec IDs) in supported shells. Currently supports Zsh with architecture designed for future shell expansion.
Requirements
Requirement: Native Shell Behavior Integration
The completion system SHALL respect and integrate with Zsh's native completion patterns and user interaction model.
Scenario: Zsh native completion
- WHEN generating Zsh completion scripts
- THEN use Zsh completion system with
_arguments,_describe, andcompadd - AND completions SHALL trigger on single TAB (standard Zsh behavior)
- AND display as an interactive menu that users navigate with TAB/arrow keys
- AND support Oh My Zsh's enhanced menu styling automatically
Scenario: No custom UX patterns
- WHEN implementing Zsh completion
- THEN do NOT attempt to customize completion trigger behavior
- AND do NOT override Zsh-specific navigation patterns
- AND ensure completions feel native to experienced Zsh users
Requirement: Command Structure
The completion command SHALL follow a subcommand pattern for generating and managing completion scripts.
Scenario: Available subcommands
- WHEN user executes
openspec completion --help - THEN display available subcommands:
generate [shell]- Generate completion script for a shell (outputs to stdout)install [shell]- Install completion for Zsh (auto-detects or requires explicit shell)uninstall [shell]- Remove completion for Zsh (auto-detects or requires explicit shell)
Requirement: Shell Detection
The completion system SHALL automatically detect the user's current shell environment.
Scenario: Detecting Zsh from environment
- WHEN no shell is explicitly specified
- THEN read the
$SHELLenvironment variable - AND extract the shell name from the path (e.g.,
/bin/zsh→zsh) - AND validate the shell is
zsh - AND throw an error if the shell is not
zsh, with message indicating only Zsh is currently supported
Scenario: Non-Zsh shell detection
- WHEN shell path indicates bash, fish, powershell, or other non-Zsh shell
- THEN throw error: "Shell '' is not supported yet. Currently supported: zsh"
Requirement: Completion Generation
The completion command SHALL generate Zsh completion scripts on demand.
Scenario: Generating Zsh completion
- WHEN user executes
openspec completion generate zsh - THEN output a complete Zsh completion script to stdout
- AND include completions for all commands: init, list, show, validate, archive, view, update, change, spec, completion
- AND include all command-specific flags and options
- AND use Zsh's
_argumentsand_describebuilt-in functions - AND support dynamic completion for change and spec IDs
Requirement: Dynamic Completions
The completion system SHALL provide context-aware dynamic completions for project-specific values.
Scenario: Completing change IDs
- WHEN completing arguments for commands that accept change names (show, validate, archive)
- THEN discover active changes from
openspec/changes/directory - AND exclude archived changes in
openspec/changes/archive/ - AND return change IDs as completion suggestions
- AND only provide suggestions when inside an OpenSpec-enabled project
Scenario: Completing spec IDs
- WHEN completing arguments for commands that accept spec names (show, validate)
- THEN discover specs from
openspec/specs/directory - AND return spec IDs as completion suggestions
- AND only provide suggestions when inside an OpenSpec-enabled project
Scenario: Completion caching
- WHEN dynamic completions are requested
- THEN cache discovered change and spec IDs for 2 seconds
- AND reuse cached values for subsequent requests within cache window
- AND automatically refresh cache after expiration
Scenario: Project detection
- WHEN user requests completions outside an OpenSpec project
- THEN skip dynamic change/spec ID completions
- AND only suggest static commands and flags
Requirement: Installation Automation
The completion command SHALL automatically install completion scripts into shell configuration files.
Scenario: Installing for Oh My Zsh
- WHEN user executes
openspec completion install zsh - THEN detect if Oh My Zsh is installed by checking for
$ZSHenvironment variable or~/.oh-my-zsh/directory - AND create custom completions directory at
~/.oh-my-zsh/custom/completions/if it doesn't exist - AND write completion script to
~/.oh-my-zsh/custom/completions/_openspec - AND ensure
~/.oh-my-zsh/custom/completionsis in$fpathby updating~/.zshrcif needed - AND display success message with instruction to run
exec zshor restart terminal
Scenario: Installing for standard Zsh
- WHEN user executes
openspec completion install zshand Oh My Zsh is not detected - THEN create completions directory at
~/.zsh/completions/if it doesn't exist - AND write completion script to
~/.zsh/completions/_openspec - AND add
fpath=(~/.zsh/completions $fpath)to~/.zshrcif not already present - AND add
autoload -Uz compinit && compinitto~/.zshrcif not already present - AND display success message with instruction to run
exec zshor restart terminal
Scenario: Auto-detecting Zsh for installation
- WHEN user executes
openspec completion installwithout specifying a shell - THEN detect current shell using shell detection logic
- AND install completion if detected shell is Zsh
- AND throw error if detected shell is not Zsh
- AND display which shell was detected
Scenario: Already installed
- WHEN completion is already installed for the target shell
- THEN display message indicating completion is already installed
- AND offer to reinstall/update by overwriting existing files
- AND exit with code 0
Requirement: Uninstallation
The completion command SHALL remove installed completion scripts and configuration.
Scenario: Uninstalling Oh My Zsh completion
- WHEN user executes
openspec completion uninstall zsh - THEN prompt for confirmation before proceeding (unless
--yesflag provided) - AND if user declines, cancel uninstall and display "Uninstall cancelled."
- AND if user confirms, remove
~/.oh-my-zsh/custom/completions/_openspecif Oh My Zsh is detected - AND remove
~/.zsh/completions/_openspecif standard Zsh setup is detected - AND remove fpath modifications from
~/.zshrc - AND display success message
Scenario: Auto-detecting Zsh for uninstallation
- WHEN user executes
openspec completion uninstallwithout specifying a shell - THEN detect current shell and uninstall completion if shell is Zsh
- AND throw error if detected shell is not Zsh
Scenario: Not installed
- WHEN attempting to uninstall completion that isn't installed
- THEN display error message indicating completion is not installed
- AND exit with code 1
Requirement: Architecture Patterns
The completion implementation SHALL follow clean architecture principles with TypeScript best practices.
Scenario: Shell-specific generators
- WHEN implementing completion generators
- THEN create
ZshCompletionGeneratorclass for Zsh - AND implement a common
CompletionGeneratorinterface with methods:generate(): string- Returns complete shell scriptgetInstallPath(): string- Returns target installation pathgetConfigFile(): string- Returns shell configuration file path
- AND design interface to be extensible for future shells (bash, fish, powershell)
Scenario: Dynamic completion providers
- WHEN implementing dynamic completions
- THEN create a
CompletionProviderclass that encapsulates project discovery logic - AND implement methods:
getChangeIds(): Promise<string[]>- Discovers active change IDsgetSpecIds(): Promise<string[]>- Discovers spec IDsisOpenSpecProject(): boolean- Checks if current directory is OpenSpec-enabled
- AND implement caching with 2-second TTL using class properties
Scenario: Command registry
- WHEN defining completable commands
- THEN create a centralized
CommandDefinitiontype with properties:name: string- Command namedescription: string- Help textflags: FlagDefinition[]- Available flagsacceptsChangeId: boolean- Whether command takes change ID argumentacceptsSpecId: boolean- Whether command takes spec ID argumentsubcommands?: CommandDefinition[]- Nested subcommands
- AND export a
COMMAND_REGISTRYconstant with all command definitions - AND generators consume this registry to ensure consistency
Scenario: Type-safe shell detection
- WHEN implementing shell detection
- THEN define a
SupportedShelltype as literal type:'zsh' - AND implement
detectShell()function that returns 'zsh' or throws error - AND design type to be extensible (e.g., future:
'bash' | 'zsh' | 'fish' | 'powershell')
Requirement: Error Handling
The completion command SHALL provide clear error messages for common failure scenarios.
Scenario: Unsupported shell
- WHEN user requests completion for unsupported shell (bash, fish, powershell, etc.)
- THEN display error message: "Shell '' is not supported yet. Currently supported: zsh"
- AND exit with code 1
Scenario: Permission errors during installation
- WHEN installation fails due to file permission issues
- THEN display clear error message indicating permission problem
- AND suggest using appropriate permissions or alternative installation method
- AND exit with code 1
Scenario: Missing shell configuration directory
- WHEN expected shell configuration directory doesn't exist
- THEN create the directory automatically (with user notification)
- AND proceed with installation
Scenario: Shell not detected
- WHEN
openspec completion installcannot detect current shell or detects non-Zsh shell - THEN display error: "Could not auto-detect shell. Please specify shell explicitly."
- AND display usage hint: "Usage: openspec completion [shell]"
- AND exit with code 1
Requirement: Output Format
The completion command SHALL provide machine-parseable and human-readable output.
Scenario: Script generation output
- WHEN generating completion script to stdout
- THEN output only the completion script content (no extra messages)
- AND allow redirection to files:
openspec completion generate zsh > /path/to/_openspec
Scenario: Installation success output
- WHEN installation completes successfully
- THEN display formatted success message with:
- Checkmark indicator
- Installation location
- Next steps (shell reload instructions)
- AND use colors when terminal supports it (unless
--no-coloris set)
Scenario: Verbose installation output
- WHEN user provides
--verboseflag during installation - THEN display detailed steps:
- Shell detection result
- Target file paths
- Configuration modifications
- File creation confirmations
Requirement: Testing Support
The completion implementation SHALL be testable with unit and integration tests.
Scenario: Mock shell environment
- WHEN writing tests for shell detection
- THEN allow overriding
$SHELLenvironment variable - AND use dependency injection for file system operations
Scenario: Generator output verification
- WHEN testing completion generators
- THEN verify generated scripts contain expected patterns
- AND test that command registry is properly consumed
- AND ensure dynamic completion placeholders are present
Scenario: Installation simulation
- WHEN testing installation logic
- THEN use temporary test directories instead of actual home directories
- AND verify file creation without modifying real shell configurations
- AND test path resolution logic independently