Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ We've expanded the documentation for custom agents in Copilot CLI, adding inform

<hr>

**31 March 2026**

The documentation for Copilot CLI now includes a new reference article about the `~/.copilot` directory, and information on how a Copilot skill can run a script:

* [GitHub Copilot CLI configuration directory](https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-config-dir-reference)
* [Creating agent skills for GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/create-skills#enabling-a-skill-to-run-a-script)

<hr>

**27 March 2026**

We've introduced a new discovery landing page design for all the top-level doc sets on docs.github.com. The landing pages highlight recommended articles and give users the ability to filter articles by category with a drop down menu. Every article across the site now includes category metadata, making it easier to browse doc sets without relying solely on search. This replaces the previous product-landing layout across 35 doc sets.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ You can customize the default funnel order on the "Alert prioritization" graph t

### 2. Focus on critical and high severity alerts

Start by identifying alerts with the highest severity by using the the `severity-critical` or `severity-high` filters. These vulnerabilities pose the greatest risk and are often prioritized by compliance standards. You can then
Start by identifying alerts with the highest severity by using the `severity-critical` or `severity-high` filters. These vulnerabilities pose the greatest risk and are often prioritized by compliance standards.

### 3. Assess exploitability and reachability

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,15 @@ Titles can be challenging. Use these general guidelines to help create clear, he

## Intro

The top of every page has an intro that provides context and sets expectations, allowing readers to quickly decide if the page is relevant to them. Intros also are displayed in search results to provide contextual information to help readers choose a result.
Every page and article has an intro which describes what they’re about. The text we use for intros is also displayed within search results, making them important for SEO.

### How to write an intro

* Article intros are one to two sentences long.
* Map topic and category intros are one sentence long.
* API reference intros are one sentence long.
* The intro for an API page should define the feature so that someone knows whether the feature meets their needs without reading the entire article.
* Intros contain a high-level summary of the page’s content, developing the idea presented in a title with more detail.
* Use approachable synonyms of words in the page’s title to help readers understand the article’s purpose differently. Avoid repeating words from the title when possible.
* Intros are relatively evergreen and high-level, so they can scale with future changes to the content on the page without needing to be frequently updated.
* For searchability, include keywords on the page's subject in the intro.
* When a term in the intro has an acronym we’ll use elsewhere in the article, indicate the acronym.
* Intros generally don't contain permissions for any tasks contained within the article.
* Intros should be concise, ideally one sentence long.
* Intros help people know if they’re in the right place for what they need. Let the user know what value is being provided to them, using words they would use and search for.
* Intros are also an invitation to continue reading. A good intro reassures the reader that their time is being well spent.
* If an important term has a related acronym that is generally used in its place, include the acronym in the intro. (Example: Search engine optimization and SEO.)
* Finally, review your intro to ensure it is search engine friendly by including relevant keywords and phrases.

## Permissions statements

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,323 @@ Prompt hooks auto-submit text as if the user typed it. They are only supported o
| `errorOccurred` | An error occurs during execution. | No |
| `notification` | Fires asynchronously when the CLI emits a system notification (shell completion, agent completion or idle, permission prompts, elicitation dialogs). Fire-and-forget: never blocks the session. Supports `matcher` regex on `notification_type`. | Optional — can inject `additionalContext` into the session. |

### Hook event input payloads

Each hook event delivers a JSON payload to the hook handler. Two payload formats are supported, selected by the event name used in the hook configuration:

* **camelCase format** — Configure the event name in camelCase (for example, `sessionStart`). Fields use camelCase.
* **{% data variables.product.prodname_vscode_shortname %} compatible format** — Configure the event name in PascalCase (for example, `SessionStart`). Fields use snake_case to match the {% data variables.product.prodname_vscode_shortname %} {% data variables.product.prodname_copilot_short %} extension format.

#### `sessionStart` / `SessionStart`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number; // Unix timestamp in milliseconds
cwd: string;
source: "startup" | "resume" | "new";
initialPrompt?: string;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "SessionStart";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
source: "startup" | "resume" | "new";
initial_prompt?: string;
}
```

#### `sessionEnd` / `SessionEnd`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "SessionEnd";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}
```

