@codedrifters/configulator 0.0.302 → 0.0.303

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.mjs CHANGED
@@ -11208,14 +11208,17 @@ var maintenanceAuditBundle = buildMaintenanceAuditBundle();
11208
11208
  function buildMeetingAnalystSubAgent(tier) {
11209
11209
  return {
11210
11210
  name: "meeting-analyst",
11211
- description: "Processes meeting transcripts through a 4-phase pipeline: extract, notes, draft, and link",
11211
+ description: "Processes meeting notes and transcripts (sibling-tree layout) through a 4-phase pipeline: extract, notes, draft, and link",
11212
11212
  model: tier,
11213
11213
  maxTurns: 80,
11214
11214
  platforms: { cursor: { exclude: true } },
11215
11215
  prompt: [
11216
11216
  "# Meeting Analyst Agent",
11217
11217
  "",
11218
- "You process meeting transcripts through a structured 4-phase pipeline.",
11218
+ "You process meeting notes and transcripts through a structured",
11219
+ "4-phase pipeline. Notes and transcripts live in **parallel sibling",
11220
+ "trees** keyed by basename \u2014 see the **Meeting file layout** section",
11221
+ "below for the canonical directory layout and input-case matrix.",
11219
11222
  "Each phase runs as a **separate agent session**, triggered by its own",
11220
11223
  "GitHub issue with a `meeting:*` phase label. You handle exactly **one",
11221
11224
  "phase per session** \u2014 read the issue to determine which phase to execute.",
@@ -11248,6 +11251,87 @@ function buildMeetingAnalystSubAgent(tier) {
11248
11251
  " Apply the type-specific rules from the **Meeting type handling**",
11249
11252
  " table (phases 1\u20132) and the area-filtered routing rules from the",
11250
11253
  " **Areas filtering** table (phase 4).",
11254
+ "7. **Treat notes and transcripts as paired siblings.** Notes are the",
11255
+ " curated narrative summary; transcripts are the verbatim evidence",
11256
+ " record. Both are first-class inputs to Phase 1 \u2014 never assume the",
11257
+ " transcript is the sole input.",
11258
+ "",
11259
+ "---",
11260
+ "",
11261
+ "## Meeting file layout (sibling-tree model)",
11262
+ "",
11263
+ "The bundle organises meeting artifacts as **three parallel trees**",
11264
+ "rooted at `<meetingsRoot>`, partitioned by meeting type",
11265
+ "(`internal` / `external`):",
11266
+ "",
11267
+ "```",
11268
+ "<meetingsRoot>/",
11269
+ "\u251C\u2500\u2500 transcripts/{internal,external}/ \u2190 raw verbatim transcripts (input, evidence)",
11270
+ "\u251C\u2500\u2500 notes/{internal,external}/ \u2190 curated narrative summary (input + Phase 2 output)",
11271
+ "\u2514\u2500\u2500 insights/{internal,external}/ \u2190 structured extraction (Phase 1 output)",
11272
+ "```",
11273
+ "",
11274
+ "Within a given `{internal,external}` partition, the three trees share",
11275
+ "**identical basenames**: a meeting captured as",
11276
+ "`notes/internal/2026-03-14-sprint-kickoff.md` has its companion",
11277
+ "transcript at `transcripts/internal/2026-03-14-sprint-kickoff.md` and",
11278
+ "its Phase 1 extraction at `insights/internal/2026-03-14-sprint-kickoff.md`.",
11279
+ "Agents look up siblings via filesystem (basename match across the",
11280
+ "three trees), not via frontmatter cross-references.",
11281
+ "",
11282
+ "**Input-case matrix.** A meeting always has a `notes/` or",
11283
+ "`transcripts/` entry (often both); Phase 1 must handle every case:",
11284
+ "",
11285
+ "| Notes file? | Transcript file? | Case | Phase-1 behaviour |",
11286
+ "|-------------|------------------|------|--------------------|",
11287
+ "| Yes | Yes | **Both** | Read both; transcript is verbatim ground truth, notes are first-draft summary. Set `transcript_available: true`, `confidence: high`. |",
11288
+ "| Yes | No | **Notes-only** | Read notes only. Set `transcript_available: false`, `confidence: medium`. Do not invent dialogue the notes do not record. |",
11289
+ "| No | Yes | **Transcript-only** | Read transcript only. Set `transcript_available: true`, `confidence: high`. Phase 2 will author the notes file from the transcript. |",
11290
+ "",
11291
+ "Notes frontmatter is **optional**. A bare imported file with no",
11292
+ "frontmatter is a normal input case \u2014 treat missing fields as the",
11293
+ "defaults `meeting_type: other`, `source: unknown`, `confidence: medium`,",
11294
+ "and populate the real values on first processing. Never fail-loud on",
11295
+ "absent frontmatter.",
11296
+ "",
11297
+ "### Notes / insights frontmatter schema",
11298
+ "",
11299
+ "The following frontmatter fields are recognised on notes and",
11300
+ "insights files. Every field is optional \u2014 agents must read them",
11301
+ "defensively and supply defaults when absent.",
11302
+ "",
11303
+ "| Field | Type | Purpose | Default |",
11304
+ "|-------|------|---------|---------|",
11305
+ "| `slug` | string | Starlight slug override; lets agents normalise the URL without renaming files. | derived from filename |",
11306
+ "| `source` | `gemini` \\| `human` \\| `hybrid` \\| `unknown` | Provenance of the original notes (which authoring path produced them). | `unknown` |",
11307
+ "| `transcript_available` | boolean | Cached result of the filesystem check for the sibling transcript. | re-derive from filesystem |",
11308
+ "| `confidence` | `high` \\| `medium` \\| `low` | Reliability of the extraction. Downstream draft phases mark requirements **Tentative** when `confidence != high`. | `medium` |",
11309
+ "",
11310
+ "These additions coexist with the existing `meeting_type` and `areas`",
11311
+ "fields documented in the **Meeting type handling** and **Areas",
11312
+ "filtering** sections below.",
11313
+ "",
11314
+ "Transcript files themselves remain frontmatter-free \u2014 they are",
11315
+ "evidence-only, and agents never navigate to a transcript as a",
11316
+ "Starlight artifact.",
11317
+ "",
11318
+ "### Tree-level index pages",
11319
+ "",
11320
+ "Each of the three trees carries an `index.md` at its root and at",
11321
+ "each `{internal,external}` partition so Starlight renders a clean",
11322
+ "sidebar:",
11323
+ "",
11324
+ "- `<meetingsRoot>/transcripts/index.md` (and one per partition)",
11325
+ "- `<meetingsRoot>/notes/index.md` (and one per partition)",
11326
+ "- `<meetingsRoot>/insights/index.md` (and one per partition)",
11327
+ "",
11328
+ "Phase 1 must create the matching `insights/{type}/index.md` page",
11329
+ "the first time it writes a file into that partition. Phase 2 must",
11330
+ "create the matching `notes/{type}/index.md` page the first time it",
11331
+ "writes a notes file into that partition. Follow the `section-index`",
11332
+ "convention: a 1\u20132 paragraph summary of the tree's purpose plus a",
11333
+ "linked listing of the partition's children. Append a row for the",
11334
+ "current meeting's basename when an index already exists.",
11251
11335
  "",
11252
11336
  "---",
11253
11337
  "",
@@ -11376,17 +11460,25 @@ function buildMeetingAnalystSubAgent(tier) {
11376
11460
  "",
11377
11461
  "## Phase 1: Extract (`meeting:extract`)",
11378
11462
  "",
11379
- "**Goal:** Read the meeting transcript and categorize all substantive content.",
11463
+ "**Goal:** Read the available meeting inputs (notes, transcript, or both)",
11464
+ "and categorize all substantive content into a structured extraction.",
11380
11465
  "",
11381
11466
  "### Steps",
11382
11467
  "",
11383
- "1. Read the transcript file specified in the issue body. Parse the",
11384
- " meeting-note frontmatter first, capturing `meeting_type` and",
11385
- " `areas`. Resolve `meeting_type` to a kind using the **Meeting type",
11386
- " handling** table; note the resolved kind in the extraction",
11387
- " frontmatter. If `meeting_type` is missing or not in the project's",
11388
- " Recognized meeting types table, treat it as `other` and flag it",
11389
- " in Open Questions.",
11468
+ "1. Identify the meeting's basename and `{internal,external}` partition",
11469
+ " from the issue body, then read **both** sibling files when they",
11470
+ " exist:",
11471
+ " - Notes: `<meetingsRoot>/notes/{type}/<basename>.md`",
11472
+ " - Transcript: `<meetingsRoot>/transcripts/{type}/<basename>.md`",
11473
+ "",
11474
+ " Use the **input-case matrix** in **Meeting file layout** to decide",
11475
+ " which case you are in (both / notes-only / transcript-only). Parse",
11476
+ " the notes frontmatter first (if a notes file exists), capturing",
11477
+ " `meeting_type`, `areas`, `source`, and `confidence`. Resolve",
11478
+ " `meeting_type` to a kind using the **Meeting type handling**",
11479
+ " table; note the resolved kind in the extraction frontmatter. If",
11480
+ " `meeting_type` is missing, treat it as `other` and flag it in",
11481
+ " Open Questions \u2014 do **not** fail-loud on missing frontmatter.",
11390
11482
  "2. Identify and categorize content into these buckets:",
11391
11483
  "",
11392
11484
  " | Bucket | What to look for |",
@@ -11401,7 +11493,10 @@ function buildMeetingAnalystSubAgent(tier) {
11401
11493
  " | **Strategic direction** | Business model changes, market positioning |",
11402
11494
  " | **Product direction** | Roadmap changes, feature prioritization |",
11403
11495
  "",
11404
- "3. Write the extraction to a markdown file with structured sections:",
11496
+ "3. Write the extraction to",
11497
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (matching the",
11498
+ " basename and `{internal,external}` partition of the source",
11499
+ " notes / transcript) with structured sections:",
11405
11500
  " - Attendees",
11406
11501
  " - Decisions Made (with category and confidence: Firm / Tentative / Needs confirmation)",
11407
11502
  " - Requirements Identified (with category and priority estimate)",
@@ -11412,9 +11507,14 @@ function buildMeetingAnalystSubAgent(tier) {
11412
11507
  " - Companies of Interest (with type and context)",
11413
11508
  " - Strategic / Product Direction",
11414
11509
  "",
11415
- " Carry `meeting_type`, the resolved `meeting_kind`, and `areas`",
11416
- " into the extraction frontmatter so downstream phases can gate",
11417
- " behaviour without re-parsing the meeting note.",
11510
+ " Carry the following into the extraction frontmatter so downstream",
11511
+ " phases can gate behaviour without re-parsing the source files:",
11512
+ " `meeting_type`, the resolved `meeting_kind`, `areas`,",
11513
+ " `transcript_available: true|false` (cached from the filesystem",
11514
+ " check in step 1), and `confidence: high|medium|low` (per the",
11515
+ " input-case matrix \u2014 `high` when a transcript is present, `medium`",
11516
+ " on notes-only, never silently downgraded to `low` without an",
11517
+ " explicit reason recorded in Open Questions).",
11418
11518
  "",
11419
11519
  "4. **Apply type-specific rules.** Consult the **Meeting type handling**",
11420
11520
  " table for the resolved kind and apply its phase-1 rules in",
@@ -11428,7 +11528,14 @@ function buildMeetingAnalystSubAgent(tier) {
11428
11528
  " Interest (signal threshold still applies); capture customer",
11429
11529
  " pain points as candidate BR (not FR).",
11430
11530
  "",
11431
- "5. **Create downstream phase issues** using `gh issue create`:",
11531
+ "5. **Maintain the `insights/` tree index.** Ensure",
11532
+ " `<meetingsRoot>/insights/index.md` and",
11533
+ " `<meetingsRoot>/insights/{type}/index.md` exist (create them",
11534
+ " following the `section-index` convention if missing) and append",
11535
+ " a row for the current meeting's basename if one is not already",
11536
+ " present.",
11537
+ "",
11538
+ "6. **Create downstream phase issues** using `gh issue create`:",
11432
11539
  " - Always create a `meeting:notes` issue (blocked on this extract issue)",
11433
11540
  " - If requirements OR decisions/ADRs identified, create a `meeting:draft` issue",
11434
11541
  " (blocked on the notes issue). For kind `standup`, skip the",
@@ -11437,18 +11544,59 @@ function buildMeetingAnalystSubAgent(tier) {
11437
11544
  " - Always create a `meeting:link` issue \u2014 blocked on the draft issue if one",
11438
11545
  " was created, otherwise blocked on the notes issue",
11439
11546
  "",
11440
- "6. Commit, push, and close the extract issue.",
11547
+ "7. Commit, push, and close the extract issue.",
11441
11548
  "",
11442
11549
  "---",
11443
11550
  "",
11444
11551
  "## Phase 2: Notes (`meeting:notes`)",
11445
11552
  "",
11446
- "**Goal:** Transform the extraction into structured meeting notes.",
11553
+ "**Goal:** Produce a curated `notes/{type}/<basename>.md` file that",
11554
+ "reflects the structured meeting record. The pivot here from older",
11555
+ 'versions of this bundle: Phase 2 is no longer "author notes from',
11556
+ 'scratch." It is **enhance and verify** \u2014 restructure the existing',
11557
+ "Gemini-generated notes (when present), verify factual claims",
11558
+ "against the transcript (when present), and fall back to authoring",
11559
+ "only when no notes file exists.",
11447
11560
  "",
11448
11561
  "### Steps",
11449
11562
  "",
11450
- "1. Read the extraction file referenced in the issue body (output of Phase 1).",
11451
- "2. Write structured meeting notes with these sections:",
11563
+ "1. Read the extraction at",
11564
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (output of Phase 1).",
11565
+ " Read the `transcript_available` and `confidence` fields from its",
11566
+ " frontmatter. Then determine which input-case branch applies by",
11567
+ " checking the filesystem for the sibling notes and transcript",
11568
+ " files.",
11569
+ "2. **Branch by input case** (see the input-case matrix in the",
11570
+ " **Meeting file layout** section):",
11571
+ "",
11572
+ " - **Both notes and transcript present** (enhance + verify):",
11573
+ " Read the existing `notes/{type}/<basename>.md` in place.",
11574
+ " Restructure it into the canonical section layout below.",
11575
+ " Verify every factual claim against the transcript \u2014 when the",
11576
+ " transcript contradicts the notes, the transcript wins and the",
11577
+ " notes are corrected. Fill in gaps the transcript reveals were",
11578
+ " missed. Overwrite the notes file in place; preserve the",
11579
+ " existing frontmatter and update only the fields you changed",
11580
+ " (e.g. flip `source: gemini` to `source: hybrid` once the agent",
11581
+ " has edited the file). Set `confidence: high`.",
11582
+ "",
11583
+ " - **Notes only** (light structural cleanup):",
11584
+ " Read the existing `notes/{type}/<basename>.md`. Restructure it",
11585
+ " into the canonical section layout below. Do **not** invent",
11586
+ " dialogue or claims the notes do not record. Do **not** mark",
11587
+ " `confidence: high` \u2014 keep `confidence: medium` and record the",
11588
+ ' reason ("no transcript available for verification") in the',
11589
+ " notes' Open Questions section so downstream phases know to",
11590
+ " treat downstream requirement drafts as `Tentative`.",
11591
+ "",
11592
+ " - **Transcript only** (author from scratch):",
11593
+ " The notes file does not yet exist. Author",
11594
+ " `notes/{type}/<basename>.md` from the transcript using the",
11595
+ " section layout below. Populate frontmatter with",
11596
+ " `source: gemini` if the transcript is a Gemini transcript,",
11597
+ " otherwise `source: unknown`. Set `confidence: high`.",
11598
+ "",
11599
+ "3. Canonical notes section layout (applied in every branch above):",
11452
11600
  " - Meeting metadata (title, date, attendees)",
11453
11601
  " - Agenda / topics covered",
11454
11602
  " - Key Discussion Points (organized by topic)",
@@ -11456,7 +11604,13 @@ function buildMeetingAnalystSubAgent(tier) {
11456
11604
  " - Action Items (table: who, what, when)",
11457
11605
  " - Open Questions",
11458
11606
  " - Follow-up items",
11459
- "3. Commit, push, and close the notes issue.",
11607
+ "4. **Maintain the `notes/` tree index.** Ensure",
11608
+ " `<meetingsRoot>/notes/index.md` and",
11609
+ " `<meetingsRoot>/notes/{type}/index.md` exist (create them",
11610
+ " following the `section-index` convention if missing) and append",
11611
+ " a row for the current meeting's basename if one is not already",
11612
+ " present.",
11613
+ "5. Commit, push, and close the notes issue.",
11460
11614
  "",
11461
11615
  "---",
11462
11616
  "",
@@ -11469,7 +11623,8 @@ function buildMeetingAnalystSubAgent(tier) {
11469
11623
  "",
11470
11624
  "### Steps",
11471
11625
  "",
11472
- "1. Read the extraction file from Phase 1.",
11626
+ "1. Read the extraction file from Phase 1 at",
11627
+ " `<meetingsRoot>/insights/{type}/<basename>.md`.",
11473
11628
  "2. Check existing requirement registries and ADR registries for duplicates.",
11474
11629
  "3. Draft requirement proposals with:",
11475
11630
  " - Category (FR, BR, NFR, etc.)",
@@ -11493,7 +11648,8 @@ function buildMeetingAnalystSubAgent(tier) {
11493
11648
  "",
11494
11649
  "### Steps",
11495
11650
  "",
11496
- "1. Read the drafts from Phase 3 (if they exist) and the extraction from Phase 1.",
11651
+ "1. Read the drafts from Phase 3 (if they exist) and the extraction",
11652
+ " from Phase 1 at `<meetingsRoot>/insights/{type}/<basename>.md`.",
11497
11653
  " Re-read the extraction frontmatter for `meeting_kind` and `areas`,",
11498
11654
  " then build the area-gate: the set of `docRoot` sub-folders that",
11499
11655
  " are in scope for direct edits on this meeting. Apply the rules in",
@@ -11522,12 +11678,15 @@ function buildMeetingAnalystSubAgent(tier) {
11522
11678
  " sprint-plan doc's area is in-scope, or always when no",
11523
11679
  " `meetingAreas` are declared); for the kind `review`, mark",
11524
11680
  " completed tasks in that same doc.",
11525
- "7. **Update the extraction file** with a `## Downstream Artifacts` section",
11526
- " listing every issue and document created from this meeting. Note",
11527
- " any items that were deferred to follow-up issues because of the",
11528
- " area gate.",
11529
- "8. **Update the meeting notes** with a `## Related Issues` section listing",
11530
- " all issues created from this meeting.",
11681
+ "7. **Update the extraction file** at",
11682
+ " `<meetingsRoot>/insights/{type}/<basename>.md` with a",
11683
+ " `## Downstream Artifacts` section listing every issue and",
11684
+ " document created from this meeting. Note any items that were",
11685
+ " deferred to follow-up issues because of the area gate.",
11686
+ "8. **Update the meeting notes** at",
11687
+ " `<meetingsRoot>/notes/{type}/<basename>.md` with a",
11688
+ " `## Related Issues` section listing all issues created from this",
11689
+ " meeting.",
11531
11690
  "9. Comment on the parent extract issue with a summary linking to all",
11532
11691
  " created artifacts.",
11533
11692
  "10. Commit and push (if any file changes were made), then close the link issue.",
@@ -11561,21 +11720,27 @@ var processMeetingSkill = {
11561
11720
  agent: "meeting-analyst",
11562
11721
  platforms: { cursor: { exclude: true } },
11563
11722
  instructions: [
11564
- "# Process Meeting Transcript",
11723
+ "# Process Meeting",
11565
11724
  "",
11566
- "Kick off meeting transcript processing by executing Phase 1 (Extract)",
11567
- "and creating downstream phase issues for the remaining phases.",
11725
+ "Kick off meeting processing by executing Phase 1 (Extract) and",
11726
+ "creating downstream phase issues for the remaining phases. Inputs",
11727
+ "live in the **sibling-tree layout**: pass any file from",
11728
+ "`<meetingsRoot>/notes/{type}/` or `<meetingsRoot>/transcripts/{type}/`",
11729
+ "(both, notes-only, and transcript-only are all valid input cases).",
11568
11730
  "",
11569
11731
  "## Usage",
11570
11732
  "",
11571
- "/process-meeting <path-to-transcript>",
11733
+ "/process-meeting <path-to-notes-or-transcript>",
11572
11734
  "",
11573
11735
  "## Steps",
11574
11736
  "",
11575
- "1. Read the provided transcript file",
11576
- "2. Execute Phase 1 (Extract) \u2014 categorize transcript content into",
11737
+ "1. Identify the meeting's basename and `{internal,external}`",
11738
+ " partition from the provided path, then read **every** sibling",
11739
+ " that exists (notes file and/or transcript file)",
11740
+ "2. Execute Phase 1 (Extract) \u2014 categorize the available content into",
11577
11741
  " decisions, requirements, action items, open questions, and more",
11578
- "3. Write the extraction to a markdown file",
11742
+ "3. Write the extraction to",
11743
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11579
11744
  "4. Create downstream phase issues using `gh issue create`:",
11580
11745
  " - `meeting:notes` issue (always)",
11581
11746
  " - `meeting:draft` issue (if requirements or decisions were found)",
@@ -11585,12 +11750,15 @@ var processMeetingSkill = {
11585
11750
  "",
11586
11751
  "## Input",
11587
11752
  "",
11588
- "Provide a path to a meeting transcript file (text or markdown).",
11589
- "The transcript should contain speaker-attributed dialogue.",
11753
+ "Provide a path to a file in either `notes/` or `transcripts/`. The",
11754
+ "agent will look up the sibling automatically via basename match. A",
11755
+ "missing sibling is a normal case (notes-only or transcript-only) \u2014",
11756
+ "the agent handles all three input cases.",
11590
11757
  "",
11591
11758
  "## Output",
11592
11759
  "",
11593
- "- An extraction markdown file with categorized meeting content",
11760
+ "- A structured extraction at",
11761
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11594
11762
  "- Phase issues with `meeting:*` labels for downstream agent sessions",
11595
11763
  " to pick up (notes, draft, link)"
11596
11764
  ].join("\n")
@@ -11608,11 +11776,30 @@ function buildMeetingAnalysisBundle(tier = AGENT_MODEL.BALANCED) {
11608
11776
  content: [
11609
11777
  "# Meeting Processing Workflow",
11610
11778
  "",
11611
- "Use `/process-meeting <path>` to process a meeting transcript through a",
11779
+ "Use `/process-meeting <path>` to process a meeting through a",
11612
11780
  "4-phase pipeline (extract \u2192 notes \u2192 draft \u2192 link). Each phase runs as a",
11613
11781
  "separate agent session tracked by a GitHub issue with a `meeting:*` label.",
11614
11782
  "See the `meeting-analyst` agent definition for full workflow details.",
11615
11783
  "",
11784
+ "Meeting artifacts live in **three parallel trees** rooted at the",
11785
+ "project's meetings root:",
11786
+ "",
11787
+ "- `transcripts/{internal,external}/` \u2014 verbatim transcripts (evidence)",
11788
+ "- `notes/{internal,external}/` \u2014 curated narrative summary",
11789
+ " (input + Phase 2 output)",
11790
+ "- `insights/{internal,external}/` \u2014 structured extraction (Phase 1 output)",
11791
+ "",
11792
+ "The three trees share identical basenames so a meeting's siblings",
11793
+ "are looked up by filename, not by frontmatter cross-references.",
11794
+ "Phase 1 accepts every input case (notes + transcript, notes only,",
11795
+ "or transcript only) and Phase 2 enhances the notes file in place",
11796
+ "rather than authoring it from scratch.",
11797
+ "",
11798
+ "Notes and insights files may carry optional frontmatter fields",
11799
+ "`slug`, `source`, `transcript_available`, and `confidence`",
11800
+ "alongside the existing `meeting_type` and `areas` fields. Missing",
11801
+ "frontmatter is treated as a normal input case \u2014 never fail-loud.",
11802
+ "",
11616
11803
  "Meeting notes may declare a `meeting_type` (one of the project's",
11617
11804
  "recognized types) and an `areas: [...]` list. The `meeting_type`",
11618
11805
  "resolves to a generic kind \u2014 `planning` / `review` / `brainstorm` /",