diff --git a/content/admin/administering-your-instance/administering-your-instance-from-the-web-ui/managing-search-indices-for-your-instance.md b/content/admin/administering-your-instance/administering-your-instance-from-the-web-ui/managing-search-indices-for-your-instance.md
index 21644d74fbae..cf64c0f6be11 100644
--- a/content/admin/administering-your-instance/administering-your-instance-from-the-web-ui/managing-search-indices-for-your-instance.md
+++ b/content/admin/administering-your-instance/administering-your-instance-from-the-web-ui/managing-search-indices-for-your-instance.md
@@ -21,7 +21,7 @@ For more information about search for {% data variables.product.prodname_ghe_ser
{% data variables.product.prodname_ghe_server %} reconciles the state of the search index with data on the instance automatically and regularly, including:
-* Issues, pull requests, repositories, and users in the database
+* Issues,{% ifversion ghes > 3.17 %} projects,{% endif %} pull requests, repositories, and users in the database
* Git repositories (source code) on disk
In normal use, enterprise owners do not need to create new indices or schedule repair jobs. For troubleshooting or other support purposes, {% data variables.contact.github_support %} may instruct you to run a repair job.
diff --git a/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md b/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md
index 3e5a7e216abf..1aa6912aa75f 100644
--- a/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md
+++ b/content/code-security/secret-scanning/introduction/supported-secret-scanning-patterns.md
@@ -101,6 +101,18 @@ In addition to these generic non-provider patterns, {% data variables.product.pr
Service providers update the patterns used to generate tokens periodically and may support more than one version of a token. Push protection only supports the most recent token versions that {% data variables.product.prodname_secret_scanning %} can identify with confidence. This avoids push protection blocking commits unnecessarily when a result may be a false positive, which is more likely to happen with legacy tokens.
+#### Multi-part secrets
+
+
+
+By default, {% data variables.product.prodname_secret_scanning %} supports validation for pair-matched access keys and key IDs.
+
+{% data variables.product.prodname_secret_scanning_caps %} also supports validation for individual key IDs for Amazon AWS Access Key IDs, in addition to existing pair matching.
+
+A key ID will show as active if {% data variables.product.prodname_secret_scanning %} confirms the key ID exists, regardless of whether or not a corresponding access key is found. The key ID will show as `inactive` if it's invalid (for example, if it is not a real key ID).
+
+Where a valid pair is found, the {% data variables.product.prodname_secret_scanning %} alerts will be linked.
+
## Further reading
* [AUTOTITLE](/code-security/secret-scanning/managing-alerts-from-secret-scanning/about-alerts)
diff --git a/data/code-languages.yml b/data/code-languages.yml
index e6b3e17cf852..f40c63a8cee5 100644
--- a/data/code-languages.yml
+++ b/data/code-languages.yml
@@ -7,6 +7,9 @@ bash:
bicep:
name: Bicep
comment: slash
+copilot:
+ name: Copilot Chat prompt
+ comment: none
csharp:
name: C#
comment: slash
diff --git a/package-lock.json b/package-lock.json
index d9e40018bdcc..c7d05b29c4ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -96,6 +96,7 @@
"tcp-port-used": "1.0.2",
"tsx": "^4.19.4",
"unified": "^11.0.5",
+ "unist-util-find": "^3.0.0",
"unist-util-visit": "^5.0.0",
"url-template": "^3.1.1",
"walk-sync": "^4.0.1"
@@ -10563,6 +10564,11 @@
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
},
+ "node_modules/lodash.iteratee": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz",
+ "integrity": "sha512-yv3cSQZmfpbIKo4Yo45B1taEvxjNvcpF1CEOc0Y6dEyvhPIfEJE3twDwPgWTPQubcSgXyBwBKG6wpQvWMDOf6Q=="
+ },
"node_modules/lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@@ -15653,6 +15659,20 @@
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
"integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
},
+ "node_modules/unist-util-find": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find/-/unist-util-find-3.0.0.tgz",
+ "integrity": "sha512-T7ZqS7immLjYyC4FCp2hDo3ksZ1v+qcbb+e5+iWxc2jONgHOLXPCpms1L8VV4hVxCXgWTxmBHDztuEZFVwC+Gg==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "lodash.iteratee": "^4.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unist-util-find-after": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
@@ -15683,6 +15703,12 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unist-util-find/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
"node_modules/unist-util-is": {
"version": "5.1.1",
"license": "MIT",
diff --git a/package.json b/package.json
index b83ea5ae07c4..b5c18f05d11c 100644
--- a/package.json
+++ b/package.json
@@ -243,6 +243,7 @@
"tcp-port-used": "1.0.2",
"tsx": "^4.19.4",
"unified": "^11.0.5",
+ "unist-util-find": "^3.0.0",
"unist-util-visit": "^5.0.0",
"url-template": "^3.1.1",
"walk-sync": "^4.0.1"
diff --git a/src/content-render/liquid/engine.js b/src/content-render/liquid/engine.js
index 50a03f701ae6..e2d5d60c7c9e 100644
--- a/src/content-render/liquid/engine.js
+++ b/src/content-render/liquid/engine.js
@@ -6,6 +6,7 @@ import Octicon from './octicon'
import Ifversion from './ifversion'
import { Tool, tags as toolTags } from './tool'
import { Spotlight, tags as spotlightTags } from './spotlight'
+import { Prompt } from './prompt'
export const engine = new Liquid({
extname: '.html',
@@ -25,6 +26,8 @@ for (const tag in spotlightTags) {
engine.registerTag(tag, Spotlight)
}
+engine.registerTag('prompt', Prompt)
+
/**
* Like the `size` filter, but specifically for
* getting the number of keys in an object
diff --git a/src/content-render/liquid/prompt.js b/src/content-render/liquid/prompt.js
new file mode 100644
index 000000000000..cc81688f93be
--- /dev/null
+++ b/src/content-render/liquid/prompt.js
@@ -0,0 +1,31 @@
+// src/content-render/liquid/prompt.js
+// Defines {% prompt %}…{% endprompt %} to wrap its content in and append the Copilot icon.
+
+import octicons from '@primer/octicons'
+
+export const Prompt = {
+ type: 'block',
+
+ // Collect everything until {% endprompt %}
+ parse(tagToken, remainTokens) {
+ this.templates = []
+ const stream = this.liquid.parser.parseStream(remainTokens)
+ stream
+ .on('template', (tpl) => this.templates.push(tpl))
+ .on('tag:endprompt', () => stream.stop())
+ .on('end', () => {
+ throw new Error(`{% prompt %} tag not closed`)
+ })
+ stream.start()
+ },
+
+ // Render the inner Markdown, wrap in , then append the SVG
+ render: function* (scope) {
+ const content = yield this.liquid.renderer.renderTemplates(this.templates, scope)
+
+ // build a URL with the prompt text encoded as query parameter
+ const promptParam = encodeURIComponent(content)
+ const href = `https://github.com/copilot?prompt=${promptParam}`
+ return `${content}${octicons.copilot.toSVG()}`
+ },
+}
diff --git a/src/content-render/tests/copilot-code-blocks.js b/src/content-render/tests/copilot-code-blocks.js
new file mode 100644
index 000000000000..45dbbbf77905
--- /dev/null
+++ b/src/content-render/tests/copilot-code-blocks.js
@@ -0,0 +1,203 @@
+import { describe, it, expect, vi } from 'vitest'
+import { renderContent } from '@/content-render/index'
+
+describe('code-header plugin', () => {
+ describe('copilot language code blocks', () => {
+ it('should render basic copilot code block without header (no copy meta)', async () => {
+ const markdown = '```copilot\nImprove the variable names in this function\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should keep copilot as the language (not convert to text without copy meta)
+ expect(html).toContain('language-copilot')
+ // Should NOT wrap in code-example div since no copy meta
+ expect(html).not.toContain('code-example')
+ // Should NOT have header since no copy meta
+ expect(html).not.toContain(' {
+ const markdown = '```copilot copy\nImprove the variable names in this function\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should be wrapped in code-example div
+ expect(html).toContain('code-example')
+ // Should have header with copy button
+ expect(html).toContain(' {
+ const markdown = '```copilot prompt\nImprove the variable names in this function\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should be wrapped in code-example div
+ expect(html).toContain('code-example')
+ // Should have header
+ expect(html).toContain(' {
+ const markdown = '```copilot copy prompt\nImprove the variable names in this function\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should be wrapped in code-example div
+ expect(html).toContain('code-example')
+ // Should have header with copy button
+ expect(html).toContain(' {
+ const markdown = `
+\`\`\`javascript id=js-age
+function logPersonsAge(a, b, c) {
+ if (c) {
+ console.log(a + " is " + b + " years old.");
+ } else {
+ console.log(a + " does not want to reveal their age.");
+ }
+}
+\`\`\`
+
+\`\`\`copilot copy prompt ref=js-age
+Improve the variable names in this function
+\`\`\`
+ `
+
+ const html = await renderContent(markdown)
+
+ // Should have prompt button with both code blocks in URL
+ expect(html).toContain('https://github.com/copilot?prompt=')
+ // Should contain encoded content from both the referenced code and the prompt
+ expect(html).toContain('function%20logPersonsAge')
+ expect(html).toContain('Improve%20the%20variable%20names')
+ // Should have different aria-label indicating context
+ expect(html).toContain('aria-label="Run this prompt with context in Copilot Chat"')
+ })
+
+ it('should render copilot code block with prompt and ref only (no copy meta)', async () => {
+ const markdown = `
+\`\`\`javascript id=js-age
+function logPersonsAge(a, b, c) {
+ if (c) {
+ console.log(a + " is " + b + " years old.");
+ } else {
+ console.log(a + " does not want to reveal their age.");
+ }
+}
+\`\`\`
+
+\`\`\`copilot prompt ref=js-age
+Improve the variable names in this function
+\`\`\`
+ `
+
+ const html = await renderContent(markdown)
+
+ // Should have prompt button with both code blocks in URL
+ expect(html).toContain('https://github.com/copilot?prompt=')
+ // Should contain encoded content from both the referenced code and the prompt
+ expect(html).toContain('function%20logPersonsAge')
+ expect(html).toContain('Improve%20the%20variable%20names')
+ // Should have different aria-label indicating context
+ expect(html).toContain('aria-label="Run this prompt with context in Copilot Chat"')
+ // Should NOT have copy button
+ expect(html).not.toContain('js-btn-copy')
+ })
+ })
+
+ describe('edge cases', () => {
+ it('should handle missing reference gracefully and fall back to current code only', async () => {
+ // Mock console.warn to capture warning
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
+
+ const markdown =
+ '```copilot copy prompt ref=nonexistent-id\nImprove the variable names in this function\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should warn about missing reference
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
+ expect.stringContaining("Can't find referenced code block with id=nonexistent-id"),
+ )
+
+ // Should still render with prompt button using current code only
+ expect(html).toContain('https://github.com/copilot?prompt=')
+ expect(html).toContain('Improve%20the%20variable%20names%20in%20this%20function')
+ // Should NOT contain any referenced code since none was found
+ expect(html).not.toContain('function%20logPersonsAge')
+ // Should have standard aria-label (not context version)
+ expect(html).toContain('aria-label="Run this prompt in Copilot Chat"')
+ // Should not crash or fail
+ expect(html).toContain('code-example')
+
+ // Restore console.warn
+ consoleWarnSpy.mockRestore()
+ })
+
+ it('should not process annotated code blocks', async () => {
+ const markdown = `\`\`\`javascript copy annotate
+// This is an annotation
+function test() {}
+\`\`\``
+
+ const html = await renderContent(markdown)
+
+ // Should NOT wrap in code-example div (annotated blocks are excluded)
+ expect(html).not.toContain('code-example')
+ })
+
+ it('should handle regular code blocks with copy', async () => {
+ const markdown = '```javascript copy\nfunction test() {}\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should render with copy button
+ expect(html).toContain('code-example')
+ expect(html).toContain('js-btn-copy')
+ expect(html).toContain('language-javascript')
+ })
+ })
+
+ describe('URL encoding', () => {
+ it('should properly encode special characters in prompt URLs', async () => {
+ const markdown = '```copilot copy prompt\nHow do I handle "quotes" and & symbols?\n```'
+
+ const html = await renderContent(markdown)
+
+ // Should encode quotes and ampersands properly
+ expect(html).toContain('%22quotes%22')
+ expect(html).toContain('%26%20symbols')
+ })
+
+ it('should handle multiline prompts correctly', async () => {
+ const markdown = `\`\`\`copilot copy prompt
+This is line 1
+This is line 2
+\`\`\``
+
+ const html = await renderContent(markdown)
+
+ // Should encode newlines properly
+ expect(html).toContain('This%20is%20line%201%0AThis%20is%20line%202')
+ })
+ })
+})
diff --git a/src/content-render/tests/prompt.js b/src/content-render/tests/prompt.js
new file mode 100644
index 000000000000..029a0ef9d486
--- /dev/null
+++ b/src/content-render/tests/prompt.js
@@ -0,0 +1,11 @@
+import { describe, expect, test } from 'vitest'
+import { renderContent } from '@/content-render/index'
+
+describe('prompt tag', () => {
+ test('wraps content in and appends svg', async () => {
+ const input = 'Here is your prompt: {% prompt %}example prompt text{% endprompt %}.'
+ const output = await renderContent(input)
+ expect(output).toContain('example prompt text
node.type === 'element' &&
node.tagName === 'pre' &&
- // For now, limit to ones with the copy meta,
+ // For now, limit to ones with the copy or prompt meta,
// but we may enable for all examples later.
- getPreMeta(node).copy &&
+ (getPreMeta(node).copy || getPreMeta(node).prompt) &&
// Don't add this header for annotated examples.
!getPreMeta(node).annotate
export default function codeHeader() {
return (tree) => {
visit(tree, matcher, (node, index, parent) => {
- parent.children[index] = wrapCodeExample(node)
+ parent.children[index] = wrapCodeExample(node, tree)
})
}
}
-function wrapCodeExample(node) {
+function wrapCodeExample(node, tree) {
const lang = node.children[0].properties.className?.[0].replace('language-', '')
const code = node.children[0].children[0].value
- return h('div', { className: 'code-example' }, [header(lang, code), node])
+
+ const subnav = null // getSubnav() lives in annotate.js, not needed for normal code blocks
+ const prompt = getPrompt(node, tree, code) // returns null if there's no prompt
+ const hasCopy = Boolean(getPreMeta(node).copy) // defaults to true
+
+ const headerHast = header(lang, code, subnav, prompt, hasCopy)
+
+ return h('div', { className: 'code-example' }, [headerHast, node])
}
-export function header(lang, code, subnav) {
+export function header(lang, code, subnav = null, prompt = null, hasCopy = true) {
const codeId = murmur('js-btn-copy').hash(code).result()
+
return h(
'header',
{
@@ -56,15 +66,18 @@ export function header(lang, code, subnav) {
[
h('span', { className: 'flex-1' }, languages[lang]?.name),
subnav,
- h(
- 'button',
- {
- class: ['js-btn-copy', 'btn', 'btn-sm', 'tooltipped', 'tooltipped-nw'],
- 'aria-label': `Copy ${languages[lang]?.name} code to clipboard`,
- 'data-clipboard': codeId,
- },
- btnIcon(),
- ),
+ prompt,
+ hasCopy
+ ? h(
+ 'button',
+ {
+ class: ['js-btn-copy', 'btn', 'btn-sm', 'tooltipped', 'tooltipped-nw'],
+ 'aria-label': `Copy ${languages[lang]?.name} code to clipboard`,
+ 'data-clipboard': codeId,
+ },
+ btnIcon(),
+ )
+ : null,
h('pre', { hidden: true, 'data-clipboard': codeId }, code),
],
)
@@ -77,7 +90,7 @@ function btnIcon() {
return btnIcon
}
-function getPreMeta(node) {
+export function getPreMeta(node) {
// Here's why this monstrosity works:
// https://github.com/syntax-tree/mdast-util-to-hast/blob/c87cd606731c88a27dbce4bfeaab913a9589bf83/lib/handlers/code.js#L40-L42
return node.children[0]?.data?.meta || {}
diff --git a/src/content-render/unified/copilot-prompt.js b/src/content-render/unified/copilot-prompt.js
new file mode 100644
index 000000000000..1d2ca48d67c1
--- /dev/null
+++ b/src/content-render/unified/copilot-prompt.js
@@ -0,0 +1,75 @@
+/**
+ * Adds a runnable prompt button in the header of Copilot Chat blocks.
+ */
+
+import { find } from 'unist-util-find'
+import { h } from 'hastscript'
+import octicons from '@primer/octicons'
+import { parse } from 'parse5'
+import { fromParse5 } from 'hast-util-from-parse5'
+import { getPreMeta } from './code-header'
+
+export function getPrompt(node, tree, code) {
+ const hasPrompt = Boolean(getPreMeta(node).prompt)
+ if (!hasPrompt) return null
+
+ const { promptContent, ariaLabel } = buildPromptData(node, tree, code)
+ const promptLink = `https://github.com/copilot?prompt=${encodeURIComponent(promptContent.trim())}`
+
+ return h(
+ 'a',
+ {
+ href: promptLink,
+ target: '_blank',
+ class: ['btn', 'btn-sm', 'mr-1', 'tooltipped', 'tooltipped-nw', 'no-underline'],
+ 'aria-label': ariaLabel,
+ },
+ copilotIcon(),
+ )
+}
+
+function buildPromptData(node, tree, code) {
+ // Find a ref meta in the format 'ref='
+ const ref = getPreMeta(node).ref
+
+ if (!ref) {
+ // If no 'ref=' meta is found, use just the current code for the prompt link.
+ return promptOnly(code)
+ }
+
+ // If the 'ref=' meta is found, find a matching code block to include as context in the prompt link.
+ const matchingCodeEl = findMatchingCode(ref, tree)
+ if (!matchingCodeEl) {
+ console.warn(`Can't find referenced code block with id=${ref}`)
+ return promptOnly(code)
+ }
+ const matchingCode = matchingCodeEl?.children[0].children[0].value || null
+ return promptAndContext(code, matchingCode)
+}
+
+function promptOnly(code) {
+ return {
+ promptContent: code,
+ ariaLabel: 'Run this prompt in Copilot Chat',
+ }
+}
+
+function promptAndContext(code, matchingCode) {
+ return {
+ promptContent: `${matchingCode}\n${code}`,
+ ariaLabel: 'Run this prompt with context in Copilot Chat',
+ }
+}
+
+function findMatchingCode(ref, tree) {
+ return find(tree, (node) => {
+ return node.type === 'element' && node.tagName === 'pre' && getPreMeta(node).id === ref
+ })
+}
+
+function copilotIcon() {
+ const copilotIconHtml = octicons.copilot.toSVG()
+ const copilotIconAst = parse(String(copilotIconHtml), { sourceCodeLocationInfo: true })
+ const copilotIcon = fromParse5(copilotIconAst, { file: copilotIconHtml })
+ return copilotIcon
+}
diff --git a/src/content-render/unified/parse-info-string.js b/src/content-render/unified/parse-info-string.js
index 6512ab363532..ec27c455d6c2 100644
--- a/src/content-render/unified/parse-info-string.js
+++ b/src/content-render/unified/parse-info-string.js
@@ -4,6 +4,7 @@
// becomes...
// node.lang = javascript
// node.meta = { lineNumbers: 'left', copy: 'all', annotate: true }
+// Also parse equals signs, where id=some-id becomes { id: 'some-id' }
import { visit } from 'unist-util-visit'
@@ -25,7 +26,7 @@ function strToObj(str) {
return Object.fromEntries(
str
.split(/\s+/g)
- .map((k) => k.split(':'))
+ .map((k) => k.split(/[:=]/)) // split by colon or equals sign
.map(([k, ...v]) => [k, v.length ? v.join(':') : true]),
)
}
diff --git a/src/content-render/unified/processor.ts b/src/content-render/unified/processor.ts
index a717a4b709f0..8b51bba4e119 100644
--- a/src/content-render/unified/processor.ts
+++ b/src/content-render/unified/processor.ts
@@ -57,7 +57,7 @@ export function createProcessor(context: Context): UnifiedProcessor {
subset: false,
aliases: {
// As of Jan 2024, 'jsonc' is not supported by highlight.js. It
- // just because plain text.
+ // just becomes plain text.
// But 'jsonc' works great in github.com. For example, when
// previewing and edited .md content in the browser. Or viewing
// PR diffs in web view.
@@ -66,6 +66,9 @@ export function createProcessor(context: Context): UnifiedProcessor {
// but with this alias you get the nice syntax highlighting when
// viewed on our site.
json: 'jsonc',
+ // Docs supports a custom 'copilot' language, which is useful for contributors,
+ // but is not a supported highlight.js language, so alias to 'text'.
+ text: 'copilot',
},
})
.use(raw)
diff --git a/src/ghes-releases/lib/enterprise-dates.json b/src/ghes-releases/lib/enterprise-dates.json
index d45bc146f360..6b4b00246060 100644
--- a/src/ghes-releases/lib/enterprise-dates.json
+++ b/src/ghes-releases/lib/enterprise-dates.json
@@ -255,7 +255,7 @@
"releaseDate": "2025-08-05",
"deprecationDate": "2026-08-25",
"releaseCandidateDate": "2025-08-05",
- "generalAvailabilityDate": "2025-08-26"
+ "generalAvailabilityDate": "2025-10-06"
},
"3.19": {
"releaseDate": "2025-11-11",
@@ -287,4 +287,4 @@
"releaseCandidateDate": "2026-11-10",
"generalAvailabilityDate": "2026-12-08"
}
-}
+}
\ No newline at end of file
diff --git a/src/secret-scanning/data/public-docs.yml b/src/secret-scanning/data/public-docs.yml
index e167d5ed29cd..252a5d612e11 100644
--- a/src/secret-scanning/data/public-docs.yml
+++ b/src/secret-scanning/data/public-docs.yml
@@ -199,6 +199,7 @@
isPrivateWithGhas: true
hasPushProtection: true
hasValidityCheck: '{% ifversion fpt or ghes %}false{% else %}true{% endif %}'
+ ismultipart: true
base64Supported: false
isduplicate: false
- provider: Amazon AWS
diff --git a/src/secret-scanning/middleware/secret-scanning.ts b/src/secret-scanning/middleware/secret-scanning.ts
index 5d68d398a322..8feb9cabbd3e 100644
--- a/src/secret-scanning/middleware/secret-scanning.ts
+++ b/src/secret-scanning/middleware/secret-scanning.ts
@@ -46,6 +46,9 @@ export default async function secretScanning(
if (entry.isduplicate) {
entry.secretType += '
Token versions'
}
+ if (entry.ismultipart) {
+ entry.secretType += '
Multi-part secrets'
+ }
})
return next()
diff --git a/src/types.ts b/src/types.ts
index f7b32ce7682d..db399ccb59dc 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -311,6 +311,7 @@ export type SecretScanningData = {
isPrivateWithGhas: boolean
hasPushProtection: boolean
hasValidityCheck: boolean | string
+ ismultipart?: boolean
base64Supported: boolean
isduplicate: boolean
}