SkillsCommand

Class
extends AbstractCommand
Final: Yes

Synchronizes packaged Fast Forward skills into the consumer repository.

Description

This command SHALL ensure that the consumer repository contains the expected .agents/skills directory structure backed by the packaged skill set. The command MUST verify that the packaged skills directory exists before any synchronization is attempted. If the target skills directory does not exist, it SHALL be created before the synchronization process begins.

The synchronization workflow is delegated to SkillsSynchronizer. This command MUST act as an orchestration layer only: it prepares the source and target paths, triggers synchronization, and translates the resulting status into Symfony Console output and process exit codes.

Attributes
#[AsCommand]
$name : 'skills'
$description : 'Synchronizes Fast Forward skills into .agents/skills directory.'
$help : 'This command ensures the consumer repository contains linked Fast Forward skills by creating symlinks to the packaged skills and removing broken links.'

Table of Contents

Properties

Methods

__construct()

Initializes the command with an optional skills synchronizer instance.

 : mixed
execute()

Executes the skills synchronization workflow.

 : int
getAbsolutePath()

Computes the absolute path for a given relative or absolute path.

 : string
getConfigFile()

Determines the correct absolute path to a configuration file.

 : string
getCurrentWorkingDirectory()

Retrieves the current working directory of the application.

 : string
getDevToolsFile()

Resolves the absolute path to a file within the fast-forward/dev-tools package.

 : string
runCommand()

Configures and executes a registered console command by name.

 : int
runProcess()

Executes a given system process gracefully and outputs its buffer.

 : int
Properties

$filesystem

Protected Read-only
protected Filesystem $filesystem
Methods

__construct()

Public

Initializes the command with an optional skills synchronizer instance.

public __construct(SkillsSynchronizer  $synchronizer, Filesystem  $filesystem) : mixed
Parameters
$synchronizer : SkillsSynchronizer

Description

the synchronizer responsible for applying the skills synchronization process

$filesystem : Filesystem

Description

filesystem used to resolve and manage the skills directory structure

execute()

Protected

Executes the skills synchronization workflow.

protected execute(InputInterface  $input, OutputInterface  $output) : int

Description

This method SHALL:

  • announce the start of synchronization;
  • resolve the packaged skills path and consumer target directory;
  • fail when the packaged skills directory does not exist;
  • create the target directory when it is missing;
  • delegate synchronization to SkillsSynchronizer;
  • return a success or failure exit code based on the synchronization result.

The command MUST return self::FAILURE when packaged skills are not available or when the synchronizer reports a failure. It MUST return self::SUCCESS only when synchronization completes successfully.

Parameters
$input : InputInterface

Description

the console input instance provided by Symfony

$output : OutputInterface

Description

the console output instance used to report progress

Return values
int

Description

The process exit status. This MUST be self::SUCCESS on success and self::FAILURE on failure.

getAbsolutePath()

Protected

Computes the absolute path for a given relative or absolute path.

protected getAbsolutePath( string  $relativePath) : string

Description

This method MUST return the exact path if it is already absolute. If relative, it SHALL make it absolute relying on the current working directory.

Parameters
$relativePath : string

Description

the path to evaluate or resolve

Return values
string

Description

the resolved absolute path

getConfigFile()

Protected

Determines the correct absolute path to a configuration file.

protected getConfigFile( string  $filename[, bool  $force = false]) : string

Description

The method MUST attempt to resolve the configuration file locally in the working directory. If absent and not forced, it SHALL provide the default equivalent from the package itself.

Parameters
$filename : string

Description

the name of the configuration file

$force : bool = false

Description

determines whether to bypass fallback and forcefully return the local file path

Return values
string

Description

the resolved absolute path to the configuration file

getCurrentWorkingDirectory()

Protected

Retrieves the current working directory of the application.

protected getCurrentWorkingDirectory() : string

Description

The method MUST return the initial working directory defined by the application. If not available, it SHALL fall back to the safe current working directory.

Return values
string

Description

the absolute path to the current working directory

getDevToolsFile()

Protected

Resolves the absolute path to a file within the fast-forward/dev-tools package.

protected getDevToolsFile( string  $filename) : string

Description

This method uses Composer's InstalledVersions to determine the installation path of the fast-forward/dev-tools package and returns the absolute path to the given filename within it. It is used as a fallback when a configuration file is not found in the project root.

Parameters
$filename : string

Description

the name of the file to resolve within the dev-tools package

Return values
string

Description

the absolute path to the file inside the dev-tools package

runCommand()

Protected

Configures and executes a registered console command by name.

protected runCommand( string  $command, OutputInterface  $output) : int

Description

The method MUST run the specified command with the provided input and output interfaces.

Parameters
$command : string

Description

the commandline name of the command to execute

$output : OutputInterface

Description

the interface for buffering output

Return values
int

Description

the status code resulting from the dispatched command

runProcess()

Protected

Executes a given system process gracefully and outputs its buffer.

protected runProcess(Process  $command, OutputInterface  $output[, bool  $tty = true]) : int

Description

The method MUST execute the provided command ensuring the output is channeled to the OutputInterface. It SHOULD leverage TTY if supported. If the process fails, it MUST return self::FAILURE; otherwise, it SHALL return self::SUCCESS.

Parameters
$command : Process

Description

the configured process instance to run

$output : OutputInterface

Description

the output interface to log warnings or results

$tty : bool = true
Return values
int

Description

the status code of the command execution