@codedrifters/configulator 0.0.396 → 0.0.398
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.mts +7 -7
- package/lib/index.d.ts +7 -7
- package/lib/index.js +297 -36
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +297 -36
- package/lib/index.mjs.map +1 -1
- package/package.json +6 -6
package/lib/index.mjs
CHANGED
|
@@ -214,6 +214,72 @@ var MCP_TRANSPORT = {
|
|
|
214
214
|
SSE: "sse"
|
|
215
215
|
};
|
|
216
216
|
|
|
217
|
+
// src/agent/bundles/claim-verification.ts
|
|
218
|
+
var ISSUE_CLAIM_MARKER_TAG = "<!-- issue-claim -->";
|
|
219
|
+
var CLAIM_MARKER_LIST_JQ = `[.comments[] | select(.body | contains("${ISSUE_CLAIM_MARKER_TAG}")) | {id, createdAt}] | sort_by(.createdAt, .id)`;
|
|
220
|
+
function renderClaimVerificationSection() {
|
|
221
|
+
return [
|
|
222
|
+
"## Claim verification",
|
|
223
|
+
"",
|
|
224
|
+
"Before you create a branch or write any artifacts, verify you own the",
|
|
225
|
+
"claim on the issue. This governs the `status:ready` \u2192",
|
|
226
|
+
"`status:in-progress` transition. In fleet deployments several",
|
|
227
|
+
"orchestrator runners share one GitHub queue, so a bare label flip does",
|
|
228
|
+
"not by itself guarantee you are the only session working the issue \u2014",
|
|
229
|
+
"two runners can scan the queue in the same window and both claim it",
|
|
230
|
+
"(fleet anti-collision).",
|
|
231
|
+
"",
|
|
232
|
+
"### The issue-claim marker",
|
|
233
|
+
"",
|
|
234
|
+
"Ownership is recorded by a single claim-marker comment on the issue.",
|
|
235
|
+
"Whoever claims the issue \u2014 the orchestrator at pick time",
|
|
236
|
+
"(claim-at-pick), or you, when you claim an unclaimed issue yourself \u2014",
|
|
237
|
+
"posts exactly one:",
|
|
238
|
+
"",
|
|
239
|
+
"```",
|
|
240
|
+
`${ISSUE_CLAIM_MARKER_TAG} Claimed <ISO-8601 UTC> by <claimant> \u2014 fleet anti-collision.`,
|
|
241
|
+
"```",
|
|
242
|
+
"",
|
|
243
|
+
"The **owner is the earliest** claim marker \u2014 the",
|
|
244
|
+
`\`${ISSUE_CLAIM_MARKER_TAG}\` comment with the lowest \`createdAt\``,
|
|
245
|
+
"(tie-broken on the lowest comment id). List the markers in claim order",
|
|
246
|
+
"with:",
|
|
247
|
+
"",
|
|
248
|
+
"```bash",
|
|
249
|
+
"gh issue view <n> --json comments \\",
|
|
250
|
+
` --jq '${CLAIM_MARKER_LIST_JQ}'`,
|
|
251
|
+
"```",
|
|
252
|
+
"",
|
|
253
|
+
"### Verify or claim",
|
|
254
|
+
"",
|
|
255
|
+
"1. **Pre-claimed at pick.** If your dispatch brief says the orchestrator",
|
|
256
|
+
" already flipped the label (claim-at-pick) and cites the marker it",
|
|
257
|
+
" posted, confirm that marker is the **earliest** claim marker on the",
|
|
258
|
+
" issue, then proceed. Do **not** re-add `status:ready` and do **not**",
|
|
259
|
+
" re-flip the label \u2014 the claim is already yours.",
|
|
260
|
+
"2. **Unclaimed (`status:ready`).** Claim it yourself: **first** post the",
|
|
261
|
+
` \`${ISSUE_CLAIM_MARKER_TAG}\` marker comment, **then** flip`,
|
|
262
|
+
" `status:ready` \u2192 `status:in-progress`. Re-read the markers; proceed",
|
|
263
|
+
" only if the marker you just posted is the earliest.",
|
|
264
|
+
"3. **Foreign prior claim \u2192 back off.** If a claim marker from another",
|
|
265
|
+
" dispatch is **earlier** than yours \u2014 or the issue is already",
|
|
266
|
+
" `status:in-progress` with a foreign marker and your dispatch brief",
|
|
267
|
+
" did not claim it for you \u2014 a sibling runner owns the issue. **Back",
|
|
268
|
+
" off cleanly and write no artifacts**: no branch, no files, no PR, and",
|
|
269
|
+
" no completion or duplicate-output comment. Log",
|
|
270
|
+
" `CLAIM_CONFLICT #<n> owner=<earliest-marker-id>` and stop the session.",
|
|
271
|
+
"",
|
|
272
|
+
"Backing off on a foreign claim is the analyst-side backstop to the",
|
|
273
|
+
"orchestrator's claim-at-pick guard: claim-at-pick closes the common",
|
|
274
|
+
"multi-minute window between the queue scan and the claim, and this",
|
|
275
|
+
"check absorbs the sub-second residual race where two runners both",
|
|
276
|
+
"scanned before either flipped the label. If you discover a foreign",
|
|
277
|
+
"prior claim **mid-execution** \u2014 after you have already begun a phase \u2014",
|
|
278
|
+
"stop immediately and discard the uncommitted work rather than opening a",
|
|
279
|
+
"second PR or writing a duplicate artifact for the issue."
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
|
|
217
283
|
// src/agent/bundles/project-context.ts
|
|
218
284
|
var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
|
|
219
285
|
var SUBPROJECT_ROLE_GUIDANCE = [
|
|
@@ -490,6 +556,10 @@ var agendaAnalystSubAgent = {
|
|
|
490
556
|
"",
|
|
491
557
|
"---",
|
|
492
558
|
"",
|
|
559
|
+
...renderClaimVerificationSection(),
|
|
560
|
+
"",
|
|
561
|
+
"---",
|
|
562
|
+
"",
|
|
493
563
|
"## Phase 1: Draft (`agenda:draft`)",
|
|
494
564
|
"",
|
|
495
565
|
"**Goal:** Produce a well-structured `agenda.md` in the meeting's",
|
|
@@ -4901,6 +4971,10 @@ function buildBcmWriterSubAgent(paths, issueDefaults) {
|
|
|
4901
4971
|
"",
|
|
4902
4972
|
"---",
|
|
4903
4973
|
"",
|
|
4974
|
+
...renderClaimVerificationSection(),
|
|
4975
|
+
"",
|
|
4976
|
+
"---",
|
|
4977
|
+
"",
|
|
4904
4978
|
"## Phase 1: Outline (`bcm:outline`)",
|
|
4905
4979
|
"",
|
|
4906
4980
|
"**Goal:** Identify the capability (name-as-noun, business object, tier)",
|
|
@@ -5790,6 +5864,10 @@ function buildBusinessModelsAnalystSubAgent(paths) {
|
|
|
5790
5864
|
"",
|
|
5791
5865
|
"---",
|
|
5792
5866
|
"",
|
|
5867
|
+
...renderClaimVerificationSection(),
|
|
5868
|
+
"",
|
|
5869
|
+
"---",
|
|
5870
|
+
"",
|
|
5793
5871
|
"## Phase 1: Scan (`business-models:scan`)",
|
|
5794
5872
|
"",
|
|
5795
5873
|
"**Goal:** Read upstream industry and profile artifacts to identify",
|
|
@@ -6683,6 +6761,10 @@ function buildCompanyProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
6683
6761
|
"",
|
|
6684
6762
|
"---",
|
|
6685
6763
|
"",
|
|
6764
|
+
...renderClaimVerificationSection(),
|
|
6765
|
+
"",
|
|
6766
|
+
"---",
|
|
6767
|
+
"",
|
|
6686
6768
|
"## Phase 1: Research (`company:research`)",
|
|
6687
6769
|
"",
|
|
6688
6770
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -8112,6 +8194,10 @@ function buildCustomerProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
8112
8194
|
"",
|
|
8113
8195
|
"---",
|
|
8114
8196
|
"",
|
|
8197
|
+
...renderClaimVerificationSection(),
|
|
8198
|
+
"",
|
|
8199
|
+
"---",
|
|
8200
|
+
"",
|
|
8115
8201
|
"## Phase 1: Discover (`customer:discover`)",
|
|
8116
8202
|
"",
|
|
8117
8203
|
"**Goal:** Identify and segment the customer archetypes relevant to",
|
|
@@ -10725,6 +10811,10 @@ function buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults) {
|
|
|
10725
10811
|
"",
|
|
10726
10812
|
"---",
|
|
10727
10813
|
"",
|
|
10814
|
+
...renderClaimVerificationSection(),
|
|
10815
|
+
"",
|
|
10816
|
+
"---",
|
|
10817
|
+
"",
|
|
10728
10818
|
"## Phase 1: Discover (`industry:discover`)",
|
|
10729
10819
|
"",
|
|
10730
10820
|
"**Goal:** Enumerate candidate industry verticals into a bounded",
|
|
@@ -11277,6 +11367,10 @@ function buildMaintenanceAuditSubAgent(paths, tier) {
|
|
|
11277
11367
|
"",
|
|
11278
11368
|
"---",
|
|
11279
11369
|
"",
|
|
11370
|
+
...renderClaimVerificationSection(),
|
|
11371
|
+
"",
|
|
11372
|
+
"---",
|
|
11373
|
+
"",
|
|
11280
11374
|
"## Phase 1: Scan (`maint:scan`)",
|
|
11281
11375
|
"",
|
|
11282
11376
|
"**Goal:** Walk the configured doc tree, check every cross-reference",
|
|
@@ -12161,6 +12255,10 @@ function buildMeetingAnalystSubAgent(tier) {
|
|
|
12161
12255
|
"",
|
|
12162
12256
|
"---",
|
|
12163
12257
|
"",
|
|
12258
|
+
...renderClaimVerificationSection(),
|
|
12259
|
+
"",
|
|
12260
|
+
"---",
|
|
12261
|
+
"",
|
|
12164
12262
|
"## Phase 1: Extract (`meeting:extract`)",
|
|
12165
12263
|
"",
|
|
12166
12264
|
"**Goal:** Read the available meeting inputs (notes, transcript, or both)",
|
|
@@ -15018,6 +15116,7 @@ function shellSingleQuote(value) {
|
|
|
15018
15116
|
}
|
|
15019
15117
|
|
|
15020
15118
|
// src/agent/bundles/orchestrator.ts
|
|
15119
|
+
var REVIEW_IN_FLIGHT_WINDOW_MINUTES = 15;
|
|
15021
15120
|
function renderDelegationActiveSignalsHelper() {
|
|
15022
15121
|
return [
|
|
15023
15122
|
"# delegation_active_signals <pr-number> <head-oid>",
|
|
@@ -15945,6 +16044,9 @@ function buildPrSweepScript() {
|
|
|
15945
16044
|
"# - isDraft = true \u2192 reason=draft",
|
|
15946
16045
|
"# - review:human-required label \u2192 reason=human-required",
|
|
15947
16046
|
"# - review:awaiting-human label \u2192 reason=awaiting-human",
|
|
16047
|
+
"# - newest ## Reviewer* comment younger than the review-in-flight",
|
|
16048
|
+
"# window (a sibling runner's review is already in flight this",
|
|
16049
|
+
"# cycle) \u2192 reason=review-in-flight",
|
|
15948
16050
|
"#",
|
|
15949
16051
|
"# Needs-worker-mode skip rules (PR carries review:needs-worker but is",
|
|
15950
16052
|
"# not eligible to drain this cycle). A PR with NO review:fixing lease",
|
|
@@ -15968,6 +16070,11 @@ function buildPrSweepScript() {
|
|
|
15968
16070
|
"",
|
|
15969
16071
|
"set -uo pipefail",
|
|
15970
16072
|
"",
|
|
16073
|
+
"# Review-in-flight window in seconds \u2014 a PR whose newest reviewer",
|
|
16074
|
+
"# comment is younger than this is treated as under active review by a",
|
|
16075
|
+
"# sibling runner (fleet anti-collision).",
|
|
16076
|
+
`REVIEW_IN_FLIGHT_WINDOW_SECONDS=${REVIEW_IN_FLIGHT_WINDOW_MINUTES * 60}`,
|
|
16077
|
+
"",
|
|
15971
16078
|
"# \u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
|
|
15972
16079
|
"",
|
|
15973
16080
|
"# Resolve the linked issue's priority for a PR so the needs-worker",
|
|
@@ -15997,6 +16104,31 @@ function buildPrSweepScript() {
|
|
|
15997
16104
|
" esac",
|
|
15998
16105
|
"}",
|
|
15999
16106
|
"",
|
|
16107
|
+
"# Fleet anti-collision: echo the age in",
|
|
16108
|
+
"# whole seconds of a PR's newest `## Reviewer*` comment, or `none` when",
|
|
16109
|
+
"# the PR has no reviewer comment yet (or the read fails). The age is",
|
|
16110
|
+
"# derived from the newest reviewer comment's `updatedAt` (fall back to",
|
|
16111
|
+
"# `createdAt`) so an in-place edit of the sticky `## Reviewer notes`",
|
|
16112
|
+
"# comment counts as fresh activity, and it is computed inside jq",
|
|
16113
|
+
"# (`now - fromdateiso8601`, clamped at 0) so no non-portable `date`",
|
|
16114
|
+
"# parsing is needed. The raw JSON is piped through the caller's jq (not",
|
|
16115
|
+
"# gh's `--jq`), mirroring cmd_review's `gh pr list` handling.",
|
|
16116
|
+
"newest_reviewer_comment_age_seconds() {",
|
|
16117
|
+
' local pr_num="$1"',
|
|
16118
|
+
" local json",
|
|
16119
|
+
' json=$(gh pr view "$pr_num" --json comments 2>/dev/null) || { echo "none"; return; }',
|
|
16120
|
+
' [[ -z "$json" ]] && { echo "none"; return; }',
|
|
16121
|
+
` echo "$json" | jq -r '`,
|
|
16122
|
+
" [ .comments[]?",
|
|
16123
|
+
' | select(.body | startswith("## Reviewer"))',
|
|
16124
|
+
" | (.updatedAt // .createdAt)",
|
|
16125
|
+
" | fromdateiso8601",
|
|
16126
|
+
" ] as $ts",
|
|
16127
|
+
' | if ($ts | length) == 0 then "none"',
|
|
16128
|
+
" else ((now - ($ts | max)) | floor | if . < 0 then 0 else . end) end",
|
|
16129
|
+
` ' 2>/dev/null || echo "none"`,
|
|
16130
|
+
"}",
|
|
16131
|
+
"",
|
|
16000
16132
|
...renderDelegationActiveSignalsHelper(),
|
|
16001
16133
|
"",
|
|
16002
16134
|
"# \u2500\u2500 modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
|
|
@@ -16013,22 +16145,47 @@ function buildPrSweepScript() {
|
|
|
16013
16145
|
" return 0",
|
|
16014
16146
|
" fi",
|
|
16015
16147
|
"",
|
|
16016
|
-
" #
|
|
16017
|
-
" #
|
|
16018
|
-
|
|
16148
|
+
" # First pass (jq, no per-PR reads): classify each PR from the labels",
|
|
16149
|
+
" # and draft flag already in the list JSON, sorted by PR number",
|
|
16150
|
+
" # ascending so the output order is deterministic across runs. A PR",
|
|
16151
|
+
" # that clears every cheap label/draft skip rule is a CANDIDATE \u2014 the",
|
|
16152
|
+
" # review-in-flight check (which needs a per-PR comment read) is",
|
|
16153
|
+
" # applied per-candidate in the loop below. Emit `kind\\tnumber\\treason`.",
|
|
16154
|
+
" local rows",
|
|
16155
|
+
` rows=$(echo "$prs" | jq -r '`,
|
|
16019
16156
|
" sort_by(.number) |",
|
|
16020
16157
|
" .[] |",
|
|
16021
16158
|
" (.labels | map(.name)) as $labels |",
|
|
16022
16159
|
" if .isDraft then",
|
|
16023
|
-
' "
|
|
16160
|
+
' "SKIP\\t\\(.number)\\tdraft"',
|
|
16024
16161
|
' elif ($labels | index("review:human-required")) then',
|
|
16025
|
-
' "
|
|
16162
|
+
' "SKIP\\t\\(.number)\\thuman-required"',
|
|
16026
16163
|
' elif ($labels | index("review:awaiting-human")) then',
|
|
16027
|
-
' "
|
|
16164
|
+
' "SKIP\\t\\(.number)\\tawaiting-human"',
|
|
16028
16165
|
" else",
|
|
16029
|
-
' "
|
|
16166
|
+
' "CANDIDATE\\t\\(.number)\\t"',
|
|
16030
16167
|
" end",
|
|
16031
|
-
" '",
|
|
16168
|
+
" ')",
|
|
16169
|
+
"",
|
|
16170
|
+
" while IFS=$'\\t' read -r kind pr_num reason; do",
|
|
16171
|
+
' [[ -z "$pr_num" ]] && continue',
|
|
16172
|
+
' if [[ "$kind" == "SKIP" ]]; then',
|
|
16173
|
+
' echo "PR_SKIP #${pr_num} reason=${reason}"',
|
|
16174
|
+
" continue",
|
|
16175
|
+
" fi",
|
|
16176
|
+
" # CANDIDATE \u2014 dispatch the reviewer UNLESS a sibling runner's review",
|
|
16177
|
+
" # is already in flight, i.e. the newest `## Reviewer*` comment is",
|
|
16178
|
+
" # younger than the review-in-flight window (fleet anti-collision).",
|
|
16179
|
+
" local age",
|
|
16180
|
+
' age=$(newest_reviewer_comment_age_seconds "$pr_num")',
|
|
16181
|
+
" # `age` is `none` (no reviewer comment / read failed) or a",
|
|
16182
|
+
" # non-negative integer; only a numeric age inside the window skips.",
|
|
16183
|
+
' if [[ "$age" =~ ^[0-9]+$ && "$age" -lt "$REVIEW_IN_FLIGHT_WINDOW_SECONDS" ]]; then',
|
|
16184
|
+
' echo "PR_SKIP #${pr_num} reason=review-in-flight"',
|
|
16185
|
+
" else",
|
|
16186
|
+
' echo "PR_ELIGIBLE #${pr_num}"',
|
|
16187
|
+
" fi",
|
|
16188
|
+
' done <<< "$rows"',
|
|
16032
16189
|
"}",
|
|
16033
16190
|
"",
|
|
16034
16191
|
"cmd_needs_worker() {",
|
|
@@ -16153,7 +16310,7 @@ function buildPrSweepScript() {
|
|
|
16153
16310
|
function buildPrSweepProcedure() {
|
|
16154
16311
|
return {
|
|
16155
16312
|
name: "pr-sweep.sh",
|
|
16156
|
-
description: "Token-efficient PR enumeration for the orchestrator. In `review` mode (default) it emits one `PR_ELIGIBLE #<n>` or `PR_SKIP #<n> reason=<draft|human-required|awaiting-human>` line per open PR so the orchestrator dispatches `pr-reviewer` per eligible PR. In `needs-worker` mode it lists open PRs carrying the `review:needs-worker` marker and drains them, emitting `PR_DRAIN #<n>` lines ordered highest-priority-first so the orchestrator dispatches `issue-worker` per PR. A PR without the `review:fixing` lease is an idle marker and always drains; a PR that also holds `review:fixing` drains UNLESS a worker is demonstrably active (judged by the shared `delegation_active_signals` helper cmd_lease_reconcile also uses) \u2014 skipping as `reason=no-fixlist` / `reason=reported` / `reason=in-flight`. `NO_NEEDS_WORKER_PRS` when none.",
|
|
16313
|
+
description: "Token-efficient PR enumeration for the orchestrator. In `review` mode (default) it emits one `PR_ELIGIBLE #<n>` or `PR_SKIP #<n> reason=<draft|human-required|awaiting-human|review-in-flight>` line per open PR so the orchestrator dispatches `pr-reviewer` per eligible PR. `review-in-flight` skips a PR whose newest `## Reviewer*` comment is younger than the fleet review-in-flight window, so overlapping runners do not both dispatch a reviewer on the same PR. In `needs-worker` mode it lists open PRs carrying the `review:needs-worker` marker and drains them, emitting `PR_DRAIN #<n>` lines ordered highest-priority-first so the orchestrator dispatches `issue-worker` per PR. A PR without the `review:fixing` lease is an idle marker and always drains; a PR that also holds `review:fixing` drains UNLESS a worker is demonstrably active (judged by the shared `delegation_active_signals` helper cmd_lease_reconcile also uses) \u2014 skipping as `reason=no-fixlist` / `reason=reported` / `reason=in-flight`. `NO_NEEDS_WORKER_PRS` when none.",
|
|
16157
16314
|
content: buildPrSweepScript()
|
|
16158
16315
|
};
|
|
16159
16316
|
}
|
|
@@ -16353,6 +16510,7 @@ var orchestratorSubAgent = {
|
|
|
16353
16510
|
"PR_SKIP #<n> reason=draft",
|
|
16354
16511
|
"PR_SKIP #<n> reason=human-required",
|
|
16355
16512
|
"PR_SKIP #<n> reason=awaiting-human",
|
|
16513
|
+
"PR_SKIP #<n> reason=review-in-flight",
|
|
16356
16514
|
"```",
|
|
16357
16515
|
"",
|
|
16358
16516
|
"Skip rules (PRs that never reach the reviewer in this sweep):",
|
|
@@ -16362,6 +16520,12 @@ var orchestratorSubAgent = {
|
|
|
16362
16520
|
" (operator override \u2014 the reviewer's auto-merge path is forbidden)",
|
|
16363
16521
|
"- Carries the `review:awaiting-human` label \u2192 `reason=awaiting-human`",
|
|
16364
16522
|
" (the reviewer already handed off; a human is the next actor)",
|
|
16523
|
+
`- Newest \`## Reviewer*\` comment younger than ${REVIEW_IN_FLIGHT_WINDOW_MINUTES} minutes \u2192`,
|
|
16524
|
+
" `reason=review-in-flight` (a sibling fleet runner's reviewer is",
|
|
16525
|
+
" already looking at this PR this cycle \u2014 dispatching a second reviewer",
|
|
16526
|
+
" would duplicate the review and race on the sticky notes / auto-merge",
|
|
16527
|
+
" decision). The procedure owns this timing check; do not second-guess",
|
|
16528
|
+
" it by dispatching a reviewer on a skipped PR.",
|
|
16365
16529
|
"",
|
|
16366
16530
|
"If the script emits `NO_OPEN_PRS`, log the empty result and skip",
|
|
16367
16531
|
"directly to Phase B1.",
|
|
@@ -16672,12 +16836,50 @@ var orchestratorSubAgent = {
|
|
|
16672
16836
|
"values reflect the override; the global thresholds are documented",
|
|
16673
16837
|
"in the **Scope gate** section in `CLAUDE.md`.",
|
|
16674
16838
|
"",
|
|
16675
|
-
"If the scope is `small` or `medium`,
|
|
16676
|
-
"
|
|
16677
|
-
"
|
|
16839
|
+
"If the scope is `small` or `medium`, the issue is dispatchable \u2014",
|
|
16840
|
+
"**claim it at pick** before proceeding to Phase G. Claim-at-pick",
|
|
16841
|
+
"collapses the multi-minute window between this queue scan and the",
|
|
16842
|
+
"dispatched worker's own claim, during which a sibling fleet runner",
|
|
16843
|
+
"scanning the same queue would otherwise see `status:ready` and",
|
|
16844
|
+
"dispatch a second worker on the same issue (fleet",
|
|
16845
|
+
"anti-collision):",
|
|
16846
|
+
"",
|
|
16847
|
+
"1. **Re-read the picked issue's labels** immediately before claiming:",
|
|
16848
|
+
" ```bash",
|
|
16849
|
+
" gh issue view <number> --json labels --jq '[.labels[].name]'",
|
|
16850
|
+
" ```",
|
|
16851
|
+
" If `status:ready` is **no longer present**, a sibling runner claimed",
|
|
16852
|
+
" the issue inside your scan window \u2014 do **not** dispatch. Return to",
|
|
16853
|
+
" the `PICK` list, take the next candidate, and re-run the scope check.",
|
|
16854
|
+
"2. **Post an issue-claim marker, then flip the label.** Post the marker",
|
|
16855
|
+
" first so ownership carries a server-side timestamp, then claim:",
|
|
16856
|
+
" ```bash",
|
|
16857
|
+
" ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
16858
|
+
` gh issue comment <number> --body "${ISSUE_CLAIM_MARKER_TAG} Claimed $ts by orchestrator claim-at-pick \u2014 fleet anti-collision."`,
|
|
16859
|
+
' gh issue edit <number> --remove-label "status:ready" --add-label "status:in-progress"',
|
|
16860
|
+
" ```",
|
|
16861
|
+
" This `status:ready` \u2192 `status:in-progress` flip is a normal claim",
|
|
16862
|
+
" transition, **not** a `status:needs-attention` flag, so removing",
|
|
16863
|
+
" `status:ready` here is correct (contrast the scope-gate large-issue",
|
|
16864
|
+
" path, which is additive and must keep the base status).",
|
|
16865
|
+
"3. **Confirm you won the race.** Re-list the issue-claim markers in",
|
|
16866
|
+
" claim order:",
|
|
16867
|
+
" ```bash",
|
|
16868
|
+
` gh issue view <number> --json comments --jq '${CLAIM_MARKER_LIST_JQ}'`,
|
|
16869
|
+
" ```",
|
|
16870
|
+
" If the **earliest** marker is not the one you just posted (a rare",
|
|
16871
|
+
" sub-second tie where a sibling claimed first), yield: leave the",
|
|
16872
|
+
" labels as they are \u2014 the sibling owns the issue \u2014 and take the next",
|
|
16873
|
+
" `PICK` candidate. Likewise take the next candidate if the flip in",
|
|
16874
|
+
" step 2 errored.",
|
|
16875
|
+
"",
|
|
16876
|
+
"Record the claimed issue as the next work item and proceed to Phase G",
|
|
16877
|
+
"(the `claim:at-pick` field records that this orchestrator session has",
|
|
16878
|
+
"already flipped the label, so the dispatch brief tells the worker not",
|
|
16879
|
+
"to treat it as a foreign claim):",
|
|
16678
16880
|
"",
|
|
16679
16881
|
"```",
|
|
16680
|
-
'NEXT_WORK_ITEM #<number> priority:<level> tier:<n> type:<label> scope:<small|medium> "<title>"',
|
|
16882
|
+
'NEXT_WORK_ITEM #<number> priority:<level> tier:<n> type:<label> scope:<small|medium> claim:at-pick "<title>"',
|
|
16681
16883
|
"```",
|
|
16682
16884
|
"",
|
|
16683
16885
|
"If the scope is `large`, **do not dispatch**. Instead:",
|
|
@@ -16722,10 +16924,14 @@ var orchestratorSubAgent = {
|
|
|
16722
16924
|
"If output is `NO_READY_ISSUES`, report that the queue is empty,",
|
|
16723
16925
|
"skip Phase G, and proceed directly to Phase F.",
|
|
16724
16926
|
"",
|
|
16725
|
-
"**
|
|
16726
|
-
"
|
|
16727
|
-
"
|
|
16728
|
-
"
|
|
16927
|
+
"**Claim only the label, and only at pick.** The claim-at-pick step",
|
|
16928
|
+
"above (re-read labels \u2192 post the issue-claim marker \u2192 flip",
|
|
16929
|
+
"`status:ready` \u2192 `status:in-progress`) is the **sole** mutation the",
|
|
16930
|
+
"orchestrator makes to an issue. Do **not** create a branch, edit the",
|
|
16931
|
+
"issue body, or start implementation yourself \u2014 Phase G hands the",
|
|
16932
|
+
"already-claimed issue off to the `issue-worker` sub-agent in scheduled",
|
|
16933
|
+
"mode, and the worker performs the branch \u2192 implement \u2192 commit \u2192 PR",
|
|
16934
|
+
"cycle.",
|
|
16729
16935
|
"",
|
|
16730
16936
|
"## Phase G: Delegate Implementation",
|
|
16731
16937
|
"",
|
|
@@ -16743,8 +16949,14 @@ var orchestratorSubAgent = {
|
|
|
16743
16949
|
"",
|
|
16744
16950
|
"Invoke the sub-agent with a single-message brief:",
|
|
16745
16951
|
"",
|
|
16746
|
-
"> `scheduled mode`: work issue #<number>.
|
|
16747
|
-
">
|
|
16952
|
+
"> `scheduled mode`: work issue #<number>. This orchestrator session",
|
|
16953
|
+
"> has **already claimed** the issue at pick time (claim-at-pick): it",
|
|
16954
|
+
"> is `status:in-progress` and carries an issue-claim marker",
|
|
16955
|
+
`> (\`${ISSUE_CLAIM_MARKER_TAG}\`) this dispatch posted. Treat that claim`,
|
|
16956
|
+
"> as **yours** \u2014 do not treat the existing `status:in-progress` as a",
|
|
16957
|
+
"> foreign claim, do not re-add `status:ready`, and skip your own claim",
|
|
16958
|
+
"> flip; per your Claim verification step, confirm that marker is the",
|
|
16959
|
+
"> earliest and proceed. Route to the appropriate typed agent if one",
|
|
16748
16960
|
"> applies, implement the change, run the verification commands,",
|
|
16749
16961
|
"> commit, push, and open a PR labeled `origin:issue-worker` that",
|
|
16750
16962
|
"> closes the issue. Do not pause for approval. Return a one-line",
|
|
@@ -16753,10 +16965,10 @@ var orchestratorSubAgent = {
|
|
|
16753
16965
|
"> `WORKER_FAILED issue:#<n> reason:<short reason>` on failure.",
|
|
16754
16966
|
"",
|
|
16755
16967
|
"Substitute `<number>` with the issue number from the",
|
|
16756
|
-
"`NEXT_WORK_ITEM` line in Phase E. The
|
|
16757
|
-
"
|
|
16758
|
-
"
|
|
16759
|
-
"the worker's job.",
|
|
16968
|
+
"`NEXT_WORK_ITEM` line in Phase E. The claim-at-pick label flip",
|
|
16969
|
+
"(Phase E) is the **only** mutation the orchestrator makes to the",
|
|
16970
|
+
"issue; in this phase it never creates a branch, edits the issue body,",
|
|
16971
|
+
"or pushes commits. Implementation is the worker's job.",
|
|
16760
16972
|
"",
|
|
16761
16973
|
"If the worker's final line is missing, malformed, or indicates an",
|
|
16762
16974
|
"error, **do not retry** in the same orchestrator session \u2014 log the",
|
|
@@ -16783,7 +16995,7 @@ var orchestratorSubAgent = {
|
|
|
16783
16995
|
"## Rules",
|
|
16784
16996
|
"",
|
|
16785
16997
|
"1. **Never implement code.** You triage, scan, and delegate \u2014 you do not code.",
|
|
16786
|
-
"2. **
|
|
16998
|
+
"2. **Claim at pick, and only the label.** Claim the picked issue yourself in Phase E \u2014 re-read its labels, post an `<!-- issue-claim -->` marker, then flip `status:ready` \u2192 `status:in-progress` \u2014 **before** dispatching in Phase G (claim-at-pick, fleet anti-collision). This closes the double-dispatch window in which a sibling runner would otherwise pick the same still-`status:ready` issue. The flip is a normal claim transition, not a `status:needs-attention` flag, so removing `status:ready` here is correct. The claim-label flip is the **only** mutation you make to an issue: never create branches, write code, edit issue bodies, or push commits \u2014 the `issue-worker` still owns branch \u2192 implement \u2192 commit \u2192 PR.",
|
|
16787
16999
|
"3. **Always use procedure scripts.** Issue triage queries go through `.claude/procedures/check-blocked.sh`; PR-eligibility filtering (Phase B) goes through `.claude/procedures/pr-sweep.sh review`; the feedback-drain enumeration (Phase B1) goes through `.claude/procedures/pr-sweep.sh needs-worker`. Never iterate raw `gh issue list` / `gh pr list` JSON in-context.",
|
|
16788
17000
|
"4. **Follow CLAUDE.md conventions** for all git and gh operations.",
|
|
16789
17001
|
"5. **Priority order:** critical > high > medium > low > trivial, then **funnel tier asc** (lower tier wins ties), then FIFO by issue number.",
|
|
@@ -16998,15 +17210,31 @@ var issueWorkerSubAgent = {
|
|
|
16998
17210
|
"",
|
|
16999
17211
|
"**Normal mode:**",
|
|
17000
17212
|
"",
|
|
17001
|
-
"
|
|
17002
|
-
|
|
17003
|
-
"
|
|
17213
|
+
"Follow the **Claim verification** protocol below before you branch \u2014 do",
|
|
17214
|
+
"not blind-flip the label:",
|
|
17215
|
+
"",
|
|
17216
|
+
"- **Dispatched by the orchestrator (claim-at-pick).** Your brief states",
|
|
17217
|
+
" the issue is already `status:in-progress` with an issue-claim marker",
|
|
17218
|
+
" this dispatch posted. Confirm that marker is the earliest claim",
|
|
17219
|
+
" marker on the issue, then proceed \u2014 do **not** re-add `status:ready`",
|
|
17220
|
+
" or re-flip the label.",
|
|
17221
|
+
"- **Interactive or otherwise unclaimed (`status:ready`).** Claim it",
|
|
17222
|
+
` yourself: post an \`${ISSUE_CLAIM_MARKER_TAG}\` marker, then flip:`,
|
|
17223
|
+
" ```bash",
|
|
17224
|
+
" ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
17225
|
+
` gh issue comment <number> --body "${ISSUE_CLAIM_MARKER_TAG} Claimed $ts by issue-worker \u2014 fleet anti-collision."`,
|
|
17226
|
+
' gh issue edit <number> --remove-label "status:ready" --add-label "status:in-progress"',
|
|
17227
|
+
" ```",
|
|
17228
|
+
"- **Foreign prior claim.** If an earlier issue-claim marker from another",
|
|
17229
|
+
" dispatch exists, back off without writing artifacts (see below).",
|
|
17004
17230
|
"",
|
|
17005
17231
|
"Read the full issue details:",
|
|
17006
17232
|
"```bash",
|
|
17007
17233
|
"gh issue view <number>",
|
|
17008
17234
|
"```",
|
|
17009
17235
|
"",
|
|
17236
|
+
...renderClaimVerificationSection(),
|
|
17237
|
+
"",
|
|
17010
17238
|
"## Phase 3: Set Up",
|
|
17011
17239
|
"",
|
|
17012
17240
|
"**Feedback mode:** Do **not** check out the default branch and do **not**",
|
|
@@ -17546,9 +17774,10 @@ var ORCHESTRATOR_CONVENTIONS_PREAMBLE = [
|
|
|
17546
17774
|
"When running the orchestrator agent (`.claude/agents/orchestrator.md`):",
|
|
17547
17775
|
"",
|
|
17548
17776
|
"- The orchestrator runs **one full end-to-end cycle every invocation**: startup \u2192 PR review sweep \u2192 feedback drain \u2192 triage / unblock \u2192 maintenance \u2192 queue scan \u2192 delegate to `issue-worker` \u2192 cleanup",
|
|
17549
|
-
"- The orchestrator **never** implements code, creates branches, or pushes commits \u2014 it routes work to other sub-agents. The merge decision is still owned by the `pr-reviewer` sub-agent; Phase B only chooses which open PRs the reviewer should look at and dispatches one reviewer session per eligible PR (skipping drafts
|
|
17777
|
+
"- The orchestrator **never** implements code, creates branches, or pushes commits \u2014 it routes work to other sub-agents. Its **only** issue mutation is the claim-at-pick label flip (Phase E, see below). The merge decision is still owned by the `pr-reviewer` sub-agent; Phase B only chooses which open PRs the reviewer should look at and dispatches one reviewer session per eligible PR (skipping drafts, any PR carrying `review:human-required` or `review:awaiting-human`, and any PR with a review already in flight).",
|
|
17778
|
+
"- **Fleet anti-collision.** When several orchestrator runners share one GitHub queue, two guards stop duplicate dispatch. **Claim-at-pick:** in Phase E, once the scope gate passes, the orchestrator re-reads the picked issue's labels (skipping to the next candidate if it is no longer `status:ready`), posts an `<!-- issue-claim -->` marker, and flips `status:ready` \u2192 `status:in-progress` itself **before** dispatching in Phase G \u2014 collapsing the window in which a sibling runner would re-pick the same issue. The Phase G dispatch brief tells the worker the label was pre-flipped so it does not treat the claim as foreign. **Review-in-flight:** `pr-sweep.sh review` skips (`reason=review-in-flight`) any PR whose newest `## Reviewer*` comment is younger than the review-in-flight window, so overlapping runners do not both dispatch a reviewer on the same PR. The dispatched `issue-worker` and every phased analyst carry a matching **Claim verification** backstop that verifies claim ownership by issue-claim-marker ordering and backs off without writing artifacts on a foreign prior claim.",
|
|
17550
17779
|
"- **Phase B produces `review:needs-worker` markers; Phase B1 consumes them.** Phase B's `pr-reviewer` dispatch leaves a durable `review:needs-worker` marker whenever it delegates a fix-list (it cannot spawn the worker in session \u2014 it may run at depth-1). Phase B1 (feedback drain) actively drains that queue every cycle: it dispatches a top-level `issue-worker` per open `review:needs-worker` PR \u2014 highest-priority first, looping until the queue is empty \u2014 to consume the reviewer's fix-list. **Feedback PRs are preferred over fresh issues**, so Phase B1 runs after the review sweep but before the queue scan (Phase E) and fresh delegation (Phase G). A PR that also carries the `review:fixing` lease still drains **unless a worker is demonstrably active** \u2014 the reviewer acquires the lease and applies the marker in one atomic pass and holds the lease across sessions, so the bare lease does not mean a worker is running. The drain judges 'active' with the same `delegation_active_signals` helper the maintenance lease-reconcile uses: it skips only when there is no reviewer fix-list (`reason=no-fixlist`), a worker-report already landed (`reason=reported`), or the branch HEAD advanced past the fix-list (`reason=in-flight`); otherwise the delegated-but-idle PR drains so its FIRST worker gets dispatched.",
|
|
17551
|
-
"- All triage queries use `.claude/procedures/check-blocked.sh` for token efficiency. PR-eligibility filtering for Phase B uses `.claude/procedures/pr-sweep.sh review`, which emits `PR_ELIGIBLE` / `PR_SKIP
|
|
17780
|
+
"- All triage queries use `.claude/procedures/check-blocked.sh` for token efficiency. PR-eligibility filtering for Phase B uses `.claude/procedures/pr-sweep.sh review`, which emits `PR_ELIGIBLE` / `PR_SKIP reason=<draft|human-required|awaiting-human|review-in-flight>` lines; the Phase B1 feedback-drain enumeration uses `.claude/procedures/pr-sweep.sh needs-worker`, which emits `PR_DRAIN` / `PR_SKIP reason=<no-fixlist|reported|in-flight>` lines. The orchestrator never iterates raw `gh pr list` JSON.",
|
|
17552
17781
|
"- The queue scan reads only `priority:*` and `status:*` labels \u2014 type-routing (which typed agent handles a given `type:*` label) is the `issue-worker`'s concern, not the orchestrator's. The orchestrator's funnel-tier sort is a tie-breaker on `priority:*`, not a routing decision.",
|
|
17553
17782
|
"- Priority order: critical > high > medium > low > trivial, then **funnel tier asc** (lower tier wins ties), then FIFO by issue number. Phase E's queue scan walks each priority bucket in turn (one `gh issue list` call per bucket, **capped at 50 issues per bucket**) and short-circuits on the first bucket whose survivors clear the `Depends on:` filter, so every higher-priority issue is visible even when the global ready backlog is much larger than 50.",
|
|
17554
17783
|
"- Stale thresholds: 72h for in-progress, 168h for blocked",
|
|
@@ -17940,6 +18169,10 @@ function buildPeopleProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
17940
18169
|
"",
|
|
17941
18170
|
"---",
|
|
17942
18171
|
"",
|
|
18172
|
+
...renderClaimVerificationSection(),
|
|
18173
|
+
"",
|
|
18174
|
+
"---",
|
|
18175
|
+
"",
|
|
17943
18176
|
"## Phase 1: Research (`people:research`)",
|
|
17944
18177
|
"",
|
|
17945
18178
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -22062,6 +22295,10 @@ function buildRegulatoryResearchAnalystSubAgent(paths, issueDefaults) {
|
|
|
22062
22295
|
"",
|
|
22063
22296
|
"---",
|
|
22064
22297
|
"",
|
|
22298
|
+
...renderClaimVerificationSection(),
|
|
22299
|
+
"",
|
|
22300
|
+
"---",
|
|
22301
|
+
"",
|
|
22065
22302
|
"## Phase 1: Scan (`regulatory:scan`)",
|
|
22066
22303
|
"",
|
|
22067
22304
|
"**Goal:** Enumerate regulations applicable to a given scope \u2014",
|
|
@@ -25251,6 +25488,10 @@ function buildRequirementsWriterSubAgent(paths) {
|
|
|
25251
25488
|
"",
|
|
25252
25489
|
"---",
|
|
25253
25490
|
"",
|
|
25491
|
+
...renderClaimVerificationSection(),
|
|
25492
|
+
"",
|
|
25493
|
+
"---",
|
|
25494
|
+
"",
|
|
25254
25495
|
"## The `req:write` Issue Schema",
|
|
25255
25496
|
"",
|
|
25256
25497
|
"This section is the **authoritative schema** for `req:write` issue",
|
|
@@ -25887,6 +26128,10 @@ function buildRequirementsAnalystSubAgent(paths, issueDefaults) {
|
|
|
25887
26128
|
"",
|
|
25888
26129
|
"---",
|
|
25889
26130
|
"",
|
|
26131
|
+
...renderClaimVerificationSection(),
|
|
26132
|
+
"",
|
|
26133
|
+
"---",
|
|
26134
|
+
"",
|
|
25890
26135
|
"## Phase 1: Scan (`req:scan`)",
|
|
25891
26136
|
"",
|
|
25892
26137
|
"**Goal:** Read source documents, identify where requirements are missing,",
|
|
@@ -26475,6 +26720,10 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
|
|
|
26475
26720
|
"",
|
|
26476
26721
|
"---",
|
|
26477
26722
|
"",
|
|
26723
|
+
...renderClaimVerificationSection(),
|
|
26724
|
+
"",
|
|
26725
|
+
"---",
|
|
26726
|
+
"",
|
|
26478
26727
|
"## Phase Router",
|
|
26479
26728
|
"",
|
|
26480
26729
|
"Before reading any documents, classify the session by reading the",
|
|
@@ -27852,6 +28101,10 @@ function buildResearchAnalystSubAgent(paths) {
|
|
|
27852
28101
|
"",
|
|
27853
28102
|
"---",
|
|
27854
28103
|
"",
|
|
28104
|
+
...renderClaimVerificationSection(),
|
|
28105
|
+
"",
|
|
28106
|
+
"---",
|
|
28107
|
+
"",
|
|
27855
28108
|
"## Phase 1: Scope (`research:scope`)",
|
|
27856
28109
|
"",
|
|
27857
28110
|
"**Goal:** Turn a natural-language research question into a bounded",
|
|
@@ -28591,6 +28844,10 @@ function buildSoftwareProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
28591
28844
|
"",
|
|
28592
28845
|
"---",
|
|
28593
28846
|
"",
|
|
28847
|
+
...renderClaimVerificationSection(),
|
|
28848
|
+
"",
|
|
28849
|
+
"---",
|
|
28850
|
+
"",
|
|
28594
28851
|
"## Phase 1: Research (`software:research`)",
|
|
28595
28852
|
"",
|
|
28596
28853
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -29713,6 +29970,10 @@ function buildStandardsResearchAnalystSubAgent(paths, issueDefaults) {
|
|
|
29713
29970
|
"",
|
|
29714
29971
|
"---",
|
|
29715
29972
|
"",
|
|
29973
|
+
...renderClaimVerificationSection(),
|
|
29974
|
+
"",
|
|
29975
|
+
"---",
|
|
29976
|
+
"",
|
|
29716
29977
|
"## Phase 1: Scope (`standards:scope`)",
|
|
29717
29978
|
"",
|
|
29718
29979
|
"**Goal:** Plan the research campaign for a standard \u2014 identify which",
|
|
@@ -31557,23 +31818,23 @@ var VERSION = {
|
|
|
31557
31818
|
/**
|
|
31558
31819
|
* Version of Astro to pin for AstroProject scaffolding.
|
|
31559
31820
|
*/
|
|
31560
|
-
ASTRO_VERSION: "7.
|
|
31821
|
+
ASTRO_VERSION: "7.1.3",
|
|
31561
31822
|
/**
|
|
31562
31823
|
* CDK CLI for workflows and command line operations.
|
|
31563
31824
|
*
|
|
31564
31825
|
* CLI and lib are versioned separately, so this is the CLI version.
|
|
31565
31826
|
*/
|
|
31566
|
-
AWS_CDK_CLI_VERSION: "2.
|
|
31827
|
+
AWS_CDK_CLI_VERSION: "2.1132.1",
|
|
31567
31828
|
/**
|
|
31568
31829
|
* CDK Version to use for construct projects.
|
|
31569
31830
|
*
|
|
31570
31831
|
* CLI and lib are versioned separately, so this is the lib version.
|
|
31571
31832
|
*/
|
|
31572
|
-
AWS_CDK_LIB_VERSION: "2.
|
|
31833
|
+
AWS_CDK_LIB_VERSION: "2.262.0",
|
|
31573
31834
|
/**
|
|
31574
31835
|
* Version of the AWS Constructs library to use.
|
|
31575
31836
|
*/
|
|
31576
|
-
AWS_CONSTRUCTS_VERSION: "10.
|
|
31837
|
+
AWS_CONSTRUCTS_VERSION: "10.7.1",
|
|
31577
31838
|
/**
|
|
31578
31839
|
* Version of Node.js to use in CI workflows at github actions.
|
|
31579
31840
|
*/
|
|
@@ -31586,7 +31847,7 @@ var VERSION = {
|
|
|
31586
31847
|
/**
|
|
31587
31848
|
* Version of PNPM to use in workflows at github actions.
|
|
31588
31849
|
*/
|
|
31589
|
-
PNPM_VERSION: "11.
|
|
31850
|
+
PNPM_VERSION: "11.16.0",
|
|
31590
31851
|
/**
|
|
31591
31852
|
* Version of Projen to use.
|
|
31592
31853
|
*/
|
|
@@ -31604,11 +31865,11 @@ var VERSION = {
|
|
|
31604
31865
|
/**
|
|
31605
31866
|
* Version of `@astrojs/starlight` to pin for StarlightProject scaffolding.
|
|
31606
31867
|
*/
|
|
31607
|
-
STARLIGHT_VERSION: "0.41.
|
|
31868
|
+
STARLIGHT_VERSION: "0.41.4",
|
|
31608
31869
|
/**
|
|
31609
31870
|
* What version of the turborepo library should we use?
|
|
31610
31871
|
*/
|
|
31611
|
-
TURBO_VERSION: "2.10.
|
|
31872
|
+
TURBO_VERSION: "2.10.6",
|
|
31612
31873
|
/**
|
|
31613
31874
|
* Version of `@types/node` to use across all packages (pnpm catalog).
|
|
31614
31875
|
*/
|