Mention the projection tooling in the projections docs - #5711
Conversation
The projections docs never said what tooling exists for writing user defined projections, so readers were left to infer that posting JavaScript through the API or the embedded UI is the whole story. - intro.md gains a Tooling section covering the gaffer CLI, the VS Code extension and the testing library, placed after the projection types so a reader meets it while learning what a user defined projection is. - The user-defined bullet said projections are created "via the API or the admin UI". Names a client library too, and uses the current name for the embedded UI. - custom.md points at the tooling before the reader starts writing JavaScript, and its Debugging projections section now describes what the VS Code extension actually does rather than linking the gaffer repository on GitHub.
Deploying eventstore with
|
| Latest commit: |
b6c23f6
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://fdc9c534.eventstore.pages.dev |
| Branch Preview URL: | https://george-ui-1856-mention-gaffe.eventstore.pages.dev |
PR Summary by QodoDocument projection authoring tooling (gaffer/VS Code/testing)
AI Description
Diagram
High-Level Assessment
Files changed (2)
|
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewTip of the day💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR More tips ↗ | Customize Qodo ↗ | Qodo docs ↗ |
There was a problem hiding this comment.
🚨 @George-Payne Failed to create cherry Pick PR due to error:
RequestError [HttpError]: Merge conflict
at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
status: '409',
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
'content-length': '127',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 13 Aug 2026 08:44:31 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'github.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'contents=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-edge-region': 'westus2',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '8420:2EF189:625853:7A816A:6A7D83EE',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4941',
'x-ratelimit-reset': '1786614233',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '59',
'x-xss-protection': '0'
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
authorization: 'bearer [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"base":"cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v24.10-2e873b89-078a-4e18-aa5e-66a96413d2b1","commit_message":"Merge b6c23f6bffad18bba9b52a8e8744067375a66eba into cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v24.10-2e873b89-078a-4e18-aa5e-66a96413d2b1 [skip ci]\\n\\n\\nskip-checks: true\\n","head":"b6c23f6bffad18bba9b52a8e8744067375a66eba"}',
request: { agent: [Agent], hook: [Function: bound bound register] }
},
documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}
🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683378439
There was a problem hiding this comment.
🚨 @George-Payne Failed to create cherry Pick PR due to error:
RequestError [HttpError]: Merge conflict
at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
status: '409',
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
'content-length': '127',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 13 Aug 2026 08:44:38 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'github.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'contents=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-edge-region': 'westus2',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '8420:2EF189:625BAA:7A859D:6A7D83F5',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4930',
'x-ratelimit-reset': '1786614233',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '70',
'x-xss-protection': '0'
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
authorization: 'bearer [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"base":"cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v25.0-2bc75bce-8e14-4158-847f-ce4cfbae0a1f","commit_message":"Merge b6c23f6bffad18bba9b52a8e8744067375a66eba into cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v25.0-2bc75bce-8e14-4158-847f-ce4cfbae0a1f [skip ci]\\n\\n\\nskip-checks: true\\n","head":"b6c23f6bffad18bba9b52a8e8744067375a66eba"}',
request: { agent: [Agent], hook: [Function: bound bound register] }
},
documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}
🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683378439
There was a problem hiding this comment.
🚨 @George-Payne Failed to create cherry Pick PR due to error:
RequestError [HttpError]: Merge conflict
at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
status: '409',
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
'content-length': '127',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 13 Aug 2026 08:44:43 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'github.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'contents=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-edge-region': 'westus2',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '8420:2EF189:625E0B:7A88C5:6A7D83FB',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4917',
'x-ratelimit-reset': '1786614233',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '83',
'x-xss-protection': '0'
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
authorization: 'bearer [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"base":"cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v25.1-855b1df9-a9af-4dc1-8dc6-1e8c05a050fc","commit_message":"Merge b6c23f6bffad18bba9b52a8e8744067375a66eba into cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v25.1-855b1df9-a9af-4dc1-8dc6-1e8c05a050fc [skip ci]\\n\\n\\nskip-checks: true\\n","head":"b6c23f6bffad18bba9b52a8e8744067375a66eba"}',
request: { agent: [Agent], hook: [Function: bound bound register] }
},
documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}
🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683378439
There was a problem hiding this comment.
🚨 @George-Payne Failed to create cherry Pick PR due to error:
RequestError [HttpError]: Merge conflict
at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
status: '409',
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
'content-length': '127',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 13 Aug 2026 08:44:50 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'github.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'contents=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-edge-region': 'westus2',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '8420:2EF189:6260C2:7A8C2A:6A7D8401',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4906',
'x-ratelimit-reset': '1786614233',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '94',
'x-xss-protection': '0'
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
authorization: 'bearer [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"base":"cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v26.0-3f16ee26-b689-4000-8294-56602b657ca7","commit_message":"Merge b6c23f6bffad18bba9b52a8e8744067375a66eba into cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v26.0-3f16ee26-b689-4000-8294-56602b657ca7 [skip ci]\\n\\n\\nskip-checks: true\\n","head":"b6c23f6bffad18bba9b52a8e8744067375a66eba"}',
request: { agent: [Agent], hook: [Function: bound bound register] }
},
documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}
🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683378439
There was a problem hiding this comment.
🚨 @George-Payne Failed to create cherry Pick PR due to error:
RequestError [HttpError]: Merge conflict
at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
status: '409',
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
'content-length': '127',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 13 Aug 2026 08:44:56 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'github.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'contents=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-edge-region': 'westus2',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '8420:2EF189:62639A:7A8FF2:6A7D8407',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4893',
'x-ratelimit-reset': '1786614233',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '107',
'x-xss-protection': '0'
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
authorization: 'bearer [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"base":"cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v26.1-796935fd-3a67-4d27-be86-189c614e440f","commit_message":"Merge b6c23f6bffad18bba9b52a8e8744067375a66eba into cherry-pick-cherry-pick/5711/george/ui-1856-mention-gaffer-tooling-in-projection-docs-release/v26.1-796935fd-3a67-4d27-be86-189c614e440f [skip ci]\\n\\n\\nskip-checks: true\\n","head":"b6c23f6bffad18bba9b52a8e8744067375a66eba"}',
request: { agent: [Agent], hook: [Function: bound bound register] }
},
documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}
🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683378439
* Rewrite the projections tutorial around gaffer Backport of #5710. This branch has no projections engine V2 page, so the paragraph explaining --engine-version 1 names 26.1 as where V2 arrives instead of linking the page, and the next-steps bullet for it is gone. * Mention the projection tooling in the projections docs Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too.
* Rewrite the projections tutorial around gaffer Backport of #5710. The tutorial content is taken verbatim from master; this branch's engine-v2 page exists, so the V2 references carry over unchanged. * Mention the projection tooling in the projections docs Backport of #5711. The debugging section replaced here is the browser walkthrough this branch still carries, rather than the short Gaffer paragraph master had, so its three screenshots go with it.
Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too.
Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too.
Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too.
* Rewrite the projections tutorial around gaffer Backport of #5710. This branch has no projections engine V2 page, so the paragraph explaining --engine-version 1 names 26.1 as where V2 arrives instead of linking the page, and the next-steps bullet for it is gone. * Mention the projection tooling in the projections docs Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too. --------- Co-authored-by: George Payne <georgepayne@hotmail.com>
* Rewrite the projections tutorial around gaffer Backport of #5710. This branch has no projections engine V2 page, so the paragraph explaining --engine-version 1 names 26.1 as where V2 arrives instead of linking the page, and the next-steps bullet for it is gone. * Mention the projection tooling in the projections docs Backport of #5711. This branch has no intro.md, so the tooling section lands in README.md, which carries that content here. The debugging section replaced is the browser walkthrough, so its screenshots go too. --------- Co-authored-by: George Payne <georgepayne@hotmail.com>
intro.mdgains a shortToolingsection covering the gaffer CLI, the VS Code extension and the testing library, one line each. It sits afterEngine versionsso the two decisions about a user-defined projection stay next to each other.intro.mdalso names a client library alongside the API and the embedded UI as ways to create a projection, and uses the current name for the embedded UI. TheProjectionsgRPC service exposesCreateandUpdate, so client libraries belong in that list.custom.mdgets a tip after its first example pointing at the same tooling, placed after the code rather than before it so the page's opening still runs straight into the example.custom.md's debugging section described debugging through a browser's dev tools, referring to screenshots that no longer exist and a debugger that went with the AngularJS UI. It now describes running a projection locally with a debugger attached, from the CLI, from VS Code, or from any DAP-aware editor.