Skip to content

Commit 7fe4403

Browse files
theletterfclaudecursoragent
authored
Add Triage and Size checkboxes to the AI menu (#7112)
## Summary Re-adds a **Triage** checkbox and adds a new **Size** checkbox to the issue AI menu, each wired to the reusable workflows in `docs-actions`. Auto-triage on open stays in place; the menu checkboxes are the on-demand path. - `docs_ai_menu.cjs`: add `triage` and `size` entries (and to `WORKFLOW_ORDER`). The `triage` label matches the original string exactly, so the Triage checkboxes on already-posted menu comments become functional again. - `docs-ai-menu.yml`: restore the `triage_triggered` output, `run-docs-triage` job (with the team mapping), and triage refresh job; add the equivalent `size_triggered` output, `run-docs-size` job, and size refresh job. ## Test plan - [ ] Tick **Triage** on an issue -> `run-docs-triage` runs and the menu status updates. - [ ] Tick **Size** -> `run-docs-size` runs and the menu status updates. - [ ] Tick **Scope the docs work** -> still works. - [ ] Tick an old Triage checkbox on a pre-existing issue -> now triggers triage. Co-authored-by: Claude <noreply@anthropic.com> Made with [Cursor](https://cursor.com) Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent bcbb7e3 commit 7fe4403

2 files changed

Lines changed: 171 additions & 2 deletions

File tree

.github/scripts/docs_ai_menu.cjs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,21 @@ const MENU_START = '<!-- docs-ai-menu:start -->';
22
const MENU_END = '<!-- docs-ai-menu:end -->';
33

44
const WORKFLOW_CONFIG = {
5+
triage: {
6+
label: 'Triage ([`docs-triage`](https://github.com/elastic/docs-actions/blob/main/.github/workflows/gh-aw-issue-triage.md)).',
7+
marker: '<!-- docs-ai-menu:triage -->',
8+
},
9+
size: {
10+
label: 'Size the work ([`docs-size`](https://github.com/elastic/docs-actions/blob/main/.github/workflows/gh-aw-issue-size.md)).',
11+
marker: '<!-- docs-ai-menu:size -->',
12+
},
513
issueScope: {
614
label: 'Scope the docs work ([`docs-issue-scope`](https://github.com/elastic/docs-actions/blob/main/.github/workflows/gh-aw-docs-issue-scope.md)).',
715
marker: '<!-- docs-ai-menu:issue-scope -->',
816
},
917
};
1018

11-
const WORKFLOW_ORDER = ['issueScope'];
19+
const WORKFLOW_ORDER = ['triage', 'size', 'issueScope'];
1220

1321
function escapeRegExp(value) {
1422
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

.github/workflows/docs-ai-menu.yml

Lines changed: 162 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ jobs:
6666
permissions:
6767
contents: read
6868
outputs:
69+
triage_triggered: ${{ steps.evaluate.outputs.triage_triggered }}
70+
size_triggered: ${{ steps.evaluate.outputs.size_triggered }}
6971
issue_scope_triggered: ${{ steps.evaluate.outputs.issue_scope_triggered }}
7072

7173
steps:
@@ -86,14 +88,21 @@ jobs:
8688
8789
const previousState = menu.parseMenuState(previousBody);
8890
const currentState = menu.parseMenuState(body);
91+
const triageTriggered = !previousState.triage.selected && currentState.triage.selected;
92+
const sizeTriggered = !previousState.size.selected && currentState.size.selected;
8993
const issueScopeTriggered = !previousState.issueScope.selected && currentState.issueScope.selected;
9094
95+
core.setOutput('triage_triggered', String(triageTriggered));
96+
core.setOutput('size_triggered', String(sizeTriggered));
9197
core.setOutput('issue_scope_triggered', String(issueScopeTriggered));
9298
9399
refresh-menu-after-trigger:
94100
name: Refresh AI menu after trigger
95101
needs: [evaluate-trigger]
96-
if: needs.evaluate-trigger.outputs.issue_scope_triggered == 'true'
102+
if: >-
103+
needs.evaluate-trigger.outputs.triage_triggered == 'true' ||
104+
needs.evaluate-trigger.outputs.size_triggered == 'true' ||
105+
needs.evaluate-trigger.outputs.issue_scope_triggered == 'true'
97106
runs-on: ubuntu-latest
98107
permissions:
99108
contents: read
@@ -118,6 +127,20 @@ jobs:
118127
const progressUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
119128
const statusOverrides = {};
120129
130+
if ('${{ needs.evaluate-trigger.outputs.triage_triggered }}' === 'true') {
131+
statusOverrides.triage = {
132+
detailsUrl: progressUrl,
133+
status: 'in_progress',
134+
};
135+
}
136+
137+
if ('${{ needs.evaluate-trigger.outputs.size_triggered }}' === 'true') {
138+
statusOverrides.size = {
139+
detailsUrl: progressUrl,
140+
status: 'in_progress',
141+
};
142+
}
143+
121144
if ('${{ needs.evaluate-trigger.outputs.issue_scope_triggered }}' === 'true') {
122145
statusOverrides.issueScope = {
123146
detailsUrl: progressUrl,
@@ -134,6 +157,50 @@ jobs:
134157
statusOverrides,
135158
});
136159
160+
run-docs-triage:
161+
name: Docs AI / triage
162+
needs: [evaluate-trigger]
163+
if: needs.evaluate-trigger.outputs.triage_triggered == 'true'
164+
permissions:
165+
actions: read
166+
contents: read
167+
copilot-requests: write
168+
discussions: write
169+
issues: write
170+
pull-requests: write
171+
uses: elastic/docs-actions/.github/workflows/gh-aw-issue-triage.lock.yml@v1
172+
with:
173+
additional-instructions: |
174+
## Team Ownership Mapping
175+
176+
This mapping is derived from the repository's CODEOWNERS file. Use it to determine which team owns each issue. Match based on the issue title, body, any mentioned URLs, and labels.
177+
178+
| Team Label | Owns | Keywords / URL paths |
179+
|---|---|---|
180+
| `Team:Admin` | Elasticsearch admin, cluster mgmt, cloud, deployment docs | Cluster management, index management, auth, roles, API keys, network security, cluster security, snapshots, ILM, data lifecycle, CCR, CCS, licensing, subscriptions, upgrade, monitoring, Elastic Cloud, ECE, ECK, serverless. Paths: `deploy-manage/`, `cloud-account/`, `manage-data/` (except `manage-data/ingest/`), `serverless/`, `troubleshoot/deployments/`, `troubleshoot/elasticsearch/` |
181+
| `Team:Experience` | Kibana, observability solution, security solution | Kibana, dashboards, visualizations, Discover, observability, security, APM UI, maps, canvas, Lens, alerting, rules, cases, SIEM, endpoint security, detection rules, security analytics. Paths: `explore-analyze/` (default), `solutions/observability/`, `solutions/security/`, `reference/kibana/`, `reference/observability/`, `reference/security/` |
182+
| `Team:Developer` | Elasticsearch developer, search solution docs | Elasticsearch APIs, ES|QL, query DSL, search features, relevance, vector search, semantic search, inference APIs, connectors, developer tools, clients, search applications, App Search, Workplace Search. Paths: `solutions/search/`, `reference/elasticsearch/clients/`, `reference/search/`, `reference/machine-learning/`, `explore-analyze/ai-features/`, `explore-analyze/cross-cluster-search/`, `explore-analyze/cross-project-search/`, `explore-analyze/transforms/` |
183+
| `Team:Ingest` | Data ingestion, Fleet, APM agents docs | Fleet, Elastic Agent, Beats, Logstash, pipelines, integrations, data streams, APM agents, APM server, OpenTelemetry. Paths: `manage-data/ingest/`, `reference/apm-agents/`, `reference/fleet/`, `reference/ingestion-tools/`, `solutions/observability/apm/apm-agents/`, `solutions/observability/apm/apm-server/`, `solutions/observability/apm/ingest/`, `solutions/observability/apm/opentelemetry/` |
184+
| `Team:DocsEng` | Docs infrastructure | Docs build system, CI/CD, website rendering, broken navigation, docs-builder bugs, elastic.co website issues not related to content. Paths: `.github/workflows/`, `.github/scripts/` |
185+
| `Team:Projects` | Internal projects, docs initiatives | Internal documentation projects, content strategy, information architecture, get-started guides. Paths: `get-started/` |
186+
187+
**Shared ownership**: Some paths have shared ownership (e.g., `/explore-analyze/machine-learning/` is shared by Developer and Experience). Pick the team whose keywords best match the issue content.
188+
**Internal projects**: If the issue seems related to an internal documentation project, initiative, or content strategy effort, apply `Team:Projects`.
189+
**Fallback**: If you genuinely cannot determine the owning team, apply `cross-team` so the issue stays visible to all teams.
190+
191+
run-docs-size:
192+
name: Docs AI / size
193+
needs: [evaluate-trigger]
194+
if: needs.evaluate-trigger.outputs.size_triggered == 'true'
195+
permissions:
196+
actions: read
197+
contents: read
198+
copilot-requests: write
199+
discussions: write
200+
issues: write
201+
pull-requests: write
202+
uses: elastic/docs-actions/.github/workflows/gh-aw-issue-size.lock.yml@v1
203+
137204
run-docs-issue-scope:
138205
name: Docs AI / issue scope
139206
needs: [evaluate-trigger]
@@ -147,6 +214,100 @@ jobs:
147214
pull-requests: write
148215
uses: elastic/docs-actions/.github/workflows/gh-aw-docs-issue-scope.lock.yml@v1
149216

217+
refresh-menu-after-docs-triage:
218+
name: Refresh AI menu after docs triage
219+
needs: [evaluate-trigger, refresh-menu-after-trigger, run-docs-triage]
220+
if: always() && needs.evaluate-trigger.outputs.triage_triggered == 'true'
221+
runs-on: ubuntu-latest
222+
permissions:
223+
contents: read
224+
issues: write
225+
concurrency:
226+
group: docs-ai-menu-${{ github.event.issue.number }}
227+
cancel-in-progress: false
228+
229+
steps:
230+
- name: Checkout repository
231+
uses: actions/checkout@v6.0.2
232+
with:
233+
persist-credentials: false
234+
235+
- name: Refresh AI menu status
236+
uses: actions/github-script@v9.0.0
237+
with:
238+
github-token: ${{ secrets.GITHUB_TOKEN }}
239+
script: |
240+
const menu = require(`${process.env.GITHUB_WORKSPACE}/.github/scripts/docs_ai_menu.cjs`);
241+
const issueNumber = context.payload.issue.number;
242+
const progressUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
243+
const triageResult = '${{ needs.run-docs-triage.result }}';
244+
245+
await menu.upsertMenuComment({
246+
core,
247+
createIfMissing: false,
248+
github,
249+
context,
250+
issueNumber,
251+
statusOverrides: {
252+
triage: {
253+
conclusion: triageResult === 'success'
254+
? 'success'
255+
: triageResult === 'cancelled'
256+
? 'cancelled'
257+
: 'failure',
258+
detailsUrl: progressUrl,
259+
status: 'completed',
260+
},
261+
},
262+
});
263+
264+
refresh-menu-after-docs-size:
265+
name: Refresh AI menu after docs size
266+
needs: [evaluate-trigger, refresh-menu-after-trigger, run-docs-size]
267+
if: always() && needs.evaluate-trigger.outputs.size_triggered == 'true'
268+
runs-on: ubuntu-latest
269+
permissions:
270+
contents: read
271+
issues: write
272+
concurrency:
273+
group: docs-ai-menu-${{ github.event.issue.number }}
274+
cancel-in-progress: false
275+
276+
steps:
277+
- name: Checkout repository
278+
uses: actions/checkout@v6.0.2
279+
with:
280+
persist-credentials: false
281+
282+
- name: Refresh AI menu status
283+
uses: actions/github-script@v9.0.0
284+
with:
285+
github-token: ${{ secrets.GITHUB_TOKEN }}
286+
script: |
287+
const menu = require(`${process.env.GITHUB_WORKSPACE}/.github/scripts/docs_ai_menu.cjs`);
288+
const issueNumber = context.payload.issue.number;
289+
const progressUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
290+
const sizeResult = '${{ needs.run-docs-size.result }}';
291+
292+
await menu.upsertMenuComment({
293+
core,
294+
createIfMissing: false,
295+
github,
296+
context,
297+
issueNumber,
298+
statusOverrides: {
299+
size: {
300+
conclusion: sizeResult === 'success'
301+
? 'success'
302+
: sizeResult === 'cancelled'
303+
? 'cancelled'
304+
: 'failure',
305+
detailsUrl: progressUrl,
306+
status: 'completed',
307+
},
308+
},
309+
});
310+
150311
refresh-menu-after-docs-issue-scope:
151312
name: Refresh AI menu after docs issue scope
152313
needs: [evaluate-trigger, refresh-menu-after-trigger, run-docs-issue-scope]

0 commit comments

Comments
 (0)