# CommandUpToDateCheck Properties

- Package: [Aspire.TypeSystem](/reference/api/csharp/aspire.typesystem.md)
- Type: [CommandUpToDateCheck](/reference/api/csharp/aspire.typesystem/commanduptodatecheck.md)
- Kind: `Properties`
- Members: `4`

Declares the inputs, outputs, and stamp file that let the CLI skip a command whose work is already done.

<a id="fileextensions"></a>

## FileExtensions

- Name: `FileExtensions`
- Modifiers: `nullable` `get; init`
- Returns: `string[]?`
- Source: [GitHub](https://github.com/microsoft/aspire/blob/f4c27f2d43ddc1cacd0dd083b30d1fea1cee7a62/src/Aspire.TypeSystem/RuntimeSpec.cs)

Gets the file extensions, including the leading dot, that identify input files. Null or empty means every file found under [CommandUpToDateCheck.Inputs](/reference/api/csharp/aspire.typesystem/commanduptodatecheck/properties.md#inputs) counts.

```csharp
public string[]? FileExtensions { get; init; }
```

## Remarks

Restricting by extension is what keeps a command's own outputs from invalidating it when they land beside its inputs -- `.class` files written next to the `.java` files they were compiled from, for example.

<a id="inputs"></a>

## Inputs

- Name: `Inputs`
- Modifiers: `get; init`
- Returns: `string[]`
- Source: [GitHub](https://github.com/microsoft/aspire/blob/f4c27f2d43ddc1cacd0dd083b30d1fea1cee7a62/src/Aspire.TypeSystem/RuntimeSpec.cs)

Gets the inputs to compare against the stamp file, relative to the working directory unless absolute. Supports the same placeholders as [CommandSpec.Args](/reference/api/csharp/aspire.typesystem/commandspec/properties.md#args).

```csharp
public string[] Inputs { get; init; }
```

## Remarks

An entry is either a file, a directory, or a directory suffixed with `/**`. A plain directory is scanned one level deep; only the `/**` form recurses. That distinction is what keeps the check cheap: the AppHost directory can be declared as an input for the sources that sit beside the AppHost without walking sibling trees such as `node_modules`. Entries that do not exist are ignored, so a spec can name a path that only some layouts have.

<a id="outputs"></a>

## Outputs

- Name: `Outputs`
- Modifiers: `nullable` `get; init`
- Returns: `string[]?`
- Source: [GitHub](https://github.com/microsoft/aspire/blob/f4c27f2d43ddc1cacd0dd083b30d1fea1cee7a62/src/Aspire.TypeSystem/RuntimeSpec.cs)

Gets the outputs that must exist for the command to be considered up to date, relative to the working directory unless absolute. Supports the same placeholders as [CommandSpec.Args](/reference/api/csharp/aspire.typesystem/commandspec/properties.md#args). Null or empty preserves the stamp-and-input-only behavior of older runtime specifications.

```csharp
public string[]? Outputs { get; init; }
```

<a id="stampfile"></a>

## StampFile

- Name: `StampFile`
- Modifiers: `get; init`
- Returns: `string`
- Source: [GitHub](https://github.com/microsoft/aspire/blob/f4c27f2d43ddc1cacd0dd083b30d1fea1cee7a62/src/Aspire.TypeSystem/RuntimeSpec.cs)

Gets the file, relative to the working directory unless absolute, written after the command succeeds and compared against the inputs on the next launch.

```csharp
public string StampFile { get; init; }
```

## Remarks

Place this with the command's outputs so that deleting them -- `mvn clean`, or removing the class output directory -- also invalidates the check.
