@codedrifters/configulator 0.0.397 → 0.0.399
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 +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +292 -31
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +292 -31
- package/lib/index.mjs.map +1 -1
- package/package.json +2 -2
package/lib/index.d.mts
CHANGED
|
@@ -10671,7 +10671,7 @@ declare const VERSION: {
|
|
|
10671
10671
|
*
|
|
10672
10672
|
* CLI and lib are versioned separately, so this is the CLI version.
|
|
10673
10673
|
*/
|
|
10674
|
-
readonly AWS_CDK_CLI_VERSION: "2.
|
|
10674
|
+
readonly AWS_CDK_CLI_VERSION: "2.1133.0";
|
|
10675
10675
|
/**
|
|
10676
10676
|
* CDK Version to use for construct projects.
|
|
10677
10677
|
*
|
|
@@ -10694,7 +10694,7 @@ declare const VERSION: {
|
|
|
10694
10694
|
/**
|
|
10695
10695
|
* Version of PNPM to use in workflows at github actions.
|
|
10696
10696
|
*/
|
|
10697
|
-
readonly PNPM_VERSION: "11.
|
|
10697
|
+
readonly PNPM_VERSION: "11.17.0";
|
|
10698
10698
|
/**
|
|
10699
10699
|
* Version of Projen to use.
|
|
10700
10700
|
*/
|
package/lib/index.d.ts
CHANGED
|
@@ -10720,7 +10720,7 @@ declare const VERSION: {
|
|
|
10720
10720
|
*
|
|
10721
10721
|
* CLI and lib are versioned separately, so this is the CLI version.
|
|
10722
10722
|
*/
|
|
10723
|
-
readonly AWS_CDK_CLI_VERSION: "2.
|
|
10723
|
+
readonly AWS_CDK_CLI_VERSION: "2.1133.0";
|
|
10724
10724
|
/**
|
|
10725
10725
|
* CDK Version to use for construct projects.
|
|
10726
10726
|
*
|
|
@@ -10743,7 +10743,7 @@ declare const VERSION: {
|
|
|
10743
10743
|
/**
|
|
10744
10744
|
* Version of PNPM to use in workflows at github actions.
|
|
10745
10745
|
*/
|
|
10746
|
-
readonly PNPM_VERSION: "11.
|
|
10746
|
+
readonly PNPM_VERSION: "11.17.0";
|
|
10747
10747
|
/**
|
|
10748
10748
|
* Version of Projen to use.
|
|
10749
10749
|
*/
|
package/lib/index.js
CHANGED
|
@@ -562,6 +562,72 @@ var MCP_TRANSPORT = {
|
|
|
562
562
|
SSE: "sse"
|
|
563
563
|
};
|
|
564
564
|
|
|
565
|
+
// src/agent/bundles/claim-verification.ts
|
|
566
|
+
var ISSUE_CLAIM_MARKER_TAG = "<!-- issue-claim -->";
|
|
567
|
+
var CLAIM_MARKER_LIST_JQ = `[.comments[] | select(.body | contains("${ISSUE_CLAIM_MARKER_TAG}")) | {id, createdAt}] | sort_by(.createdAt, .id)`;
|
|
568
|
+
function renderClaimVerificationSection() {
|
|
569
|
+
return [
|
|
570
|
+
"## Claim verification",
|
|
571
|
+
"",
|
|
572
|
+
"Before you create a branch or write any artifacts, verify you own the",
|
|
573
|
+
"claim on the issue. This governs the `status:ready` \u2192",
|
|
574
|
+
"`status:in-progress` transition. In fleet deployments several",
|
|
575
|
+
"orchestrator runners share one GitHub queue, so a bare label flip does",
|
|
576
|
+
"not by itself guarantee you are the only session working the issue \u2014",
|
|
577
|
+
"two runners can scan the queue in the same window and both claim it",
|
|
578
|
+
"(fleet anti-collision).",
|
|
579
|
+
"",
|
|
580
|
+
"### The issue-claim marker",
|
|
581
|
+
"",
|
|
582
|
+
"Ownership is recorded by a single claim-marker comment on the issue.",
|
|
583
|
+
"Whoever claims the issue \u2014 the orchestrator at pick time",
|
|
584
|
+
"(claim-at-pick), or you, when you claim an unclaimed issue yourself \u2014",
|
|
585
|
+
"posts exactly one:",
|
|
586
|
+
"",
|
|
587
|
+
"```",
|
|
588
|
+
`${ISSUE_CLAIM_MARKER_TAG} Claimed <ISO-8601 UTC> by <claimant> \u2014 fleet anti-collision.`,
|
|
589
|
+
"```",
|
|
590
|
+
"",
|
|
591
|
+
"The **owner is the earliest** claim marker \u2014 the",
|
|
592
|
+
`\`${ISSUE_CLAIM_MARKER_TAG}\` comment with the lowest \`createdAt\``,
|
|
593
|
+
"(tie-broken on the lowest comment id). List the markers in claim order",
|
|
594
|
+
"with:",
|
|
595
|
+
"",
|
|
596
|
+
"```bash",
|
|
597
|
+
"gh issue view <n> --json comments \\",
|
|
598
|
+
` --jq '${CLAIM_MARKER_LIST_JQ}'`,
|
|
599
|
+
"```",
|
|
600
|
+
"",
|
|
601
|
+
"### Verify or claim",
|
|
602
|
+
"",
|
|
603
|
+
"1. **Pre-claimed at pick.** If your dispatch brief says the orchestrator",
|
|
604
|
+
" already flipped the label (claim-at-pick) and cites the marker it",
|
|
605
|
+
" posted, confirm that marker is the **earliest** claim marker on the",
|
|
606
|
+
" issue, then proceed. Do **not** re-add `status:ready` and do **not**",
|
|
607
|
+
" re-flip the label \u2014 the claim is already yours.",
|
|
608
|
+
"2. **Unclaimed (`status:ready`).** Claim it yourself: **first** post the",
|
|
609
|
+
` \`${ISSUE_CLAIM_MARKER_TAG}\` marker comment, **then** flip`,
|
|
610
|
+
" `status:ready` \u2192 `status:in-progress`. Re-read the markers; proceed",
|
|
611
|
+
" only if the marker you just posted is the earliest.",
|
|
612
|
+
"3. **Foreign prior claim \u2192 back off.** If a claim marker from another",
|
|
613
|
+
" dispatch is **earlier** than yours \u2014 or the issue is already",
|
|
614
|
+
" `status:in-progress` with a foreign marker and your dispatch brief",
|
|
615
|
+
" did not claim it for you \u2014 a sibling runner owns the issue. **Back",
|
|
616
|
+
" off cleanly and write no artifacts**: no branch, no files, no PR, and",
|
|
617
|
+
" no completion or duplicate-output comment. Log",
|
|
618
|
+
" `CLAIM_CONFLICT #<n> owner=<earliest-marker-id>` and stop the session.",
|
|
619
|
+
"",
|
|
620
|
+
"Backing off on a foreign claim is the analyst-side backstop to the",
|
|
621
|
+
"orchestrator's claim-at-pick guard: claim-at-pick closes the common",
|
|
622
|
+
"multi-minute window between the queue scan and the claim, and this",
|
|
623
|
+
"check absorbs the sub-second residual race where two runners both",
|
|
624
|
+
"scanned before either flipped the label. If you discover a foreign",
|
|
625
|
+
"prior claim **mid-execution** \u2014 after you have already begun a phase \u2014",
|
|
626
|
+
"stop immediately and discard the uncommitted work rather than opening a",
|
|
627
|
+
"second PR or writing a duplicate artifact for the issue."
|
|
628
|
+
];
|
|
629
|
+
}
|
|
630
|
+
|
|
565
631
|
// src/agent/bundles/project-context.ts
|
|
566
632
|
var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
|
|
567
633
|
var SUBPROJECT_ROLE_GUIDANCE = [
|
|
@@ -838,6 +904,10 @@ var agendaAnalystSubAgent = {
|
|
|
838
904
|
"",
|
|
839
905
|
"---",
|
|
840
906
|
"",
|
|
907
|
+
...renderClaimVerificationSection(),
|
|
908
|
+
"",
|
|
909
|
+
"---",
|
|
910
|
+
"",
|
|
841
911
|
"## Phase 1: Draft (`agenda:draft`)",
|
|
842
912
|
"",
|
|
843
913
|
"**Goal:** Produce a well-structured `agenda.md` in the meeting's",
|
|
@@ -5249,6 +5319,10 @@ function buildBcmWriterSubAgent(paths, issueDefaults) {
|
|
|
5249
5319
|
"",
|
|
5250
5320
|
"---",
|
|
5251
5321
|
"",
|
|
5322
|
+
...renderClaimVerificationSection(),
|
|
5323
|
+
"",
|
|
5324
|
+
"---",
|
|
5325
|
+
"",
|
|
5252
5326
|
"## Phase 1: Outline (`bcm:outline`)",
|
|
5253
5327
|
"",
|
|
5254
5328
|
"**Goal:** Identify the capability (name-as-noun, business object, tier)",
|
|
@@ -6138,6 +6212,10 @@ function buildBusinessModelsAnalystSubAgent(paths) {
|
|
|
6138
6212
|
"",
|
|
6139
6213
|
"---",
|
|
6140
6214
|
"",
|
|
6215
|
+
...renderClaimVerificationSection(),
|
|
6216
|
+
"",
|
|
6217
|
+
"---",
|
|
6218
|
+
"",
|
|
6141
6219
|
"## Phase 1: Scan (`business-models:scan`)",
|
|
6142
6220
|
"",
|
|
6143
6221
|
"**Goal:** Read upstream industry and profile artifacts to identify",
|
|
@@ -7031,6 +7109,10 @@ function buildCompanyProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
7031
7109
|
"",
|
|
7032
7110
|
"---",
|
|
7033
7111
|
"",
|
|
7112
|
+
...renderClaimVerificationSection(),
|
|
7113
|
+
"",
|
|
7114
|
+
"---",
|
|
7115
|
+
"",
|
|
7034
7116
|
"## Phase 1: Research (`company:research`)",
|
|
7035
7117
|
"",
|
|
7036
7118
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -8460,6 +8542,10 @@ function buildCustomerProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
8460
8542
|
"",
|
|
8461
8543
|
"---",
|
|
8462
8544
|
"",
|
|
8545
|
+
...renderClaimVerificationSection(),
|
|
8546
|
+
"",
|
|
8547
|
+
"---",
|
|
8548
|
+
"",
|
|
8463
8549
|
"## Phase 1: Discover (`customer:discover`)",
|
|
8464
8550
|
"",
|
|
8465
8551
|
"**Goal:** Identify and segment the customer archetypes relevant to",
|
|
@@ -11073,6 +11159,10 @@ function buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults) {
|
|
|
11073
11159
|
"",
|
|
11074
11160
|
"---",
|
|
11075
11161
|
"",
|
|
11162
|
+
...renderClaimVerificationSection(),
|
|
11163
|
+
"",
|
|
11164
|
+
"---",
|
|
11165
|
+
"",
|
|
11076
11166
|
"## Phase 1: Discover (`industry:discover`)",
|
|
11077
11167
|
"",
|
|
11078
11168
|
"**Goal:** Enumerate candidate industry verticals into a bounded",
|
|
@@ -11625,6 +11715,10 @@ function buildMaintenanceAuditSubAgent(paths, tier) {
|
|
|
11625
11715
|
"",
|
|
11626
11716
|
"---",
|
|
11627
11717
|
"",
|
|
11718
|
+
...renderClaimVerificationSection(),
|
|
11719
|
+
"",
|
|
11720
|
+
"---",
|
|
11721
|
+
"",
|
|
11628
11722
|
"## Phase 1: Scan (`maint:scan`)",
|
|
11629
11723
|
"",
|
|
11630
11724
|
"**Goal:** Walk the configured doc tree, check every cross-reference",
|
|
@@ -12509,6 +12603,10 @@ function buildMeetingAnalystSubAgent(tier) {
|
|
|
12509
12603
|
"",
|
|
12510
12604
|
"---",
|
|
12511
12605
|
"",
|
|
12606
|
+
...renderClaimVerificationSection(),
|
|
12607
|
+
"",
|
|
12608
|
+
"---",
|
|
12609
|
+
"",
|
|
12512
12610
|
"## Phase 1: Extract (`meeting:extract`)",
|
|
12513
12611
|
"",
|
|
12514
12612
|
"**Goal:** Read the available meeting inputs (notes, transcript, or both)",
|
|
@@ -15366,6 +15464,7 @@ function shellSingleQuote(value) {
|
|
|
15366
15464
|
}
|
|
15367
15465
|
|
|
15368
15466
|
// src/agent/bundles/orchestrator.ts
|
|
15467
|
+
var REVIEW_IN_FLIGHT_WINDOW_MINUTES = 15;
|
|
15369
15468
|
function renderDelegationActiveSignalsHelper() {
|
|
15370
15469
|
return [
|
|
15371
15470
|
"# delegation_active_signals <pr-number> <head-oid>",
|
|
@@ -16293,6 +16392,9 @@ function buildPrSweepScript() {
|
|
|
16293
16392
|
"# - isDraft = true \u2192 reason=draft",
|
|
16294
16393
|
"# - review:human-required label \u2192 reason=human-required",
|
|
16295
16394
|
"# - review:awaiting-human label \u2192 reason=awaiting-human",
|
|
16395
|
+
"# - newest ## Reviewer* comment younger than the review-in-flight",
|
|
16396
|
+
"# window (a sibling runner's review is already in flight this",
|
|
16397
|
+
"# cycle) \u2192 reason=review-in-flight",
|
|
16296
16398
|
"#",
|
|
16297
16399
|
"# Needs-worker-mode skip rules (PR carries review:needs-worker but is",
|
|
16298
16400
|
"# not eligible to drain this cycle). A PR with NO review:fixing lease",
|
|
@@ -16316,6 +16418,11 @@ function buildPrSweepScript() {
|
|
|
16316
16418
|
"",
|
|
16317
16419
|
"set -uo pipefail",
|
|
16318
16420
|
"",
|
|
16421
|
+
"# Review-in-flight window in seconds \u2014 a PR whose newest reviewer",
|
|
16422
|
+
"# comment is younger than this is treated as under active review by a",
|
|
16423
|
+
"# sibling runner (fleet anti-collision).",
|
|
16424
|
+
`REVIEW_IN_FLIGHT_WINDOW_SECONDS=${REVIEW_IN_FLIGHT_WINDOW_MINUTES * 60}`,
|
|
16425
|
+
"",
|
|
16319
16426
|
"# \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",
|
|
16320
16427
|
"",
|
|
16321
16428
|
"# Resolve the linked issue's priority for a PR so the needs-worker",
|
|
@@ -16345,6 +16452,31 @@ function buildPrSweepScript() {
|
|
|
16345
16452
|
" esac",
|
|
16346
16453
|
"}",
|
|
16347
16454
|
"",
|
|
16455
|
+
"# Fleet anti-collision: echo the age in",
|
|
16456
|
+
"# whole seconds of a PR's newest `## Reviewer*` comment, or `none` when",
|
|
16457
|
+
"# the PR has no reviewer comment yet (or the read fails). The age is",
|
|
16458
|
+
"# derived from the newest reviewer comment's `updatedAt` (fall back to",
|
|
16459
|
+
"# `createdAt`) so an in-place edit of the sticky `## Reviewer notes`",
|
|
16460
|
+
"# comment counts as fresh activity, and it is computed inside jq",
|
|
16461
|
+
"# (`now - fromdateiso8601`, clamped at 0) so no non-portable `date`",
|
|
16462
|
+
"# parsing is needed. The raw JSON is piped through the caller's jq (not",
|
|
16463
|
+
"# gh's `--jq`), mirroring cmd_review's `gh pr list` handling.",
|
|
16464
|
+
"newest_reviewer_comment_age_seconds() {",
|
|
16465
|
+
' local pr_num="$1"',
|
|
16466
|
+
" local json",
|
|
16467
|
+
' json=$(gh pr view "$pr_num" --json comments 2>/dev/null) || { echo "none"; return; }',
|
|
16468
|
+
' [[ -z "$json" ]] && { echo "none"; return; }',
|
|
16469
|
+
` echo "$json" | jq -r '`,
|
|
16470
|
+
" [ .comments[]?",
|
|
16471
|
+
' | select(.body | startswith("## Reviewer"))',
|
|
16472
|
+
" | (.updatedAt // .createdAt)",
|
|
16473
|
+
" | fromdateiso8601",
|
|
16474
|
+
" ] as $ts",
|
|
16475
|
+
' | if ($ts | length) == 0 then "none"',
|
|
16476
|
+
" else ((now - ($ts | max)) | floor | if . < 0 then 0 else . end) end",
|
|
16477
|
+
` ' 2>/dev/null || echo "none"`,
|
|
16478
|
+
"}",
|
|
16479
|
+
"",
|
|
16348
16480
|
...renderDelegationActiveSignalsHelper(),
|
|
16349
16481
|
"",
|
|
16350
16482
|
"# \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",
|
|
@@ -16361,22 +16493,47 @@ function buildPrSweepScript() {
|
|
|
16361
16493
|
" return 0",
|
|
16362
16494
|
" fi",
|
|
16363
16495
|
"",
|
|
16364
|
-
" #
|
|
16365
|
-
" #
|
|
16366
|
-
|
|
16496
|
+
" # First pass (jq, no per-PR reads): classify each PR from the labels",
|
|
16497
|
+
" # and draft flag already in the list JSON, sorted by PR number",
|
|
16498
|
+
" # ascending so the output order is deterministic across runs. A PR",
|
|
16499
|
+
" # that clears every cheap label/draft skip rule is a CANDIDATE \u2014 the",
|
|
16500
|
+
" # review-in-flight check (which needs a per-PR comment read) is",
|
|
16501
|
+
" # applied per-candidate in the loop below. Emit `kind\\tnumber\\treason`.",
|
|
16502
|
+
" local rows",
|
|
16503
|
+
` rows=$(echo "$prs" | jq -r '`,
|
|
16367
16504
|
" sort_by(.number) |",
|
|
16368
16505
|
" .[] |",
|
|
16369
16506
|
" (.labels | map(.name)) as $labels |",
|
|
16370
16507
|
" if .isDraft then",
|
|
16371
|
-
' "
|
|
16508
|
+
' "SKIP\\t\\(.number)\\tdraft"',
|
|
16372
16509
|
' elif ($labels | index("review:human-required")) then',
|
|
16373
|
-
' "
|
|
16510
|
+
' "SKIP\\t\\(.number)\\thuman-required"',
|
|
16374
16511
|
' elif ($labels | index("review:awaiting-human")) then',
|
|
16375
|
-
' "
|
|
16512
|
+
' "SKIP\\t\\(.number)\\tawaiting-human"',
|
|
16376
16513
|
" else",
|
|
16377
|
-
' "
|
|
16514
|
+
' "CANDIDATE\\t\\(.number)\\t"',
|
|
16378
16515
|
" end",
|
|
16379
|
-
" '",
|
|
16516
|
+
" ')",
|
|
16517
|
+
"",
|
|
16518
|
+
" while IFS=$'\\t' read -r kind pr_num reason; do",
|
|
16519
|
+
' [[ -z "$pr_num" ]] && continue',
|
|
16520
|
+
' if [[ "$kind" == "SKIP" ]]; then',
|
|
16521
|
+
' echo "PR_SKIP #${pr_num} reason=${reason}"',
|
|
16522
|
+
" continue",
|
|
16523
|
+
" fi",
|
|
16524
|
+
" # CANDIDATE \u2014 dispatch the reviewer UNLESS a sibling runner's review",
|
|
16525
|
+
" # is already in flight, i.e. the newest `## Reviewer*` comment is",
|
|
16526
|
+
" # younger than the review-in-flight window (fleet anti-collision).",
|
|
16527
|
+
" local age",
|
|
16528
|
+
' age=$(newest_reviewer_comment_age_seconds "$pr_num")',
|
|
16529
|
+
" # `age` is `none` (no reviewer comment / read failed) or a",
|
|
16530
|
+
" # non-negative integer; only a numeric age inside the window skips.",
|
|
16531
|
+
' if [[ "$age" =~ ^[0-9]+$ && "$age" -lt "$REVIEW_IN_FLIGHT_WINDOW_SECONDS" ]]; then',
|
|
16532
|
+
' echo "PR_SKIP #${pr_num} reason=review-in-flight"',
|
|
16533
|
+
" else",
|
|
16534
|
+
' echo "PR_ELIGIBLE #${pr_num}"',
|
|
16535
|
+
" fi",
|
|
16536
|
+
' done <<< "$rows"',
|
|
16380
16537
|
"}",
|
|
16381
16538
|
"",
|
|
16382
16539
|
"cmd_needs_worker() {",
|
|
@@ -16501,7 +16658,7 @@ function buildPrSweepScript() {
|
|
|
16501
16658
|
function buildPrSweepProcedure() {
|
|
16502
16659
|
return {
|
|
16503
16660
|
name: "pr-sweep.sh",
|
|
16504
|
-
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.",
|
|
16661
|
+
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.",
|
|
16505
16662
|
content: buildPrSweepScript()
|
|
16506
16663
|
};
|
|
16507
16664
|
}
|
|
@@ -16701,6 +16858,7 @@ var orchestratorSubAgent = {
|
|
|
16701
16858
|
"PR_SKIP #<n> reason=draft",
|
|
16702
16859
|
"PR_SKIP #<n> reason=human-required",
|
|
16703
16860
|
"PR_SKIP #<n> reason=awaiting-human",
|
|
16861
|
+
"PR_SKIP #<n> reason=review-in-flight",
|
|
16704
16862
|
"```",
|
|
16705
16863
|
"",
|
|
16706
16864
|
"Skip rules (PRs that never reach the reviewer in this sweep):",
|
|
@@ -16710,6 +16868,12 @@ var orchestratorSubAgent = {
|
|
|
16710
16868
|
" (operator override \u2014 the reviewer's auto-merge path is forbidden)",
|
|
16711
16869
|
"- Carries the `review:awaiting-human` label \u2192 `reason=awaiting-human`",
|
|
16712
16870
|
" (the reviewer already handed off; a human is the next actor)",
|
|
16871
|
+
`- Newest \`## Reviewer*\` comment younger than ${REVIEW_IN_FLIGHT_WINDOW_MINUTES} minutes \u2192`,
|
|
16872
|
+
" `reason=review-in-flight` (a sibling fleet runner's reviewer is",
|
|
16873
|
+
" already looking at this PR this cycle \u2014 dispatching a second reviewer",
|
|
16874
|
+
" would duplicate the review and race on the sticky notes / auto-merge",
|
|
16875
|
+
" decision). The procedure owns this timing check; do not second-guess",
|
|
16876
|
+
" it by dispatching a reviewer on a skipped PR.",
|
|
16713
16877
|
"",
|
|
16714
16878
|
"If the script emits `NO_OPEN_PRS`, log the empty result and skip",
|
|
16715
16879
|
"directly to Phase B1.",
|
|
@@ -17020,12 +17184,50 @@ var orchestratorSubAgent = {
|
|
|
17020
17184
|
"values reflect the override; the global thresholds are documented",
|
|
17021
17185
|
"in the **Scope gate** section in `CLAUDE.md`.",
|
|
17022
17186
|
"",
|
|
17023
|
-
"If the scope is `small` or `medium`,
|
|
17024
|
-
"
|
|
17025
|
-
"
|
|
17187
|
+
"If the scope is `small` or `medium`, the issue is dispatchable \u2014",
|
|
17188
|
+
"**claim it at pick** before proceeding to Phase G. Claim-at-pick",
|
|
17189
|
+
"collapses the multi-minute window between this queue scan and the",
|
|
17190
|
+
"dispatched worker's own claim, during which a sibling fleet runner",
|
|
17191
|
+
"scanning the same queue would otherwise see `status:ready` and",
|
|
17192
|
+
"dispatch a second worker on the same issue (fleet",
|
|
17193
|
+
"anti-collision):",
|
|
17194
|
+
"",
|
|
17195
|
+
"1. **Re-read the picked issue's labels** immediately before claiming:",
|
|
17196
|
+
" ```bash",
|
|
17197
|
+
" gh issue view <number> --json labels --jq '[.labels[].name]'",
|
|
17198
|
+
" ```",
|
|
17199
|
+
" If `status:ready` is **no longer present**, a sibling runner claimed",
|
|
17200
|
+
" the issue inside your scan window \u2014 do **not** dispatch. Return to",
|
|
17201
|
+
" the `PICK` list, take the next candidate, and re-run the scope check.",
|
|
17202
|
+
"2. **Post an issue-claim marker, then flip the label.** Post the marker",
|
|
17203
|
+
" first so ownership carries a server-side timestamp, then claim:",
|
|
17204
|
+
" ```bash",
|
|
17205
|
+
" ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
17206
|
+
` gh issue comment <number> --body "${ISSUE_CLAIM_MARKER_TAG} Claimed $ts by orchestrator claim-at-pick \u2014 fleet anti-collision."`,
|
|
17207
|
+
' gh issue edit <number> --remove-label "status:ready" --add-label "status:in-progress"',
|
|
17208
|
+
" ```",
|
|
17209
|
+
" This `status:ready` \u2192 `status:in-progress` flip is a normal claim",
|
|
17210
|
+
" transition, **not** a `status:needs-attention` flag, so removing",
|
|
17211
|
+
" `status:ready` here is correct (contrast the scope-gate large-issue",
|
|
17212
|
+
" path, which is additive and must keep the base status).",
|
|
17213
|
+
"3. **Confirm you won the race.** Re-list the issue-claim markers in",
|
|
17214
|
+
" claim order:",
|
|
17215
|
+
" ```bash",
|
|
17216
|
+
` gh issue view <number> --json comments --jq '${CLAIM_MARKER_LIST_JQ}'`,
|
|
17217
|
+
" ```",
|
|
17218
|
+
" If the **earliest** marker is not the one you just posted (a rare",
|
|
17219
|
+
" sub-second tie where a sibling claimed first), yield: leave the",
|
|
17220
|
+
" labels as they are \u2014 the sibling owns the issue \u2014 and take the next",
|
|
17221
|
+
" `PICK` candidate. Likewise take the next candidate if the flip in",
|
|
17222
|
+
" step 2 errored.",
|
|
17223
|
+
"",
|
|
17224
|
+
"Record the claimed issue as the next work item and proceed to Phase G",
|
|
17225
|
+
"(the `claim:at-pick` field records that this orchestrator session has",
|
|
17226
|
+
"already flipped the label, so the dispatch brief tells the worker not",
|
|
17227
|
+
"to treat it as a foreign claim):",
|
|
17026
17228
|
"",
|
|
17027
17229
|
"```",
|
|
17028
|
-
'NEXT_WORK_ITEM #<number> priority:<level> tier:<n> type:<label> scope:<small|medium> "<title>"',
|
|
17230
|
+
'NEXT_WORK_ITEM #<number> priority:<level> tier:<n> type:<label> scope:<small|medium> claim:at-pick "<title>"',
|
|
17029
17231
|
"```",
|
|
17030
17232
|
"",
|
|
17031
17233
|
"If the scope is `large`, **do not dispatch**. Instead:",
|
|
@@ -17070,10 +17272,14 @@ var orchestratorSubAgent = {
|
|
|
17070
17272
|
"If output is `NO_READY_ISSUES`, report that the queue is empty,",
|
|
17071
17273
|
"skip Phase G, and proceed directly to Phase F.",
|
|
17072
17274
|
"",
|
|
17073
|
-
"**
|
|
17074
|
-
"
|
|
17075
|
-
"
|
|
17076
|
-
"
|
|
17275
|
+
"**Claim only the label, and only at pick.** The claim-at-pick step",
|
|
17276
|
+
"above (re-read labels \u2192 post the issue-claim marker \u2192 flip",
|
|
17277
|
+
"`status:ready` \u2192 `status:in-progress`) is the **sole** mutation the",
|
|
17278
|
+
"orchestrator makes to an issue. Do **not** create a branch, edit the",
|
|
17279
|
+
"issue body, or start implementation yourself \u2014 Phase G hands the",
|
|
17280
|
+
"already-claimed issue off to the `issue-worker` sub-agent in scheduled",
|
|
17281
|
+
"mode, and the worker performs the branch \u2192 implement \u2192 commit \u2192 PR",
|
|
17282
|
+
"cycle.",
|
|
17077
17283
|
"",
|
|
17078
17284
|
"## Phase G: Delegate Implementation",
|
|
17079
17285
|
"",
|
|
@@ -17091,8 +17297,14 @@ var orchestratorSubAgent = {
|
|
|
17091
17297
|
"",
|
|
17092
17298
|
"Invoke the sub-agent with a single-message brief:",
|
|
17093
17299
|
"",
|
|
17094
|
-
"> `scheduled mode`: work issue #<number>.
|
|
17095
|
-
">
|
|
17300
|
+
"> `scheduled mode`: work issue #<number>. This orchestrator session",
|
|
17301
|
+
"> has **already claimed** the issue at pick time (claim-at-pick): it",
|
|
17302
|
+
"> is `status:in-progress` and carries an issue-claim marker",
|
|
17303
|
+
`> (\`${ISSUE_CLAIM_MARKER_TAG}\`) this dispatch posted. Treat that claim`,
|
|
17304
|
+
"> as **yours** \u2014 do not treat the existing `status:in-progress` as a",
|
|
17305
|
+
"> foreign claim, do not re-add `status:ready`, and skip your own claim",
|
|
17306
|
+
"> flip; per your Claim verification step, confirm that marker is the",
|
|
17307
|
+
"> earliest and proceed. Route to the appropriate typed agent if one",
|
|
17096
17308
|
"> applies, implement the change, run the verification commands,",
|
|
17097
17309
|
"> commit, push, and open a PR labeled `origin:issue-worker` that",
|
|
17098
17310
|
"> closes the issue. Do not pause for approval. Return a one-line",
|
|
@@ -17101,10 +17313,10 @@ var orchestratorSubAgent = {
|
|
|
17101
17313
|
"> `WORKER_FAILED issue:#<n> reason:<short reason>` on failure.",
|
|
17102
17314
|
"",
|
|
17103
17315
|
"Substitute `<number>` with the issue number from the",
|
|
17104
|
-
"`NEXT_WORK_ITEM` line in Phase E. The
|
|
17105
|
-
"
|
|
17106
|
-
"
|
|
17107
|
-
"the worker's job.",
|
|
17316
|
+
"`NEXT_WORK_ITEM` line in Phase E. The claim-at-pick label flip",
|
|
17317
|
+
"(Phase E) is the **only** mutation the orchestrator makes to the",
|
|
17318
|
+
"issue; in this phase it never creates a branch, edits the issue body,",
|
|
17319
|
+
"or pushes commits. Implementation is the worker's job.",
|
|
17108
17320
|
"",
|
|
17109
17321
|
"If the worker's final line is missing, malformed, or indicates an",
|
|
17110
17322
|
"error, **do not retry** in the same orchestrator session \u2014 log the",
|
|
@@ -17131,7 +17343,7 @@ var orchestratorSubAgent = {
|
|
|
17131
17343
|
"## Rules",
|
|
17132
17344
|
"",
|
|
17133
17345
|
"1. **Never implement code.** You triage, scan, and delegate \u2014 you do not code.",
|
|
17134
|
-
"2. **
|
|
17346
|
+
"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.",
|
|
17135
17347
|
"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.",
|
|
17136
17348
|
"4. **Follow CLAUDE.md conventions** for all git and gh operations.",
|
|
17137
17349
|
"5. **Priority order:** critical > high > medium > low > trivial, then **funnel tier asc** (lower tier wins ties), then FIFO by issue number.",
|
|
@@ -17346,15 +17558,31 @@ var issueWorkerSubAgent = {
|
|
|
17346
17558
|
"",
|
|
17347
17559
|
"**Normal mode:**",
|
|
17348
17560
|
"",
|
|
17349
|
-
"
|
|
17350
|
-
|
|
17351
|
-
"
|
|
17561
|
+
"Follow the **Claim verification** protocol below before you branch \u2014 do",
|
|
17562
|
+
"not blind-flip the label:",
|
|
17563
|
+
"",
|
|
17564
|
+
"- **Dispatched by the orchestrator (claim-at-pick).** Your brief states",
|
|
17565
|
+
" the issue is already `status:in-progress` with an issue-claim marker",
|
|
17566
|
+
" this dispatch posted. Confirm that marker is the earliest claim",
|
|
17567
|
+
" marker on the issue, then proceed \u2014 do **not** re-add `status:ready`",
|
|
17568
|
+
" or re-flip the label.",
|
|
17569
|
+
"- **Interactive or otherwise unclaimed (`status:ready`).** Claim it",
|
|
17570
|
+
` yourself: post an \`${ISSUE_CLAIM_MARKER_TAG}\` marker, then flip:`,
|
|
17571
|
+
" ```bash",
|
|
17572
|
+
" ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
17573
|
+
` gh issue comment <number> --body "${ISSUE_CLAIM_MARKER_TAG} Claimed $ts by issue-worker \u2014 fleet anti-collision."`,
|
|
17574
|
+
' gh issue edit <number> --remove-label "status:ready" --add-label "status:in-progress"',
|
|
17575
|
+
" ```",
|
|
17576
|
+
"- **Foreign prior claim.** If an earlier issue-claim marker from another",
|
|
17577
|
+
" dispatch exists, back off without writing artifacts (see below).",
|
|
17352
17578
|
"",
|
|
17353
17579
|
"Read the full issue details:",
|
|
17354
17580
|
"```bash",
|
|
17355
17581
|
"gh issue view <number>",
|
|
17356
17582
|
"```",
|
|
17357
17583
|
"",
|
|
17584
|
+
...renderClaimVerificationSection(),
|
|
17585
|
+
"",
|
|
17358
17586
|
"## Phase 3: Set Up",
|
|
17359
17587
|
"",
|
|
17360
17588
|
"**Feedback mode:** Do **not** check out the default branch and do **not**",
|
|
@@ -17894,9 +18122,10 @@ var ORCHESTRATOR_CONVENTIONS_PREAMBLE = [
|
|
|
17894
18122
|
"When running the orchestrator agent (`.claude/agents/orchestrator.md`):",
|
|
17895
18123
|
"",
|
|
17896
18124
|
"- 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",
|
|
17897
|
-
"- 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
|
|
18125
|
+
"- 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).",
|
|
18126
|
+
"- **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.",
|
|
17898
18127
|
"- **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.",
|
|
17899
|
-
"- 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
|
|
18128
|
+
"- 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.",
|
|
17900
18129
|
"- 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.",
|
|
17901
18130
|
"- 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.",
|
|
17902
18131
|
"- Stale thresholds: 72h for in-progress, 168h for blocked",
|
|
@@ -18288,6 +18517,10 @@ function buildPeopleProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
18288
18517
|
"",
|
|
18289
18518
|
"---",
|
|
18290
18519
|
"",
|
|
18520
|
+
...renderClaimVerificationSection(),
|
|
18521
|
+
"",
|
|
18522
|
+
"---",
|
|
18523
|
+
"",
|
|
18291
18524
|
"## Phase 1: Research (`people:research`)",
|
|
18292
18525
|
"",
|
|
18293
18526
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -22410,6 +22643,10 @@ function buildRegulatoryResearchAnalystSubAgent(paths, issueDefaults) {
|
|
|
22410
22643
|
"",
|
|
22411
22644
|
"---",
|
|
22412
22645
|
"",
|
|
22646
|
+
...renderClaimVerificationSection(),
|
|
22647
|
+
"",
|
|
22648
|
+
"---",
|
|
22649
|
+
"",
|
|
22413
22650
|
"## Phase 1: Scan (`regulatory:scan`)",
|
|
22414
22651
|
"",
|
|
22415
22652
|
"**Goal:** Enumerate regulations applicable to a given scope \u2014",
|
|
@@ -25599,6 +25836,10 @@ function buildRequirementsWriterSubAgent(paths) {
|
|
|
25599
25836
|
"",
|
|
25600
25837
|
"---",
|
|
25601
25838
|
"",
|
|
25839
|
+
...renderClaimVerificationSection(),
|
|
25840
|
+
"",
|
|
25841
|
+
"---",
|
|
25842
|
+
"",
|
|
25602
25843
|
"## The `req:write` Issue Schema",
|
|
25603
25844
|
"",
|
|
25604
25845
|
"This section is the **authoritative schema** for `req:write` issue",
|
|
@@ -26235,6 +26476,10 @@ function buildRequirementsAnalystSubAgent(paths, issueDefaults) {
|
|
|
26235
26476
|
"",
|
|
26236
26477
|
"---",
|
|
26237
26478
|
"",
|
|
26479
|
+
...renderClaimVerificationSection(),
|
|
26480
|
+
"",
|
|
26481
|
+
"---",
|
|
26482
|
+
"",
|
|
26238
26483
|
"## Phase 1: Scan (`req:scan`)",
|
|
26239
26484
|
"",
|
|
26240
26485
|
"**Goal:** Read source documents, identify where requirements are missing,",
|
|
@@ -26823,6 +27068,10 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
|
|
|
26823
27068
|
"",
|
|
26824
27069
|
"---",
|
|
26825
27070
|
"",
|
|
27071
|
+
...renderClaimVerificationSection(),
|
|
27072
|
+
"",
|
|
27073
|
+
"---",
|
|
27074
|
+
"",
|
|
26826
27075
|
"## Phase Router",
|
|
26827
27076
|
"",
|
|
26828
27077
|
"Before reading any documents, classify the session by reading the",
|
|
@@ -28200,6 +28449,10 @@ function buildResearchAnalystSubAgent(paths) {
|
|
|
28200
28449
|
"",
|
|
28201
28450
|
"---",
|
|
28202
28451
|
"",
|
|
28452
|
+
...renderClaimVerificationSection(),
|
|
28453
|
+
"",
|
|
28454
|
+
"---",
|
|
28455
|
+
"",
|
|
28203
28456
|
"## Phase 1: Scope (`research:scope`)",
|
|
28204
28457
|
"",
|
|
28205
28458
|
"**Goal:** Turn a natural-language research question into a bounded",
|
|
@@ -28939,6 +29192,10 @@ function buildSoftwareProfileAnalystSubAgent(paths, issueDefaults, tier) {
|
|
|
28939
29192
|
"",
|
|
28940
29193
|
"---",
|
|
28941
29194
|
"",
|
|
29195
|
+
...renderClaimVerificationSection(),
|
|
29196
|
+
"",
|
|
29197
|
+
"---",
|
|
29198
|
+
"",
|
|
28942
29199
|
"## Phase 1: Research (`software:research`)",
|
|
28943
29200
|
"",
|
|
28944
29201
|
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
@@ -30061,6 +30318,10 @@ function buildStandardsResearchAnalystSubAgent(paths, issueDefaults) {
|
|
|
30061
30318
|
"",
|
|
30062
30319
|
"---",
|
|
30063
30320
|
"",
|
|
30321
|
+
...renderClaimVerificationSection(),
|
|
30322
|
+
"",
|
|
30323
|
+
"---",
|
|
30324
|
+
"",
|
|
30064
30325
|
"## Phase 1: Scope (`standards:scope`)",
|
|
30065
30326
|
"",
|
|
30066
30327
|
"**Goal:** Plan the research campaign for a standard \u2014 identify which",
|
|
@@ -31905,7 +32166,7 @@ var VERSION = {
|
|
|
31905
32166
|
*
|
|
31906
32167
|
* CLI and lib are versioned separately, so this is the CLI version.
|
|
31907
32168
|
*/
|
|
31908
|
-
AWS_CDK_CLI_VERSION: "2.
|
|
32169
|
+
AWS_CDK_CLI_VERSION: "2.1133.0",
|
|
31909
32170
|
/**
|
|
31910
32171
|
* CDK Version to use for construct projects.
|
|
31911
32172
|
*
|
|
@@ -31928,7 +32189,7 @@ var VERSION = {
|
|
|
31928
32189
|
/**
|
|
31929
32190
|
* Version of PNPM to use in workflows at github actions.
|
|
31930
32191
|
*/
|
|
31931
|
-
PNPM_VERSION: "11.
|
|
32192
|
+
PNPM_VERSION: "11.17.0",
|
|
31932
32193
|
/**
|
|
31933
32194
|
* Version of Projen to use.
|
|
31934
32195
|
*/
|