@codedrifters/configulator 0.0.294 → 0.0.296

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,
@@ -338,7 +339,12 @@ __export(index_exports, {
338
339
  formatStarlightSingletonViolation: () => formatStarlightSingletonViolation,
339
340
  getLatestEligibleVersion: () => getLatestEligibleVersion,
340
341
  githubWorkflowBundle: () => githubWorkflowBundle,
342
+ hasAnyDocsEmittingBundle: () => hasAnyDocsEmittingBundle,
343
+ hasAnyDownstreamIssueKindBundle: () => hasAnyDownstreamIssueKindBundle,
341
344
  industryDiscoveryBundle: () => industryDiscoveryBundle,
345
+ isPhaseLabelOwnedByExcluded: () => isPhaseLabelOwnedByExcluded,
346
+ isScheduledTaskOwnedByExcluded: () => isScheduledTaskOwnedByExcluded,
347
+ isTypeLabelOwnedByExcluded: () => isTypeLabelOwnedByExcluded,
342
348
  jestBundle: () => jestBundle,
343
349
  labelsForPhase: () => labelsForPhase,
344
350
  maintenanceAuditBundle: () => maintenanceAuditBundle,
@@ -1404,8 +1410,8 @@ function resolveIssueTemplates(config) {
1404
1410
  function validateIssueTemplatesConfig(config) {
1405
1411
  return resolveIssueTemplates(config);
1406
1412
  }
1407
- function renderIssueTemplatesRuleContent(it) {
1408
- if (!it.enabled) {
1413
+ function renderIssueTemplatesRuleContent(it, hasDownstreamBundles = true) {
1414
+ if (!it.enabled || !hasDownstreamBundles) {
1409
1415
  return [
1410
1416
  "# Issue Templates",
1411
1417
  "",
@@ -11555,6 +11561,238 @@ function assertValidStateFilePath(stateFilePath) {
11555
11561
  }
11556
11562
  }
11557
11563
 
11564
+ // src/agent/bundles/bundle-ownership.ts
11565
+ var BUNDLE_OWNERSHIP = {
11566
+ agenda: {
11567
+ typeLabels: ["agenda"],
11568
+ phaseLabelPrefixes: ["agenda:"],
11569
+ scheduledTaskIds: ["worker-agenda"],
11570
+ emitsDocs: true,
11571
+ downstreamIssueKinds: true
11572
+ },
11573
+ "bcm-writer": {
11574
+ typeLabels: ["bcm-document"],
11575
+ phaseLabelPrefixes: ["bcm:"],
11576
+ scheduledTaskIds: ["worker-bcm-writer"],
11577
+ emitsDocs: true,
11578
+ downstreamIssueKinds: true
11579
+ },
11580
+ "business-models": {
11581
+ typeLabels: ["business-model"],
11582
+ phaseLabelPrefixes: ["business-models:"],
11583
+ scheduledTaskIds: ["worker-business-models"],
11584
+ emitsDocs: true,
11585
+ downstreamIssueKinds: true
11586
+ },
11587
+ "company-profile": {
11588
+ typeLabels: ["company-profile"],
11589
+ phaseLabelPrefixes: ["company:"],
11590
+ scheduledTaskIds: ["worker-company-profile"],
11591
+ emitsDocs: true,
11592
+ downstreamIssueKinds: true
11593
+ },
11594
+ "customer-profile": {
11595
+ typeLabels: ["customer-profile"],
11596
+ phaseLabelPrefixes: ["customer:"],
11597
+ scheduledTaskIds: ["worker-customer-profile"],
11598
+ emitsDocs: true,
11599
+ downstreamIssueKinds: true
11600
+ },
11601
+ "docs-sync": {
11602
+ typeLabels: ["docs-sync"],
11603
+ phaseLabelPrefixes: ["docs-sync:"],
11604
+ scheduledTaskIds: ["worker-docs-sync"],
11605
+ emitsDocs: true,
11606
+ downstreamIssueKinds: true
11607
+ },
11608
+ "industry-discovery": {
11609
+ typeLabels: ["industry-discovery"],
11610
+ phaseLabelPrefixes: ["industry:"],
11611
+ scheduledTaskIds: ["worker-industry-discovery"],
11612
+ emitsDocs: true,
11613
+ downstreamIssueKinds: true
11614
+ },
11615
+ "maintenance-audit": {
11616
+ typeLabels: ["maintenance"],
11617
+ phaseLabelPrefixes: ["maint:"],
11618
+ scheduledTaskIds: ["worker-maintenance"],
11619
+ emitsDocs: false,
11620
+ downstreamIssueKinds: true
11621
+ },
11622
+ "meeting-analysis": {
11623
+ typeLabels: ["meeting-processing"],
11624
+ phaseLabelPrefixes: ["meeting:"],
11625
+ scheduledTaskIds: ["worker-meeting-analysis"],
11626
+ emitsDocs: true,
11627
+ downstreamIssueKinds: true
11628
+ },
11629
+ orchestrator: {
11630
+ // The orchestrator pipeline manager itself ships with the
11631
+ // `worker-orchestrator` scheduled task. It owns no `type:*` label
11632
+ // (it dispatches every type) and no phase-label prefix.
11633
+ typeLabels: [],
11634
+ phaseLabelPrefixes: [],
11635
+ scheduledTaskIds: ["worker-orchestrator"],
11636
+ emitsDocs: false,
11637
+ downstreamIssueKinds: false
11638
+ },
11639
+ "people-profile": {
11640
+ typeLabels: ["people-profile"],
11641
+ phaseLabelPrefixes: ["people:"],
11642
+ scheduledTaskIds: ["worker-people-profile"],
11643
+ emitsDocs: true,
11644
+ downstreamIssueKinds: true
11645
+ },
11646
+ "pr-review": {
11647
+ typeLabels: ["pr-review"],
11648
+ phaseLabelPrefixes: [],
11649
+ scheduledTaskIds: ["worker-pr-review"],
11650
+ emitsDocs: false,
11651
+ downstreamIssueKinds: false
11652
+ },
11653
+ "regulatory-research": {
11654
+ typeLabels: ["regulatory-research"],
11655
+ phaseLabelPrefixes: ["regulatory:"],
11656
+ scheduledTaskIds: ["worker-regulatory-research"],
11657
+ emitsDocs: true,
11658
+ downstreamIssueKinds: true
11659
+ },
11660
+ "requirements-analyst": {
11661
+ typeLabels: ["requirement"],
11662
+ phaseLabelPrefixes: ["req:"],
11663
+ scheduledTaskIds: ["worker-requirements-analyst"],
11664
+ emitsDocs: true,
11665
+ downstreamIssueKinds: true
11666
+ },
11667
+ "requirements-reviewer": {
11668
+ // Co-owns `type:requirement` with the analyst and writer; owns
11669
+ // the `req:review` and `req:deprecate` phase labels exactly.
11670
+ typeLabels: ["requirement"],
11671
+ phaseLabelPrefixes: ["req:review", "req:deprecate"],
11672
+ scheduledTaskIds: ["worker-requirements-reviewer"],
11673
+ emitsDocs: true,
11674
+ downstreamIssueKinds: true
11675
+ },
11676
+ "requirements-writer": {
11677
+ // Co-owns `type:requirement` with the analyst and reviewer; owns
11678
+ // the `req:write` phase label exactly.
11679
+ typeLabels: ["requirement"],
11680
+ phaseLabelPrefixes: ["req:write"],
11681
+ scheduledTaskIds: ["worker-requirements-writer"],
11682
+ emitsDocs: true,
11683
+ downstreamIssueKinds: true
11684
+ },
11685
+ "research-pipeline": {
11686
+ typeLabels: ["research"],
11687
+ phaseLabelPrefixes: ["research:"],
11688
+ scheduledTaskIds: ["worker-research"],
11689
+ emitsDocs: true,
11690
+ downstreamIssueKinds: true
11691
+ },
11692
+ "software-profile": {
11693
+ typeLabels: ["software-profile"],
11694
+ phaseLabelPrefixes: ["software:"],
11695
+ scheduledTaskIds: ["worker-software-profile"],
11696
+ emitsDocs: true,
11697
+ downstreamIssueKinds: true
11698
+ },
11699
+ "standards-research": {
11700
+ typeLabels: ["standards-research"],
11701
+ phaseLabelPrefixes: ["standards:"],
11702
+ scheduledTaskIds: ["worker-standards-research"],
11703
+ emitsDocs: true,
11704
+ downstreamIssueKinds: true
11705
+ }
11706
+ };
11707
+ function isTypeLabelOwnedByExcluded(typeLabel, excludedBundles) {
11708
+ if (excludedBundles.length === 0) {
11709
+ return false;
11710
+ }
11711
+ for (const bundleName of excludedBundles) {
11712
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11713
+ if (!ownership) {
11714
+ continue;
11715
+ }
11716
+ if (ownership.typeLabels.includes(typeLabel)) {
11717
+ const owners = findOwnersOfTypeLabel(typeLabel);
11718
+ const allExcluded = owners.every(
11719
+ (owner) => excludedBundles.includes(owner)
11720
+ );
11721
+ if (allExcluded) {
11722
+ return true;
11723
+ }
11724
+ }
11725
+ }
11726
+ return false;
11727
+ }
11728
+ function isPhaseLabelOwnedByExcluded(phaseLabel, excludedBundles) {
11729
+ if (excludedBundles.length === 0) {
11730
+ return false;
11731
+ }
11732
+ for (const bundleName of excludedBundles) {
11733
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11734
+ if (!ownership) {
11735
+ continue;
11736
+ }
11737
+ for (const entry of ownership.phaseLabelPrefixes) {
11738
+ if (entry.endsWith(":")) {
11739
+ if (phaseLabel.startsWith(entry)) {
11740
+ return true;
11741
+ }
11742
+ } else if (phaseLabel === entry) {
11743
+ return true;
11744
+ }
11745
+ }
11746
+ }
11747
+ return false;
11748
+ }
11749
+ function isScheduledTaskOwnedByExcluded(taskId, excludedBundles) {
11750
+ if (excludedBundles.length === 0) {
11751
+ return false;
11752
+ }
11753
+ for (const bundleName of excludedBundles) {
11754
+ const ownership = BUNDLE_OWNERSHIP[bundleName];
11755
+ if (!ownership) {
11756
+ continue;
11757
+ }
11758
+ if (ownership.scheduledTaskIds.includes(taskId)) {
11759
+ return true;
11760
+ }
11761
+ }
11762
+ return false;
11763
+ }
11764
+ function hasAnyDocsEmittingBundle(excludedBundles) {
11765
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11766
+ if (!ownership.emitsDocs) {
11767
+ continue;
11768
+ }
11769
+ if (!excludedBundles.includes(bundleName)) {
11770
+ return true;
11771
+ }
11772
+ }
11773
+ return false;
11774
+ }
11775
+ function hasAnyDownstreamIssueKindBundle(excludedBundles) {
11776
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11777
+ if (!ownership.downstreamIssueKinds) {
11778
+ continue;
11779
+ }
11780
+ if (!excludedBundles.includes(bundleName)) {
11781
+ return true;
11782
+ }
11783
+ }
11784
+ return false;
11785
+ }
11786
+ function findOwnersOfTypeLabel(typeLabel) {
11787
+ const owners = [];
11788
+ for (const [bundleName, ownership] of Object.entries(BUNDLE_OWNERSHIP)) {
11789
+ if (ownership.typeLabels.includes(typeLabel)) {
11790
+ owners.push(bundleName);
11791
+ }
11792
+ }
11793
+ return owners;
11794
+ }
11795
+
11558
11796
  // src/agent/bundles/scheduled-tasks.ts
11559
11797
  var SCHEDULED_TASK_MODEL_VALUES = ["opus", "sonnet", "haiku"];
11560
11798
  var SCHEDULED_TASK_KIND_VALUES = ["issue-worker", "pipeline"];
@@ -11819,17 +12057,23 @@ var DEFAULT_SCHEDULED_TASK_ENTRIES = [
11819
12057
  description: "Documentation-sync drift-detection and audit pipeline (scaffolding release \u2014 behavior carried by downstream child issues of the parent docs-sync epic)."
11820
12058
  }
11821
12059
  ];
11822
- function resolveScheduledTasks(config) {
12060
+ function resolveScheduledTasks(config, excludeBundles = []) {
11823
12061
  const root = config?.root ?? DEFAULT_SCHEDULED_TASKS_ROOT;
11824
12062
  assertValidRoot(root);
11825
12063
  const merged = /* @__PURE__ */ new Map();
11826
12064
  for (const entry of DEFAULT_SCHEDULED_TASK_ENTRIES) {
12065
+ if (isScheduledTaskOwnedByExcluded(entry.taskId, excludeBundles)) {
12066
+ continue;
12067
+ }
11827
12068
  merged.set(entry.taskId, entry);
11828
12069
  }
11829
12070
  if (config?.overrides) {
11830
12071
  for (const [taskId, override] of Object.entries(config.overrides)) {
11831
12072
  const existing = merged.get(taskId);
11832
12073
  if (!existing) {
12074
+ if (isScheduledTaskOwnedByExcluded(taskId, excludeBundles)) {
12075
+ continue;
12076
+ }
11833
12077
  throw new Error(
11834
12078
  `ScheduledTasksConfig.overrides references unknown taskId ${JSON.stringify(
11835
12079
  taskId
@@ -11860,8 +12104,8 @@ function resolveScheduledTasks(config) {
11860
12104
  tasks: [...merged.values()]
11861
12105
  };
11862
12106
  }
11863
- function validateScheduledTasksConfig(config) {
11864
- return resolveScheduledTasks(config);
12107
+ function validateScheduledTasksConfig(config, excludeBundles = []) {
12108
+ return resolveScheduledTasks(config, excludeBundles);
11865
12109
  }
11866
12110
  function renderScheduledTasksSection(resolved) {
11867
12111
  const lines = [
@@ -12344,7 +12588,7 @@ function classifyIssueScope(body, gate, labels = []) {
12344
12588
  matchedLabel: effective.matchedLabel
12345
12589
  };
12346
12590
  }
12347
- function renderScopeGateSection(gate) {
12591
+ function renderScopeGateSection(gate, excludeBundles = []) {
12348
12592
  const { acceptanceCriteria: ac, sources } = gate;
12349
12593
  const lines = [
12350
12594
  "## Scope gate",
@@ -12418,7 +12662,9 @@ function renderScopeGateSection(gate) {
12418
12662
  " is in place."
12419
12663
  );
12420
12664
  }
12421
- const overrideEntries = Object.entries(gate.bundleOverrides);
12665
+ const overrideEntries = Object.entries(gate.bundleOverrides).filter(
12666
+ ([label]) => !isPhaseLabelOwnedByExcluded(label, excludeBundles)
12667
+ );
12422
12668
  if (overrideEntries.length > 0) {
12423
12669
  lines.push(
12424
12670
  "",
@@ -12762,9 +13008,12 @@ function validateAgentTierConfig(config) {
12762
13008
  }
12763
13009
  return resolveAgentTiers(config);
12764
13010
  }
12765
- function renderAgentTierSection(tiers) {
13011
+ function renderAgentTierSection(tiers, excludeBundles = []) {
13012
+ const filtered = tiers.filter(
13013
+ (entry) => !isTypeLabelOwnedByExcluded(entry.type, excludeBundles)
13014
+ );
12766
13015
  const grouped = /* @__PURE__ */ new Map();
12767
- for (const entry of tiers) {
13016
+ for (const entry of filtered) {
12768
13017
  const bucket = grouped.get(entry.tier) ?? [];
12769
13018
  bucket.push(entry);
12770
13019
  grouped.set(entry.tier, bucket);
@@ -14495,13 +14744,13 @@ var ORCHESTRATOR_CONVENTIONS_PREAMBLE = [
14495
14744
  "",
14496
14745
  '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
14746
  ].join("\n");
14498
- function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate(), runRatio = resolveRunRatio(), scheduledTasks = resolveScheduledTasks(), unblockDependents = resolveUnblockDependents()) {
14747
+ function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate(), runRatio = resolveRunRatio(), scheduledTasks = resolveScheduledTasks(), unblockDependents = resolveUnblockDependents(), excludeBundles = []) {
14499
14748
  return [
14500
14749
  ORCHESTRATOR_CONVENTIONS_PREAMBLE,
14501
14750
  "",
14502
- renderAgentTierSection(tiers),
14751
+ renderAgentTierSection(tiers, excludeBundles),
14503
14752
  "",
14504
- renderScopeGateSection(scopeGate),
14753
+ renderScopeGateSection(scopeGate, excludeBundles),
14505
14754
  "",
14506
14755
  renderRunRatioSection(runRatio),
14507
14756
  "",
@@ -14510,11 +14759,14 @@ function buildOrchestratorConventionsContent(tiers, scopeGate = resolveScopeGate
14510
14759
  renderUnblockDependentsSection(unblockDependents)
14511
14760
  ].join("\n");
14512
14761
  }
14513
- function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig, scheduledTasksConfig, unblockDependentsConfig) {
14762
+ function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig, scheduledTasksConfig, unblockDependentsConfig, excludeBundles = []) {
14514
14763
  const tiers = resolveAgentTiers(tierConfig);
14515
14764
  const scopeGate = resolveScopeGate(scopeGateConfig);
14516
14765
  const runRatio = resolveRunRatio(runRatioConfig);
14517
- const scheduledTasks = resolveScheduledTasks(scheduledTasksConfig);
14766
+ const scheduledTasks = resolveScheduledTasks(
14767
+ scheduledTasksConfig,
14768
+ excludeBundles
14769
+ );
14518
14770
  const unblockDependentsResolved = resolveUnblockDependents(
14519
14771
  unblockDependentsConfig
14520
14772
  );
@@ -14529,7 +14781,8 @@ function resolveOrchestratorAssets(tierConfig, scopeGateConfig, runRatioConfig,
14529
14781
  scopeGate,
14530
14782
  runRatio,
14531
14783
  scheduledTasks,
14532
- unblockDependentsResolved
14784
+ unblockDependentsResolved,
14785
+ excludeBundles
14533
14786
  ),
14534
14787
  procedure: buildCheckBlockedProcedure(tiers, scopeGate, runRatio),
14535
14788
  unblockDependentsProcedure: buildUnblockDependentsProcedure(
@@ -26805,7 +27058,7 @@ var VERSION = {
26805
27058
  /**
26806
27059
  * Version of Astro to pin for AstroProject scaffolding.
26807
27060
  */
26808
- ASTRO_VERSION: "6.2.1",
27061
+ ASTRO_VERSION: "6.2.2",
26809
27062
  /**
26810
27063
  * CDK CLI for workflows and command line operations.
26811
27064
  *
@@ -26834,7 +27087,7 @@ var VERSION = {
26834
27087
  /**
26835
27088
  * Version of PNPM to use in workflows at github actions.
26836
27089
  */
26837
- PNPM_VERSION: "10.33.2",
27090
+ PNPM_VERSION: "10.33.3",
26838
27091
  /**
26839
27092
  * Version of Projen to use.
26840
27093
  */
@@ -26852,11 +27105,11 @@ var VERSION = {
26852
27105
  /**
26853
27106
  * Version of @astrojs/starlight to pin for StarlightProject scaffolding.
26854
27107
  */
26855
- STARLIGHT_VERSION: "0.38.4",
27108
+ STARLIGHT_VERSION: "0.38.5",
26856
27109
  /**
26857
27110
  * What version of the turborepo library should we use?
26858
27111
  */
26859
- TURBO_VERSION: "2.9.8",
27112
+ TURBO_VERSION: "2.9.9",
26860
27113
  /**
26861
27114
  * Version of @types/node to use across all packages (pnpm catalog).
26862
27115
  */
@@ -28304,7 +28557,8 @@ var AgentConfig = class _AgentConfig extends import_projen8.Component {
28304
28557
  this.project.gitignore.addPatterns(`/${resolvedProgressFiles.stateDir}/`);
28305
28558
  }
28306
28559
  const resolvedScheduledTasks = validateScheduledTasksConfig(
28307
- this.options.scheduledTasks
28560
+ this.options.scheduledTasks,
28561
+ this.options.excludeBundles ?? []
28308
28562
  );
28309
28563
  if (resolvedScheduledTasks.enabled) {
28310
28564
  for (const task of resolvedScheduledTasks.tasks) {
@@ -28512,7 +28766,8 @@ ${section}`
28512
28766
  }
28513
28767
  }
28514
28768
  }
28515
- if (this.options.tiers || this.options.scopeGate || this.options.runRatio || this.options.scheduledTasks || this.options.unblockDependents) {
28769
+ const excludedBundleNames = this.options.excludeBundles ?? [];
28770
+ if (this.options.tiers || this.options.scopeGate || this.options.runRatio || this.options.scheduledTasks || this.options.unblockDependents || excludedBundleNames.length > 0) {
28516
28771
  const orchestratorRule = ruleMap.get("orchestrator-conventions");
28517
28772
  if (orchestratorRule) {
28518
28773
  const { conventionsContent } = resolveOrchestratorAssets(
@@ -28520,7 +28775,8 @@ ${section}`
28520
28775
  this.options.scopeGate,
28521
28776
  this.options.runRatio,
28522
28777
  this.options.scheduledTasks,
28523
- this.options.unblockDependents
28778
+ this.options.unblockDependents,
28779
+ excludedBundleNames
28524
28780
  );
28525
28781
  if (conventionsContent !== orchestratorRule.content) {
28526
28782
  ruleMap.set("orchestrator-conventions", {
@@ -28653,11 +28909,13 @@ ${hook}`
28653
28909
  const resolvedIssueTemplatesForRules = resolveIssueTemplates(
28654
28910
  this.options.issueTemplates
28655
28911
  );
28656
- if (this.options.issueTemplates) {
28912
+ const hasDownstreamBundles = hasAnyDownstreamIssueKindBundle(excludedBundleNames);
28913
+ if (this.options.issueTemplates || !hasDownstreamBundles) {
28657
28914
  const issueTemplatesRule = ruleMap.get("issue-templates-convention");
28658
28915
  if (issueTemplatesRule) {
28659
28916
  const issueTemplatesContent = renderIssueTemplatesRuleContent(
28660
- resolvedIssueTemplatesForRules
28917
+ resolvedIssueTemplatesForRules,
28918
+ hasDownstreamBundles
28661
28919
  );
28662
28920
  if (issueTemplatesContent !== issueTemplatesRule.content) {
28663
28921
  ruleMap.set("issue-templates-convention", {
@@ -28667,7 +28925,10 @@ ${hook}`
28667
28925
  }
28668
28926
  }
28669
28927
  }
28670
- if (resolvedIssueTemplatesForRules.enabled) {
28928
+ if (!hasAnyDocsEmittingBundle(excludedBundleNames)) {
28929
+ ruleMap.delete("stub-index-convention");
28930
+ }
28931
+ if (resolvedIssueTemplatesForRules.enabled && hasDownstreamBundles) {
28671
28932
  for (const [ruleName, label] of ISSUE_TEMPLATES_BUNDLE_HOOKS) {
28672
28933
  const existing = ruleMap.get(ruleName);
28673
28934
  if (!existing) {
@@ -33157,6 +33418,7 @@ var TypeScriptConfig = class extends import_projen23.Component {
33157
33418
  AwsDeploymentTarget,
33158
33419
  AwsTeardownWorkflow,
33159
33420
  BUILT_IN_BUNDLES,
33421
+ BUNDLE_OWNERSHIP,
33160
33422
  CLAUDE_RULE_TARGET,
33161
33423
  COMPLETE_JOB_ID,
33162
33424
  DEFAULT_AC_THRESHOLDS,
@@ -33300,7 +33562,12 @@ var TypeScriptConfig = class extends import_projen23.Component {
33300
33562
  formatStarlightSingletonViolation,
33301
33563
  getLatestEligibleVersion,
33302
33564
  githubWorkflowBundle,
33565
+ hasAnyDocsEmittingBundle,
33566
+ hasAnyDownstreamIssueKindBundle,
33303
33567
  industryDiscoveryBundle,
33568
+ isPhaseLabelOwnedByExcluded,
33569
+ isScheduledTaskOwnedByExcluded,
33570
+ isTypeLabelOwnedByExcluded,
33304
33571
  jestBundle,
33305
33572
  labelsForPhase,
33306
33573
  maintenanceAuditBundle,