#### `userPromptSubmitted` / `UserPromptSubmit`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
prompt: string;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "UserPromptSubmit";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
prompt: string;
}
```

#### `preToolUse` / `PreToolUse`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
toolName: string;
toolArgs: unknown;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

When configured with the PascalCase event name `PreToolUse`, the payload uses snake_case field names to match the {% data variables.product.prodname_vscode_shortname %} {% data variables.product.prodname_copilot_short %} extension format:

```typescript
{
hook_event_name: "PreToolUse";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
tool_name: string;
tool_input: unknown; // Tool arguments (parsed from JSON string when possible)
}
```

#### `postToolUse` / `PostToolUse`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
toolName: string;
toolArgs: unknown;
toolResult: {
resultType: "success";
textResultForLlm: string;
}
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "PostToolUse";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
tool_name: string;
tool_input: unknown;
tool_result: {
result_type: "success" | "failure" | "denied" | "error";
text_result_for_llm: string;
}
}
```

#### `postToolUseFailure` / `PostToolUseFailure`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
toolName: string;
toolArgs: unknown;
error: string;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "PostToolUseFailure";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
tool_name: string;
tool_input: unknown;
error: string;
}
```

#### `agentStop` / `Stop`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
transcriptPath: string;
stopReason: "end_turn";
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "Stop";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
transcript_path: string;
stop_reason: "end_turn";
}
```

#### `subagentStart`

**Input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
transcriptPath: string;
agentName: string;
agentDisplayName?: string;
agentDescription?: string;
}
```

#### `subagentStop` / `SubagentStop`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
transcriptPath: string;
agentName: string;
agentDisplayName?: string;
stopReason: "end_turn";
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "SubagentStop";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
transcript_path: string;
agent_name: string;
agent_display_name?: string;
stop_reason: "end_turn";
}
```

#### `errorOccurred` / `ErrorOccurred`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
error: {
message: string;
name: string;
stack?: string;
};
errorContext: "model_call" | "tool_execution" | "system" | "user_input";
recoverable: boolean;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "ErrorOccurred";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
error: {
message: string;
name: string;
stack?: string;
};
error_context: "model_call" | "tool_execution" | "system" | "user_input";
recoverable: boolean;
}
```

#### `preCompact` / `PreCompact`

**camelCase input:**

```typescript
{
sessionId: string;
timestamp: number;
cwd: string;
transcriptPath: string;
trigger: "manual" | "auto";
customInstructions: string;
}
```

**{% data variables.product.prodname_vscode_shortname %} compatible input:**

```typescript
{
hook_event_name: "PreCompact";
session_id: string;
timestamp: string; // ISO 8601 timestamp
cwd: string;
transcript_path: string;
trigger: "manual" | "auto";
custom_instructions: string;
}
```

### `preToolUse` decision control

The `preToolUse` hook can control tool execution by writing a JSON object to stdout.
Expand Down Expand Up @@ -628,7 +945,7 @@ Custom agents are specialized AI agents defined in Markdown files. The filename
| Agent | Default model | Description |
|-------|--------------|-------------|
| `code-review` | claude-sonnet-4.5 | High signal-to-noise code review. Analyzes diffs for bugs, security issues, and logic errors. |
| `critic` | complementary model | Adversarial feedback on proposals, designs, and implementations. Identifies weak points and suggests improvements. Experimental—requires `--experimental`. |
| `critic` | complementary model | Rubber-duck adversarial feedback on proposals, designs, and implementations. Identifies weak points and suggests improvements. Available for Claude models. Experimental—requires `--experimental`. |
| `explore` | claude-haiku-4.5 | Fast codebase exploration. Searches files, reads code, and answers questions. Returns focused answers under 300 words. Safe to run in parallel. |
| `general-purpose` | claude-sonnet-4.5 | Full-capability agent for complex multi-step tasks. Runs in a separate context window. |
| `research` | claude-sonnet-4.6 | Deep research agent. Generates a report based on information in your codebase, in relevant repositories, and on the web. |
Expand Down Expand Up @@ -847,7 +1164,7 @@ Feature flags enable functionality that is not yet generally available. Enable f

| Flag | Tier | Description |
|------|------|-------------|
| `CRITIC_AGENT` | experimental | Critic subagent for adversarial feedback on code and designs (Claude and GPT models) |
| `RUBBER_DUCK_AGENT` | experimental | Rubber-duck subagent for adversarial feedback on code and designs (available for Claude models) |
| `BACKGROUND_SESSIONS` | experimental | Multiple concurrent sessions with background management |
| `MULTI_TURN_AGENTS` | experimental | Multi-turn subagent message passing via `write_agent` |
| `EXTENSIONS` | experimental | Programmatic extensions with custom tools and hooks |
Expand Down
2 changes: 1 addition & 1 deletion src/content-pipelines/state/copilot-cli.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
e566c239b96a15dd2d7e2e32b67668227e21f417
ed524424679cf44e46cf94e5beb5b8aa9974b554
Loading
Loading