@codedrifters/configulator 0.0.181 → 0.0.183

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
@@ -185,6 +185,9 @@ __export(index_exports, {
185
185
  BUILT_IN_BUNDLES: () => BUILT_IN_BUNDLES,
186
186
  CLAUDE_RULE_TARGET: () => CLAUDE_RULE_TARGET,
187
187
  COMPLETE_JOB_ID: () => COMPLETE_JOB_ID,
188
+ DEFAULT_PRIORITY_LABELS: () => DEFAULT_PRIORITY_LABELS,
189
+ DEFAULT_STATUS_LABELS: () => DEFAULT_STATUS_LABELS,
190
+ DEFAULT_TYPE_LABELS: () => DEFAULT_TYPE_LABELS,
188
191
  JsiiFaker: () => JsiiFaker,
189
192
  MCP_TRANSPORT: () => MCP_TRANSPORT,
190
193
  MERGE_METHODS: () => MERGE_METHODS,
@@ -209,13 +212,16 @@ __export(index_exports, {
209
212
  Vitest: () => Vitest,
210
213
  addApproveMergeUpgradeWorkflow: () => addApproveMergeUpgradeWorkflow,
211
214
  addBuildCompleteJob: () => addBuildCompleteJob,
215
+ addSyncLabelsWorkflow: () => addSyncLabelsWorkflow,
212
216
  awsCdkBundle: () => awsCdkBundle,
213
217
  baseBundle: () => baseBundle,
214
218
  getLatestEligibleVersion: () => getLatestEligibleVersion,
215
219
  githubWorkflowBundle: () => githubWorkflowBundle,
216
220
  jestBundle: () => jestBundle,
221
+ meetingAnalysisBundle: () => meetingAnalysisBundle,
217
222
  pnpmBundle: () => pnpmBundle,
218
223
  projenBundle: () => projenBundle,
224
+ resolveModelAlias: () => resolveModelAlias,
219
225
  resolveTemplateVariables: () => resolveTemplateVariables,
220
226
  slackBundle: () => slackBundle,
221
227
  turborepoBundle: () => turborepoBundle,
@@ -249,6 +255,17 @@ var AGENT_MODEL = {
249
255
  BALANCED: "balanced",
250
256
  POWERFUL: "powerful"
251
257
  };
258
+ function resolveModelAlias(model) {
259
+ if (!model || model === AGENT_MODEL.INHERIT) {
260
+ return void 0;
261
+ }
262
+ const mapping = {
263
+ [AGENT_MODEL.POWERFUL]: "opus",
264
+ [AGENT_MODEL.BALANCED]: "sonnet",
265
+ [AGENT_MODEL.FAST]: "haiku"
266
+ };
267
+ return mapping[model] ?? model;
268
+ }
252
269
  var MCP_TRANSPORT = {
253
270
  STDIO: "stdio",
254
271
  HTTP: "http",
@@ -995,6 +1012,297 @@ var jestBundle = {
995
1012
  }
996
1013
  };
997
1014
 
1015
+ // src/agent/bundles/meeting-analysis.ts
1016
+ var meetingAnalystSubAgent = {
1017
+ name: "meeting-analyst",
1018
+ description: "Processes meeting transcripts through a 4-phase pipeline: extract, notes, draft, and link",
1019
+ model: AGENT_MODEL.POWERFUL,
1020
+ maxTurns: 80,
1021
+ platforms: { cursor: { exclude: true } },
1022
+ prompt: [
1023
+ "# Meeting Analyst Agent",
1024
+ "",
1025
+ "You process meeting transcripts through a structured 4-phase pipeline.",
1026
+ "Each phase runs as a **separate agent session**, triggered by its own",
1027
+ "GitHub issue with a `meeting:*` phase label. You handle exactly **one",
1028
+ "phase per session** \u2014 read the issue to determine which phase to execute.",
1029
+ "",
1030
+ "## Execution Model",
1031
+ "",
1032
+ "1. Each meeting produces up to 4 GitHub issues (one per phase)",
1033
+ "2. Each issue carries a `meeting:*` label identifying the phase",
1034
+ "3. You pick up one issue, execute that phase, commit/push, then close the issue",
1035
+ "4. Phase 1 (Extract) creates the downstream phase issues for phases 2-4",
1036
+ "5. Each downstream issue includes `Depends on: #N` linking to its predecessor",
1037
+ "",
1038
+ "## Design Principles",
1039
+ "",
1040
+ "1. **Extract, don't interpret.** Capture what was said and decided. Flag",
1041
+ " ambiguity as open items rather than resolving it.",
1042
+ "2. **Route to the right category.** Meeting content maps to requirements,",
1043
+ " ADRs, product docs, and business strategy. Each output goes to the",
1044
+ " correct location per the project's taxonomy.",
1045
+ "3. **Preserve provenance.** Every extracted item links back to the meeting",
1046
+ " source so reviewers can check context.",
1047
+ "4. **Create issues, not documents.** For requirements and ADRs, create",
1048
+ " GitHub issues that other agents or humans will pick up. Do not write",
1049
+ " final requirement documents yourself.",
1050
+ "5. **Bi-directional traceability.** Every document and issue created by",
1051
+ " this pipeline must link back to the meeting source, and the meeting",
1052
+ " source documents must link forward to everything created from them.",
1053
+ "",
1054
+ "---",
1055
+ "",
1056
+ "## Traceability",
1057
+ "",
1058
+ "All outputs must be bi-directionally linked so any artifact can be traced",
1059
+ "back to the meeting that produced it and forward to everything it spawned.",
1060
+ "",
1061
+ "### Backward links (created artifact \u2192 meeting source)",
1062
+ "",
1063
+ "Every GitHub issue and document created by this pipeline must include a",
1064
+ "`## Traceability` section with:",
1065
+ "",
1066
+ "```markdown",
1067
+ "## Traceability",
1068
+ "",
1069
+ "- **Source meeting:** <path to transcript or meeting notes>",
1070
+ "- **Extraction:** <path to extraction file>",
1071
+ "- **Phase issue:** #<N> (the phase issue that created this artifact)",
1072
+ "```",
1073
+ "",
1074
+ "### Forward links (meeting source \u2192 created artifacts)",
1075
+ "",
1076
+ "After Phase 4 (Link) creates all follow-up issues and documents:",
1077
+ "",
1078
+ "1. **Update the extraction file** with a `## Downstream Artifacts` section",
1079
+ " listing every issue and document created from this meeting:",
1080
+ "",
1081
+ " ```markdown",
1082
+ " ## Downstream Artifacts",
1083
+ "",
1084
+ " | Artifact | Type | Issue/Path |",
1085
+ " |----------|------|------------|",
1086
+ " | <title> | requirement / ADR / action-item / profile | #<N> or <path> |",
1087
+ " ```",
1088
+ "",
1089
+ "2. **Update the meeting notes** with a similar `## Related Issues` section",
1090
+ " listing all issues created from this meeting.",
1091
+ "",
1092
+ "3. **Comment on the extract issue** with a summary linking to all created",
1093
+ " artifacts.",
1094
+ "",
1095
+ "### Within-pipeline links",
1096
+ "",
1097
+ "- Phase issues link to predecessors via `Depends on: #N`",
1098
+ "- Phase issues reference the extraction file path in their body",
1099
+ "- Draft documents reference both the extraction and the meeting notes",
1100
+ "",
1101
+ "---",
1102
+ "",
1103
+ "## Phase 1: Extract (`meeting:extract`)",
1104
+ "",
1105
+ "**Goal:** Read the meeting transcript and categorize all substantive content.",
1106
+ "",
1107
+ "### Steps",
1108
+ "",
1109
+ "1. Read the transcript file specified in the issue body.",
1110
+ "2. Identify and categorize content into these buckets:",
1111
+ "",
1112
+ " | Bucket | What to look for |",
1113
+ " |--------|-----------------|",
1114
+ ` | **Decisions** | "We decided...", "Let's go with...", explicit choices |`,
1115
+ ' | **Requirements** | Feature descriptions, acceptance criteria, "it should..." |',
1116
+ " | **Technology discussions** | Platform comparisons, architecture options, tool evaluations |",
1117
+ ' | **Action items** | "[Person] will...", "Next step is...", assigned tasks |',
1118
+ ' | **Open questions** | "We need to figure out...", unresolved debates |',
1119
+ " | **People of interest** | Industry contacts, domain experts mentioned |",
1120
+ " | **Companies of interest** | Competitors, vendors, partners discussed |",
1121
+ " | **Strategic direction** | Business model changes, market positioning |",
1122
+ " | **Product direction** | Roadmap changes, feature prioritization |",
1123
+ "",
1124
+ "3. Write the extraction to a markdown file with structured sections:",
1125
+ " - Attendees",
1126
+ " - Decisions Made (with category and confidence: Firm / Tentative / Needs confirmation)",
1127
+ " - Requirements Identified (with category and priority estimate)",
1128
+ " - Technology Discussions (with status: Decided / Leaning toward / Open)",
1129
+ " - Action Items (with assignee and due date if stated)",
1130
+ " - Open Questions",
1131
+ " - People of Interest (with context and whether a profile exists)",
1132
+ " - Companies of Interest (with type and context)",
1133
+ " - Strategic / Product Direction",
1134
+ "",
1135
+ "4. **Create downstream phase issues** using `gh issue create`:",
1136
+ " - Always create a `meeting:notes` issue (blocked on this extract issue)",
1137
+ " - If requirements OR decisions/ADRs identified, create a `meeting:draft` issue",
1138
+ " (blocked on the notes issue)",
1139
+ " - Always create a `meeting:link` issue \u2014 blocked on the draft issue if one",
1140
+ " was created, otherwise blocked on the notes issue",
1141
+ "",
1142
+ "5. Commit, push, and close the extract issue.",
1143
+ "",
1144
+ "---",
1145
+ "",
1146
+ "## Phase 2: Notes (`meeting:notes`)",
1147
+ "",
1148
+ "**Goal:** Transform the extraction into structured meeting notes.",
1149
+ "",
1150
+ "### Steps",
1151
+ "",
1152
+ "1. Read the extraction file referenced in the issue body (output of Phase 1).",
1153
+ "2. Write structured meeting notes with these sections:",
1154
+ " - Meeting metadata (title, date, attendees)",
1155
+ " - Agenda / topics covered",
1156
+ " - Key Discussion Points (organized by topic)",
1157
+ " - Decisions (numbered, with rationale)",
1158
+ " - Action Items (table: who, what, when)",
1159
+ " - Open Questions",
1160
+ " - Follow-up items",
1161
+ "3. Commit, push, and close the notes issue.",
1162
+ "",
1163
+ "---",
1164
+ "",
1165
+ "## Phase 3: Draft (`meeting:draft`)",
1166
+ "",
1167
+ "**Goal:** Draft proposals for requirements, ADRs, and product/strategy updates.",
1168
+ "",
1169
+ "This phase only exists if the extraction identified requirements, architectural",
1170
+ "decisions, or strategy changes. If this issue exists, execute it.",
1171
+ "",
1172
+ "### Steps",
1173
+ "",
1174
+ "1. Read the extraction file from Phase 1.",
1175
+ "2. Check existing requirement registries and ADR registries for duplicates.",
1176
+ "3. Draft requirement proposals with:",
1177
+ " - Category (FR, BR, NFR, etc.)",
1178
+ " - Summary (2-3 sentences)",
1179
+ " - Draft acceptance criteria",
1180
+ " - Related existing requirements",
1181
+ "4. Draft ADR proposals for technology decisions with:",
1182
+ " - Context and problem statement",
1183
+ " - Options discussed",
1184
+ " - Stated preferences or decisions",
1185
+ " - Status: Proposed or Decided",
1186
+ "5. Summarize product/strategy document updates needed.",
1187
+ "6. Commit, push, and close the draft issue.",
1188
+ "",
1189
+ "---",
1190
+ "",
1191
+ "## Phase 4: Link (`meeting:link`)",
1192
+ "",
1193
+ "**Goal:** Create GitHub issues for follow-up work, cross-reference the",
1194
+ "meeting into existing documentation, and complete bi-directional traceability.",
1195
+ "",
1196
+ "### Steps",
1197
+ "",
1198
+ "1. Read the drafts from Phase 3 (if they exist) and the extraction from Phase 1.",
1199
+ "2. Create requirement issues using `gh issue create` with appropriate labels.",
1200
+ " Include a `## Traceability` section in each issue body linking back to",
1201
+ " the source meeting and extraction file.",
1202
+ "3. Create ADR issues if technology decisions need formal records.",
1203
+ " Include a `## Traceability` section in each.",
1204
+ "4. Create action item issues for tasks that are not document-related.",
1205
+ " Include a `## Traceability` section in each.",
1206
+ "5. Cross-reference the meeting in any existing documents that were discussed.",
1207
+ "6. Apply direct product/strategy doc updates for items flagged as **Firm**",
1208
+ " confidence in the extraction.",
1209
+ "7. **Update the extraction file** with a `## Downstream Artifacts` section",
1210
+ " listing every issue and document created from this meeting.",
1211
+ "8. **Update the meeting notes** with a `## Related Issues` section listing",
1212
+ " all issues created from this meeting.",
1213
+ "9. Comment on the parent extract issue with a summary linking to all",
1214
+ " created artifacts.",
1215
+ "10. Commit and push (if any file changes were made), then close the link issue.",
1216
+ "",
1217
+ "---",
1218
+ "",
1219
+ "## GitHub Integration",
1220
+ "",
1221
+ "- Use `gh` CLI for all GitHub operations",
1222
+ "- Apply the appropriate `meeting:*` phase label to each phase issue",
1223
+ "- Use `type:docs` for documentation-producing issues, `type:chore` for",
1224
+ " maintenance/organizational tasks",
1225
+ "- Use `status:` labels to track progress (`status:ready`, `status:in-progress`, `status:done`)",
1226
+ "- Reference the source meeting transcript in all created issues",
1227
+ "- Link phase issues with `Depends on: #N` to enforce ordering",
1228
+ "",
1229
+ "## When to Shorten the Pipeline",
1230
+ "",
1231
+ "- **Short meetings** (<30 min, <2000 words): combine extract + notes into one session",
1232
+ "- **No requirements or decisions**: Phase 1 skips creating the `meeting:draft` issue",
1233
+ "- **Only action items**: extract + notes + link (3 phase issues)"
1234
+ ].join("\n")
1235
+ };
1236
+ var processMeetingSkill = {
1237
+ name: "process-meeting",
1238
+ description: "Process a meeting transcript through the 4-phase meeting analysis pipeline",
1239
+ disableModelInvocation: true,
1240
+ userInvocable: true,
1241
+ context: "fork",
1242
+ agent: "meeting-analyst",
1243
+ platforms: { cursor: { exclude: true } },
1244
+ instructions: [
1245
+ "# Process Meeting Transcript",
1246
+ "",
1247
+ "Kick off meeting transcript processing by executing Phase 1 (Extract)",
1248
+ "and creating downstream phase issues for the remaining phases.",
1249
+ "",
1250
+ "## Usage",
1251
+ "",
1252
+ "/process-meeting <path-to-transcript>",
1253
+ "",
1254
+ "## Steps",
1255
+ "",
1256
+ "1. Read the provided transcript file",
1257
+ "2. Execute Phase 1 (Extract) \u2014 categorize transcript content into",
1258
+ " decisions, requirements, action items, open questions, and more",
1259
+ "3. Write the extraction to a markdown file",
1260
+ "4. Create downstream phase issues using `gh issue create`:",
1261
+ " - `meeting:notes` issue (always)",
1262
+ " - `meeting:draft` issue (if requirements or decisions were found)",
1263
+ " - `meeting:link` issue (always)",
1264
+ "5. Each downstream issue includes `Depends on:` linking to its predecessor",
1265
+ "6. Commit and push the extraction file",
1266
+ "",
1267
+ "## Input",
1268
+ "",
1269
+ "Provide a path to a meeting transcript file (text or markdown).",
1270
+ "The transcript should contain speaker-attributed dialogue.",
1271
+ "",
1272
+ "## Output",
1273
+ "",
1274
+ "- An extraction markdown file with categorized meeting content",
1275
+ "- Phase issues with `meeting:*` labels for downstream agent sessions",
1276
+ " to pick up (notes, draft, link)"
1277
+ ].join("\n")
1278
+ };
1279
+ var meetingAnalysisBundle = {
1280
+ name: "meeting-analysis",
1281
+ description: "Meeting transcript processing workflow with 4-phase pipeline (extract, notes, draft, link)",
1282
+ appliesWhen: () => true,
1283
+ rules: [
1284
+ {
1285
+ name: "meeting-processing-workflow",
1286
+ description: "Describes the 4-phase meeting processing pipeline, extraction taxonomy, and labeling conventions",
1287
+ scope: AGENT_RULE_SCOPE.ALWAYS,
1288
+ content: [
1289
+ "# Meeting Processing Workflow",
1290
+ "",
1291
+ "Use `/process-meeting <path>` to process a meeting transcript through a",
1292
+ "4-phase pipeline (extract \u2192 notes \u2192 draft \u2192 link). Each phase runs as a",
1293
+ "separate agent session tracked by a GitHub issue with a `meeting:*` label.",
1294
+ "See the `meeting-analyst` agent definition for full workflow details."
1295
+ ].join("\n"),
1296
+ platforms: {
1297
+ cursor: { exclude: true }
1298
+ },
1299
+ tags: ["workflow"]
1300
+ }
1301
+ ],
1302
+ skills: [processMeetingSkill],
1303
+ subAgents: [meetingAnalystSubAgent]
1304
+ };
1305
+
998
1306
  // src/pnpm/pnpm-workspace.ts
999
1307
  var import_path = require("path");
1000
1308
  var import_projen = require("projen");
@@ -2011,7 +2319,8 @@ var BUILT_IN_BUNDLES = [
2011
2319
  awsCdkBundle,
2012
2320
  projenBundle,
2013
2321
  githubWorkflowBundle,
2014
- slackBundle
2322
+ slackBundle,
2323
+ meetingAnalysisBundle
2015
2324
  ];
2016
2325
 
2017
2326
  // src/agent/bundles/scope.ts
@@ -2343,6 +2652,7 @@ var ClaudeRenderer = class _ClaudeRenderer {
2343
2652
  }
2344
2653
  static renderSkills(component, skills) {
2345
2654
  for (const skill of skills) {
2655
+ if (skill.platforms?.claude?.exclude) continue;
2346
2656
  const lines = [];
2347
2657
  lines.push("---");
2348
2658
  lines.push(`name: "${skill.name}"`);
@@ -2353,8 +2663,9 @@ var ClaudeRenderer = class _ClaudeRenderer {
2353
2663
  if (skill.userInvocable === false) {
2354
2664
  lines.push(`user-invocable: false`);
2355
2665
  }
2356
- if (skill.model) {
2357
- lines.push(`model: "${skill.model}"`);
2666
+ const resolvedSkillModel = resolveModelAlias(skill.model);
2667
+ if (resolvedSkillModel) {
2668
+ lines.push(`model: "${resolvedSkillModel}"`);
2358
2669
  }
2359
2670
  if (skill.effort) {
2360
2671
  lines.push(`effort: "${skill.effort}"`);
@@ -2396,8 +2707,9 @@ var ClaudeRenderer = class _ClaudeRenderer {
2396
2707
  lines.push(`name: ${agent.name}`);
2397
2708
  lines.push(`description: >-`);
2398
2709
  lines.push(` ${agent.description}`);
2399
- if (agent.model) {
2400
- lines.push(`model: ${agent.model}`);
2710
+ const resolvedModel = resolveModelAlias(agent.model);
2711
+ if (resolvedModel) {
2712
+ lines.push(`model: ${resolvedModel}`);
2401
2713
  }
2402
2714
  if (agent.tools && agent.tools.length > 0) {
2403
2715
  lines.push(`tools:`);
@@ -2510,6 +2822,7 @@ var CursorRenderer = class _CursorRenderer {
2510
2822
  }
2511
2823
  static renderSkills(component, skills) {
2512
2824
  for (const skill of skills) {
2825
+ if (skill.platforms?.cursor?.exclude) continue;
2513
2826
  const lines = [];
2514
2827
  lines.push("---");
2515
2828
  lines.push(`name: "${skill.name}"`);
@@ -2551,9 +2864,6 @@ var CursorRenderer = class _CursorRenderer {
2551
2864
  lines.push(`name: ${agent.name}`);
2552
2865
  lines.push(`description: >-`);
2553
2866
  lines.push(` ${agent.description}`);
2554
- if (agent.model) {
2555
- lines.push(`model: ${agent.model}`);
2556
- }
2557
2867
  if (agent.platforms?.cursor?.readonly) {
2558
2868
  lines.push(`readonly: true`);
2559
2869
  }
@@ -3859,6 +4169,198 @@ function addBuildCompleteJob(buildWorkflow) {
3859
4169
  });
3860
4170
  }
3861
4171
 
4172
+ // src/workflows/sync-labels.ts
4173
+ var import_projen15 = require("projen");
4174
+ var import_workflows_model4 = require("projen/lib/github/workflows-model");
4175
+ var DEFAULT_STATUS_LABELS = [
4176
+ {
4177
+ name: "status:ready",
4178
+ color: "0E8A16",
4179
+ description: "Task is ready for pickup"
4180
+ },
4181
+ {
4182
+ name: "status:in-progress",
4183
+ color: "FBCA04",
4184
+ description: "Actively being worked on"
4185
+ },
4186
+ {
4187
+ name: "status:blocked",
4188
+ color: "D93F0B",
4189
+ description: "Blocked on a dependency or question"
4190
+ },
4191
+ {
4192
+ name: "status:done",
4193
+ color: "6F42C1",
4194
+ description: "Task completed and closed"
4195
+ },
4196
+ {
4197
+ name: "status:deferred",
4198
+ color: "C2E0C6",
4199
+ description: "Intentionally parked \u2014 not ready for pickup"
4200
+ },
4201
+ {
4202
+ name: "status:needs-attention",
4203
+ color: "FF0000",
4204
+ description: "Requires human review"
4205
+ }
4206
+ ];
4207
+ var DEFAULT_PRIORITY_LABELS = [
4208
+ {
4209
+ name: "priority:critical",
4210
+ color: "B60205",
4211
+ description: "Critical priority \u2014 address immediately"
4212
+ },
4213
+ {
4214
+ name: "priority:high",
4215
+ color: "D93F0B",
4216
+ description: "High priority \u2014 pick before normal"
4217
+ },
4218
+ {
4219
+ name: "priority:medium",
4220
+ color: "E4E669",
4221
+ description: "Medium priority"
4222
+ },
4223
+ {
4224
+ name: "priority:low",
4225
+ color: "D4C5F9",
4226
+ description: "Low priority \u2014 skip if higher-priority work exists"
4227
+ },
4228
+ {
4229
+ name: "priority:trivial",
4230
+ color: "EDEDED",
4231
+ description: "Trivial priority \u2014 address when convenient"
4232
+ }
4233
+ ];
4234
+ var DEFAULT_TYPE_LABELS = [
4235
+ {
4236
+ name: "type:feat",
4237
+ color: "1D76DB",
4238
+ description: "New feature or functionality"
4239
+ },
4240
+ {
4241
+ name: "type:fix",
4242
+ color: "D73A4A",
4243
+ description: "Bug fix"
4244
+ },
4245
+ {
4246
+ name: "type:docs",
4247
+ color: "0075CA",
4248
+ description: "Documentation only"
4249
+ },
4250
+ {
4251
+ name: "type:style",
4252
+ color: "BFD4F2",
4253
+ description: "Code style (formatting, whitespace) \u2014 no logic change"
4254
+ },
4255
+ {
4256
+ name: "type:refactor",
4257
+ color: "A2EEEF",
4258
+ description: "Code restructure \u2014 no feature or fix"
4259
+ },
4260
+ {
4261
+ name: "type:perf",
4262
+ color: "F9D0C4",
4263
+ description: "Performance improvement"
4264
+ },
4265
+ {
4266
+ name: "type:test",
4267
+ color: "BFD4F2",
4268
+ description: "Adding or updating tests"
4269
+ },
4270
+ {
4271
+ name: "type:build",
4272
+ color: "E6CCF5",
4273
+ description: "Build system or external dependencies"
4274
+ },
4275
+ {
4276
+ name: "type:ci",
4277
+ color: "D4C5F9",
4278
+ description: "CI configuration changes"
4279
+ },
4280
+ {
4281
+ name: "type:chore",
4282
+ color: "E6E6E6",
4283
+ description: "Maintenance tasks (deps, tooling, config)"
4284
+ },
4285
+ {
4286
+ name: "type:revert",
4287
+ color: "EDEDED",
4288
+ description: "Revert a previous commit"
4289
+ },
4290
+ {
4291
+ name: "type:release",
4292
+ color: "0E8A16",
4293
+ description: "Release preparation and version bumps"
4294
+ },
4295
+ {
4296
+ name: "type:hotfix",
4297
+ color: "B60205",
4298
+ description: "Urgent production fix"
4299
+ }
4300
+ ];
4301
+ var DEFAULT_WORKFLOW_NAME2 = "sync-labels";
4302
+ var LABELS_CONFIG_PATH = ".github/labels.yml";
4303
+ function addSyncLabelsWorkflow(project, options) {
4304
+ const workflowName = options.workflowName ?? DEFAULT_WORKFLOW_NAME2;
4305
+ const deleteOtherLabels = options.deleteOtherLabels ?? true;
4306
+ const allLabels = [
4307
+ ...DEFAULT_STATUS_LABELS,
4308
+ ...DEFAULT_PRIORITY_LABELS,
4309
+ ...DEFAULT_TYPE_LABELS,
4310
+ ...options.labels ?? []
4311
+ ];
4312
+ new LabelsFile(project, allLabels);
4313
+ const workflow = project.github?.addWorkflow(workflowName);
4314
+ if (!workflow) {
4315
+ return;
4316
+ }
4317
+ workflow.on({
4318
+ push: {
4319
+ branches: ["main"],
4320
+ paths: [LABELS_CONFIG_PATH]
4321
+ },
4322
+ workflowDispatch: {}
4323
+ });
4324
+ workflow.addJobs({
4325
+ sync: {
4326
+ name: "Sync labels",
4327
+ runsOn: ["ubuntu-latest"],
4328
+ permissions: {
4329
+ contents: import_workflows_model4.JobPermission.READ,
4330
+ issues: import_workflows_model4.JobPermission.WRITE
4331
+ },
4332
+ steps: [
4333
+ {
4334
+ name: "Checkout",
4335
+ uses: "actions/checkout@v6"
4336
+ },
4337
+ {
4338
+ name: "Sync labels",
4339
+ uses: "EndBug/label-sync@v2",
4340
+ with: {
4341
+ "config-file": LABELS_CONFIG_PATH,
4342
+ "delete-other-labels": deleteOtherLabels,
4343
+ token: "${{ secrets.GITHUB_TOKEN }}"
4344
+ }
4345
+ }
4346
+ ]
4347
+ }
4348
+ });
4349
+ }
4350
+ var LabelsFile = class extends import_projen15.Component {
4351
+ constructor(project, labels) {
4352
+ super(project);
4353
+ new import_projen15.YamlFile(project, LABELS_CONFIG_PATH, {
4354
+ obj: labels.map((l) => ({
4355
+ name: l.name,
4356
+ color: l.color,
4357
+ description: l.description
4358
+ })),
4359
+ committed: true
4360
+ });
4361
+ }
4362
+ };
4363
+
3862
4364
  // src/projects/monorepo-project.ts
3863
4365
  var CONFIGULATOR_PACKAGE_NAME = "@codedrifters/configulator";
3864
4366
  var postInstallDependenciesMap = /* @__PURE__ */ new WeakMap();
@@ -4108,6 +4610,12 @@ var MonorepoProject = class extends import_typescript3.TypeScriptAppProject {
4108
4610
  typeof options.agentConfig === "object" ? options.agentConfig : {}
4109
4611
  );
4110
4612
  }
4613
+ if (options.syncLabels !== false) {
4614
+ addSyncLabelsWorkflow(
4615
+ this,
4616
+ typeof options.syncLabels === "object" ? options.syncLabels : {}
4617
+ );
4618
+ }
4111
4619
  if (this.buildWorkflow) {
4112
4620
  addBuildCompleteJob(this.buildWorkflow);
4113
4621
  }
@@ -4166,9 +4674,9 @@ var MonorepoProject = class extends import_typescript3.TypeScriptAppProject {
4166
4674
 
4167
4675
  // src/typescript/typescript-config.ts
4168
4676
  var import_node_path2 = require("path");
4169
- var import_projen15 = require("projen");
4677
+ var import_projen16 = require("projen");
4170
4678
  var import_path2 = require("projen/lib/util/path");
4171
- var TypeScriptConfig = class extends import_projen15.Component {
4679
+ var TypeScriptConfig = class extends import_projen16.Component {
4172
4680
  constructor(project) {
4173
4681
  super(project);
4174
4682
  let tsPaths = {};
@@ -4196,12 +4704,12 @@ var TypeScriptConfig = class extends import_projen15.Component {
4196
4704
 
4197
4705
  // src/workflows/aws-deploy-workflow.ts
4198
4706
  var import_utils11 = __toESM(require_lib());
4199
- var import_projen16 = require("projen");
4707
+ var import_projen17 = require("projen");
4200
4708
  var import_build = require("projen/lib/build");
4201
4709
  var import_github2 = require("projen/lib/github");
4202
- var import_workflows_model4 = require("projen/lib/github/workflows-model");
4710
+ var import_workflows_model5 = require("projen/lib/github/workflows-model");
4203
4711
  var PROD_DEPLOY_NAME = "prod-deploy";
4204
- var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen16.Component {
4712
+ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen17.Component {
4205
4713
  constructor(project, options = {}) {
4206
4714
  super(project);
4207
4715
  this.project = project;
@@ -4428,8 +4936,8 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen16.Compone
4428
4936
  ],
4429
4937
  runsOn: ["ubuntu-latest"],
4430
4938
  permissions: {
4431
- contents: import_workflows_model4.JobPermission.READ,
4432
- idToken: import_workflows_model4.JobPermission.WRITE
4939
+ contents: import_workflows_model5.JobPermission.READ,
4940
+ idToken: import_workflows_model5.JobPermission.WRITE
4433
4941
  },
4434
4942
  concurrency: deployJobName,
4435
4943
  if: jobCondition,
@@ -4476,6 +4984,9 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen16.Compone
4476
4984
  BUILT_IN_BUNDLES,
4477
4985
  CLAUDE_RULE_TARGET,
4478
4986
  COMPLETE_JOB_ID,
4987
+ DEFAULT_PRIORITY_LABELS,
4988
+ DEFAULT_STATUS_LABELS,
4989
+ DEFAULT_TYPE_LABELS,
4479
4990
  JsiiFaker,
4480
4991
  MCP_TRANSPORT,
4481
4992
  MERGE_METHODS,
@@ -4500,13 +5011,16 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen16.Compone
4500
5011
  Vitest,
4501
5012
  addApproveMergeUpgradeWorkflow,
4502
5013
  addBuildCompleteJob,
5014
+ addSyncLabelsWorkflow,
4503
5015
  awsCdkBundle,
4504
5016
  baseBundle,
4505
5017
  getLatestEligibleVersion,
4506
5018
  githubWorkflowBundle,
4507
5019
  jestBundle,
5020
+ meetingAnalysisBundle,
4508
5021
  pnpmBundle,
4509
5022
  projenBundle,
5023
+ resolveModelAlias,
4510
5024
  resolveTemplateVariables,
4511
5025
  slackBundle,
4512
5026
  turborepoBundle,