@codedrifters/configulator 0.0.263 → 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.d.mts +30 -6
- package/lib/index.d.ts +30 -6
- package/lib/index.js +845 -251
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +844 -251
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
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",
|
|
@@ -9431,7 +10032,7 @@ var REQ_WRITE_ISSUE_SCHEMA_SECTION = [
|
|
|
9431
10032
|
// src/agent/bundles/requirements-analyst.ts
|
|
9432
10033
|
var requirementsAnalystSubAgent = {
|
|
9433
10034
|
name: "requirements-analyst",
|
|
9434
|
-
description: "Discovers requirement gaps from BCM model docs, competitive analysis, product docs, and meeting extracts. Produces scan reports and
|
|
10035
|
+
description: "Discovers requirement gaps from BCM model docs, competitive analysis, product docs, and meeting extracts. Produces scan reports, proposals, and req:write issues for the downstream requirements-writer agent. Runs through a 2-phase pipeline (scan \u2192 draft-trace), one phase per session, tracked by req:* GitHub issue labels.",
|
|
9435
10036
|
model: AGENT_MODEL.POWERFUL,
|
|
9436
10037
|
maxTurns: 80,
|
|
9437
10038
|
platforms: { cursor: { exclude: true } },
|
|
@@ -9472,35 +10073,39 @@ var requirementsAnalystSubAgent = {
|
|
|
9472
10073
|
"",
|
|
9473
10074
|
"## State Machine Overview",
|
|
9474
10075
|
"",
|
|
9475
|
-
"Requirements synthesis flows through **
|
|
10076
|
+
"Requirements synthesis flows through **2 phases**:",
|
|
9476
10077
|
"",
|
|
9477
10078
|
"```",
|
|
9478
|
-
"\u250C\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\
|
|
9479
|
-
"\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT
|
|
9480
|
-
"\u2502 Read docs, \u2502 \u2502 Write
|
|
9481
|
-
"\u2502 identify \u2502 \u2502
|
|
9482
|
-
"\u2502 gaps, check \u2502 \u2502
|
|
9483
|
-
"\u2502 for dupes \u2502 \u2502
|
|
9484
|
-
"\u2502 \u2502 \u2502
|
|
9485
|
-
"\u2514\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\
|
|
10079
|
+
"\u250C\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",
|
|
10080
|
+
"\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT-TRACE \u2502",
|
|
10081
|
+
"\u2502 Read docs, \u2502 \u2502 Write proposals,\u2502",
|
|
10082
|
+
"\u2502 identify \u2502 \u2502 create req:write\u2502",
|
|
10083
|
+
"\u2502 gaps, check \u2502 \u2502 issues, update \u2502",
|
|
10084
|
+
"\u2502 for dupes \u2502 \u2502 source docs \u2502",
|
|
10085
|
+
"\u2502 \u2502 \u2502 with traceability\u2502",
|
|
10086
|
+
"\u2514\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",
|
|
9486
10087
|
"```",
|
|
9487
10088
|
"",
|
|
10089
|
+
"This pipeline matches the `scan \u2192 draft-trace \u2192 write` pattern",
|
|
10090
|
+
"used by the sibling openhi project. Draft and Trace were previously",
|
|
10091
|
+
"separate phases; they were collapsed because the proposals file Draft",
|
|
10092
|
+
"wrote was only ever consumed by Trace (no human review, no async work",
|
|
10093
|
+
"between the two), so the phase boundary added latency without value.",
|
|
10094
|
+
"See ADR-009 for the full reasoning.",
|
|
10095
|
+
"",
|
|
9488
10096
|
"**Issue labels encode the phase:**",
|
|
9489
10097
|
"",
|
|
9490
10098
|
"| Label | Phase | Session work |",
|
|
9491
10099
|
"|-------|-------|-------------|",
|
|
9492
10100
|
"| `req:scan` | 1. Scan | Read source docs, identify potential requirement gaps, check against existing requirements and open issues, write deduplicated scan report |",
|
|
9493
|
-
"| `req:draft` | 2. Draft | Write
|
|
9494
|
-
"| `req:trace` | 3. Trace | Create GitHub issues for each proposed requirement and update source documents with traceability notes |",
|
|
10101
|
+
"| `req:draft-trace` | 2. Draft & Trace | Write proposals, create `req:write` GitHub issues for each proposal, and update source documents with traceability notes \u2014 all in a single session |",
|
|
9495
10102
|
"",
|
|
9496
10103
|
"All issues also carry `type:requirement` and a `status:*` label.",
|
|
9497
10104
|
"",
|
|
9498
|
-
"**Issue count per scan cycle:** 1 scan + 1 draft
|
|
10105
|
+
"**Issue count per scan cycle:** 1 scan + 1 draft-trace = **2 sessions**.",
|
|
9499
10106
|
"",
|
|
9500
10107
|
"**Shortened paths:**",
|
|
9501
|
-
"- No gaps found after scan \u2192 skip draft
|
|
9502
|
-
"- No source docs need traceability updates \u2192 still **3 sessions** (trace",
|
|
9503
|
-
" handles both issue creation and doc updates)",
|
|
10108
|
+
"- No gaps found after scan \u2192 skip draft-trace \u2192 **1 session**",
|
|
9504
10109
|
"",
|
|
9505
10110
|
"---",
|
|
9506
10111
|
"",
|
|
@@ -9529,7 +10134,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9529
10134
|
"Run this loop exactly once per session. Never start a second issue.",
|
|
9530
10135
|
"",
|
|
9531
10136
|
"1. Claim one open `type:requirement` issue using phase priority:",
|
|
9532
|
-
" `req:scan` > `req:draft
|
|
10137
|
+
" `req:scan` > `req:draft-trace`.",
|
|
9533
10138
|
"2. Transition `status:ready` \u2192 `status:in-progress` and create the branch",
|
|
9534
10139
|
" per your project's branch-naming convention.",
|
|
9535
10140
|
"3. Execute the phase handler that matches the issue's `req:*` label.",
|
|
@@ -9630,7 +10235,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9630
10235
|
" ```",
|
|
9631
10236
|
"",
|
|
9632
10237
|
"7. **Create downstream issues based on findings:**",
|
|
9633
|
-
" - If any new gaps were identified \u2192 create `req:draft` issue",
|
|
10238
|
+
" - If any new gaps were identified \u2192 create `req:draft-trace` issue",
|
|
9634
10239
|
" (blocked on this issue via `Depends on: #N`).",
|
|
9635
10240
|
" - If **no gaps** were found \u2192 stop (no further phases needed). Comment",
|
|
9636
10241
|
" on the issue noting that no gaps were identified, and proceed directly",
|
|
@@ -9641,12 +10246,54 @@ var requirementsAnalystSubAgent = {
|
|
|
9641
10246
|
"",
|
|
9642
10247
|
"---",
|
|
9643
10248
|
"",
|
|
9644
|
-
"## Phase 2: Draft (`req:draft`)",
|
|
10249
|
+
"## Phase 2: Draft & Trace (`req:draft-trace`)",
|
|
9645
10250
|
"",
|
|
9646
|
-
"**Goal:** Expand each identified gap into a requirement proposal
|
|
9647
|
-
"
|
|
10251
|
+
"**Goal:** Expand each identified gap into a requirement proposal, create",
|
|
10252
|
+
"a `req:write` GitHub issue for each proposal so the downstream",
|
|
10253
|
+
"`requirements-writer` bundle picks it up, and backfill source-document",
|
|
10254
|
+
"traceability notes \u2014 all in a single session.",
|
|
9648
10255
|
"",
|
|
9649
|
-
"**Budget:** No web searches. Reading + writing
|
|
10256
|
+
"**Budget:** No web searches. Reading + writing proposals + issue creation",
|
|
10257
|
+
"+ minor traceability edits to source documents.",
|
|
10258
|
+
"",
|
|
10259
|
+
"Draft and Trace were previously separate phases. They were collapsed",
|
|
10260
|
+
"because the proposals file written by Draft was only ever consumed by",
|
|
10261
|
+
"Trace \u2014 no human review, no async work, no CI validation sat between",
|
|
10262
|
+
"them. See ADR-009 for the decision record.",
|
|
10263
|
+
"",
|
|
10264
|
+
"### `req:write` issue schema",
|
|
10265
|
+
"",
|
|
10266
|
+
"The `req:write` issues this phase creates are picked up by the",
|
|
10267
|
+
"downstream `requirements-writer` agent, which parses a strict",
|
|
10268
|
+
"schema on intake. The authoritative schema is defined in the",
|
|
10269
|
+
"`requirements-writer` sub-agent prompt under **The `req:write`",
|
|
10270
|
+
"Issue Schema** \u2014 every `req:write` issue this phase opens must",
|
|
10271
|
+
"conform. The same schema is embedded in the",
|
|
10272
|
+
"`requirements-reviewer` follow-up generator so the three",
|
|
10273
|
+
"producers never drift apart.",
|
|
10274
|
+
"",
|
|
10275
|
+
...REQ_WRITE_ISSUE_SCHEMA_SECTION,
|
|
10276
|
+
"",
|
|
10277
|
+
"**Deriving the three required fields from the proposal.** For",
|
|
10278
|
+
"every `req:write` issue this phase opens, the three fields come",
|
|
10279
|
+
"directly from the proposal entry written earlier in the same",
|
|
10280
|
+
"session:",
|
|
10281
|
+
"",
|
|
10282
|
+
"- **Category** \u2014 the proposal's `**Category:**` line.",
|
|
10283
|
+
"- **Tier** \u2014 the proposal's `**Tier:**` line.",
|
|
10284
|
+
"- **Output Path** \u2014",
|
|
10285
|
+
" `<REQUIREMENTS_ROOT>/<category-dir>/<PREFIX>-<NNN>-<slug>.md`,",
|
|
10286
|
+
" using the sequence number determined in the proposal step below.",
|
|
10287
|
+
"",
|
|
10288
|
+
"**Validation step \u2014 required before opening the issue.** Before",
|
|
10289
|
+
"calling `gh issue create`, verify all three required fields are",
|
|
10290
|
+
"populated and internally consistent (Category matches title",
|
|
10291
|
+
"prefix, Tier matches `tier:*` label, Output Path filename starts",
|
|
10292
|
+
"with the Category prefix). If any field cannot be derived, open",
|
|
10293
|
+
"the issue with `status:needs-attention` (not `status:ready`) and",
|
|
10294
|
+
"include a `Missing: <field> \u2014 <one-line reason>` line so a human",
|
|
10295
|
+
"triaging the issue only has to supply the remaining value(s)",
|
|
10296
|
+
"before flipping the label to `status:ready`.",
|
|
9650
10297
|
"",
|
|
9651
10298
|
"### Steps",
|
|
9652
10299
|
"",
|
|
@@ -9697,61 +10344,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9697
10344
|
" directory under `<REQUIREMENTS_ROOT>/<category>/` to find the next",
|
|
9698
10345
|
" available `NNN` for each proposed requirement.",
|
|
9699
10346
|
"",
|
|
9700
|
-
"5. **Create
|
|
9701
|
-
"",
|
|
9702
|
-
"6. **Commit and push.**",
|
|
9703
|
-
"",
|
|
9704
|
-
"---",
|
|
9705
|
-
"",
|
|
9706
|
-
"## Phase 3: Trace (`req:trace`)",
|
|
9707
|
-
"",
|
|
9708
|
-
"**Goal:** Create GitHub issues for each proposed requirement and update",
|
|
9709
|
-
"source documents with traceability notes indicating that requirement issues",
|
|
9710
|
-
"were created.",
|
|
9711
|
-
"",
|
|
9712
|
-
"**Budget:** No web searches. Issue creation + minor edits to source",
|
|
9713
|
-
"documents.",
|
|
9714
|
-
"",
|
|
9715
|
-
"### `req:write` issue schema",
|
|
9716
|
-
"",
|
|
9717
|
-
"The `req:write` issues this phase creates are picked up by the",
|
|
9718
|
-
"downstream `requirements-writer` agent, which parses a strict",
|
|
9719
|
-
"schema on intake. The authoritative schema is defined in the",
|
|
9720
|
-
"`requirements-writer` sub-agent prompt under **The `req:write`",
|
|
9721
|
-
"Issue Schema** \u2014 every `req:write` issue this phase opens must",
|
|
9722
|
-
"conform. The same schema is embedded in the",
|
|
9723
|
-
"`requirements-reviewer` follow-up generator so the three",
|
|
9724
|
-
"producers never drift apart.",
|
|
9725
|
-
"",
|
|
9726
|
-
...REQ_WRITE_ISSUE_SCHEMA_SECTION,
|
|
9727
|
-
"",
|
|
9728
|
-
"**Deriving the three required fields from the proposal.** For",
|
|
9729
|
-
"every `req:write` issue this phase opens, the three fields come",
|
|
9730
|
-
"directly from the Phase 2 proposal entry:",
|
|
9731
|
-
"",
|
|
9732
|
-
"- **Category** \u2014 the proposal's `**Category:**` line.",
|
|
9733
|
-
"- **Tier** \u2014 the proposal's `**Tier:**` line (added in Phase 2).",
|
|
9734
|
-
" If the proposal omitted the Tier line (older proposals may),",
|
|
9735
|
-
" route the issue through `Missing:` rather than guessing.",
|
|
9736
|
-
"- **Output Path** \u2014",
|
|
9737
|
-
" `<REQUIREMENTS_ROOT>/<category-dir>/<PREFIX>-<NNN>-<slug>.md`,",
|
|
9738
|
-
" using the sequence number determined in Phase 2 step 4.",
|
|
9739
|
-
"",
|
|
9740
|
-
"**Validation step \u2014 required before opening the issue.** Before",
|
|
9741
|
-
"calling `gh issue create`, verify all three required fields are",
|
|
9742
|
-
"populated and internally consistent (Category matches title",
|
|
9743
|
-
"prefix, Tier matches `tier:*` label, Output Path filename starts",
|
|
9744
|
-
"with the Category prefix). If any field cannot be derived, open",
|
|
9745
|
-
"the issue with `status:needs-attention` (not `status:ready`) and",
|
|
9746
|
-
"include a `Missing: <field> \u2014 <one-line reason>` line so a human",
|
|
9747
|
-
"triaging the issue only has to supply the remaining value(s)",
|
|
9748
|
-
"before flipping the label to `status:ready`.",
|
|
9749
|
-
"",
|
|
9750
|
-
"### Steps",
|
|
9751
|
-
"",
|
|
9752
|
-
"1. **Read the proposals** from Phase 2.",
|
|
9753
|
-
"",
|
|
9754
|
-
"2. **Create requirement issues.** For each proposal:",
|
|
10347
|
+
"5. **Create requirement issues.** For each proposal:",
|
|
9755
10348
|
"",
|
|
9756
10349
|
" All `type:requirement` issues default to `priority:medium` (override",
|
|
9757
10350
|
" only if the proposal's priority was explicitly High or Low). Each",
|
|
@@ -9796,7 +10389,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9796
10389
|
" whichever of the three fields **could** be derived so a human",
|
|
9797
10390
|
" triaging the issue has the minimum possible cleanup.",
|
|
9798
10391
|
"",
|
|
9799
|
-
"
|
|
10392
|
+
"6. **Update source documents.** In each BCM model doc or competitive",
|
|
9800
10393
|
" analysis that was scanned, add a note in the project-relevance /",
|
|
9801
10394
|
" strategic-implications section (whichever heading the source doc uses)",
|
|
9802
10395
|
" indicating that a requirement issue was created:",
|
|
@@ -9806,10 +10399,10 @@ var requirementsAnalystSubAgent = {
|
|
|
9806
10399
|
" (issue #<N>)",
|
|
9807
10400
|
" ```",
|
|
9808
10401
|
"",
|
|
9809
|
-
"
|
|
10402
|
+
"7. **Comment on the scan issue** with a summary of all issues created and",
|
|
9810
10403
|
" all docs updated.",
|
|
9811
10404
|
"",
|
|
9812
|
-
"
|
|
10405
|
+
"8. **Commit and push.**",
|
|
9813
10406
|
"",
|
|
9814
10407
|
"---",
|
|
9815
10408
|
"",
|
|
@@ -9887,39 +10480,41 @@ var scanRequirementsSkill = {
|
|
|
9887
10480
|
"1. Create a `req:scan` issue with `type:requirement`, `priority:medium`,",
|
|
9888
10481
|
" and `status:ready`. Body must list the files to read and the scan scope.",
|
|
9889
10482
|
"2. Execute Phase 1 (Scan) of the requirements-analyst agent.",
|
|
9890
|
-
"3. If gaps are found, a `req:draft` issue is created automatically.",
|
|
10483
|
+
"3. If gaps are found, a `req:draft-trace` issue is created automatically.",
|
|
9891
10484
|
"",
|
|
9892
10485
|
"## Output",
|
|
9893
10486
|
"",
|
|
9894
10487
|
"- A `req-scan-<scope>-<YYYY-MM-DD>.md` file under the project's research",
|
|
9895
10488
|
" requirements directory.",
|
|
9896
|
-
"- A `req:draft` issue if any gaps were identified."
|
|
10489
|
+
"- A `req:draft-trace` issue if any gaps were identified."
|
|
9897
10490
|
].join("\n")
|
|
9898
10491
|
};
|
|
9899
10492
|
var requirementsAnalystBundle = {
|
|
9900
10493
|
name: "requirements-analyst",
|
|
9901
|
-
description: "Requirements gap-discovery agent bundle for BCM-driven projects.
|
|
10494
|
+
description: "Requirements gap-discovery agent bundle for BCM-driven projects. 2-phase pipeline (scan, draft-trace) with req:* phase labels.",
|
|
9902
10495
|
appliesWhen: () => true,
|
|
9903
10496
|
rules: [
|
|
9904
10497
|
{
|
|
9905
10498
|
name: "requirements-analyst-workflow",
|
|
9906
|
-
description: "Describes the
|
|
10499
|
+
description: "Describes the 2-phase requirements gap-discovery pipeline, the req:* label taxonomy, and the boundary with the downstream requirements-writer agent.",
|
|
9907
10500
|
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
9908
10501
|
content: [
|
|
9909
10502
|
"# Requirements Analyst Workflow",
|
|
9910
10503
|
"",
|
|
9911
10504
|
"Use `/scan-requirements <scope>` to kick off a requirements gap",
|
|
9912
|
-
"discovery cycle. The pipeline runs in
|
|
9913
|
-
"each tracked by its own GitHub issue labeled
|
|
9914
|
-
"or `req:trace`. All issues carry
|
|
9915
|
-
"",
|
|
9916
|
-
"
|
|
9917
|
-
"
|
|
9918
|
-
"
|
|
10505
|
+
"discovery cycle. The pipeline runs in 2 phases \u2014 scan and",
|
|
10506
|
+
"draft-trace \u2014 each tracked by its own GitHub issue labeled",
|
|
10507
|
+
"`req:scan` or `req:draft-trace`. All issues carry",
|
|
10508
|
+
"`type:requirement`.",
|
|
10509
|
+
"",
|
|
10510
|
+
"The requirements-analyst *discovers gaps, drafts proposals, and",
|
|
10511
|
+
"opens `req:write` issues for the downstream writer*; it does",
|
|
10512
|
+
"**not** write final requirement documents. Writing is the job of",
|
|
10513
|
+
"the downstream `requirements-writer` agent (a separate bundle).",
|
|
9919
10514
|
"Keep that boundary clean: proposals land under the research",
|
|
9920
10515
|
"requirements directory, not under the authoritative requirements",
|
|
9921
|
-
"tree. The trace phase tags new issues with `req:write` so
|
|
9922
|
-
"writer bundle picks them up automatically.",
|
|
10516
|
+
"tree. The draft-trace phase tags new issues with `req:write` so",
|
|
10517
|
+
"the writer bundle picks them up automatically.",
|
|
9923
10518
|
"",
|
|
9924
10519
|
"See the `requirements-analyst` agent definition for full workflow",
|
|
9925
10520
|
"details and phase-by-phase instructions."
|
|
@@ -9944,14 +10539,9 @@ var requirementsAnalystBundle = {
|
|
|
9944
10539
|
description: "Phase 1: scan source docs for requirement gaps and deduplicate"
|
|
9945
10540
|
},
|
|
9946
10541
|
{
|
|
9947
|
-
name: "req:draft",
|
|
10542
|
+
name: "req:draft-trace",
|
|
9948
10543
|
color: "BFDADC",
|
|
9949
|
-
description: "Phase 2: draft
|
|
9950
|
-
},
|
|
9951
|
-
{
|
|
9952
|
-
name: "req:trace",
|
|
9953
|
-
color: "D4C5F9",
|
|
9954
|
-
description: "Phase 3: create requirement issues and backfill traceability on source docs"
|
|
10544
|
+
description: "Phase 2: draft proposals, create req:write issues, and backfill source-doc traceability"
|
|
9955
10545
|
}
|
|
9956
10546
|
]
|
|
9957
10547
|
};
|
|
@@ -11835,8 +12425,8 @@ var requirementsWriterSubAgent = {
|
|
|
11835
12425
|
"This agent produces **requirement documents only** \u2014 capability",
|
|
11836
12426
|
"models are written by the `bcm-writer` agent and requirement-gap",
|
|
11837
12427
|
"discovery is the responsibility of the `requirements-analyst` agent.",
|
|
11838
|
-
"Keep this boundary clean: never open `req:scan`,
|
|
11839
|
-
"`bcm:*` issues from this pipeline.",
|
|
12428
|
+
"Keep this boundary clean: never open `req:scan`,",
|
|
12429
|
+
"`req:draft-trace`, or `bcm:*` issues from this pipeline.",
|
|
11840
12430
|
"",
|
|
11841
12431
|
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
11842
12432
|
"`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
|
|
@@ -12370,7 +12960,7 @@ var requirementsWriterSubAgent = {
|
|
|
12370
12960
|
"specialized upstream/downstream agents.",
|
|
12371
12961
|
"",
|
|
12372
12962
|
"**Do NOT create:**",
|
|
12373
|
-
"- `req:scan
|
|
12963
|
+
"- `req:scan` or `req:draft-trace` issues \u2014 those belong to",
|
|
12374
12964
|
" the `requirements-analyst` bundle",
|
|
12375
12965
|
"- `bcm:*` issues \u2014 those belong to the `bcm-writer` bundle",
|
|
12376
12966
|
"- `people:*`, `company:*`, `software:*`, `research:*`, or",
|
|
@@ -12418,8 +13008,8 @@ var requirementsWriterSubAgent = {
|
|
|
12418
13008
|
" exists as a file but is missing from its category index is",
|
|
12419
13009
|
" invisible to anyone browsing the documentation tree.",
|
|
12420
13010
|
"- **Write requirements, not capability models or gap reports.**",
|
|
12421
|
-
" Never open `req:scan`, `req:draft
|
|
12422
|
-
"
|
|
13011
|
+
" Never open `req:scan`, `req:draft-trace`, or `bcm:*` issues from",
|
|
13012
|
+
" this pipeline."
|
|
12423
13013
|
].join("\n")
|
|
12424
13014
|
};
|
|
12425
13015
|
var writeRequirementSkill = {
|
|
@@ -12514,8 +13104,8 @@ var requirementsWriterBundle = {
|
|
|
12514
13104
|
"The pipeline produces **requirement documents only** \u2014 capability",
|
|
12515
13105
|
"models are written by the `bcm-writer` agent and gap discovery is",
|
|
12516
13106
|
"the responsibility of the `requirements-analyst` agent. The",
|
|
12517
|
-
"writer never opens `req:scan`, `req:draft
|
|
12518
|
-
"
|
|
13107
|
+
"writer never opens `req:scan`, `req:draft-trace`, or `bcm:*`",
|
|
13108
|
+
"issues.",
|
|
12519
13109
|
"",
|
|
12520
13110
|
"Documents follow the 11-category taxonomy (BR, FR, NFR, TR, ADR,",
|
|
12521
13111
|
"SEC, DR, INT, OPS, UX, MT) and the four-tier classification",
|
|
@@ -12621,8 +13211,8 @@ var requirementsReviewerSubAgent = {
|
|
|
12621
13211
|
"`requirements-writer` bundle (requirement docs) and `bcm-writer`",
|
|
12622
13212
|
"bundle (capability models). Gap discovery belongs to the",
|
|
12623
13213
|
"`requirements-analyst` bundle. Keep this boundary clean: never open",
|
|
12624
|
-
"`req:scan`, `req:draft
|
|
12625
|
-
"
|
|
13214
|
+
"`req:scan`, `req:draft-trace`, `req:review`, or `bcm:*` issues",
|
|
13215
|
+
"from this pipeline. The only follow-ups you open are the",
|
|
12626
13216
|
"`req:write` issues documented below.",
|
|
12627
13217
|
"",
|
|
12628
13218
|
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
@@ -12835,8 +13425,8 @@ var requirementsReviewerSubAgent = {
|
|
|
12835
13425
|
"doc and must be rewritten or removed). Route follow-up issues to",
|
|
12836
13426
|
"`req:write` so the `requirements-writer` \u2014 the only agent scoped",
|
|
12837
13427
|
"to edit under `<REQUIREMENTS_ROOT>` \u2014 picks them up. Do **not**",
|
|
12838
|
-
"route Check 4 findings to `req:trace`; the analyst bundle
|
|
12839
|
-
"not edit requirement documents and the issue would sit",
|
|
13428
|
+
"route Check 4 findings to `req:draft-trace`; the analyst bundle",
|
|
13429
|
+
"does not edit requirement documents and the issue would sit",
|
|
12840
13430
|
"unresolved. See the Follow-Up Issues section below for the full",
|
|
12841
13431
|
"Check 3 vs. Check 4 routing split.",
|
|
12842
13432
|
"",
|
|
@@ -13255,11 +13845,12 @@ var requirementsReviewerSubAgent = {
|
|
|
13255
13845
|
" docs, competitive-analysis notes, product-roadmap entries,",
|
|
13256
13846
|
" meeting extracts \u2014 that should link forward to an existing",
|
|
13257
13847
|
" requirement (Check 3: orphaned requirements whose fix lives",
|
|
13258
|
-
" in the source tree, not the requirement doc) \u2192 `req:trace`",
|
|
13848
|
+
" in the source tree, not the requirement doc) \u2192 `req:draft-trace`",
|
|
13259
13849
|
" (the `requirements-analyst` agent picks it up to backfill",
|
|
13260
|
-
" source-doc traceability
|
|
13261
|
-
" cross-references here \u2014 the
|
|
13262
|
-
" `<REQUIREMENTS_ROOT>` and the
|
|
13850
|
+
" source-doc traceability inside its combined draft-trace phase).",
|
|
13851
|
+
" **Do not** route Check 4 broken cross-references here \u2014 the",
|
|
13852
|
+
" analyst bundle never writes to `<REQUIREMENTS_ROOT>` and the",
|
|
13853
|
+
" issue would sit unresolved.",
|
|
13263
13854
|
" - A new requirement is needed (e.g., a `Proposed` ADR is missing",
|
|
13264
13855
|
" for a deferred technology choice) \u2192 `req:scan` (the analyst",
|
|
13265
13856
|
" runs a scoped scan to confirm the gap, then drafts the new",
|
|
@@ -13273,7 +13864,7 @@ var requirementsReviewerSubAgent = {
|
|
|
13273
13864
|
"",
|
|
13274
13865
|
"**Check 12 exception \u2014 stale `Proposed` ADR/TR triage.** Check 12",
|
|
13275
13866
|
"findings are the one case where follow-up flows through a new",
|
|
13276
|
-
"`req:review` issue rather than `req:write` / `req:trace` /",
|
|
13867
|
+
"`req:review` issue rather than `req:write` / `req:draft-trace` /",
|
|
13277
13868
|
"`req:scan`. The finding is a decision a human must make, not an",
|
|
13278
13869
|
"edit to a requirement document, so:",
|
|
13279
13870
|
"",
|
|
@@ -13713,8 +14304,9 @@ var reviewRequirementsSkill = {
|
|
|
13713
14304
|
"- One verification script under `<REVIEW_REPORTS_ROOT>` (only",
|
|
13714
14305
|
" for audits >10 documents)",
|
|
13715
14306
|
"- Follow-up GitHub issues for every Critical and Warning finding,",
|
|
13716
|
-
" carrying the appropriate phase label (`req:write`,
|
|
13717
|
-
" or `req:scan`) for the downstream agent that
|
|
14307
|
+
" carrying the appropriate phase label (`req:write`,",
|
|
14308
|
+
" `req:draft-trace`, or `req:scan`) for the downstream agent that",
|
|
14309
|
+
" should act",
|
|
13718
14310
|
"- An aggregated `req:review` follow-up issue labeled",
|
|
13719
14311
|
" `status:needs-attention` when Check 12 surfaces stale `Proposed`",
|
|
13720
14312
|
" ADR/TR documents (one issue per review, not one per document);",
|
|
@@ -13869,9 +14461,9 @@ var requirementsReviewerBundle = {
|
|
|
13869
14461
|
"The review phase produces **review reports and follow-up issues",
|
|
13870
14462
|
"only** \u2014 it never edits requirement documents, capability",
|
|
13871
14463
|
"models, or research notes. It files follow-up issues with the",
|
|
13872
|
-
"appropriate phase label (`req:write`, `req:trace`,
|
|
13873
|
-
"or \u2014 only for Check 12 stale-decision triage \u2014
|
|
13874
|
-
"for the downstream agent or human to pick up.",
|
|
14464
|
+
"appropriate phase label (`req:write`, `req:draft-trace`,",
|
|
14465
|
+
"`req:scan`, or \u2014 only for Check 12 stale-decision triage \u2014",
|
|
14466
|
+
"`req:review`) for the downstream agent or human to pick up.",
|
|
13875
14467
|
"",
|
|
13876
14468
|
"For audits covering more than 10 documents, the reviewer writes",
|
|
13877
14469
|
"a read-only Python verification script alongside the report and",
|
|
@@ -13914,9 +14506,9 @@ var requirementsReviewerBundle = {
|
|
|
13914
14506
|
"Authoring remains the responsibility of the `requirements-writer`",
|
|
13915
14507
|
"(requirement docs) and `bcm-writer` (capability models) bundles.",
|
|
13916
14508
|
"Gap discovery is the responsibility of the `requirements-analyst`",
|
|
13917
|
-
"bundle. The reviewer never opens `req:scan`, `req:draft`,",
|
|
13918
|
-
"`req:
|
|
13919
|
-
"
|
|
14509
|
+
"bundle. The reviewer never opens `req:scan`, `req:draft-trace`,",
|
|
14510
|
+
"`req:review`, or `bcm:*` issues \u2014 only `req:write` follow-ups",
|
|
14511
|
+
"from either phase.",
|
|
13920
14512
|
"",
|
|
13921
14513
|
"**Soft dependency on the `requirements-writer` bundle.** The",
|
|
13922
14514
|
"reviewer reads category templates from",
|
|
@@ -16588,6 +17180,7 @@ var BUILT_IN_BUNDLES = [
|
|
|
16588
17180
|
githubWorkflowBundle,
|
|
16589
17181
|
slackBundle,
|
|
16590
17182
|
meetingAnalysisBundle,
|
|
17183
|
+
agendaBundle,
|
|
16591
17184
|
orchestratorBundle,
|
|
16592
17185
|
prReviewBundle,
|
|
16593
17186
|
requirementsAnalystBundle,
|
|
@@ -20371,6 +20964,7 @@ var TypeScriptConfig = class extends import_projen22.Component {
|
|
|
20371
20964
|
addApproveMergeUpgradeWorkflow,
|
|
20372
20965
|
addBuildCompleteJob,
|
|
20373
20966
|
addSyncLabelsWorkflow,
|
|
20967
|
+
agendaBundle,
|
|
20374
20968
|
awsCdkBundle,
|
|
20375
20969
|
baseBundle,
|
|
20376
20970
|
bcmWriterBundle,
|