@codedrifters/configulator 0.0.264 → 0.0.265

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
@@ -226,6 +226,7 @@ __export(index_exports, {
226
226
  addApproveMergeUpgradeWorkflow: () => addApproveMergeUpgradeWorkflow,
227
227
  addBuildCompleteJob: () => addBuildCompleteJob,
228
228
  addSyncLabelsWorkflow: () => addSyncLabelsWorkflow,
229
+ agendaBundle: () => agendaBundle,
229
230
  awsCdkBundle: () => awsCdkBundle,
230
231
  baseBundle: () => baseBundle,
231
232
  bcmWriterBundle: () => bcmWriterBundle,
@@ -273,6 +274,133 @@ module.exports = __toCommonJS(index_exports);
273
274
  // src/agent/agent-config.ts
274
275
  var import_projen8 = require("projen");
275
276
 
277
+ // src/agent/bundles/project-context.ts
278
+ var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
279
+ var SUBPROJECT_ROLE_GUIDANCE = [
280
+ "### Sub-project roles",
281
+ "",
282
+ "When the repository follows the configulator monorepo layout,",
283
+ "every sub-project's role is derivable from the first segment of",
284
+ "its `outdir` path. No other lookup is required.",
285
+ "",
286
+ "- `apps/<scope>/<name>` \u2014 deployable application (CDK stack,",
287
+ " mobile app, backend service).",
288
+ "- `packages/<scope>/<name>` \u2014 shared library (published npm",
289
+ " package or workspace-internal library).",
290
+ "- `sites/<scope>/<name>` \u2014 user-facing web front end that is",
291
+ " not the monorepo-wide docs site.",
292
+ "- `docs/` \u2014 the single Starlight documentation site for the",
293
+ " whole monorepo (exactly one per repo; lives at `/docs`, not",
294
+ " under `sites/`).",
295
+ "",
296
+ "Repositories that have not adopted the layout contract may use a",
297
+ "different folder structure \u2014 in that case fall back to whatever",
298
+ `\`${PROJECT_CONTEXT_PATH}\` documents explicitly.`,
299
+ ""
300
+ ];
301
+ var PROJECT_CONTEXT_READER_SECTION = [
302
+ "## Project Context",
303
+ "",
304
+ `Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
305
+ 'repository root. It is the canonical answer to "what is this project',
306
+ 'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
307
+ "key stakeholders. Use it to frame judgment calls in this session.",
308
+ "",
309
+ `If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
310
+ "task and note the absence in your session log \u2014 the meeting-analyst and",
311
+ "requirements-analyst agents seed the file on their next run.",
312
+ "",
313
+ "You are a **read-only consumer** of this file. Do not edit it.",
314
+ "",
315
+ ...SUBPROJECT_ROLE_GUIDANCE,
316
+ "---",
317
+ ""
318
+ ];
319
+ var PROJECT_CONTEXT_MAINTAINER_SECTION = [
320
+ "## Project Context",
321
+ "",
322
+ `Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
323
+ 'repository root. It is the canonical answer to "what is this project',
324
+ 'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
325
+ "key stakeholders. Use it to judge relevance when scanning source",
326
+ "material in this session.",
327
+ "",
328
+ ...SUBPROJECT_ROLE_GUIDANCE,
329
+ "### Seed on first use",
330
+ "",
331
+ `If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
332
+ "template and commit it alongside this phase's other outputs:",
333
+ "",
334
+ "```markdown",
335
+ "# Project Context",
336
+ "",
337
+ "> Canonical description of this project. Read by all agents before",
338
+ "> work. Updated by meeting-analyst and requirements-analyst when new",
339
+ "> scope, vocabulary, or stakeholders emerge.",
340
+ "",
341
+ "## Mission",
342
+ "TODO: one or two sentences on what this project exists to do.",
343
+ "",
344
+ "## Target Users",
345
+ "TODO: who uses this, in what role.",
346
+ "",
347
+ "## In-Scope Capabilities",
348
+ "TODO: bullet list of the capabilities this project owns.",
349
+ "",
350
+ "## Out-of-Scope",
351
+ "TODO: capabilities or concerns that are explicitly not this project's.",
352
+ "",
353
+ "## Domain Vocabulary",
354
+ "TODO: short glossary of domain terms, acronyms, and their definitions.",
355
+ "",
356
+ "## Key Stakeholders",
357
+ "TODO: named people or teams and what they care about.",
358
+ "{{monorepoLayoutSeedBlock}}",
359
+ "## References",
360
+ "TODO: links to BCM docs, competitive analysis, product roadmap, and",
361
+ "other authoritative sources.",
362
+ "```",
363
+ "",
364
+ "Fill whatever you can infer from the source material you are already",
365
+ "reading in this phase; leave `TODO:` placeholders for the rest.",
366
+ "",
367
+ "### Update on new facts",
368
+ "",
369
+ "When the source material you process reveals new project-scope",
370
+ "information \u2014 a new capability, a vocabulary term, an entity, a",
371
+ "stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
372
+ `append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
373
+ "before closing the phase. Commit those edits with the phase's other",
374
+ "outputs.",
375
+ "",
376
+ "Keep edits surgical: short bullet additions, brief clarifications, or",
377
+ "single-line vocabulary entries. Treat the file as an accreting",
378
+ "reference, not a document you reshape every session.",
379
+ "",
380
+ "---",
381
+ ""
382
+ ];
383
+ var MONOREPO_LAYOUT_SEED_BLOCK = [
384
+ "",
385
+ "## Sub-Projects",
386
+ "",
387
+ "TODO: one bullet per sub-project, grouped by role. The role is",
388
+ "derivable from the first segment of each sub-project's `outdir`.",
389
+ "",
390
+ "### Applications (`apps/`)",
391
+ "TODO: deployable applications (CDK stacks, mobile apps, services).",
392
+ "",
393
+ "### Packages (`packages/`)",
394
+ "TODO: shared libraries (published npm packages, workspace-internal libraries).",
395
+ "",
396
+ "### Sites (`sites/`)",
397
+ "TODO: user-facing web front ends (marketing sites, SPAs, client apps).",
398
+ "",
399
+ "### Docs (`docs/`)",
400
+ "TODO: the single monorepo-wide Starlight documentation site.",
401
+ ""
402
+ ].join("\n");
403
+
276
404
  // src/agent/types.ts
277
405
  var AGENT_RULE_SCOPE = {
278
406
  ALWAYS: "always",
@@ -312,6 +440,606 @@ var MCP_TRANSPORT = {
312
440
  SSE: "sse"
313
441
  };
314
442
 
443
+ // src/agent/bundles/agenda.ts
444
+ var agendaAnalystSubAgent = {
445
+ name: "agenda-analyst",
446
+ description: "Authors pre-meeting agendas through a 2-phase pipeline (draft \u2192 finalize). Selects a type-specific template, pulls carryover from prior instances of the same recurring series, and writes a time-boxed, intent-tagged agenda to the meeting's dated folder. One phase per session, tracked by agenda:* GitHub issue labels.",
447
+ model: AGENT_MODEL.BALANCED,
448
+ maxTurns: 40,
449
+ platforms: { cursor: { exclude: true } },
450
+ prompt: [
451
+ "# Meeting Agenda Agent",
452
+ "",
453
+ "Dedicated agent loop for producing meeting **agendas** before a",
454
+ "meeting takes place. Complements the `meeting-analyst`, which",
455
+ "processes transcripts and notes *after* the meeting. Together they",
456
+ "close the loop: **agenda \u2192 meeting \u2192 transcript \u2192 notes \u2192 follow-up",
457
+ "work**.",
458
+ "",
459
+ "Each phase runs as a **separate agent session**, triggered by its",
460
+ "own GitHub issue with an `agenda:*` phase label. You handle exactly",
461
+ "**one phase per session** \u2014 read the issue to determine which phase",
462
+ "to execute.",
463
+ "",
464
+ "This agent is **domain-neutral**. It makes no assumptions about",
465
+ "concrete meeting types, templates, or area routing \u2014 those come",
466
+ "from the consuming project via `AgentConfigOptions.meetings`",
467
+ "(which renders a **Recognized meeting types** table the agent",
468
+ "consults at runtime).",
469
+ "",
470
+ "Follow your project's shared agent conventions (`AGENTS.md`,",
471
+ "`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
472
+ "",
473
+ "---",
474
+ "",
475
+ ...PROJECT_CONTEXT_READER_SECTION,
476
+ "## Design Principles",
477
+ "",
478
+ "1. **Agendas exist to make meetings shorter.** Every section must",
479
+ " justify its minutes. If a section has no decision, no discussion,",
480
+ " and no new information, cut it or move it to async.",
481
+ "2. **One meeting, one dated folder.** All artifacts for a given",
482
+ " meeting live in `<meetingsRoot>/<YYYY-MM-DD>-<slug>/`: `agenda.md`,",
483
+ " `notes.md`, and any attachments. The agenda agent creates the",
484
+ " folder if it does not yet exist; the meeting-analyst lands",
485
+ " transcripts and notes into the same folder post-meeting.",
486
+ "3. **Objective before outline.** No agenda ships without a stated",
487
+ " objective and 1\u20133 desired outcomes. If the issue does not supply",
488
+ " them and they cannot be inferred from prior meeting notes or",
489
+ " related docs, **block the issue** rather than guessing.",
490
+ "4. **Time-box everything.** Section times must sum to the meeting",
491
+ " duration \xB15 minutes. Overruns are planned for (a parking lot",
492
+ " section) rather than assumed.",
493
+ "5. **Tag every section with intent.** Each timed block carries one",
494
+ " of: `[decide]`, `[discuss]`, `[inform]`, `[brainstorm]`.",
495
+ " Attendees should know what is expected of them before the section",
496
+ " starts.",
497
+ "6. **Link by reference, never copy.** Pre-reads link to existing",
498
+ " docs by relative markdown path. The agent does not inline content",
499
+ " from other files into the agenda.",
500
+ "7. **Recurring meetings share a skeleton.** Every instance of a",
501
+ " recurring meeting uses the same template structure so attendees",
502
+ " know where to find what; only the content varies.",
503
+ "8. **Never cross agent boundaries.** Do not write `notes.md`,",
504
+ " transcripts, extracts, requirements, ADRs, or profiles. If the",
505
+ " agenda work surfaces a need for any of those, create the",
506
+ " appropriate issue for the specialist agent instead.",
507
+ "",
508
+ "---",
509
+ "",
510
+ "## State Machine Overview",
511
+ "",
512
+ "Producing one agenda flows through **2 phases**:",
513
+ "",
514
+ "```",
515
+ "\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
516
+ "\u2502 1. DRAFT \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. FINALIZE \u2502",
517
+ "\u2502 Create folder, \u2502 \u2502 Cross-link, \u2502",
518
+ "\u2502 select template,\u2502 \u2502 register in \u2502",
519
+ "\u2502 write agenda.md \u2502 \u2502 index.md, \u2502",
520
+ "\u2502 \u2502 \u2502 verify \u2502",
521
+ "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
522
+ "```",
523
+ "",
524
+ "**Issue labels encode the phase:**",
525
+ "",
526
+ "| Label | Phase | Session work |",
527
+ "|-------|-------|-------------|",
528
+ "| `agenda:draft` | 1. Draft | Create dated folder if missing, select template by meeting type, write `agenda.md` with objective, outcomes, timed sections, pre-reads, parking lot. Inline-finalize when possible. |",
529
+ "| `agenda:finalize` | 2. Finalize | Register agenda in the meetings index, add cross-links to related docs, verify the folder contains the canonical artifact set. Only exists as a separate session when finalize work was deferred. |",
530
+ "",
531
+ "All issues also carry `type:agenda` and a `status:*` label.",
532
+ "",
533
+ "**Issue count per agenda:** usually **1** (`agenda:draft` only).",
534
+ "Small, well-specified agendas do not need a separate finalize",
535
+ "session \u2014 the draft phase does both draft and finalize in one",
536
+ "session. Create a separate `agenda:finalize` issue only when:",
537
+ "",
538
+ "- The agenda requires review by a non-agent reviewer before",
539
+ " cross-linking.",
540
+ "- Finalize work is blocked on other deliverables (e.g., sprint plan",
541
+ " not yet written).",
542
+ "- The draft was produced by a human and only needs agent-side",
543
+ " linking.",
544
+ "",
545
+ "**Default path:** single `agenda:draft` session, finalize inline.",
546
+ "",
547
+ "---",
548
+ "",
549
+ "## Meeting Type Handling",
550
+ "",
551
+ "The issue body specifies `meeting_type` in its Context or Inputs",
552
+ "section. The agent matches `meeting_type` to the project's",
553
+ "**Recognized meeting types** table (rendered below when the",
554
+ "consuming project declares `AgentConfigOptions.meetings.meetingTypes`)",
555
+ "and applies the matching row's `agendaTemplatePath` and",
556
+ "`defaultDurationMinutes`.",
557
+ "",
558
+ "**How to resolve the template:**",
559
+ "",
560
+ "1. Read `meeting_type` from the issue body.",
561
+ "2. Look up the matching `id` in the project's **Recognized meeting",
562
+ " types** table. Use the `Agenda template` column value, resolved",
563
+ " relative to the `agendaTemplateRoot` documented above the table",
564
+ " (defaults to `<meetingsRoot>/_agenda-templates`).",
565
+ "3. If the table is absent, the `id` is unknown, or the template",
566
+ " column is `\u2014`, fall back to `<meetingsRoot>/_agenda-templates/_base.md`",
567
+ " and note the gap in the agenda's Open Items section so the",
568
+ " template can be added later.",
569
+ "",
570
+ "When the project has **not** declared any `meetingTypes` at all,",
571
+ "the agent uses `_base.md` unconditionally and relies on the issue",
572
+ "body for all per-meeting structure.",
573
+ "",
574
+ "---",
575
+ "",
576
+ "## Agent Loop",
577
+ "",
578
+ "Run this loop exactly once per session. Never start a second issue.",
579
+ "",
580
+ "1. Claim one open `type:agenda` issue. Phase priority:",
581
+ " `agenda:finalize` > `agenda:draft` so a deferred finalize for an",
582
+ " older agenda closes before a new draft starts.",
583
+ "2. Transition `status:ready` \u2192 `status:in-progress` and create the",
584
+ " branch per your project's branch-naming convention.",
585
+ "3. Execute the phase handler that matches the issue's `agenda:*`",
586
+ " label.",
587
+ "4. Commit, push, open a PR, and transition the issue to",
588
+ " `status:ready-for-review` per your project's PR workflow.",
589
+ "",
590
+ "---",
591
+ "",
592
+ "## Phase 1: Draft (`agenda:draft`)",
593
+ "",
594
+ "**Goal:** Produce a well-structured `agenda.md` in the meeting's",
595
+ "dated folder, with objective, desired outcomes, timed sections,",
596
+ "pre-reads, and a parking lot.",
597
+ "",
598
+ "**Budget:** Reading + one file write (`agenda.md`), plus an optional",
599
+ "folder creation and a small registry edit when inline-finalizing.",
600
+ "No web searches unless the issue explicitly asks for external",
601
+ "research.",
602
+ "",
603
+ "### Steps",
604
+ "",
605
+ "1. **Read the issue body.** Extract:",
606
+ " - `meeting_type` \u2014 one of the `id`s in the project's",
607
+ " **Recognized meeting types** table",
608
+ " - `meeting_date` \u2014 `YYYY-MM-DD`",
609
+ " - `meeting_slug` \u2014 kebab-case (becomes the folder name suffix)",
610
+ " - `duration_min` \u2014 integer minutes (default from the type table",
611
+ " if absent)",
612
+ " - `attendees` \u2014 list of names/roles (internal) or",
613
+ " names/companies (external)",
614
+ " - `objective` \u2014 one-sentence decision-oriented goal",
615
+ ' - `desired_outcomes` \u2014 1\u20133 bullets describing "done"',
616
+ " - `pre_reads` \u2014 relative paths to existing docs (optional)",
617
+ " - `related_docs` \u2014 relative paths for context (optional)",
618
+ "",
619
+ "2. **Block if under-specified.** If `objective` AND",
620
+ " `desired_outcomes` are both missing and cannot be inferred from",
621
+ " prior meeting notes or the template type, follow Blocked Issues",
622
+ " below. Do not invent an objective.",
623
+ "",
624
+ "3. **Create or locate the dated folder.**",
625
+ " ```",
626
+ " <meetingsRoot>/<YYYY-MM-DD>-<slug>/",
627
+ " ```",
628
+ " If the folder does not exist, create it. If it exists (because",
629
+ " the meeting-analyst already landed a transcript), reuse it. If an",
630
+ " `agenda.md` already exists, read it and update rather than",
631
+ " overwriting.",
632
+ "",
633
+ "4. **Load the matching template** by resolving `meeting_type`",
634
+ " against the project's **Recognized meeting types** table. Follow",
635
+ " the resolution rules in **Meeting Type Handling** above. If the",
636
+ " type is unrecognized, load `_base.md` and note the gap in Open",
637
+ " Items.",
638
+ "",
639
+ "5. **Read prior meeting notes for recurring series.** If",
640
+ " `meeting_type` maps to kind `planning` or `review` in the",
641
+ " project's meeting-types table (or, in the absence of a table,",
642
+ " the issue body flags the meeting as recurring):",
643
+ " - Glob `<meetingsRoot>/` for prior instances with the same",
644
+ " `meeting_type` (by frontmatter `meeting_type:` field).",
645
+ " - Read the most recent prior `notes.md`.",
646
+ " - Carry forward open action items, unresolved questions, and",
647
+ " `## Follow-up` entries into the new agenda under a",
648
+ " `## Carryover from last meeting` section.",
649
+ "",
650
+ "6. **Write the agenda.** Populate the template with:",
651
+ " - Frontmatter (see skeleton below)",
652
+ " - Objective (single sentence)",
653
+ " - Desired outcomes (1\u20133 bullets)",
654
+ " - Attendees + roles",
655
+ " - Pre-reads (relative markdown links only)",
656
+ " - Timed sections with",
657
+ " `[decide | discuss | inform | brainstorm]` tags",
658
+ " - Parking lot",
659
+ " - Action items placeholder (the meeting-analyst fills this in",
660
+ " post-meeting)",
661
+ " - Cross-link stub back to `notes.md` (created post-meeting)",
662
+ "",
663
+ " **Frontmatter skeleton:**",
664
+ " ```markdown",
665
+ " ---",
666
+ ' title: "Agenda: <Meeting Name>"',
667
+ " date: YYYY-MM-DD",
668
+ " meeting_type: <type>",
669
+ " duration_min: <N>",
670
+ " attendees:",
671
+ " - <Name> (<role>)",
672
+ " status: proposed",
673
+ " areas:",
674
+ " - <area-id-from-the-project's-area-map>",
675
+ " sidebar:",
676
+ " hidden: true",
677
+ " ---",
678
+ " ```",
679
+ "",
680
+ " `sidebar.hidden: true` keeps the agenda out of any autogenerated",
681
+ " sidebar \u2014 only the folder's `index.md` should appear there.",
682
+ "",
683
+ " **Duration check.** Sum of section times must equal",
684
+ " `duration_min` \xB1 5 minutes. If it doesn't, adjust section times",
685
+ " or cut content \u2014 do not ship a math-broken agenda.",
686
+ "",
687
+ "7. **Create the folder `index.md` if missing.** Populate it with:",
688
+ " - Frontmatter `title` (short sidebar label) and `description`",
689
+ " (one line).",
690
+ " - A 2\u20134 sentence summary of the meeting's objective and desired",
691
+ " outcomes pulled from the agenda.",
692
+ " - A `## Documents` section linking to `./agenda.md` (and",
693
+ " `./notes.md` once the meeting-analyst produces it).",
694
+ "",
695
+ " Do NOT set `sidebar.hidden: true` on `index.md` \u2014 it is the page",
696
+ " that should appear in the sidebar.",
697
+ "",
698
+ "8. **Inline finalize (default).** Unless a separate",
699
+ " `agenda:finalize` issue was created, complete these steps in the",
700
+ " same session:",
701
+ " - Register the agenda in `<meetingsRoot>/index.md` (append to",
702
+ " the meeting registry table).",
703
+ " - Add a forward link from any related doc in `related_docs` to",
704
+ " the agenda, using a relative markdown link.",
705
+ " - Verify the dated folder contains at minimum `agenda.md`.",
706
+ " Transcript and notes will land later via the meeting-analyst.",
707
+ "",
708
+ "9. **Commit and push.**",
709
+ "",
710
+ "---",
711
+ "",
712
+ "## Phase 2: Finalize (`agenda:finalize`)",
713
+ "",
714
+ "**Goal:** Complete the registry updates and cross-linking that were",
715
+ "deferred from the draft phase. Only runs when an explicit",
716
+ "`agenda:finalize` issue exists.",
717
+ "",
718
+ "**Budget:** Reading + small edits to `index.md` and related docs.",
719
+ "No new agenda file writes.",
720
+ "",
721
+ "### Steps",
722
+ "",
723
+ "1. **Read the draft agenda** at",
724
+ " `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`.",
725
+ "",
726
+ "2. **Incorporate late-added items.** The finalize phase is the",
727
+ " last chance to add attendee-requested sections before the",
728
+ " meeting starts. Read any comments on the `agenda:finalize`",
729
+ " issue for late additions; fold them into timed sections and",
730
+ " re-balance durations so the sum still equals `duration_min` \xB15.",
731
+ " If late additions exceed the remaining budget, move the lowest-",
732
+ " priority existing section to the parking lot rather than",
733
+ " overrunning the duration.",
734
+ "",
735
+ "3. **Register in the meeting index.** Append to",
736
+ " `<meetingsRoot>/index.md` if not already listed.",
737
+ "",
738
+ "4. **Add forward links** from each doc in the agenda's",
739
+ " `related_docs` frontmatter field (if any). Use relative markdown",
740
+ " links.",
741
+ "",
742
+ "5. **Lock the agenda.** Update the agenda's frontmatter",
743
+ " `status: proposed` \u2192 `status: locked` to signal the agenda is",
744
+ " frozen before the meeting starts. Late-breaking items that",
745
+ " arrive after this point go on the meeting's parking lot during",
746
+ " the meeting itself, not the agenda.",
747
+ "",
748
+ "6. **Verify artifact set.** Confirm the dated folder has at least",
749
+ " `agenda.md` and `index.md`. Do not wait for `notes.md` or a",
750
+ " transcript \u2014 those land post-meeting via the meeting-analyst.",
751
+ "",
752
+ "7. **Commit and push.**",
753
+ "",
754
+ "---",
755
+ "",
756
+ "## Coordination with Other Agents",
757
+ "",
758
+ "### Downstream Consumers",
759
+ "",
760
+ "| Output | Consumed by |",
761
+ "|--------|------------|",
762
+ "| `agenda.md` in dated folder | Humans running the meeting; the `meeting-analyst` reads it when processing the resulting transcript. |",
763
+ "| Registry entry in `<meetingsRoot>/index.md` | Humans browsing meetings; search indexing. |",
764
+ "| Forward links from related docs | Human readers of those docs. |",
765
+ "",
766
+ "### Upstream Sources",
767
+ "",
768
+ "| Input | Produced by |",
769
+ "|-------|------------|",
770
+ "| Prior `notes.md` for recurring series | `meeting-analyst` (post-prior-meeting). |",
771
+ "| Sprint plan for planning-kind meetings | `meeting-analyst` Phase 4 or the orchestrator. |",
772
+ "| Roadmap for strategy-kind meetings | Product docs maintained by the `meeting-analyst`. |",
773
+ "| Company/people profiles for external-meeting pre-reads | `company-profile` / `people-profile` agents. |",
774
+ "",
775
+ "### File Boundaries",
776
+ "",
777
+ "- **Reads:** `<docsRoot>/` (any file, for pre-reads, related docs,",
778
+ " and carryover lookup).",
779
+ "- **Writes:**",
780
+ " - `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`",
781
+ " - `<meetingsRoot>/<YYYY-MM-DD>-<slug>/index.md`",
782
+ " - `<meetingsRoot>/index.md` (append registry entries)",
783
+ " - Small cross-link edits to related docs (\u226410 lines, forward",
784
+ " links only)",
785
+ "- **Never writes to:**",
786
+ " - `notes.md` in any meeting folder (the `meeting-analyst` owns",
787
+ " this)",
788
+ " - Transcript files in any meeting folder (tooling / human)",
789
+ " - `<requirementsRoot>/`, `<bcmRoot>/`, `<peopleRoot>/`,",
790
+ " `<companiesRoot>/`, `<softwareRoot>/`, `<industriesRoot>/`",
791
+ " (specialist agents own these)",
792
+ " - Meeting extraction files (the `meeting-analyst` owns extracts)",
793
+ "",
794
+ "---",
795
+ "",
796
+ "## Blocked Issues",
797
+ "",
798
+ "Follow your project's shared Blocked Issues procedure. Additional",
799
+ "block reasons specific to agenda drafting:",
800
+ "",
801
+ "- **Objective missing and not inferrable.** The issue body has no",
802
+ " objective and no prior meeting notes or related docs that imply",
803
+ " one.",
804
+ "- **Attendees unknown.** External meetings especially \u2014 an agenda",
805
+ " cannot be tuned without knowing who is in the room.",
806
+ "- **Duration conflict.** The issue specifies a duration that cannot",
807
+ " fit the stated outcomes even with aggressive time-boxing.",
808
+ "- **Unrecognized `meeting_type` and no fallback viable.** If",
809
+ " `meeting_type` is unrecognized AND `_base.md` is insufficient",
810
+ " (the meeting pattern does not fit any existing template), block",
811
+ " so a human can either add a template or reclassify the meeting.",
812
+ "",
813
+ "---",
814
+ "",
815
+ "## Rules",
816
+ "",
817
+ "- **Objective or block.** No agenda ships without a stated",
818
+ " objective and at least one desired outcome. If the issue does",
819
+ " not supply one and none can be inferred, block \u2014 do not invent.",
820
+ "- **Time-box every section.** Sum must equal `duration_min` \xB1 5.",
821
+ " No untimed sections except Parking Lot.",
822
+ "- **Intent tag per section.** Every timed section carries",
823
+ " `[decide]`, `[discuss]`, `[inform]`, or `[brainstorm]`.",
824
+ "- **Link, don't copy.** Pre-reads are relative markdown links to",
825
+ " existing docs. The agent never inlines content from another doc",
826
+ " into the agenda.",
827
+ "- **Dated folder is canonical.** `agenda.md` lives alongside",
828
+ " `notes.md` (landed post-meeting) in the same `YYYY-MM-DD-<slug>/`",
829
+ " folder. The agent creates the folder if needed but never writes",
830
+ " outside it for agenda content.",
831
+ "- **Async suggestion for decision-free meetings.** If the agent",
832
+ " cannot identify any `[decide]` sections in a meeting that has no",
833
+ " recurring-ritual justification, the agent should comment on the",
834
+ " issue suggesting the meeting be converted to an async update",
835
+ " before writing the agenda.",
836
+ "- **Recurring-series carryover.** For recurring meetings (kind",
837
+ " `planning` or `review`), read the prior instance's `notes.md`",
838
+ " and carry forward open items, unresolved questions, and",
839
+ " follow-up commitments.",
840
+ "- **Registry freshness.** Every new agenda adds a row to",
841
+ " `<meetingsRoot>/index.md`. No silent publishes.",
842
+ "- **Bidirectional traceability.** The agenda's `notes.md` link",
843
+ " stub and the notes file's forward link to the agenda form the",
844
+ " round-trip. Once `notes.md` is written by the meeting-analyst,",
845
+ " both files link to each other via relative markdown paths.",
846
+ "- **Never cross agent boundaries.** Do not write `notes.md`,",
847
+ " transcripts, extracts, requirements, ADRs, or profiles. If the",
848
+ " agenda work surfaces a need for any of those, create the",
849
+ " appropriate issue for the specialist agent instead."
850
+ ].join("\n")
851
+ };
852
+ var draftAgendaSkill = {
853
+ name: "draft-agenda",
854
+ description: "Kick off the draft phase of a meeting-agenda cycle. Creates an agenda:draft issue for the supplied meeting (type, date, slug, objective, outcomes) and dispatches Phase 1 of the agenda-analyst, which writes agenda.md to the meeting's dated folder.",
855
+ disableModelInvocation: true,
856
+ userInvocable: true,
857
+ context: "fork",
858
+ agent: "agenda-analyst",
859
+ platforms: { cursor: { exclude: true } },
860
+ instructions: [
861
+ "# Draft Agenda",
862
+ "",
863
+ "Kick off a meeting-agenda cycle. Creates an `agenda:draft` issue",
864
+ "targeted at the requested meeting and dispatches Phase 1 (Draft)",
865
+ "in the agenda-analyst agent. If a separate finalize pass is",
866
+ "needed, Phase 1 creates the `agenda:finalize` issue automatically;",
867
+ "otherwise the draft phase inline-finalizes in the same session.",
868
+ "",
869
+ "## Usage",
870
+ "",
871
+ "/draft-agenda <meeting-type>:<YYYY-MM-DD>-<slug>",
872
+ "",
873
+ "Where:",
874
+ "- `<meeting-type>` \u2014 one of the `id`s from the project's",
875
+ " **Recognized meeting types** table (rendered into the",
876
+ " agenda-analyst prompt when the consuming project declares",
877
+ " `AgentConfigOptions.meetings.meetingTypes`).",
878
+ "- `<YYYY-MM-DD>` \u2014 the meeting date.",
879
+ "- `<slug>` \u2014 a kebab-case short name for the meeting (becomes the",
880
+ " folder name suffix).",
881
+ "",
882
+ "Examples (the meeting-type `id`s below are illustrative \u2014 use",
883
+ "whatever `id`s your project declares in `meetingTypes`):",
884
+ "- `team-weekly:2026-04-24-weekly-sync`",
885
+ "- `customer-discovery:2026-04-28-prospect-intro`",
886
+ "",
887
+ "## Steps",
888
+ "",
889
+ "1. Create an `agenda:draft` issue with `type:agenda`,",
890
+ " `priority:high`, and `status:ready`. The body must list:",
891
+ " - `meeting_type` \u2014 from the `<meeting-type>` segment",
892
+ " - `meeting_date` \u2014 from the `<YYYY-MM-DD>` segment",
893
+ " - `meeting_slug` \u2014 from the `<slug>` segment",
894
+ " - `duration_min` \u2014 optional (defaults to the type table value)",
895
+ " - `attendees` \u2014 list of names/roles",
896
+ " - `objective` \u2014 one-sentence decision-oriented goal",
897
+ ' - `desired_outcomes` \u2014 1\u20133 bullets describing "done"',
898
+ " - `pre_reads` \u2014 relative paths to existing docs (optional)",
899
+ " - `related_docs` \u2014 relative paths for context (optional)",
900
+ "2. Execute Phase 1 (Draft) of the agenda-analyst agent.",
901
+ "3. If the draft phase inline-finalizes (default path), no",
902
+ " downstream issues are created.",
903
+ "4. If finalize work is deferred, Phase 1 creates an",
904
+ " `agenda:finalize` issue blocked on the draft issue.",
905
+ "",
906
+ "## Output",
907
+ "",
908
+ "- `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md` \u2014 the agenda",
909
+ " itself, with frontmatter, objective, outcomes, timed intent-",
910
+ " tagged sections, pre-reads, and a parking lot.",
911
+ "- `<meetingsRoot>/<YYYY-MM-DD>-<slug>/index.md` \u2014 folder index",
912
+ " page that appears in the docs sidebar.",
913
+ "- A registry row in `<meetingsRoot>/index.md`.",
914
+ "- An `agenda:finalize` issue (only when finalize work was",
915
+ " deferred)."
916
+ ].join("\n")
917
+ };
918
+ var finalizeAgendaSkill = {
919
+ name: "finalize-agenda",
920
+ description: "Kick off the finalize phase of a meeting-agenda cycle. Creates an agenda:finalize issue for an already-drafted agenda and dispatches Phase 2 of the agenda-analyst, which incorporates late-added items, registers the agenda in the meeting index, cross-links related docs, and locks the agenda before the meeting starts.",
921
+ disableModelInvocation: true,
922
+ userInvocable: true,
923
+ context: "fork",
924
+ agent: "agenda-analyst",
925
+ platforms: { cursor: { exclude: true } },
926
+ instructions: [
927
+ "# Finalize Agenda",
928
+ "",
929
+ "Close the loop on a meeting-agenda cycle whose draft phase deferred",
930
+ "finalize work. Creates an `agenda:finalize` issue and dispatches",
931
+ "Phase 2 (Finalize) in the agenda-analyst agent.",
932
+ "",
933
+ "Phase 2 incorporates late-added items (from comments on the",
934
+ "finalize issue), registers the agenda in the meetings index,",
935
+ "cross-links related docs, and locks the agenda before the meeting",
936
+ "starts.",
937
+ "",
938
+ "Most cycles do not need this skill \u2014 Phase 1 (Draft) inline-",
939
+ "finalizes by default. Use this skill when:",
940
+ "- The draft phase explicitly deferred finalize work (an",
941
+ " `agenda:finalize` issue was created during draft).",
942
+ "- The draft was produced by a human and only needs agent-side",
943
+ " linking.",
944
+ "- Late-breaking items arrived after draft and need to be folded",
945
+ " in before the meeting starts.",
946
+ "",
947
+ "## Usage",
948
+ "",
949
+ "/finalize-agenda <YYYY-MM-DD>-<slug>",
950
+ "",
951
+ "Where `<YYYY-MM-DD>-<slug>` identifies the dated meeting folder",
952
+ "that already contains an `agenda.md`.",
953
+ "",
954
+ "Example:",
955
+ "- `/finalize-agenda 2026-04-24-weekly-sync`",
956
+ "",
957
+ "## Steps",
958
+ "",
959
+ "1. Create an `agenda:finalize` issue with `type:agenda`,",
960
+ " `priority:high`, and `status:ready`. Body must list:",
961
+ " - Path to the draft agenda",
962
+ " (`<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`)",
963
+ " - Any late-added items to incorporate",
964
+ "2. Execute Phase 2 (Finalize) of the agenda-analyst agent.",
965
+ "",
966
+ "## Output",
967
+ "",
968
+ "- Updates to `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`",
969
+ " (frontmatter `status: proposed` \u2192 `status: locked`, plus",
970
+ " incorporated late items).",
971
+ "- A new row in `<meetingsRoot>/index.md` (if not already",
972
+ " registered).",
973
+ "- Small forward-link edits in related docs."
974
+ ].join("\n")
975
+ };
976
+ var agendaBundle = {
977
+ name: "agenda",
978
+ description: "Meeting-agenda authoring bundle. 2-phase pipeline (draft, finalize) with agenda:* phase labels for producing pre-meeting agendas from the project's meeting-type taxonomy. Complements the meeting-analysis bundle, which handles the post-meeting pipeline. Enabled by default.",
979
+ appliesWhen: () => true,
980
+ rules: [
981
+ {
982
+ name: "meeting-agenda-workflow",
983
+ description: "Describes the 2-phase pre-meeting agenda pipeline, the agenda:* label taxonomy, and the relationship to the meeting-analysis bundle.",
984
+ scope: AGENT_RULE_SCOPE.ALWAYS,
985
+ content: [
986
+ "# Meeting Agenda Workflow",
987
+ "",
988
+ "Use `/draft-agenda <meeting-type>:<YYYY-MM-DD>-<slug>` to kick",
989
+ "off a pre-meeting agenda cycle. The pipeline runs in 2 phases \u2014",
990
+ "draft and finalize \u2014 each tracked by its own GitHub issue",
991
+ "labeled `agenda:draft` or `agenda:finalize`. All issues carry",
992
+ "`type:agenda`.",
993
+ "",
994
+ "One additional user-invocable skill drives the finalize phase",
995
+ "on demand:",
996
+ "",
997
+ "- `/finalize-agenda <YYYY-MM-DD>-<slug>` \u2014 register the agenda",
998
+ " in the meetings index, add cross-links, incorporate late-",
999
+ " added items, and lock the agenda before the meeting starts.",
1000
+ " Phase 1 (Draft) normally inline-finalizes \u2014 this skill is",
1001
+ " the explicit entry point when finalize work was deferred or",
1002
+ " a human authored the draft.",
1003
+ "",
1004
+ "The agenda bundle *writes pre-meeting agendas*; the",
1005
+ "`meeting-analysis` bundle *processes post-meeting transcripts",
1006
+ "and notes*. Together they close the loop:",
1007
+ "**agenda \u2192 meeting \u2192 transcript \u2192 notes \u2192 follow-up work**.",
1008
+ "The agenda bundle reuses the `meeting_type` taxonomy declared",
1009
+ "via `AgentConfigOptions.meetings.meetingTypes` \u2014 the same",
1010
+ "taxonomy the `meeting-analysis` bundle consumes for post-",
1011
+ "meeting extraction.",
1012
+ "",
1013
+ "See the `agenda-analyst` agent definition for full workflow",
1014
+ "details and phase-by-phase instructions."
1015
+ ].join("\n"),
1016
+ platforms: {
1017
+ cursor: { exclude: true }
1018
+ },
1019
+ tags: ["workflow"]
1020
+ }
1021
+ ],
1022
+ skills: [draftAgendaSkill, finalizeAgendaSkill],
1023
+ subAgents: [agendaAnalystSubAgent],
1024
+ labels: [
1025
+ {
1026
+ name: "type:agenda",
1027
+ color: "5319E7",
1028
+ description: "Work that authors a pre-meeting agenda for a scheduled meeting"
1029
+ },
1030
+ {
1031
+ name: "agenda:draft",
1032
+ color: "C5DEF5",
1033
+ description: "Phase 1: draft an agenda for a scheduled meeting (template, objective, timed sections, pre-reads)"
1034
+ },
1035
+ {
1036
+ name: "agenda:finalize",
1037
+ color: "BFDADC",
1038
+ description: "Phase 2: incorporate late-added items, register in the meetings index, cross-link related docs, and lock the agenda"
1039
+ }
1040
+ ]
1041
+ };
1042
+
315
1043
  // src/agent/bundles/utils.ts
316
1044
  function findProjectsWithComponent(project, ctor) {
317
1045
  const out = [];
@@ -1573,133 +2301,6 @@ function resolveAgentPaths(paths) {
1573
2301
  };
1574
2302
  }
1575
2303
 
1576
- // src/agent/bundles/project-context.ts
1577
- var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
1578
- var SUBPROJECT_ROLE_GUIDANCE = [
1579
- "### Sub-project roles",
1580
- "",
1581
- "When the repository follows the configulator monorepo layout,",
1582
- "every sub-project's role is derivable from the first segment of",
1583
- "its `outdir` path. No other lookup is required.",
1584
- "",
1585
- "- `apps/<scope>/<name>` \u2014 deployable application (CDK stack,",
1586
- " mobile app, backend service).",
1587
- "- `packages/<scope>/<name>` \u2014 shared library (published npm",
1588
- " package or workspace-internal library).",
1589
- "- `sites/<scope>/<name>` \u2014 user-facing web front end that is",
1590
- " not the monorepo-wide docs site.",
1591
- "- `docs/` \u2014 the single Starlight documentation site for the",
1592
- " whole monorepo (exactly one per repo; lives at `/docs`, not",
1593
- " under `sites/`).",
1594
- "",
1595
- "Repositories that have not adopted the layout contract may use a",
1596
- "different folder structure \u2014 in that case fall back to whatever",
1597
- `\`${PROJECT_CONTEXT_PATH}\` documents explicitly.`,
1598
- ""
1599
- ];
1600
- var PROJECT_CONTEXT_READER_SECTION = [
1601
- "## Project Context",
1602
- "",
1603
- `Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
1604
- 'repository root. It is the canonical answer to "what is this project',
1605
- 'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
1606
- "key stakeholders. Use it to frame judgment calls in this session.",
1607
- "",
1608
- `If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
1609
- "task and note the absence in your session log \u2014 the meeting-analyst and",
1610
- "requirements-analyst agents seed the file on their next run.",
1611
- "",
1612
- "You are a **read-only consumer** of this file. Do not edit it.",
1613
- "",
1614
- ...SUBPROJECT_ROLE_GUIDANCE,
1615
- "---",
1616
- ""
1617
- ];
1618
- var PROJECT_CONTEXT_MAINTAINER_SECTION = [
1619
- "## Project Context",
1620
- "",
1621
- `Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
1622
- 'repository root. It is the canonical answer to "what is this project',
1623
- 'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
1624
- "key stakeholders. Use it to judge relevance when scanning source",
1625
- "material in this session.",
1626
- "",
1627
- ...SUBPROJECT_ROLE_GUIDANCE,
1628
- "### Seed on first use",
1629
- "",
1630
- `If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
1631
- "template and commit it alongside this phase's other outputs:",
1632
- "",
1633
- "```markdown",
1634
- "# Project Context",
1635
- "",
1636
- "> Canonical description of this project. Read by all agents before",
1637
- "> work. Updated by meeting-analyst and requirements-analyst when new",
1638
- "> scope, vocabulary, or stakeholders emerge.",
1639
- "",
1640
- "## Mission",
1641
- "TODO: one or two sentences on what this project exists to do.",
1642
- "",
1643
- "## Target Users",
1644
- "TODO: who uses this, in what role.",
1645
- "",
1646
- "## In-Scope Capabilities",
1647
- "TODO: bullet list of the capabilities this project owns.",
1648
- "",
1649
- "## Out-of-Scope",
1650
- "TODO: capabilities or concerns that are explicitly not this project's.",
1651
- "",
1652
- "## Domain Vocabulary",
1653
- "TODO: short glossary of domain terms, acronyms, and their definitions.",
1654
- "",
1655
- "## Key Stakeholders",
1656
- "TODO: named people or teams and what they care about.",
1657
- "{{monorepoLayoutSeedBlock}}",
1658
- "## References",
1659
- "TODO: links to BCM docs, competitive analysis, product roadmap, and",
1660
- "other authoritative sources.",
1661
- "```",
1662
- "",
1663
- "Fill whatever you can infer from the source material you are already",
1664
- "reading in this phase; leave `TODO:` placeholders for the rest.",
1665
- "",
1666
- "### Update on new facts",
1667
- "",
1668
- "When the source material you process reveals new project-scope",
1669
- "information \u2014 a new capability, a vocabulary term, an entity, a",
1670
- "stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
1671
- `append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
1672
- "before closing the phase. Commit those edits with the phase's other",
1673
- "outputs.",
1674
- "",
1675
- "Keep edits surgical: short bullet additions, brief clarifications, or",
1676
- "single-line vocabulary entries. Treat the file as an accreting",
1677
- "reference, not a document you reshape every session.",
1678
- "",
1679
- "---",
1680
- ""
1681
- ];
1682
- var MONOREPO_LAYOUT_SEED_BLOCK = [
1683
- "",
1684
- "## Sub-Projects",
1685
- "",
1686
- "TODO: one bullet per sub-project, grouped by role. The role is",
1687
- "derivable from the first segment of each sub-project's `outdir`.",
1688
- "",
1689
- "### Applications (`apps/`)",
1690
- "TODO: deployable applications (CDK stacks, mobile apps, services).",
1691
- "",
1692
- "### Packages (`packages/`)",
1693
- "TODO: shared libraries (published npm packages, workspace-internal libraries).",
1694
- "",
1695
- "### Sites (`sites/`)",
1696
- "TODO: user-facing web front ends (marketing sites, SPAs, client apps).",
1697
- "",
1698
- "### Docs (`docs/`)",
1699
- "TODO: the single monorepo-wide Starlight documentation site.",
1700
- ""
1701
- ].join("\n");
1702
-
1703
2304
  // src/agent/bundles/bcm-writer.ts
1704
2305
  var bcmWriterSubAgent = {
1705
2306
  name: "bcm-writer",
@@ -16579,6 +17180,7 @@ var BUILT_IN_BUNDLES = [
16579
17180
  githubWorkflowBundle,
16580
17181
  slackBundle,
16581
17182
  meetingAnalysisBundle,
17183
+ agendaBundle,
16582
17184
  orchestratorBundle,
16583
17185
  prReviewBundle,
16584
17186
  requirementsAnalystBundle,
@@ -20362,6 +20964,7 @@ var TypeScriptConfig = class extends import_projen22.Component {
20362
20964
  addApproveMergeUpgradeWorkflow,
20363
20965
  addBuildCompleteJob,
20364
20966
  addSyncLabelsWorkflow,
20967
+ agendaBundle,
20365
20968
  awsCdkBundle,
20366
20969
  baseBundle,
20367
20970
  bcmWriterBundle,