@codedrifters/configulator 0.0.295 → 0.0.297

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.js CHANGED
@@ -195,6 +195,7 @@ __export(index_exports, {
195
195
  AwsDeploymentTarget: () => AwsDeploymentTarget,
196
196
  AwsTeardownWorkflow: () => AwsTeardownWorkflow,
197
197
  BUILT_IN_BUNDLES: () => BUILT_IN_BUNDLES,
198
+ BUNDLE_OWNERSHIP: () => BUNDLE_OWNERSHIP,
198
199
  CLAUDE_RULE_TARGET: () => CLAUDE_RULE_TARGET,
199
200
  COMPLETE_JOB_ID: () => COMPLETE_JOB_ID,
200
201
  DEFAULT_AC_THRESHOLDS: () => DEFAULT_AC_THRESHOLDS,
@@ -259,6 +260,7 @@ __export(index_exports, {
259
260
  MINIMUM_RELEASE_AGE: () => MINIMUM_RELEASE_AGE,
260
261
  MONOREPO_LAYOUT: () => MONOREPO_LAYOUT,
261
262
  MonorepoProject: () => MonorepoProject,
263
+ Nvmrc: () => Nvmrc,
262
264
  PROD_DEPLOY_NAME: () => PROD_DEPLOY_NAME,
263
265
  PROGRESS_FILES_FORMAT_VALUES: () => PROGRESS_FILES_FORMAT_VALUES,
264
266
  PnpmWorkspace: () => PnpmWorkspace,
@@ -338,7 +340,12 @@ __export(index_exports, {
338
340
  formatStarlightSingletonViolation: () => formatStarlightSingletonViolation,
339
341
  getLatestEligibleVersion: () => getLatestEligibleVersion,
340
342
  githubWorkflowBundle: () => githubWorkflowBundle,
343
+ hasAnyDocsEmittingBundle: () => hasAnyDocsEmittingBundle,
344
+ hasAnyDownstreamIssueKindBundle: () => hasAnyDownstreamIssueKindBundle,
341
345
  industryDiscoveryBundle: () => industryDiscoveryBundle,
346
+ isPhaseLabelOwnedByExcluded: () => isPhaseLabelOwnedByExcluded,
347
+ isScheduledTaskOwnedByExcluded: () => isScheduledTaskOwnedByExcluded,
348
+ isTypeLabelOwnedByExcluded: () => isTypeLabelOwnedByExcluded,
342
349
  jestBundle: () => jestBundle,
343
350
  labelsForPhase: () => labelsForPhase,
344
351
  maintenanceAuditBundle: () => maintenanceAuditBundle,
@@ -347,6 +354,8 @@ __export(index_exports, {
347
354
  parseApiRollup: () => parseApiRollup,
348
355
  peopleProfileBundle: () => peopleProfileBundle,
349
356
  persistAuditReport: () => persistAuditReport,
357
+ pinPnpmActionSetup: () => pinPnpmActionSetup,
358
+ pinSetupNodeVersion: () => pinSetupNodeVersion,
350
359
  pnpmBundle: () => pnpmBundle,
351
360
  prReviewBundle: () => prReviewBundle,
352
361
  projenBundle: () => projenBundle,
@@ -1404,8 +1413,8 @@ function resolveIssueTemplates(config) {
1404
1413
  function validateIssueTemplatesConfig(config) {
1405
1414
  return resolveIssueTemplates(config);
1406
1415
  }
1407
- function renderIssueTemplatesRuleContent(it) {
1408
- if (!it.enabled) {
1416
+ function renderIssueTemplatesRuleContent(it, hasDownstreamBundles = true) {
1417
+ if (!it.enabled || !hasDownstreamBundles) {
1409
1418
  return [
1410
1419
  "# Issue Templates",
1411
1420
  "",
@@ -11555,6 +11564,238 @@ function assertValidStateFilePath(stateFilePath) {
11555
11564
  }
11556
11565
  }
11557
11566
 
11567
+ // src/agent/bundles/bundle-ownership.ts
11568
+ var BUNDLE_OWNERSHIP = {
11569
+ agenda: {
11570
+ typeLabels: ["agenda"],
11571
+ phaseLabelPrefixes: ["agenda:"],
11572
+ scheduledTaskIds: ["worker-agenda"],
11573
+ emitsDocs: true,
11574
+ downstreamIssueKinds: true
11575
+ },
11576
+ "bcm-writer": {
11577
+ typeLabels: ["bcm-document"],
11578
+ phaseLabelPrefixes: ["bcm:"],
11579
+ scheduledTaskIds: ["worker-bcm-writer"],
11580
+ emitsDocs: true,
11581
+ downstreamIssueKinds: true
11582
+ },
11583
+ "business-models": {
11584
+ typeLabels: ["business-model"],
11585
+ phaseLabelPrefixes: ["business-models:"],
11586
+ scheduledTaskIds: ["worker-business-models"],
11587
+ emitsDocs: true,
11588
+ downstreamIssueKinds: true
11589
+ },
11590
+ "company-profile": {
11591
+ typeLabels: ["company-profile"],
11592
+ phaseLabelPrefixes: ["company:"],
11593
+ scheduledTaskIds: ["worker-company-profile"],
11594
+ emitsDocs: true,
11595
+ downstreamIssueKinds: true
11596
+ },
11597
+ "customer-profile": {
11598
+ typeLabels: ["customer-profile"],
11599
+ phaseLabelPrefixes: ["customer:"],
11600
+ scheduledTaskIds: ["worker-customer-profile"],
11601
+ emitsDocs: true,
11602
+ downstreamIssueKinds: true
11603
+ },
11604
+ "docs-sync": {
11605
+ typeLabels: ["docs-sync"],
11606
+ phaseLabelPrefixes: ["docs-sync:"],
11607
+ scheduledTaskIds: ["worker-docs-sync"],
11608
+ emitsDocs: true,
11609
+ downstreamIssueKinds: true
11610
+ },
11611
+ "industry-discovery": {
11612
+ typeLabels: ["industry-discovery"],
11613
+ phaseLabelPrefixes: ["industry:"],
11614
+ scheduledTaskIds: ["worker-industry-discovery"],
11615
+ emitsDocs: true,
11616
+ downstreamIssueKinds: true
11617
+ },
11618
+ "maintenance-audit": {
11619
+ typeLabels: ["maintenance"],
11620
+ phaseLabelPrefixes: ["maint:"],
11621
+ scheduledTaskIds: ["worker-maintenance"],
11622
+ emitsDocs: false,
11623
+ downstreamIssueKinds: true
11624
+ },
11625
+ "meeting-analysis": {
11626
+ typeLabels: ["meeting-processing"],
11627
+ phaseLabelPrefixes: ["meeting:"],
11628
+ scheduledTaskIds: ["worker-meeting-analysis"],
11629
+ emitsDocs: true,
11630
+ downstreamIssueKinds: true
11631
+ },
11632
+ orchestrator: {
11633
+ // The orchestrator pipeline manager itself ships with the
11634
+ // `worker-orchestrator` scheduled task. It owns no `type:*` label
11635
+ // (it dispatches every type) and no phase-label prefix.
11636
+ typeLabels: [],
11637
+ phaseLabelPrefixes: [],
11638
+ scheduledTaskIds: ["worker-orchestrator"],
11639
+ emitsDocs: false,
11640
+ downstreamIssueKinds: false
11641
+ },
11642
+ "people-profile": {
11643
+ typeLabels: ["people-profile"],
11644
+ phaseLabelPrefixes: ["people:"],
11645
+ scheduledTaskIds: ["worker-people-profile"],
11646
+ emitsDocs: true,
11647
+ downstreamIssueKinds: true
11648
+ },
11649
+ "pr-review": {
11650
+ typeLabels: ["pr-review"],
11651
+ phaseLabelPrefixes: [],
11652
+ scheduledTaskIds: ["worker-pr-review"],
11653
+ emitsDocs: false,
11654
+ downstreamIssueKinds: false
11655
+ },
11656
+ "regulatory-research": {
11657
+ typeLabels: ["regulatory-research"],
11658
+ phaseLabelPrefixes: ["regulatory:"],
11659
+ scheduledTaskIds: ["worker-regulatory-research"],
11660
+ emitsDocs: true,
11661
+ downstreamIssueKinds: true
11662
+ },
11663
+ "requirements-analyst": {
11664
+ typeLabels: ["requirement"],
11665
+ phaseLabelPrefixes: ["req:"],
11666
+ scheduledTaskIds: ["worker-requirements-analyst"],
11667
+ emitsDocs: true,
11668
+ downstreamIssueKinds: true
11669
+ },
11670
+ "requirements-reviewer": {
11671
+ // Co-owns `type:requirement` with the analyst and writer; owns
11672
+ // the `req:review` and `req:deprecate` phase labels exactly.
11673
+ typeLabels: ["requirement"],
11674
+ phaseLabelPrefixes: ["req:review", "req:deprecate"],
11675
+ scheduledTaskIds: ["worker-requirements-reviewer"],
11676
+ emitsDocs: true,
11677
+ downstreamIssueKinds: true
11678
+ },
11679
+ "requirements-writer": {
11680
+ // Co-owns `type:requirement` with the analyst and reviewer; owns
11681
+ // the `req:write` phase label exactly.
11682
+ typeLabels: ["requirement"],
11683
+ phaseLabelPrefixes: ["req:write"],
11684
+ scheduledTaskIds: ["worker-requirements-writer"],
11685
+ emitsDocs: true,
11686
+ downstreamIssueKinds: true
11687
+ },
11688
+ "research-pipeline": {
11689
+ typeLabels: ["research"],
11690
+ phaseLabelPrefixes: ["research:"],
11691
+ scheduledTaskIds: ["worker-research"],
11692
+ emitsDocs: true,
11693
+ downstreamIssueKinds: true
11694
+ },
11695
+ "software-profile": {
11696
+ typeLabels: ["software-profile"],
11697
+ phaseLabelPrefixes: ["software:"],
11698
+ scheduledTaskIds: ["worker-software-profile"],
11699
+ emitsDocs: true,
11700
+ downstreamIssueKinds: true
11701
+ },
11702
+ "standards-research": {
11703
+ typeLabels: ["standards-research"],
11704
+ phaseLabelPrefixes: ["standards:"],
11705
+ scheduledTaskIds: ["worker-standards-research"],
11706
+ emitsDocs: true,
11707
+ downstreamIssueKinds: true
11708
+ }
11709
+ };
11710
+ function isTypeLabelOwnedByExcluded(typeLabel, excludedBundles) {
11711
+ if (excludedBundles.length === 0) {
11712
+ return false;
11713
+ }
11714
+ for (const bundleName of excludedBundles) {
11715
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11716
+ if (!ownership) {
11717
+ continue;
11718
+ }
11719
+ if (ownership.typeLabels.includes(typeLabel)) {
11720
+ const owners = findOwnersOfTypeLabel(typeLabel);
11721
+ const allExcluded = owners.every(
11722
+ (owner) => excludedBundles.includes(owner)
11723
+ );
11724
+ if (allExcluded) {
11725
+ return true;
11726
+ }
11727
+ }
11728
+ }
11729
+ return false;
11730
+ }
11731
+ function isPhaseLabelOwnedByExcluded(phaseLabel, excludedBundles) {
11732
+ if (excludedBundles.length === 0) {
11733
+ return false;
11734
+ }
11735
+ for (const bundleName of excludedBundles) {
11736
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11737
+ if (!ownership) {
11738
+ continue;
11739
+ }
11740
+ for (const entry of ownership.phaseLabelPrefixes) {
11741
+ if (entry.endsWith(":")) {
11742
+ if (phaseLabel.startsWith(entry)) {
11743
+ return true;
11744
+ }
11745
+ } else if (phaseLabel === entry) {
11746
+ return true;
11747
+ }
11748
+ }
11749
+ }
11750
+ return false;
11751
+ }
11752
+ function isScheduledTaskOwnedByExcluded(taskId, excludedBundles) {
11753
+ if (excludedBundles.length === 0) {
11754
+ return false;
11755
+ }
11756
+ for (const bundleName of excludedBundles) {
11757
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11758
+ if (!ownership) {
11759
+ continue;
11760
+ }
11761
+ if (ownership.scheduledTaskIds.includes(taskId)) {
11762
+ return true;
11763
+ }
11764
+ }
11765
+ return false;
11766
+ }
11767
+ function hasAnyDocsEmittingBundle(excludedBundles) {
11768
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11769
+ if (!ownership.emitsDocs) {
11770
+ continue;
11771
+ }
11772
+ if (!excludedBundles.includes(bundleName)) {
11773
+ return true;
11774
+ }
11775
+ }
11776
+ return false;
11777
+ }
11778
+ function hasAnyDownstreamIssueKindBundle(excludedBundles) {
11779
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11780
+ if (!ownership.downstreamIssueKinds) {
11781
+ continue;
11782
+ }
11783
+ if (!excludedBundles.includes(bundleName)) {
11784
+ return true;
11785
+ }
11786
+ }
11787
+ return false;
11788
+ }
11789
+ function findOwnersOfTypeLabel(typeLabel) {
11790
+ const owners = [];
11791
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11792
+ if (ownership.typeLabels.includes(typeLabel)) {
11793
+ owners.push(bundleName);
11794
+ }
11795
+ }
11796
+ return owners;
11797
+ }
11798
+
11558
11799
  // src/agent/bundles/scheduled-tasks.ts
11559
11800
  var SCHEDULED_TASK_MODEL_VALUES = ["opus", "sonnet", "haiku"];
11560
11801
  var SCHEDULED_TASK_KIND_VALUES = ["issue-worker", "pipeline"];
@@ -11819,17 +12060,23 @@ var DEFAULT_SCHEDULED_TASK_ENTRIES = [
11819
12060
  description: "Documentation-sync drift-detection and audit pipeline (scaffolding release \u2014 behavior carried by downstream child issues of the parent docs-sync epic)."
11820
12061
  }
11821
12062
  ];
11822
- function resolveScheduledTasks(config) {
12063
+ function resolveScheduledTasks(config, excludeBundles = []) {
11823
12064
  const root = config?.root ?? DEFAULT_SCHEDULED_TASKS_ROOT;
11824
12065
  assertValidRoot(root);
11825
12066
  const merged = /* @__PURE__ */ new Map();
11826
12067
  for (const entry of DEFAULT_SCHEDULED_TASK_ENTRIES) {
12068
+ if (isScheduledTaskOwnedByExcluded(entry.taskId, excludeBundles)) {
12069
+ continue;
12070
+ }
11827
12071
  merged.set(entry.taskId, entry);
11828
12072
  }
11829
12073
  if (config?.overrides) {
11830
12074
  for (const [taskId, override] of Object.entries(config.overrides)) {
11831
12075
  const existing = merged.get(taskId);
11832
12076
  if (!existing) {
12077
+ if (isScheduledTaskOwnedByExcluded(taskId, excludeBundles)) {
12078
+ continue;
12079
+ }
11833
12080
  throw new Error(
11834
12081
  `ScheduledTasksConfig.overrides references unknown taskId ${JSON.stringify(
11835
12082
  taskId
@@ -11860,8 +12107,8 @@ function resolveScheduledTasks(config) {
11860
12107
  tasks: [...merged.values()]
11861
12108
  };
11862
12109
  }
11863
- function validateScheduledTasksConfig(config) {
11864
- return resolveScheduledTasks(config);
12110
+ function validateScheduledTasksConfig(config, excludeBundles = []) {
12111
+ return resolveScheduledTasks(config, excludeBundles);
11865
12112
  }
11866
12113
  function renderScheduledTasksSection(resolved) {
11867
12114
  const lines = [
@@ -12344,7 +12591,7 @@ function classifyIssueScope(body, gate, labels = []) {
12344
12591
  matchedLabel: effective.matchedLabel
12345
12592
  };
12346
12593
  }
12347
- function renderScopeGateSection(gate) {
12594
+ function renderScopeGateSection(gate, excludeBundles = []) {
12348
12595
  const { acceptanceCriteria: ac, sources } = gate;
12349
12596
  const lines = [
12350
12597
  "## Scope gate",
@@ -12418,7 +12665,9 @@ function renderScopeGateSection(gate) {
12418
12665
  " is in place."
12419
12666
  );
12420
12667
  }
12421
- const overrideEntries = Object.entries(gate.bundleOverrides);
12668
+ const overrideEntries = Object.entries(gate.bundleOverrides).filter(
12669
+ ([label]) => !isPhaseLabelOwnedByExcluded(label, excludeBundles)
12670
+ );
12422
12671
  if (overrideEntries.length > 0) {
12423
12672
  lines.push(
12424
12673
  "",
@@ -12762,9 +13011,12 @@ function validateAgentTierConfig(config) {
12762
13011
  }
12763
13012
  return resolveAgentTiers(config);
12764
13013
  }
12765
- function renderAgentTierSection(tiers) {
13014
+ function renderAgentTierSection(tiers, excludeBundles = []) {
13015
+ const filtered = tiers.filter(
13016
+ (entry) => !isTypeLabelOwnedByExcluded(entry.type, excludeBundles)
13017
+ );
12766
13018
  const grouped = /* @__PURE__ */ new Map();
12767
- for (const entry of tiers) {
13019
+ for (const entry of filtered) {
12768
13020
  const bucket = grouped.get(entry.tier) ?? [];
12769
13021
  bucket.push(entry);
12770
13022
  grouped.set(entry.tier, bucket);
@@ -14495,13 +14747,13 @@ var ORCHESTRATOR_CONVENTIONS_PREAMBLE = [
14495
14747
  "",
14496
14748
  'Practical implication for scheduled-task wiring: the `worker-orchestrator` scheduled task\'s `SKILL.md` instructs the **scheduled-task session itself** to read `.claude/agents/orchestrator.md` and execute its phase pipeline in-session, then use the `Agent` tool to delegate the picked work item to `issue-worker` (depth-1). The scheduled task does **not** call `Agent(subagent_type: "orchestrator")` \u2014 that would put the orchestrator at depth-1 and break the chain.'
14497
14749
  ].join("\n");
14498
- function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate(), runRatio = resolveRunRatio(), scheduledTasks = resolveScheduledTasks(), unblockDependents = resolveUnblockDependents()) {
14750
+ function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate(), runRatio = resolveRunRatio(), scheduledTasks = resolveScheduledTasks(), unblockDependents = resolveUnblockDependents(), excludeBundles = []) {
14499
14751
  return [
14500
14752
  ORCHESTRATOR_CONVENTIONS_PREAMBLE,
14501
14753
  "",
14502
- renderAgentTierSection(tiers),
14754
+ renderAgentTierSection(tiers, excludeBundles),
14503
14755
  "",
14504
- renderScopeGateSection(scopeGate),
14756
+ renderScopeGateSection(scopeGate, excludeBundles),
14505
14757
  "",
14506
14758
  renderRunRatioSection(runRatio),
14507
14759
  "",
@@ -14510,11 +14762,14 @@ function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate
14510
14762
  renderUnblockDependentsSection(unblockDependents)
14511
14763
  ].join("\n");
14512
14764
  }
14513
- function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig, scheduledTasksConfig, unblockDependentsConfig) {
14765
+ function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig, scheduledTasksConfig, unblockDependentsConfig, excludeBundles = []) {
14514
14766
  const tiers = resolveAgentTiers(tierConfig);
14515
14767
  const scopeGate = resolveScopeGate(scopeGateConfig);
14516
14768
  const runRatio = resolveRunRatio(runRatioConfig);
14517
- const scheduledTasks = resolveScheduledTasks(scheduledTasksConfig);
14769
+ const scheduledTasks = resolveScheduledTasks(
14770
+ scheduledTasksConfig,
14771
+ excludeBundles
14772
+ );
14518
14773
  const unblockDependentsResolved = resolveUnblockDependents(
14519
14774
  unblockDependentsConfig
14520
14775
  );
@@ -14529,7 +14784,8 @@ function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig,
14529
14784
  scopeGate,
14530
14785
  runRatio,
14531
14786
  scheduledTasks,
14532
- unblockDependentsResolved
14787
+ unblockDependentsResolved,
14788
+ excludeBundles
14533
14789
  ),
14534
14790
  procedure: buildCheckBlockedProcedure(tiers, scopeGate, runRatio),
14535
14791
  unblockDependentsProcedure: buildUnblockDependentsProcedure(
@@ -15522,6 +15778,7 @@ var PnpmWorkspace = class _PnpmWorkspace extends import_projen.Component {
15522
15778
  this.minimumReleaseAgeExclude = options.minimumReleaseAgeExclude ? ["@codedrifters/*", ...options.minimumReleaseAgeExclude] : ["@codedrifters/*"];
15523
15779
  this.onlyBuiltDependencies = options.onlyBuiltDependencies ? options.onlyBuiltDependencies : [];
15524
15780
  this.ignoredBuiltDependencies = options.ignoredBuiltDependencies ? options.ignoredBuiltDependencies : [];
15781
+ this.allowBuilds = options.allowBuilds ?? {};
15525
15782
  this.subprojects = options.subprojects ?? [];
15526
15783
  this.defaultCatalog = options.defaultCatalog;
15527
15784
  this.namedCatalogs = options.namedCatalogs;
@@ -15545,11 +15802,35 @@ var PnpmWorkspace = class _PnpmWorkspace extends import_projen.Component {
15545
15802
  if (this.minimumReleaseAgeExclude.length > 0) {
15546
15803
  pnpmConfig.minimumReleaseAgeExclude = this.minimumReleaseAgeExclude;
15547
15804
  }
15548
- if (this.onlyBuiltDependencies.length > 0) {
15549
- pnpmConfig.onlyBuiltDependencies = this.onlyBuiltDependencies;
15805
+ const mergedAllowBuilds = {};
15806
+ for (const pkg of this.onlyBuiltDependencies) {
15807
+ mergedAllowBuilds[pkg] = true;
15550
15808
  }
15551
- if (this.ignoredBuiltDependencies.length > 0) {
15552
- pnpmConfig.ignoreBuiltDependencies = this.ignoredBuiltDependencies;
15809
+ for (const pkg of this.ignoredBuiltDependencies) {
15810
+ mergedAllowBuilds[pkg] = false;
15811
+ }
15812
+ for (const [pkg, allowed] of Object.entries(this.allowBuilds)) {
15813
+ mergedAllowBuilds[pkg] = allowed;
15814
+ }
15815
+ const allowList = [];
15816
+ const denyList = [];
15817
+ for (const [pkg, allowed] of Object.entries(mergedAllowBuilds)) {
15818
+ if (allowed) {
15819
+ allowList.push(pkg);
15820
+ } else {
15821
+ denyList.push(pkg);
15822
+ }
15823
+ }
15824
+ allowList.sort();
15825
+ denyList.sort();
15826
+ if (allowList.length > 0) {
15827
+ pnpmConfig.onlyBuiltDependencies = allowList;
15828
+ }
15829
+ if (denyList.length > 0) {
15830
+ pnpmConfig.ignoredBuiltDependencies = denyList;
15831
+ }
15832
+ if (Object.keys(mergedAllowBuilds).length > 0) {
15833
+ pnpmConfig.allowBuilds = mergedAllowBuilds;
15553
15834
  }
15554
15835
  if (this.defaultCatalog && Object.keys(this.defaultCatalog).length > 0) {
15555
15836
  pnpmConfig.catalog = this.defaultCatalog;
@@ -26830,11 +27111,11 @@ var VERSION = {
26830
27111
  * Version of `pnpm/action-setup` to use in GitHub workflows.
26831
27112
  * Tracks the version projen currently emits (see node_modules/projen/lib/javascript/node-project.js).
26832
27113
  */
26833
- PNPM_ACTION_SETUP_VERSION: "v5",
27114
+ PNPM_ACTION_SETUP_VERSION: "v6.0.5",
26834
27115
  /**
26835
27116
  * Version of PNPM to use in workflows at github actions.
26836
27117
  */
26837
- PNPM_VERSION: "10.33.3",
27118
+ PNPM_VERSION: "11.0.8",
26838
27119
  /**
26839
27120
  * Version of Projen to use.
26840
27121
  */
@@ -28304,7 +28585,8 @@ var AgentConfig = class _AgentConfig extends import_projen8.Component {
28304
28585
  this.project.gitignore.addPatterns(`/${resolvedProgressFiles.stateDir}/`);
28305
28586
  }
28306
28587
  const resolvedScheduledTasks = validateScheduledTasksConfig(
28307
- this.options.scheduledTasks
28588
+ this.options.scheduledTasks,
28589
+ this.options.excludeBundles ?? []
28308
28590
  );
28309
28591
  if (resolvedScheduledTasks.enabled) {
28310
28592
  for (const task of resolvedScheduledTasks.tasks) {
@@ -28512,7 +28794,8 @@ ${section}`
28512
28794
  }
28513
28795
  }
28514
28796
  }
28515
- if (this.options.tiers || this.options.scopeGate || this.options.runRatio || this.options.scheduledTasks || this.options.unblockDependents) {
28797
+ const excludedBundleNames = this.options.excludeBundles ?? [];
28798
+ if (this.options.tiers || this.options.scopeGate || this.options.runRatio || this.options.scheduledTasks || this.options.unblockDependents || excludedBundleNames.length > 0) {
28516
28799
  const orchestratorRule = ruleMap.get("orchestrator-conventions");
28517
28800
  if (orchestratorRule) {
28518
28801
  const { conventionsContent } = resolveOrchestratorAssets(
@@ -28520,7 +28803,8 @@ ${section}`
28520
28803
  this.options.scopeGate,
28521
28804
  this.options.runRatio,
28522
28805
  this.options.scheduledTasks,
28523
- this.options.unblockDependents
28806
+ this.options.unblockDependents,
28807
+ excludedBundleNames
28524
28808
  );
28525
28809
  if (conventionsContent !== orchestratorRule.content) {
28526
28810
  ruleMap.set("orchestrator-conventions", {
@@ -28653,11 +28937,13 @@ ${hook}`
28653
28937
  const resolvedIssueTemplatesForRules = resolveIssueTemplates(
28654
28938
  this.options.issueTemplates
28655
28939
  );
28656
- if (this.options.issueTemplates) {
28940
+ const hasDownstreamBundles = hasAnyDownstreamIssueKindBundle(excludedBundleNames);
28941
+ if (this.options.issueTemplates || !hasDownstreamBundles) {
28657
28942
  const issueTemplatesRule = ruleMap.get("issue-templates-convention");
28658
28943
  if (issueTemplatesRule) {
28659
28944
  const issueTemplatesContent = renderIssueTemplatesRuleContent(
28660
- resolvedIssueTemplatesForRules
28945
+ resolvedIssueTemplatesForRules,
28946
+ hasDownstreamBundles
28661
28947
  );
28662
28948
  if (issueTemplatesContent !== issueTemplatesRule.content) {
28663
28949
  ruleMap.set("issue-templates-convention", {
@@ -28667,7 +28953,10 @@ ${hook}`
28667
28953
  }
28668
28954
  }
28669
28955
  }
28670
- if (resolvedIssueTemplatesForRules.enabled) {
28956
+ if (!hasAnyDocsEmittingBundle(excludedBundleNames)) {
28957
+ ruleMap.delete("stub-index-convention");
28958
+ }
28959
+ if (resolvedIssueTemplatesForRules.enabled && hasDownstreamBundles) {
28671
28960
  for (const [ruleName, label] of ISSUE_TEMPLATES_BUNDLE_HOOKS) {
28672
28961
  const existing = ruleMap.get(ruleName);
28673
28962
  if (!existing) {
@@ -31020,7 +31309,7 @@ var JsiiFaker = class _JsiiFaker extends import_projen13.Component {
31020
31309
  };
31021
31310
 
31022
31311
  // src/projects/astro-project.ts
31023
- var import_projen18 = require("projen");
31312
+ var import_projen19 = require("projen");
31024
31313
  var import_ts_deepmerge3 = require("ts-deepmerge");
31025
31314
 
31026
31315
  // src/projects/monorepo-layout.ts
@@ -31164,20 +31453,35 @@ function resolveAstroProjectOutdir(packageName) {
31164
31453
  }
31165
31454
 
31166
31455
  // src/projects/typescript-project.ts
31167
- var import_projen17 = require("projen");
31456
+ var import_projen18 = require("projen");
31168
31457
  var import_javascript4 = require("projen/lib/javascript");
31169
31458
  var import_release = require("projen/lib/release");
31170
31459
  var import_ts_deepmerge2 = require("ts-deepmerge");
31171
31460
 
31172
31461
  // src/projects/monorepo-project.ts
31173
- var import_github2 = require("projen/lib/github");
31462
+ var import_github4 = require("projen/lib/github");
31174
31463
  var import_javascript3 = require("projen/lib/javascript");
31175
31464
  var import_typescript3 = require("projen/lib/typescript");
31176
31465
  var import_ts_deepmerge = require("ts-deepmerge");
31177
31466
 
31178
- // src/tasks/reset-task.ts
31467
+ // src/projects/nvmrc.ts
31179
31468
  var import_projen14 = require("projen");
31180
- var ResetTask = class _ResetTask extends import_projen14.Component {
31469
+ var import_textfile5 = require("projen/lib/textfile");
31470
+ var Nvmrc = class extends import_projen14.Component {
31471
+ constructor(project) {
31472
+ super(project);
31473
+ new import_textfile5.TextFile(project, ".nvmrc", {
31474
+ // `lines` is joined with `\n` — adding an empty trailing entry
31475
+ // produces a POSIX-friendly trailing newline (`24\n`).
31476
+ lines: [VERSION.NODE_WORKFLOWS, ""],
31477
+ readonly: true
31478
+ });
31479
+ }
31480
+ };
31481
+
31482
+ // src/tasks/reset-task.ts
31483
+ var import_projen15 = require("projen");
31484
+ var ResetTask = class _ResetTask extends import_projen15.Component {
31181
31485
  constructor(project, options = {}) {
31182
31486
  super(project);
31183
31487
  this.project = project;
@@ -31250,12 +31554,12 @@ var ResetTask = class _ResetTask extends import_projen14.Component {
31250
31554
  };
31251
31555
 
31252
31556
  // src/vscode/vscode.ts
31253
- var import_projen15 = require("projen");
31254
- var VSCodeConfig = class extends import_projen15.Component {
31557
+ var import_projen16 = require("projen");
31558
+ var VSCodeConfig = class extends import_projen16.Component {
31255
31559
  constructor(project) {
31256
31560
  super(project);
31257
- const vsConfig = new import_projen15.vscode.VsCode(project);
31258
- const vsSettings = new import_projen15.vscode.VsCodeSettings(vsConfig);
31561
+ const vsConfig = new import_projen16.vscode.VsCode(project);
31562
+ const vsSettings = new import_projen16.vscode.VsCodeSettings(vsConfig);
31259
31563
  vsSettings.addSetting("editor.tabSize", 2);
31260
31564
  vsSettings.addSetting("editor.detectIndentation", false);
31261
31565
  vsSettings.addSetting("editor.bracketPairColorization.enabled", true);
@@ -31396,8 +31700,146 @@ function addBuildCompleteJob(buildWorkflow) {
31396
31700
  });
31397
31701
  }
31398
31702
 
31703
+ // src/workflows/pin-pnpm-action-setup.ts
31704
+ var import_github2 = require("projen/lib/github");
31705
+ var PNPM_ACTION_SETUP_PREFIX = "pnpm/action-setup@";
31706
+ var STEP_ARRAY_FIELDS = ["preBuildSteps", "postBuildSteps"];
31707
+ function pinPnpmActionSetup(project) {
31708
+ const pinned = `${PNPM_ACTION_SETUP_PREFIX}${VERSION.PNPM_ACTION_SETUP_VERSION}`;
31709
+ patchComponentStepArrays(project, pinned);
31710
+ for (const sub of project.subprojects) {
31711
+ patchComponentStepArrays(sub, pinned);
31712
+ }
31713
+ const github = import_github2.GitHub.of(project);
31714
+ if (!github) {
31715
+ return;
31716
+ }
31717
+ for (const workflow of github.workflows) {
31718
+ for (const job of Object.values(workflow.jobs)) {
31719
+ patchStepArray(getEagerSteps(job), pinned);
31720
+ }
31721
+ }
31722
+ }
31723
+ function patchComponentStepArrays(project, pinned) {
31724
+ for (const component of project.components) {
31725
+ for (const field of STEP_ARRAY_FIELDS) {
31726
+ const steps = readStepArray(component, field);
31727
+ if (steps !== void 0) {
31728
+ patchStepArray(steps, pinned);
31729
+ }
31730
+ }
31731
+ }
31732
+ }
31733
+ function readStepArray(component, field) {
31734
+ const value = component[field];
31735
+ return Array.isArray(value) ? value : void 0;
31736
+ }
31737
+ function getEagerSteps(job) {
31738
+ if (typeof job !== "object" || job === null) {
31739
+ return void 0;
31740
+ }
31741
+ const steps = job.steps;
31742
+ return Array.isArray(steps) ? steps : void 0;
31743
+ }
31744
+ function patchStepArray(steps, pinned) {
31745
+ if (!steps) {
31746
+ return;
31747
+ }
31748
+ for (const step of steps) {
31749
+ if (typeof step.uses === "string" && step.uses.startsWith(PNPM_ACTION_SETUP_PREFIX)) {
31750
+ step.uses = pinned;
31751
+ }
31752
+ }
31753
+ }
31754
+
31755
+ // src/workflows/pin-setup-node-version.ts
31756
+ var import_github3 = require("projen/lib/github");
31757
+ var SETUP_NODE_PREFIX = "actions/setup-node@";
31758
+ var STEP_ARRAY_FIELDS2 = ["preBuildSteps", "postBuildSteps"];
31759
+ var NODE_VERSION_FIELDS = ["workflowNodeVersion"];
31760
+ function pinSetupNodeVersion(project) {
31761
+ const pinned = VERSION.NODE_WORKFLOWS;
31762
+ patchComponentNodeVersionFields(project, pinned);
31763
+ patchComponentStepArrays2(project, pinned);
31764
+ for (const sub of project.subprojects) {
31765
+ patchComponentNodeVersionFields(sub, pinned);
31766
+ patchComponentStepArrays2(sub, pinned);
31767
+ }
31768
+ const github = import_github3.GitHub.of(project);
31769
+ if (!github) {
31770
+ return;
31771
+ }
31772
+ for (const workflow of github.workflows) {
31773
+ for (const job of Object.values(workflow.jobs)) {
31774
+ patchJobToolsNode(job, pinned);
31775
+ patchStepArray2(getEagerSteps2(job), pinned);
31776
+ }
31777
+ }
31778
+ }
31779
+ function patchComponentNodeVersionFields(project, pinned) {
31780
+ for (const component of project.components) {
31781
+ for (const field of NODE_VERSION_FIELDS) {
31782
+ const record = component;
31783
+ const value = record[field];
31784
+ if (typeof value === "string") {
31785
+ record[field] = pinned;
31786
+ }
31787
+ }
31788
+ }
31789
+ }
31790
+ function patchComponentStepArrays2(project, pinned) {
31791
+ for (const component of project.components) {
31792
+ for (const field of STEP_ARRAY_FIELDS2) {
31793
+ const steps = readStepArray2(component, field);
31794
+ if (steps !== void 0) {
31795
+ patchStepArray2(steps, pinned);
31796
+ }
31797
+ }
31798
+ }
31799
+ }
31800
+ function readStepArray2(component, field) {
31801
+ const value = component[field];
31802
+ return Array.isArray(value) ? value : void 0;
31803
+ }
31804
+ function getEagerSteps2(job) {
31805
+ if (typeof job !== "object" || job === null) {
31806
+ return void 0;
31807
+ }
31808
+ const steps = job.steps;
31809
+ return Array.isArray(steps) ? steps : void 0;
31810
+ }
31811
+ function patchJobToolsNode(job, pinned) {
31812
+ if (typeof job !== "object" || job === null) {
31813
+ return;
31814
+ }
31815
+ const tools = job.tools;
31816
+ if (typeof tools !== "object" || tools === null) {
31817
+ return;
31818
+ }
31819
+ const node = tools.node;
31820
+ if (typeof node !== "object" || node === null) {
31821
+ return;
31822
+ }
31823
+ if (typeof node.version === "string") {
31824
+ node.version = pinned;
31825
+ }
31826
+ }
31827
+ function patchStepArray2(steps, pinned) {
31828
+ if (!steps) {
31829
+ return;
31830
+ }
31831
+ for (const step of steps) {
31832
+ if (typeof step.uses === "string" && step.uses.startsWith(SETUP_NODE_PREFIX)) {
31833
+ if (!step.with || typeof step.with !== "object") {
31834
+ step.with = {};
31835
+ }
31836
+ step.with["node-version"] = pinned;
31837
+ }
31838
+ }
31839
+ }
31840
+
31399
31841
  // src/workflows/sync-labels.ts
31400
- var import_projen16 = require("projen");
31842
+ var import_projen17 = require("projen");
31401
31843
  var import_workflows_model4 = require("projen/lib/github/workflows-model");
31402
31844
  var DEFAULT_STATUS_LABELS = [
31403
31845
  {
@@ -31605,10 +32047,10 @@ ${offenders}`
31605
32047
  }
31606
32048
  });
31607
32049
  }
31608
- var LabelsFile = class extends import_projen16.Component {
32050
+ var LabelsFile = class extends import_projen17.Component {
31609
32051
  constructor(project, labels) {
31610
32052
  super(project);
31611
- new import_projen16.YamlFile(project, LABELS_CONFIG_PATH, {
32053
+ new import_projen17.YamlFile(project, LABELS_CONFIG_PATH, {
31612
32054
  obj: labels.map((l) => ({
31613
32055
  name: l.name,
31614
32056
  color: l.color,
@@ -31826,6 +32268,7 @@ var MonorepoProject = class extends import_typescript3.TypeScriptAppProject {
31826
32268
  this.configulatorRegistryConsumer = options.configulatorRegistryConsumer ?? true;
31827
32269
  this.layoutEnforcement = options.layoutEnforcement ?? LAYOUT_ENFORCEMENT.WARN;
31828
32270
  new VSCodeConfig(this);
32271
+ new Nvmrc(this);
31829
32272
  new PnpmWorkspace(this, options.pnpmOptions?.pnpmWorkspaceOptions);
31830
32273
  if (options.turbo) {
31831
32274
  new TurboRepo(this, options.turboOptions);
@@ -31834,7 +32277,7 @@ var MonorepoProject = class extends import_typescript3.TypeScriptAppProject {
31834
32277
  name: "Build Sub Projects",
31835
32278
  run: `pnpm exec projen ${ROOT_CI_TASK_NAME}`
31836
32279
  },
31837
- import_github2.WorkflowSteps.uploadArtifact({
32280
+ import_github4.WorkflowSteps.uploadArtifact({
31838
32281
  name: "Upload Turbo runs",
31839
32282
  if: "always()",
31840
32283
  continueOnError: true,
@@ -31944,6 +32387,8 @@ var MonorepoProject = class extends import_typescript3.TypeScriptAppProject {
31944
32387
  */
31945
32388
  preSynthesize() {
31946
32389
  super.preSynthesize();
32390
+ pinPnpmActionSetup(this);
32391
+ pinSetupNodeVersion(this);
31947
32392
  if (this.layoutEnforcement === LAYOUT_ENFORCEMENT.OFF) {
31948
32393
  return;
31949
32394
  }
@@ -31998,7 +32443,7 @@ var TestRunner = {
31998
32443
  JEST: "jest",
31999
32444
  VITEST: "vitest"
32000
32445
  };
32001
- var TypeScriptProject = class extends import_projen17.typescript.TypeScriptProject {
32446
+ var TypeScriptProject = class extends import_projen18.typescript.TypeScriptProject {
32002
32447
  constructor(userOptions) {
32003
32448
  if (!(userOptions.parent instanceof MonorepoProject)) {
32004
32449
  throw new Error(
@@ -32308,10 +32753,10 @@ var AstroProject = class extends TypeScriptProject {
32308
32753
  adapter: options.adapter
32309
32754
  });
32310
32755
  if (options.sampleCode === true) {
32311
- new import_projen18.SampleFile(this, "src/pages/index.astro", {
32756
+ new import_projen19.SampleFile(this, "src/pages/index.astro", {
32312
32757
  contents: DEFAULT_INDEX_ASTRO
32313
32758
  });
32314
- new import_projen18.SampleFile(this, "public/favicon.svg", {
32759
+ new import_projen19.SampleFile(this, "public/favicon.svg", {
32315
32760
  contents: DEFAULT_FAVICON_SVG
32316
32761
  });
32317
32762
  }
@@ -32336,19 +32781,19 @@ var DEFAULT_FAVICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
32336
32781
  `;
32337
32782
 
32338
32783
  // src/projects/aws-cdk-project.ts
32339
- var import_projen21 = require("projen");
32784
+ var import_projen22 = require("projen");
32340
32785
  var import_javascript5 = require("projen/lib/javascript");
32341
32786
  var import_release2 = require("projen/lib/release");
32342
32787
  var import_ts_deepmerge4 = require("ts-deepmerge");
32343
32788
 
32344
32789
  // src/workflows/aws-deploy-workflow.ts
32345
32790
  var import_utils11 = __toESM(require_lib());
32346
- var import_projen19 = require("projen");
32791
+ var import_projen20 = require("projen");
32347
32792
  var import_build = require("projen/lib/build");
32348
- var import_github3 = require("projen/lib/github");
32793
+ var import_github5 = require("projen/lib/github");
32349
32794
  var import_workflows_model5 = require("projen/lib/github/workflows-model");
32350
32795
  var PROD_DEPLOY_NAME = "prod-deploy";
32351
- var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen19.Component {
32796
+ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen20.Component {
32352
32797
  constructor(project, options = {}) {
32353
32798
  super(project);
32354
32799
  this.project = project;
@@ -32461,7 +32906,7 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen19.Compone
32461
32906
  );
32462
32907
  }
32463
32908
  this.rootProject = project.root;
32464
- const github = import_github3.GitHub.of(this.rootProject);
32909
+ const github = import_github5.GitHub.of(this.rootProject);
32465
32910
  if (!github) {
32466
32911
  throw new Error(
32467
32912
  "AwsDeployWorkflow requires a GitHub component in the root project"
@@ -32596,7 +33041,7 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen19.Compone
32596
33041
  name: "Build Sub Projects",
32597
33042
  run: `pnpm exec projen ${ROOT_CI_TASK_NAME}`
32598
33043
  },
32599
- import_github3.WorkflowSteps.uploadArtifact({
33044
+ import_github5.WorkflowSteps.uploadArtifact({
32600
33045
  name: "Upload Turbo runs",
32601
33046
  if: "always()",
32602
33047
  continueOnError: true,
@@ -32612,8 +33057,8 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen19.Compone
32612
33057
  };
32613
33058
 
32614
33059
  // src/workflows/aws-teardown-workflow.ts
32615
- var import_projen20 = require("projen");
32616
- var import_github4 = require("projen/lib/github");
33060
+ var import_projen21 = require("projen");
33061
+ var import_github6 = require("projen/lib/github");
32617
33062
  var import_workflows_model6 = require("projen/lib/github/workflows-model");
32618
33063
  var DEFAULT_TEARDOWN_BRANCH_PATTERNS = [
32619
33064
  "feat/*",
@@ -32634,7 +33079,7 @@ var resolveBranchPatterns = (explicit, targets) => {
32634
33079
  }
32635
33080
  return [...DEFAULT_TEARDOWN_BRANCH_PATTERNS];
32636
33081
  };
32637
- var AwsTeardownWorkflow = class extends import_projen20.Component {
33082
+ var AwsTeardownWorkflow = class extends import_projen21.Component {
32638
33083
  constructor(rootProject, options) {
32639
33084
  super(rootProject);
32640
33085
  this.rootProject = rootProject;
@@ -32663,7 +33108,7 @@ var AwsTeardownWorkflow = class extends import_projen20.Component {
32663
33108
  "AwsTeardownWorkflow requires the root project to be a MonorepoProject"
32664
33109
  );
32665
33110
  }
32666
- const github = import_github4.GitHub.of(this.rootProject);
33111
+ const github = import_github6.GitHub.of(this.rootProject);
32667
33112
  if (!github) {
32668
33113
  throw new Error(
32669
33114
  "AwsTeardownWorkflow requires a GitHub component in the root project"
@@ -32673,7 +33118,7 @@ var AwsTeardownWorkflow = class extends import_projen20.Component {
32673
33118
  deleteBranchPatterns,
32674
33119
  awsDestructionTargets
32675
33120
  );
32676
- const workflow = new import_github4.GithubWorkflow(github, "teardown-dev");
33121
+ const workflow = new import_github6.GithubWorkflow(github, "teardown-dev");
32677
33122
  workflow.on({
32678
33123
  workflowDispatch: {},
32679
33124
  schedule: [
@@ -32816,7 +33261,7 @@ var AwsTeardownWorkflow = class extends import_projen20.Component {
32816
33261
  };
32817
33262
 
32818
33263
  // src/projects/aws-cdk-project.ts
32819
- var AwsCdkProject = class extends import_projen21.awscdk.AwsCdkTypeScriptApp {
33264
+ var AwsCdkProject = class extends import_projen22.awscdk.AwsCdkTypeScriptApp {
32820
33265
  constructor(userOptions) {
32821
33266
  if (!(userOptions.parent instanceof MonorepoProject)) {
32822
33267
  throw new Error(
@@ -33013,7 +33458,7 @@ var AwsCdkProject = class extends import_projen21.awscdk.AwsCdkTypeScriptApp {
33013
33458
  };
33014
33459
 
33015
33460
  // src/projects/starlight-project.ts
33016
- var import_projen22 = require("projen");
33461
+ var import_projen23 = require("projen");
33017
33462
  var STARLIGHT_ROLE = {
33018
33463
  DOCS: "docs",
33019
33464
  SITE: "site"
@@ -33055,10 +33500,10 @@ var StarlightProject = class extends AstroProject {
33055
33500
  turbo.compileTask.inputs.push("src/content/**");
33056
33501
  }
33057
33502
  if (userOptions.sampleContent === true) {
33058
- new import_projen22.SampleFile(this, "src/content/docs/index.mdx", {
33503
+ new import_projen23.SampleFile(this, "src/content/docs/index.mdx", {
33059
33504
  contents: DEFAULT_INDEX_MDX
33060
33505
  });
33061
- new import_projen22.SampleFile(this, "src/content.config.ts", {
33506
+ new import_projen23.SampleFile(this, "src/content.config.ts", {
33062
33507
  contents: DEFAULT_CONTENT_CONFIG_TS
33063
33508
  });
33064
33509
  }
@@ -33108,9 +33553,9 @@ export const collections = {
33108
33553
 
33109
33554
  // src/typescript/typescript-config.ts
33110
33555
  var import_node_path2 = require("path");
33111
- var import_projen23 = require("projen");
33556
+ var import_projen24 = require("projen");
33112
33557
  var import_path2 = require("projen/lib/util/path");
33113
- var TypeScriptConfig = class extends import_projen23.Component {
33558
+ var TypeScriptConfig = class extends import_projen24.Component {
33114
33559
  constructor(project) {
33115
33560
  super(project);
33116
33561
  let tsPaths = {};
@@ -33157,6 +33602,7 @@ var TypeScriptConfig = class extends import_projen23.Component {
33157
33602
  AwsDeploymentTarget,
33158
33603
  AwsTeardownWorkflow,
33159
33604
  BUILT_IN_BUNDLES,
33605
+ BUNDLE_OWNERSHIP,
33160
33606
  CLAUDE_RULE_TARGET,
33161
33607
  COMPLETE_JOB_ID,
33162
33608
  DEFAULT_AC_THRESHOLDS,
@@ -33221,6 +33667,7 @@ var TypeScriptConfig = class extends import_projen23.Component {
33221
33667
  MINIMUM_RELEASE_AGE,
33222
33668
  MONOREPO_LAYOUT,
33223
33669
  MonorepoProject,
33670
+ Nvmrc,
33224
33671
  PROD_DEPLOY_NAME,
33225
33672
  PROGRESS_FILES_FORMAT_VALUES,
33226
33673
  PnpmWorkspace,
@@ -33300,7 +33747,12 @@ var TypeScriptConfig = class extends import_projen23.Component {
33300
33747
  formatStarlightSingletonViolation,
33301
33748
  getLatestEligibleVersion,
33302
33749
  githubWorkflowBundle,
33750
+ hasAnyDocsEmittingBundle,
33751
+ hasAnyDownstreamIssueKindBundle,
33303
33752
  industryDiscoveryBundle,
33753
+ isPhaseLabelOwnedByExcluded,
33754
+ isScheduledTaskOwnedByExcluded,
33755
+ isTypeLabelOwnedByExcluded,
33304
33756
  jestBundle,
33305
33757
  labelsForPhase,
33306
33758
  maintenanceAuditBundle,
@@ -33309,6 +33761,8 @@ var TypeScriptConfig = class extends import_projen23.Component {
33309
33761
  parseApiRollup,
33310
33762
  peopleProfileBundle,
33311
33763
  persistAuditReport,
33764
+ pinPnpmActionSetup,
33765
+ pinSetupNodeVersion,
33312
33766
  pnpmBundle,
33313
33767
  prReviewBundle,
33314
33768
  projenBundle,