@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.mjs
CHANGED
|
@@ -175,6 +175,133 @@ var require_lib = __commonJS({
|
|
|
175
175
|
// src/agent/agent-config.ts
|
|
176
176
|
import { Component as Component8 } from "projen";
|
|
177
177
|
|
|
178
|
+
// src/agent/bundles/project-context.ts
|
|
179
|
+
var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
|
|
180
|
+
var SUBPROJECT_ROLE_GUIDANCE = [
|
|
181
|
+
"### Sub-project roles",
|
|
182
|
+
"",
|
|
183
|
+
"When the repository follows the configulator monorepo layout,",
|
|
184
|
+
"every sub-project's role is derivable from the first segment of",
|
|
185
|
+
"its `outdir` path. No other lookup is required.",
|
|
186
|
+
"",
|
|
187
|
+
"- `apps/<scope>/<name>` \u2014 deployable application (CDK stack,",
|
|
188
|
+
" mobile app, backend service).",
|
|
189
|
+
"- `packages/<scope>/<name>` \u2014 shared library (published npm",
|
|
190
|
+
" package or workspace-internal library).",
|
|
191
|
+
"- `sites/<scope>/<name>` \u2014 user-facing web front end that is",
|
|
192
|
+
" not the monorepo-wide docs site.",
|
|
193
|
+
"- `docs/` \u2014 the single Starlight documentation site for the",
|
|
194
|
+
" whole monorepo (exactly one per repo; lives at `/docs`, not",
|
|
195
|
+
" under `sites/`).",
|
|
196
|
+
"",
|
|
197
|
+
"Repositories that have not adopted the layout contract may use a",
|
|
198
|
+
"different folder structure \u2014 in that case fall back to whatever",
|
|
199
|
+
`\`${PROJECT_CONTEXT_PATH}\` documents explicitly.`,
|
|
200
|
+
""
|
|
201
|
+
];
|
|
202
|
+
var PROJECT_CONTEXT_READER_SECTION = [
|
|
203
|
+
"## Project Context",
|
|
204
|
+
"",
|
|
205
|
+
`Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
206
|
+
'repository root. It is the canonical answer to "what is this project',
|
|
207
|
+
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
208
|
+
"key stakeholders. Use it to frame judgment calls in this session.",
|
|
209
|
+
"",
|
|
210
|
+
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
|
|
211
|
+
"task and note the absence in your session log \u2014 the meeting-analyst and",
|
|
212
|
+
"requirements-analyst agents seed the file on their next run.",
|
|
213
|
+
"",
|
|
214
|
+
"You are a **read-only consumer** of this file. Do not edit it.",
|
|
215
|
+
"",
|
|
216
|
+
...SUBPROJECT_ROLE_GUIDANCE,
|
|
217
|
+
"---",
|
|
218
|
+
""
|
|
219
|
+
];
|
|
220
|
+
var PROJECT_CONTEXT_MAINTAINER_SECTION = [
|
|
221
|
+
"## Project Context",
|
|
222
|
+
"",
|
|
223
|
+
`Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
224
|
+
'repository root. It is the canonical answer to "what is this project',
|
|
225
|
+
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
226
|
+
"key stakeholders. Use it to judge relevance when scanning source",
|
|
227
|
+
"material in this session.",
|
|
228
|
+
"",
|
|
229
|
+
...SUBPROJECT_ROLE_GUIDANCE,
|
|
230
|
+
"### Seed on first use",
|
|
231
|
+
"",
|
|
232
|
+
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
|
|
233
|
+
"template and commit it alongside this phase's other outputs:",
|
|
234
|
+
"",
|
|
235
|
+
"```markdown",
|
|
236
|
+
"# Project Context",
|
|
237
|
+
"",
|
|
238
|
+
"> Canonical description of this project. Read by all agents before",
|
|
239
|
+
"> work. Updated by meeting-analyst and requirements-analyst when new",
|
|
240
|
+
"> scope, vocabulary, or stakeholders emerge.",
|
|
241
|
+
"",
|
|
242
|
+
"## Mission",
|
|
243
|
+
"TODO: one or two sentences on what this project exists to do.",
|
|
244
|
+
"",
|
|
245
|
+
"## Target Users",
|
|
246
|
+
"TODO: who uses this, in what role.",
|
|
247
|
+
"",
|
|
248
|
+
"## In-Scope Capabilities",
|
|
249
|
+
"TODO: bullet list of the capabilities this project owns.",
|
|
250
|
+
"",
|
|
251
|
+
"## Out-of-Scope",
|
|
252
|
+
"TODO: capabilities or concerns that are explicitly not this project's.",
|
|
253
|
+
"",
|
|
254
|
+
"## Domain Vocabulary",
|
|
255
|
+
"TODO: short glossary of domain terms, acronyms, and their definitions.",
|
|
256
|
+
"",
|
|
257
|
+
"## Key Stakeholders",
|
|
258
|
+
"TODO: named people or teams and what they care about.",
|
|
259
|
+
"{{monorepoLayoutSeedBlock}}",
|
|
260
|
+
"## References",
|
|
261
|
+
"TODO: links to BCM docs, competitive analysis, product roadmap, and",
|
|
262
|
+
"other authoritative sources.",
|
|
263
|
+
"```",
|
|
264
|
+
"",
|
|
265
|
+
"Fill whatever you can infer from the source material you are already",
|
|
266
|
+
"reading in this phase; leave `TODO:` placeholders for the rest.",
|
|
267
|
+
"",
|
|
268
|
+
"### Update on new facts",
|
|
269
|
+
"",
|
|
270
|
+
"When the source material you process reveals new project-scope",
|
|
271
|
+
"information \u2014 a new capability, a vocabulary term, an entity, a",
|
|
272
|
+
"stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
|
|
273
|
+
`append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
|
|
274
|
+
"before closing the phase. Commit those edits with the phase's other",
|
|
275
|
+
"outputs.",
|
|
276
|
+
"",
|
|
277
|
+
"Keep edits surgical: short bullet additions, brief clarifications, or",
|
|
278
|
+
"single-line vocabulary entries. Treat the file as an accreting",
|
|
279
|
+
"reference, not a document you reshape every session.",
|
|
280
|
+
"",
|
|
281
|
+
"---",
|
|
282
|
+
""
|
|
283
|
+
];
|
|
284
|
+
var MONOREPO_LAYOUT_SEED_BLOCK = [
|
|
285
|
+
"",
|
|
286
|
+
"## Sub-Projects",
|
|
287
|
+
"",
|
|
288
|
+
"TODO: one bullet per sub-project, grouped by role. The role is",
|
|
289
|
+
"derivable from the first segment of each sub-project's `outdir`.",
|
|
290
|
+
"",
|
|
291
|
+
"### Applications (`apps/`)",
|
|
292
|
+
"TODO: deployable applications (CDK stacks, mobile apps, services).",
|
|
293
|
+
"",
|
|
294
|
+
"### Packages (`packages/`)",
|
|
295
|
+
"TODO: shared libraries (published npm packages, workspace-internal libraries).",
|
|
296
|
+
"",
|
|
297
|
+
"### Sites (`sites/`)",
|
|
298
|
+
"TODO: user-facing web front ends (marketing sites, SPAs, client apps).",
|
|
299
|
+
"",
|
|
300
|
+
"### Docs (`docs/`)",
|
|
301
|
+
"TODO: the single monorepo-wide Starlight documentation site.",
|
|
302
|
+
""
|
|
303
|
+
].join("\n");
|
|
304
|
+
|
|
178
305
|
// src/agent/types.ts
|
|
179
306
|
var AGENT_RULE_SCOPE = {
|
|
180
307
|
ALWAYS: "always",
|
|
@@ -214,6 +341,606 @@ var MCP_TRANSPORT = {
|
|
|
214
341
|
SSE: "sse"
|
|
215
342
|
};
|
|
216
343
|
|
|
344
|
+
// src/agent/bundles/agenda.ts
|
|
345
|
+
var agendaAnalystSubAgent = {
|
|
346
|
+
name: "agenda-analyst",
|
|
347
|
+
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.",
|
|
348
|
+
model: AGENT_MODEL.BALANCED,
|
|
349
|
+
maxTurns: 40,
|
|
350
|
+
platforms: { cursor: { exclude: true } },
|
|
351
|
+
prompt: [
|
|
352
|
+
"# Meeting Agenda Agent",
|
|
353
|
+
"",
|
|
354
|
+
"Dedicated agent loop for producing meeting **agendas** before a",
|
|
355
|
+
"meeting takes place. Complements the `meeting-analyst`, which",
|
|
356
|
+
"processes transcripts and notes *after* the meeting. Together they",
|
|
357
|
+
"close the loop: **agenda \u2192 meeting \u2192 transcript \u2192 notes \u2192 follow-up",
|
|
358
|
+
"work**.",
|
|
359
|
+
"",
|
|
360
|
+
"Each phase runs as a **separate agent session**, triggered by its",
|
|
361
|
+
"own GitHub issue with an `agenda:*` phase label. You handle exactly",
|
|
362
|
+
"**one phase per session** \u2014 read the issue to determine which phase",
|
|
363
|
+
"to execute.",
|
|
364
|
+
"",
|
|
365
|
+
"This agent is **domain-neutral**. It makes no assumptions about",
|
|
366
|
+
"concrete meeting types, templates, or area routing \u2014 those come",
|
|
367
|
+
"from the consuming project via `AgentConfigOptions.meetings`",
|
|
368
|
+
"(which renders a **Recognized meeting types** table the agent",
|
|
369
|
+
"consults at runtime).",
|
|
370
|
+
"",
|
|
371
|
+
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
372
|
+
"`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
|
|
373
|
+
"",
|
|
374
|
+
"---",
|
|
375
|
+
"",
|
|
376
|
+
...PROJECT_CONTEXT_READER_SECTION,
|
|
377
|
+
"## Design Principles",
|
|
378
|
+
"",
|
|
379
|
+
"1. **Agendas exist to make meetings shorter.** Every section must",
|
|
380
|
+
" justify its minutes. If a section has no decision, no discussion,",
|
|
381
|
+
" and no new information, cut it or move it to async.",
|
|
382
|
+
"2. **One meeting, one dated folder.** All artifacts for a given",
|
|
383
|
+
" meeting live in `<meetingsRoot>/<YYYY-MM-DD>-<slug>/`: `agenda.md`,",
|
|
384
|
+
" `notes.md`, and any attachments. The agenda agent creates the",
|
|
385
|
+
" folder if it does not yet exist; the meeting-analyst lands",
|
|
386
|
+
" transcripts and notes into the same folder post-meeting.",
|
|
387
|
+
"3. **Objective before outline.** No agenda ships without a stated",
|
|
388
|
+
" objective and 1\u20133 desired outcomes. If the issue does not supply",
|
|
389
|
+
" them and they cannot be inferred from prior meeting notes or",
|
|
390
|
+
" related docs, **block the issue** rather than guessing.",
|
|
391
|
+
"4. **Time-box everything.** Section times must sum to the meeting",
|
|
392
|
+
" duration \xB15 minutes. Overruns are planned for (a parking lot",
|
|
393
|
+
" section) rather than assumed.",
|
|
394
|
+
"5. **Tag every section with intent.** Each timed block carries one",
|
|
395
|
+
" of: `[decide]`, `[discuss]`, `[inform]`, `[brainstorm]`.",
|
|
396
|
+
" Attendees should know what is expected of them before the section",
|
|
397
|
+
" starts.",
|
|
398
|
+
"6. **Link by reference, never copy.** Pre-reads link to existing",
|
|
399
|
+
" docs by relative markdown path. The agent does not inline content",
|
|
400
|
+
" from other files into the agenda.",
|
|
401
|
+
"7. **Recurring meetings share a skeleton.** Every instance of a",
|
|
402
|
+
" recurring meeting uses the same template structure so attendees",
|
|
403
|
+
" know where to find what; only the content varies.",
|
|
404
|
+
"8. **Never cross agent boundaries.** Do not write `notes.md`,",
|
|
405
|
+
" transcripts, extracts, requirements, ADRs, or profiles. If the",
|
|
406
|
+
" agenda work surfaces a need for any of those, create the",
|
|
407
|
+
" appropriate issue for the specialist agent instead.",
|
|
408
|
+
"",
|
|
409
|
+
"---",
|
|
410
|
+
"",
|
|
411
|
+
"## State Machine Overview",
|
|
412
|
+
"",
|
|
413
|
+
"Producing one agenda flows through **2 phases**:",
|
|
414
|
+
"",
|
|
415
|
+
"```",
|
|
416
|
+
"\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",
|
|
417
|
+
"\u2502 1. DRAFT \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. FINALIZE \u2502",
|
|
418
|
+
"\u2502 Create folder, \u2502 \u2502 Cross-link, \u2502",
|
|
419
|
+
"\u2502 select template,\u2502 \u2502 register in \u2502",
|
|
420
|
+
"\u2502 write agenda.md \u2502 \u2502 index.md, \u2502",
|
|
421
|
+
"\u2502 \u2502 \u2502 verify \u2502",
|
|
422
|
+
"\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",
|
|
423
|
+
"```",
|
|
424
|
+
"",
|
|
425
|
+
"**Issue labels encode the phase:**",
|
|
426
|
+
"",
|
|
427
|
+
"| Label | Phase | Session work |",
|
|
428
|
+
"|-------|-------|-------------|",
|
|
429
|
+
"| `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. |",
|
|
430
|
+
"| `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. |",
|
|
431
|
+
"",
|
|
432
|
+
"All issues also carry `type:agenda` and a `status:*` label.",
|
|
433
|
+
"",
|
|
434
|
+
"**Issue count per agenda:** usually **1** (`agenda:draft` only).",
|
|
435
|
+
"Small, well-specified agendas do not need a separate finalize",
|
|
436
|
+
"session \u2014 the draft phase does both draft and finalize in one",
|
|
437
|
+
"session. Create a separate `agenda:finalize` issue only when:",
|
|
438
|
+
"",
|
|
439
|
+
"- The agenda requires review by a non-agent reviewer before",
|
|
440
|
+
" cross-linking.",
|
|
441
|
+
"- Finalize work is blocked on other deliverables (e.g., sprint plan",
|
|
442
|
+
" not yet written).",
|
|
443
|
+
"- The draft was produced by a human and only needs agent-side",
|
|
444
|
+
" linking.",
|
|
445
|
+
"",
|
|
446
|
+
"**Default path:** single `agenda:draft` session, finalize inline.",
|
|
447
|
+
"",
|
|
448
|
+
"---",
|
|
449
|
+
"",
|
|
450
|
+
"## Meeting Type Handling",
|
|
451
|
+
"",
|
|
452
|
+
"The issue body specifies `meeting_type` in its Context or Inputs",
|
|
453
|
+
"section. The agent matches `meeting_type` to the project's",
|
|
454
|
+
"**Recognized meeting types** table (rendered below when the",
|
|
455
|
+
"consuming project declares `AgentConfigOptions.meetings.meetingTypes`)",
|
|
456
|
+
"and applies the matching row's `agendaTemplatePath` and",
|
|
457
|
+
"`defaultDurationMinutes`.",
|
|
458
|
+
"",
|
|
459
|
+
"**How to resolve the template:**",
|
|
460
|
+
"",
|
|
461
|
+
"1. Read `meeting_type` from the issue body.",
|
|
462
|
+
"2. Look up the matching `id` in the project's **Recognized meeting",
|
|
463
|
+
" types** table. Use the `Agenda template` column value, resolved",
|
|
464
|
+
" relative to the `agendaTemplateRoot` documented above the table",
|
|
465
|
+
" (defaults to `<meetingsRoot>/_agenda-templates`).",
|
|
466
|
+
"3. If the table is absent, the `id` is unknown, or the template",
|
|
467
|
+
" column is `\u2014`, fall back to `<meetingsRoot>/_agenda-templates/_base.md`",
|
|
468
|
+
" and note the gap in the agenda's Open Items section so the",
|
|
469
|
+
" template can be added later.",
|
|
470
|
+
"",
|
|
471
|
+
"When the project has **not** declared any `meetingTypes` at all,",
|
|
472
|
+
"the agent uses `_base.md` unconditionally and relies on the issue",
|
|
473
|
+
"body for all per-meeting structure.",
|
|
474
|
+
"",
|
|
475
|
+
"---",
|
|
476
|
+
"",
|
|
477
|
+
"## Agent Loop",
|
|
478
|
+
"",
|
|
479
|
+
"Run this loop exactly once per session. Never start a second issue.",
|
|
480
|
+
"",
|
|
481
|
+
"1. Claim one open `type:agenda` issue. Phase priority:",
|
|
482
|
+
" `agenda:finalize` > `agenda:draft` so a deferred finalize for an",
|
|
483
|
+
" older agenda closes before a new draft starts.",
|
|
484
|
+
"2. Transition `status:ready` \u2192 `status:in-progress` and create the",
|
|
485
|
+
" branch per your project's branch-naming convention.",
|
|
486
|
+
"3. Execute the phase handler that matches the issue's `agenda:*`",
|
|
487
|
+
" label.",
|
|
488
|
+
"4. Commit, push, open a PR, and transition the issue to",
|
|
489
|
+
" `status:ready-for-review` per your project's PR workflow.",
|
|
490
|
+
"",
|
|
491
|
+
"---",
|
|
492
|
+
"",
|
|
493
|
+
"## Phase 1: Draft (`agenda:draft`)",
|
|
494
|
+
"",
|
|
495
|
+
"**Goal:** Produce a well-structured `agenda.md` in the meeting's",
|
|
496
|
+
"dated folder, with objective, desired outcomes, timed sections,",
|
|
497
|
+
"pre-reads, and a parking lot.",
|
|
498
|
+
"",
|
|
499
|
+
"**Budget:** Reading + one file write (`agenda.md`), plus an optional",
|
|
500
|
+
"folder creation and a small registry edit when inline-finalizing.",
|
|
501
|
+
"No web searches unless the issue explicitly asks for external",
|
|
502
|
+
"research.",
|
|
503
|
+
"",
|
|
504
|
+
"### Steps",
|
|
505
|
+
"",
|
|
506
|
+
"1. **Read the issue body.** Extract:",
|
|
507
|
+
" - `meeting_type` \u2014 one of the `id`s in the project's",
|
|
508
|
+
" **Recognized meeting types** table",
|
|
509
|
+
" - `meeting_date` \u2014 `YYYY-MM-DD`",
|
|
510
|
+
" - `meeting_slug` \u2014 kebab-case (becomes the folder name suffix)",
|
|
511
|
+
" - `duration_min` \u2014 integer minutes (default from the type table",
|
|
512
|
+
" if absent)",
|
|
513
|
+
" - `attendees` \u2014 list of names/roles (internal) or",
|
|
514
|
+
" names/companies (external)",
|
|
515
|
+
" - `objective` \u2014 one-sentence decision-oriented goal",
|
|
516
|
+
' - `desired_outcomes` \u2014 1\u20133 bullets describing "done"',
|
|
517
|
+
" - `pre_reads` \u2014 relative paths to existing docs (optional)",
|
|
518
|
+
" - `related_docs` \u2014 relative paths for context (optional)",
|
|
519
|
+
"",
|
|
520
|
+
"2. **Block if under-specified.** If `objective` AND",
|
|
521
|
+
" `desired_outcomes` are both missing and cannot be inferred from",
|
|
522
|
+
" prior meeting notes or the template type, follow Blocked Issues",
|
|
523
|
+
" below. Do not invent an objective.",
|
|
524
|
+
"",
|
|
525
|
+
"3. **Create or locate the dated folder.**",
|
|
526
|
+
" ```",
|
|
527
|
+
" <meetingsRoot>/<YYYY-MM-DD>-<slug>/",
|
|
528
|
+
" ```",
|
|
529
|
+
" If the folder does not exist, create it. If it exists (because",
|
|
530
|
+
" the meeting-analyst already landed a transcript), reuse it. If an",
|
|
531
|
+
" `agenda.md` already exists, read it and update rather than",
|
|
532
|
+
" overwriting.",
|
|
533
|
+
"",
|
|
534
|
+
"4. **Load the matching template** by resolving `meeting_type`",
|
|
535
|
+
" against the project's **Recognized meeting types** table. Follow",
|
|
536
|
+
" the resolution rules in **Meeting Type Handling** above. If the",
|
|
537
|
+
" type is unrecognized, load `_base.md` and note the gap in Open",
|
|
538
|
+
" Items.",
|
|
539
|
+
"",
|
|
540
|
+
"5. **Read prior meeting notes for recurring series.** If",
|
|
541
|
+
" `meeting_type` maps to kind `planning` or `review` in the",
|
|
542
|
+
" project's meeting-types table (or, in the absence of a table,",
|
|
543
|
+
" the issue body flags the meeting as recurring):",
|
|
544
|
+
" - Glob `<meetingsRoot>/` for prior instances with the same",
|
|
545
|
+
" `meeting_type` (by frontmatter `meeting_type:` field).",
|
|
546
|
+
" - Read the most recent prior `notes.md`.",
|
|
547
|
+
" - Carry forward open action items, unresolved questions, and",
|
|
548
|
+
" `## Follow-up` entries into the new agenda under a",
|
|
549
|
+
" `## Carryover from last meeting` section.",
|
|
550
|
+
"",
|
|
551
|
+
"6. **Write the agenda.** Populate the template with:",
|
|
552
|
+
" - Frontmatter (see skeleton below)",
|
|
553
|
+
" - Objective (single sentence)",
|
|
554
|
+
" - Desired outcomes (1\u20133 bullets)",
|
|
555
|
+
" - Attendees + roles",
|
|
556
|
+
" - Pre-reads (relative markdown links only)",
|
|
557
|
+
" - Timed sections with",
|
|
558
|
+
" `[decide | discuss | inform | brainstorm]` tags",
|
|
559
|
+
" - Parking lot",
|
|
560
|
+
" - Action items placeholder (the meeting-analyst fills this in",
|
|
561
|
+
" post-meeting)",
|
|
562
|
+
" - Cross-link stub back to `notes.md` (created post-meeting)",
|
|
563
|
+
"",
|
|
564
|
+
" **Frontmatter skeleton:**",
|
|
565
|
+
" ```markdown",
|
|
566
|
+
" ---",
|
|
567
|
+
' title: "Agenda: <Meeting Name>"',
|
|
568
|
+
" date: YYYY-MM-DD",
|
|
569
|
+
" meeting_type: <type>",
|
|
570
|
+
" duration_min: <N>",
|
|
571
|
+
" attendees:",
|
|
572
|
+
" - <Name> (<role>)",
|
|
573
|
+
" status: proposed",
|
|
574
|
+
" areas:",
|
|
575
|
+
" - <area-id-from-the-project's-area-map>",
|
|
576
|
+
" sidebar:",
|
|
577
|
+
" hidden: true",
|
|
578
|
+
" ---",
|
|
579
|
+
" ```",
|
|
580
|
+
"",
|
|
581
|
+
" `sidebar.hidden: true` keeps the agenda out of any autogenerated",
|
|
582
|
+
" sidebar \u2014 only the folder's `index.md` should appear there.",
|
|
583
|
+
"",
|
|
584
|
+
" **Duration check.** Sum of section times must equal",
|
|
585
|
+
" `duration_min` \xB1 5 minutes. If it doesn't, adjust section times",
|
|
586
|
+
" or cut content \u2014 do not ship a math-broken agenda.",
|
|
587
|
+
"",
|
|
588
|
+
"7. **Create the folder `index.md` if missing.** Populate it with:",
|
|
589
|
+
" - Frontmatter `title` (short sidebar label) and `description`",
|
|
590
|
+
" (one line).",
|
|
591
|
+
" - A 2\u20134 sentence summary of the meeting's objective and desired",
|
|
592
|
+
" outcomes pulled from the agenda.",
|
|
593
|
+
" - A `## Documents` section linking to `./agenda.md` (and",
|
|
594
|
+
" `./notes.md` once the meeting-analyst produces it).",
|
|
595
|
+
"",
|
|
596
|
+
" Do NOT set `sidebar.hidden: true` on `index.md` \u2014 it is the page",
|
|
597
|
+
" that should appear in the sidebar.",
|
|
598
|
+
"",
|
|
599
|
+
"8. **Inline finalize (default).** Unless a separate",
|
|
600
|
+
" `agenda:finalize` issue was created, complete these steps in the",
|
|
601
|
+
" same session:",
|
|
602
|
+
" - Register the agenda in `<meetingsRoot>/index.md` (append to",
|
|
603
|
+
" the meeting registry table).",
|
|
604
|
+
" - Add a forward link from any related doc in `related_docs` to",
|
|
605
|
+
" the agenda, using a relative markdown link.",
|
|
606
|
+
" - Verify the dated folder contains at minimum `agenda.md`.",
|
|
607
|
+
" Transcript and notes will land later via the meeting-analyst.",
|
|
608
|
+
"",
|
|
609
|
+
"9. **Commit and push.**",
|
|
610
|
+
"",
|
|
611
|
+
"---",
|
|
612
|
+
"",
|
|
613
|
+
"## Phase 2: Finalize (`agenda:finalize`)",
|
|
614
|
+
"",
|
|
615
|
+
"**Goal:** Complete the registry updates and cross-linking that were",
|
|
616
|
+
"deferred from the draft phase. Only runs when an explicit",
|
|
617
|
+
"`agenda:finalize` issue exists.",
|
|
618
|
+
"",
|
|
619
|
+
"**Budget:** Reading + small edits to `index.md` and related docs.",
|
|
620
|
+
"No new agenda file writes.",
|
|
621
|
+
"",
|
|
622
|
+
"### Steps",
|
|
623
|
+
"",
|
|
624
|
+
"1. **Read the draft agenda** at",
|
|
625
|
+
" `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`.",
|
|
626
|
+
"",
|
|
627
|
+
"2. **Incorporate late-added items.** The finalize phase is the",
|
|
628
|
+
" last chance to add attendee-requested sections before the",
|
|
629
|
+
" meeting starts. Read any comments on the `agenda:finalize`",
|
|
630
|
+
" issue for late additions; fold them into timed sections and",
|
|
631
|
+
" re-balance durations so the sum still equals `duration_min` \xB15.",
|
|
632
|
+
" If late additions exceed the remaining budget, move the lowest-",
|
|
633
|
+
" priority existing section to the parking lot rather than",
|
|
634
|
+
" overrunning the duration.",
|
|
635
|
+
"",
|
|
636
|
+
"3. **Register in the meeting index.** Append to",
|
|
637
|
+
" `<meetingsRoot>/index.md` if not already listed.",
|
|
638
|
+
"",
|
|
639
|
+
"4. **Add forward links** from each doc in the agenda's",
|
|
640
|
+
" `related_docs` frontmatter field (if any). Use relative markdown",
|
|
641
|
+
" links.",
|
|
642
|
+
"",
|
|
643
|
+
"5. **Lock the agenda.** Update the agenda's frontmatter",
|
|
644
|
+
" `status: proposed` \u2192 `status: locked` to signal the agenda is",
|
|
645
|
+
" frozen before the meeting starts. Late-breaking items that",
|
|
646
|
+
" arrive after this point go on the meeting's parking lot during",
|
|
647
|
+
" the meeting itself, not the agenda.",
|
|
648
|
+
"",
|
|
649
|
+
"6. **Verify artifact set.** Confirm the dated folder has at least",
|
|
650
|
+
" `agenda.md` and `index.md`. Do not wait for `notes.md` or a",
|
|
651
|
+
" transcript \u2014 those land post-meeting via the meeting-analyst.",
|
|
652
|
+
"",
|
|
653
|
+
"7. **Commit and push.**",
|
|
654
|
+
"",
|
|
655
|
+
"---",
|
|
656
|
+
"",
|
|
657
|
+
"## Coordination with Other Agents",
|
|
658
|
+
"",
|
|
659
|
+
"### Downstream Consumers",
|
|
660
|
+
"",
|
|
661
|
+
"| Output | Consumed by |",
|
|
662
|
+
"|--------|------------|",
|
|
663
|
+
"| `agenda.md` in dated folder | Humans running the meeting; the `meeting-analyst` reads it when processing the resulting transcript. |",
|
|
664
|
+
"| Registry entry in `<meetingsRoot>/index.md` | Humans browsing meetings; search indexing. |",
|
|
665
|
+
"| Forward links from related docs | Human readers of those docs. |",
|
|
666
|
+
"",
|
|
667
|
+
"### Upstream Sources",
|
|
668
|
+
"",
|
|
669
|
+
"| Input | Produced by |",
|
|
670
|
+
"|-------|------------|",
|
|
671
|
+
"| Prior `notes.md` for recurring series | `meeting-analyst` (post-prior-meeting). |",
|
|
672
|
+
"| Sprint plan for planning-kind meetings | `meeting-analyst` Phase 4 or the orchestrator. |",
|
|
673
|
+
"| Roadmap for strategy-kind meetings | Product docs maintained by the `meeting-analyst`. |",
|
|
674
|
+
"| Company/people profiles for external-meeting pre-reads | `company-profile` / `people-profile` agents. |",
|
|
675
|
+
"",
|
|
676
|
+
"### File Boundaries",
|
|
677
|
+
"",
|
|
678
|
+
"- **Reads:** `<docsRoot>/` (any file, for pre-reads, related docs,",
|
|
679
|
+
" and carryover lookup).",
|
|
680
|
+
"- **Writes:**",
|
|
681
|
+
" - `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`",
|
|
682
|
+
" - `<meetingsRoot>/<YYYY-MM-DD>-<slug>/index.md`",
|
|
683
|
+
" - `<meetingsRoot>/index.md` (append registry entries)",
|
|
684
|
+
" - Small cross-link edits to related docs (\u226410 lines, forward",
|
|
685
|
+
" links only)",
|
|
686
|
+
"- **Never writes to:**",
|
|
687
|
+
" - `notes.md` in any meeting folder (the `meeting-analyst` owns",
|
|
688
|
+
" this)",
|
|
689
|
+
" - Transcript files in any meeting folder (tooling / human)",
|
|
690
|
+
" - `<requirementsRoot>/`, `<bcmRoot>/`, `<peopleRoot>/`,",
|
|
691
|
+
" `<companiesRoot>/`, `<softwareRoot>/`, `<industriesRoot>/`",
|
|
692
|
+
" (specialist agents own these)",
|
|
693
|
+
" - Meeting extraction files (the `meeting-analyst` owns extracts)",
|
|
694
|
+
"",
|
|
695
|
+
"---",
|
|
696
|
+
"",
|
|
697
|
+
"## Blocked Issues",
|
|
698
|
+
"",
|
|
699
|
+
"Follow your project's shared Blocked Issues procedure. Additional",
|
|
700
|
+
"block reasons specific to agenda drafting:",
|
|
701
|
+
"",
|
|
702
|
+
"- **Objective missing and not inferrable.** The issue body has no",
|
|
703
|
+
" objective and no prior meeting notes or related docs that imply",
|
|
704
|
+
" one.",
|
|
705
|
+
"- **Attendees unknown.** External meetings especially \u2014 an agenda",
|
|
706
|
+
" cannot be tuned without knowing who is in the room.",
|
|
707
|
+
"- **Duration conflict.** The issue specifies a duration that cannot",
|
|
708
|
+
" fit the stated outcomes even with aggressive time-boxing.",
|
|
709
|
+
"- **Unrecognized `meeting_type` and no fallback viable.** If",
|
|
710
|
+
" `meeting_type` is unrecognized AND `_base.md` is insufficient",
|
|
711
|
+
" (the meeting pattern does not fit any existing template), block",
|
|
712
|
+
" so a human can either add a template or reclassify the meeting.",
|
|
713
|
+
"",
|
|
714
|
+
"---",
|
|
715
|
+
"",
|
|
716
|
+
"## Rules",
|
|
717
|
+
"",
|
|
718
|
+
"- **Objective or block.** No agenda ships without a stated",
|
|
719
|
+
" objective and at least one desired outcome. If the issue does",
|
|
720
|
+
" not supply one and none can be inferred, block \u2014 do not invent.",
|
|
721
|
+
"- **Time-box every section.** Sum must equal `duration_min` \xB1 5.",
|
|
722
|
+
" No untimed sections except Parking Lot.",
|
|
723
|
+
"- **Intent tag per section.** Every timed section carries",
|
|
724
|
+
" `[decide]`, `[discuss]`, `[inform]`, or `[brainstorm]`.",
|
|
725
|
+
"- **Link, don't copy.** Pre-reads are relative markdown links to",
|
|
726
|
+
" existing docs. The agent never inlines content from another doc",
|
|
727
|
+
" into the agenda.",
|
|
728
|
+
"- **Dated folder is canonical.** `agenda.md` lives alongside",
|
|
729
|
+
" `notes.md` (landed post-meeting) in the same `YYYY-MM-DD-<slug>/`",
|
|
730
|
+
" folder. The agent creates the folder if needed but never writes",
|
|
731
|
+
" outside it for agenda content.",
|
|
732
|
+
"- **Async suggestion for decision-free meetings.** If the agent",
|
|
733
|
+
" cannot identify any `[decide]` sections in a meeting that has no",
|
|
734
|
+
" recurring-ritual justification, the agent should comment on the",
|
|
735
|
+
" issue suggesting the meeting be converted to an async update",
|
|
736
|
+
" before writing the agenda.",
|
|
737
|
+
"- **Recurring-series carryover.** For recurring meetings (kind",
|
|
738
|
+
" `planning` or `review`), read the prior instance's `notes.md`",
|
|
739
|
+
" and carry forward open items, unresolved questions, and",
|
|
740
|
+
" follow-up commitments.",
|
|
741
|
+
"- **Registry freshness.** Every new agenda adds a row to",
|
|
742
|
+
" `<meetingsRoot>/index.md`. No silent publishes.",
|
|
743
|
+
"- **Bidirectional traceability.** The agenda's `notes.md` link",
|
|
744
|
+
" stub and the notes file's forward link to the agenda form the",
|
|
745
|
+
" round-trip. Once `notes.md` is written by the meeting-analyst,",
|
|
746
|
+
" both files link to each other via relative markdown paths.",
|
|
747
|
+
"- **Never cross agent boundaries.** Do not write `notes.md`,",
|
|
748
|
+
" transcripts, extracts, requirements, ADRs, or profiles. If the",
|
|
749
|
+
" agenda work surfaces a need for any of those, create the",
|
|
750
|
+
" appropriate issue for the specialist agent instead."
|
|
751
|
+
].join("\n")
|
|
752
|
+
};
|
|
753
|
+
var draftAgendaSkill = {
|
|
754
|
+
name: "draft-agenda",
|
|
755
|
+
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.",
|
|
756
|
+
disableModelInvocation: true,
|
|
757
|
+
userInvocable: true,
|
|
758
|
+
context: "fork",
|
|
759
|
+
agent: "agenda-analyst",
|
|
760
|
+
platforms: { cursor: { exclude: true } },
|
|
761
|
+
instructions: [
|
|
762
|
+
"# Draft Agenda",
|
|
763
|
+
"",
|
|
764
|
+
"Kick off a meeting-agenda cycle. Creates an `agenda:draft` issue",
|
|
765
|
+
"targeted at the requested meeting and dispatches Phase 1 (Draft)",
|
|
766
|
+
"in the agenda-analyst agent. If a separate finalize pass is",
|
|
767
|
+
"needed, Phase 1 creates the `agenda:finalize` issue automatically;",
|
|
768
|
+
"otherwise the draft phase inline-finalizes in the same session.",
|
|
769
|
+
"",
|
|
770
|
+
"## Usage",
|
|
771
|
+
"",
|
|
772
|
+
"/draft-agenda <meeting-type>:<YYYY-MM-DD>-<slug>",
|
|
773
|
+
"",
|
|
774
|
+
"Where:",
|
|
775
|
+
"- `<meeting-type>` \u2014 one of the `id`s from the project's",
|
|
776
|
+
" **Recognized meeting types** table (rendered into the",
|
|
777
|
+
" agenda-analyst prompt when the consuming project declares",
|
|
778
|
+
" `AgentConfigOptions.meetings.meetingTypes`).",
|
|
779
|
+
"- `<YYYY-MM-DD>` \u2014 the meeting date.",
|
|
780
|
+
"- `<slug>` \u2014 a kebab-case short name for the meeting (becomes the",
|
|
781
|
+
" folder name suffix).",
|
|
782
|
+
"",
|
|
783
|
+
"Examples (the meeting-type `id`s below are illustrative \u2014 use",
|
|
784
|
+
"whatever `id`s your project declares in `meetingTypes`):",
|
|
785
|
+
"- `team-weekly:2026-04-24-weekly-sync`",
|
|
786
|
+
"- `customer-discovery:2026-04-28-prospect-intro`",
|
|
787
|
+
"",
|
|
788
|
+
"## Steps",
|
|
789
|
+
"",
|
|
790
|
+
"1. Create an `agenda:draft` issue with `type:agenda`,",
|
|
791
|
+
" `priority:high`, and `status:ready`. The body must list:",
|
|
792
|
+
" - `meeting_type` \u2014 from the `<meeting-type>` segment",
|
|
793
|
+
" - `meeting_date` \u2014 from the `<YYYY-MM-DD>` segment",
|
|
794
|
+
" - `meeting_slug` \u2014 from the `<slug>` segment",
|
|
795
|
+
" - `duration_min` \u2014 optional (defaults to the type table value)",
|
|
796
|
+
" - `attendees` \u2014 list of names/roles",
|
|
797
|
+
" - `objective` \u2014 one-sentence decision-oriented goal",
|
|
798
|
+
' - `desired_outcomes` \u2014 1\u20133 bullets describing "done"',
|
|
799
|
+
" - `pre_reads` \u2014 relative paths to existing docs (optional)",
|
|
800
|
+
" - `related_docs` \u2014 relative paths for context (optional)",
|
|
801
|
+
"2. Execute Phase 1 (Draft) of the agenda-analyst agent.",
|
|
802
|
+
"3. If the draft phase inline-finalizes (default path), no",
|
|
803
|
+
" downstream issues are created.",
|
|
804
|
+
"4. If finalize work is deferred, Phase 1 creates an",
|
|
805
|
+
" `agenda:finalize` issue blocked on the draft issue.",
|
|
806
|
+
"",
|
|
807
|
+
"## Output",
|
|
808
|
+
"",
|
|
809
|
+
"- `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md` \u2014 the agenda",
|
|
810
|
+
" itself, with frontmatter, objective, outcomes, timed intent-",
|
|
811
|
+
" tagged sections, pre-reads, and a parking lot.",
|
|
812
|
+
"- `<meetingsRoot>/<YYYY-MM-DD>-<slug>/index.md` \u2014 folder index",
|
|
813
|
+
" page that appears in the docs sidebar.",
|
|
814
|
+
"- A registry row in `<meetingsRoot>/index.md`.",
|
|
815
|
+
"- An `agenda:finalize` issue (only when finalize work was",
|
|
816
|
+
" deferred)."
|
|
817
|
+
].join("\n")
|
|
818
|
+
};
|
|
819
|
+
var finalizeAgendaSkill = {
|
|
820
|
+
name: "finalize-agenda",
|
|
821
|
+
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.",
|
|
822
|
+
disableModelInvocation: true,
|
|
823
|
+
userInvocable: true,
|
|
824
|
+
context: "fork",
|
|
825
|
+
agent: "agenda-analyst",
|
|
826
|
+
platforms: { cursor: { exclude: true } },
|
|
827
|
+
instructions: [
|
|
828
|
+
"# Finalize Agenda",
|
|
829
|
+
"",
|
|
830
|
+
"Close the loop on a meeting-agenda cycle whose draft phase deferred",
|
|
831
|
+
"finalize work. Creates an `agenda:finalize` issue and dispatches",
|
|
832
|
+
"Phase 2 (Finalize) in the agenda-analyst agent.",
|
|
833
|
+
"",
|
|
834
|
+
"Phase 2 incorporates late-added items (from comments on the",
|
|
835
|
+
"finalize issue), registers the agenda in the meetings index,",
|
|
836
|
+
"cross-links related docs, and locks the agenda before the meeting",
|
|
837
|
+
"starts.",
|
|
838
|
+
"",
|
|
839
|
+
"Most cycles do not need this skill \u2014 Phase 1 (Draft) inline-",
|
|
840
|
+
"finalizes by default. Use this skill when:",
|
|
841
|
+
"- The draft phase explicitly deferred finalize work (an",
|
|
842
|
+
" `agenda:finalize` issue was created during draft).",
|
|
843
|
+
"- The draft was produced by a human and only needs agent-side",
|
|
844
|
+
" linking.",
|
|
845
|
+
"- Late-breaking items arrived after draft and need to be folded",
|
|
846
|
+
" in before the meeting starts.",
|
|
847
|
+
"",
|
|
848
|
+
"## Usage",
|
|
849
|
+
"",
|
|
850
|
+
"/finalize-agenda <YYYY-MM-DD>-<slug>",
|
|
851
|
+
"",
|
|
852
|
+
"Where `<YYYY-MM-DD>-<slug>` identifies the dated meeting folder",
|
|
853
|
+
"that already contains an `agenda.md`.",
|
|
854
|
+
"",
|
|
855
|
+
"Example:",
|
|
856
|
+
"- `/finalize-agenda 2026-04-24-weekly-sync`",
|
|
857
|
+
"",
|
|
858
|
+
"## Steps",
|
|
859
|
+
"",
|
|
860
|
+
"1. Create an `agenda:finalize` issue with `type:agenda`,",
|
|
861
|
+
" `priority:high`, and `status:ready`. Body must list:",
|
|
862
|
+
" - Path to the draft agenda",
|
|
863
|
+
" (`<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`)",
|
|
864
|
+
" - Any late-added items to incorporate",
|
|
865
|
+
"2. Execute Phase 2 (Finalize) of the agenda-analyst agent.",
|
|
866
|
+
"",
|
|
867
|
+
"## Output",
|
|
868
|
+
"",
|
|
869
|
+
"- Updates to `<meetingsRoot>/<YYYY-MM-DD>-<slug>/agenda.md`",
|
|
870
|
+
" (frontmatter `status: proposed` \u2192 `status: locked`, plus",
|
|
871
|
+
" incorporated late items).",
|
|
872
|
+
"- A new row in `<meetingsRoot>/index.md` (if not already",
|
|
873
|
+
" registered).",
|
|
874
|
+
"- Small forward-link edits in related docs."
|
|
875
|
+
].join("\n")
|
|
876
|
+
};
|
|
877
|
+
var agendaBundle = {
|
|
878
|
+
name: "agenda",
|
|
879
|
+
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.",
|
|
880
|
+
appliesWhen: () => true,
|
|
881
|
+
rules: [
|
|
882
|
+
{
|
|
883
|
+
name: "meeting-agenda-workflow",
|
|
884
|
+
description: "Describes the 2-phase pre-meeting agenda pipeline, the agenda:* label taxonomy, and the relationship to the meeting-analysis bundle.",
|
|
885
|
+
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
886
|
+
content: [
|
|
887
|
+
"# Meeting Agenda Workflow",
|
|
888
|
+
"",
|
|
889
|
+
"Use `/draft-agenda <meeting-type>:<YYYY-MM-DD>-<slug>` to kick",
|
|
890
|
+
"off a pre-meeting agenda cycle. The pipeline runs in 2 phases \u2014",
|
|
891
|
+
"draft and finalize \u2014 each tracked by its own GitHub issue",
|
|
892
|
+
"labeled `agenda:draft` or `agenda:finalize`. All issues carry",
|
|
893
|
+
"`type:agenda`.",
|
|
894
|
+
"",
|
|
895
|
+
"One additional user-invocable skill drives the finalize phase",
|
|
896
|
+
"on demand:",
|
|
897
|
+
"",
|
|
898
|
+
"- `/finalize-agenda <YYYY-MM-DD>-<slug>` \u2014 register the agenda",
|
|
899
|
+
" in the meetings index, add cross-links, incorporate late-",
|
|
900
|
+
" added items, and lock the agenda before the meeting starts.",
|
|
901
|
+
" Phase 1 (Draft) normally inline-finalizes \u2014 this skill is",
|
|
902
|
+
" the explicit entry point when finalize work was deferred or",
|
|
903
|
+
" a human authored the draft.",
|
|
904
|
+
"",
|
|
905
|
+
"The agenda bundle *writes pre-meeting agendas*; the",
|
|
906
|
+
"`meeting-analysis` bundle *processes post-meeting transcripts",
|
|
907
|
+
"and notes*. Together they close the loop:",
|
|
908
|
+
"**agenda \u2192 meeting \u2192 transcript \u2192 notes \u2192 follow-up work**.",
|
|
909
|
+
"The agenda bundle reuses the `meeting_type` taxonomy declared",
|
|
910
|
+
"via `AgentConfigOptions.meetings.meetingTypes` \u2014 the same",
|
|
911
|
+
"taxonomy the `meeting-analysis` bundle consumes for post-",
|
|
912
|
+
"meeting extraction.",
|
|
913
|
+
"",
|
|
914
|
+
"See the `agenda-analyst` agent definition for full workflow",
|
|
915
|
+
"details and phase-by-phase instructions."
|
|
916
|
+
].join("\n"),
|
|
917
|
+
platforms: {
|
|
918
|
+
cursor: { exclude: true }
|
|
919
|
+
},
|
|
920
|
+
tags: ["workflow"]
|
|
921
|
+
}
|
|
922
|
+
],
|
|
923
|
+
skills: [draftAgendaSkill, finalizeAgendaSkill],
|
|
924
|
+
subAgents: [agendaAnalystSubAgent],
|
|
925
|
+
labels: [
|
|
926
|
+
{
|
|
927
|
+
name: "type:agenda",
|
|
928
|
+
color: "5319E7",
|
|
929
|
+
description: "Work that authors a pre-meeting agenda for a scheduled meeting"
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
name: "agenda:draft",
|
|
933
|
+
color: "C5DEF5",
|
|
934
|
+
description: "Phase 1: draft an agenda for a scheduled meeting (template, objective, timed sections, pre-reads)"
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
name: "agenda:finalize",
|
|
938
|
+
color: "BFDADC",
|
|
939
|
+
description: "Phase 2: incorporate late-added items, register in the meetings index, cross-link related docs, and lock the agenda"
|
|
940
|
+
}
|
|
941
|
+
]
|
|
942
|
+
};
|
|
943
|
+
|
|
217
944
|
// src/agent/bundles/utils.ts
|
|
218
945
|
function findProjectsWithComponent(project, ctor) {
|
|
219
946
|
const out = [];
|
|
@@ -1475,133 +2202,6 @@ function resolveAgentPaths(paths) {
|
|
|
1475
2202
|
};
|
|
1476
2203
|
}
|
|
1477
2204
|
|
|
1478
|
-
// src/agent/bundles/project-context.ts
|
|
1479
|
-
var PROJECT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
|
|
1480
|
-
var SUBPROJECT_ROLE_GUIDANCE = [
|
|
1481
|
-
"### Sub-project roles",
|
|
1482
|
-
"",
|
|
1483
|
-
"When the repository follows the configulator monorepo layout,",
|
|
1484
|
-
"every sub-project's role is derivable from the first segment of",
|
|
1485
|
-
"its `outdir` path. No other lookup is required.",
|
|
1486
|
-
"",
|
|
1487
|
-
"- `apps/<scope>/<name>` \u2014 deployable application (CDK stack,",
|
|
1488
|
-
" mobile app, backend service).",
|
|
1489
|
-
"- `packages/<scope>/<name>` \u2014 shared library (published npm",
|
|
1490
|
-
" package or workspace-internal library).",
|
|
1491
|
-
"- `sites/<scope>/<name>` \u2014 user-facing web front end that is",
|
|
1492
|
-
" not the monorepo-wide docs site.",
|
|
1493
|
-
"- `docs/` \u2014 the single Starlight documentation site for the",
|
|
1494
|
-
" whole monorepo (exactly one per repo; lives at `/docs`, not",
|
|
1495
|
-
" under `sites/`).",
|
|
1496
|
-
"",
|
|
1497
|
-
"Repositories that have not adopted the layout contract may use a",
|
|
1498
|
-
"different folder structure \u2014 in that case fall back to whatever",
|
|
1499
|
-
`\`${PROJECT_CONTEXT_PATH}\` documents explicitly.`,
|
|
1500
|
-
""
|
|
1501
|
-
];
|
|
1502
|
-
var PROJECT_CONTEXT_READER_SECTION = [
|
|
1503
|
-
"## Project Context",
|
|
1504
|
-
"",
|
|
1505
|
-
`Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
1506
|
-
'repository root. It is the canonical answer to "what is this project',
|
|
1507
|
-
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
1508
|
-
"key stakeholders. Use it to frame judgment calls in this session.",
|
|
1509
|
-
"",
|
|
1510
|
-
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
|
|
1511
|
-
"task and note the absence in your session log \u2014 the meeting-analyst and",
|
|
1512
|
-
"requirements-analyst agents seed the file on their next run.",
|
|
1513
|
-
"",
|
|
1514
|
-
"You are a **read-only consumer** of this file. Do not edit it.",
|
|
1515
|
-
"",
|
|
1516
|
-
...SUBPROJECT_ROLE_GUIDANCE,
|
|
1517
|
-
"---",
|
|
1518
|
-
""
|
|
1519
|
-
];
|
|
1520
|
-
var PROJECT_CONTEXT_MAINTAINER_SECTION = [
|
|
1521
|
-
"## Project Context",
|
|
1522
|
-
"",
|
|
1523
|
-
`Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
1524
|
-
'repository root. It is the canonical answer to "what is this project',
|
|
1525
|
-
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
1526
|
-
"key stakeholders. Use it to judge relevance when scanning source",
|
|
1527
|
-
"material in this session.",
|
|
1528
|
-
"",
|
|
1529
|
-
...SUBPROJECT_ROLE_GUIDANCE,
|
|
1530
|
-
"### Seed on first use",
|
|
1531
|
-
"",
|
|
1532
|
-
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
|
|
1533
|
-
"template and commit it alongside this phase's other outputs:",
|
|
1534
|
-
"",
|
|
1535
|
-
"```markdown",
|
|
1536
|
-
"# Project Context",
|
|
1537
|
-
"",
|
|
1538
|
-
"> Canonical description of this project. Read by all agents before",
|
|
1539
|
-
"> work. Updated by meeting-analyst and requirements-analyst when new",
|
|
1540
|
-
"> scope, vocabulary, or stakeholders emerge.",
|
|
1541
|
-
"",
|
|
1542
|
-
"## Mission",
|
|
1543
|
-
"TODO: one or two sentences on what this project exists to do.",
|
|
1544
|
-
"",
|
|
1545
|
-
"## Target Users",
|
|
1546
|
-
"TODO: who uses this, in what role.",
|
|
1547
|
-
"",
|
|
1548
|
-
"## In-Scope Capabilities",
|
|
1549
|
-
"TODO: bullet list of the capabilities this project owns.",
|
|
1550
|
-
"",
|
|
1551
|
-
"## Out-of-Scope",
|
|
1552
|
-
"TODO: capabilities or concerns that are explicitly not this project's.",
|
|
1553
|
-
"",
|
|
1554
|
-
"## Domain Vocabulary",
|
|
1555
|
-
"TODO: short glossary of domain terms, acronyms, and their definitions.",
|
|
1556
|
-
"",
|
|
1557
|
-
"## Key Stakeholders",
|
|
1558
|
-
"TODO: named people or teams and what they care about.",
|
|
1559
|
-
"{{monorepoLayoutSeedBlock}}",
|
|
1560
|
-
"## References",
|
|
1561
|
-
"TODO: links to BCM docs, competitive analysis, product roadmap, and",
|
|
1562
|
-
"other authoritative sources.",
|
|
1563
|
-
"```",
|
|
1564
|
-
"",
|
|
1565
|
-
"Fill whatever you can infer from the source material you are already",
|
|
1566
|
-
"reading in this phase; leave `TODO:` placeholders for the rest.",
|
|
1567
|
-
"",
|
|
1568
|
-
"### Update on new facts",
|
|
1569
|
-
"",
|
|
1570
|
-
"When the source material you process reveals new project-scope",
|
|
1571
|
-
"information \u2014 a new capability, a vocabulary term, an entity, a",
|
|
1572
|
-
"stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
|
|
1573
|
-
`append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
|
|
1574
|
-
"before closing the phase. Commit those edits with the phase's other",
|
|
1575
|
-
"outputs.",
|
|
1576
|
-
"",
|
|
1577
|
-
"Keep edits surgical: short bullet additions, brief clarifications, or",
|
|
1578
|
-
"single-line vocabulary entries. Treat the file as an accreting",
|
|
1579
|
-
"reference, not a document you reshape every session.",
|
|
1580
|
-
"",
|
|
1581
|
-
"---",
|
|
1582
|
-
""
|
|
1583
|
-
];
|
|
1584
|
-
var MONOREPO_LAYOUT_SEED_BLOCK = [
|
|
1585
|
-
"",
|
|
1586
|
-
"## Sub-Projects",
|
|
1587
|
-
"",
|
|
1588
|
-
"TODO: one bullet per sub-project, grouped by role. The role is",
|
|
1589
|
-
"derivable from the first segment of each sub-project's `outdir`.",
|
|
1590
|
-
"",
|
|
1591
|
-
"### Applications (`apps/`)",
|
|
1592
|
-
"TODO: deployable applications (CDK stacks, mobile apps, services).",
|
|
1593
|
-
"",
|
|
1594
|
-
"### Packages (`packages/`)",
|
|
1595
|
-
"TODO: shared libraries (published npm packages, workspace-internal libraries).",
|
|
1596
|
-
"",
|
|
1597
|
-
"### Sites (`sites/`)",
|
|
1598
|
-
"TODO: user-facing web front ends (marketing sites, SPAs, client apps).",
|
|
1599
|
-
"",
|
|
1600
|
-
"### Docs (`docs/`)",
|
|
1601
|
-
"TODO: the single monorepo-wide Starlight documentation site.",
|
|
1602
|
-
""
|
|
1603
|
-
].join("\n");
|
|
1604
|
-
|
|
1605
2205
|
// src/agent/bundles/bcm-writer.ts
|
|
1606
2206
|
var bcmWriterSubAgent = {
|
|
1607
2207
|
name: "bcm-writer",
|
|
@@ -9333,7 +9933,7 @@ var REQ_WRITE_ISSUE_SCHEMA_SECTION = [
|
|
|
9333
9933
|
// src/agent/bundles/requirements-analyst.ts
|
|
9334
9934
|
var requirementsAnalystSubAgent = {
|
|
9335
9935
|
name: "requirements-analyst",
|
|
9336
|
-
description: "Discovers requirement gaps from BCM model docs, competitive analysis, product docs, and meeting extracts. Produces scan reports and
|
|
9936
|
+
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.",
|
|
9337
9937
|
model: AGENT_MODEL.POWERFUL,
|
|
9338
9938
|
maxTurns: 80,
|
|
9339
9939
|
platforms: { cursor: { exclude: true } },
|
|
@@ -9374,35 +9974,39 @@ var requirementsAnalystSubAgent = {
|
|
|
9374
9974
|
"",
|
|
9375
9975
|
"## State Machine Overview",
|
|
9376
9976
|
"",
|
|
9377
|
-
"Requirements synthesis flows through **
|
|
9977
|
+
"Requirements synthesis flows through **2 phases**:",
|
|
9378
9978
|
"",
|
|
9379
9979
|
"```",
|
|
9380
|
-
"\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\
|
|
9381
|
-
"\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT
|
|
9382
|
-
"\u2502 Read docs, \u2502 \u2502 Write
|
|
9383
|
-
"\u2502 identify \u2502 \u2502
|
|
9384
|
-
"\u2502 gaps, check \u2502 \u2502
|
|
9385
|
-
"\u2502 for dupes \u2502 \u2502
|
|
9386
|
-
"\u2502 \u2502 \u2502
|
|
9387
|
-
"\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\
|
|
9980
|
+
"\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",
|
|
9981
|
+
"\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT-TRACE \u2502",
|
|
9982
|
+
"\u2502 Read docs, \u2502 \u2502 Write proposals,\u2502",
|
|
9983
|
+
"\u2502 identify \u2502 \u2502 create req:write\u2502",
|
|
9984
|
+
"\u2502 gaps, check \u2502 \u2502 issues, update \u2502",
|
|
9985
|
+
"\u2502 for dupes \u2502 \u2502 source docs \u2502",
|
|
9986
|
+
"\u2502 \u2502 \u2502 with traceability\u2502",
|
|
9987
|
+
"\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",
|
|
9388
9988
|
"```",
|
|
9389
9989
|
"",
|
|
9990
|
+
"This pipeline matches the `scan \u2192 draft-trace \u2192 write` pattern",
|
|
9991
|
+
"used by the sibling openhi project. Draft and Trace were previously",
|
|
9992
|
+
"separate phases; they were collapsed because the proposals file Draft",
|
|
9993
|
+
"wrote was only ever consumed by Trace (no human review, no async work",
|
|
9994
|
+
"between the two), so the phase boundary added latency without value.",
|
|
9995
|
+
"See ADR-009 for the full reasoning.",
|
|
9996
|
+
"",
|
|
9390
9997
|
"**Issue labels encode the phase:**",
|
|
9391
9998
|
"",
|
|
9392
9999
|
"| Label | Phase | Session work |",
|
|
9393
10000
|
"|-------|-------|-------------|",
|
|
9394
10001
|
"| `req:scan` | 1. Scan | Read source docs, identify potential requirement gaps, check against existing requirements and open issues, write deduplicated scan report |",
|
|
9395
|
-
"| `req:draft` | 2. Draft | Write
|
|
9396
|
-
"| `req:trace` | 3. Trace | Create GitHub issues for each proposed requirement and update source documents with traceability notes |",
|
|
10002
|
+
"| `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 |",
|
|
9397
10003
|
"",
|
|
9398
10004
|
"All issues also carry `type:requirement` and a `status:*` label.",
|
|
9399
10005
|
"",
|
|
9400
|
-
"**Issue count per scan cycle:** 1 scan + 1 draft
|
|
10006
|
+
"**Issue count per scan cycle:** 1 scan + 1 draft-trace = **2 sessions**.",
|
|
9401
10007
|
"",
|
|
9402
10008
|
"**Shortened paths:**",
|
|
9403
|
-
"- No gaps found after scan \u2192 skip draft
|
|
9404
|
-
"- No source docs need traceability updates \u2192 still **3 sessions** (trace",
|
|
9405
|
-
" handles both issue creation and doc updates)",
|
|
10009
|
+
"- No gaps found after scan \u2192 skip draft-trace \u2192 **1 session**",
|
|
9406
10010
|
"",
|
|
9407
10011
|
"---",
|
|
9408
10012
|
"",
|
|
@@ -9431,7 +10035,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9431
10035
|
"Run this loop exactly once per session. Never start a second issue.",
|
|
9432
10036
|
"",
|
|
9433
10037
|
"1. Claim one open `type:requirement` issue using phase priority:",
|
|
9434
|
-
" `req:scan` > `req:draft
|
|
10038
|
+
" `req:scan` > `req:draft-trace`.",
|
|
9435
10039
|
"2. Transition `status:ready` \u2192 `status:in-progress` and create the branch",
|
|
9436
10040
|
" per your project's branch-naming convention.",
|
|
9437
10041
|
"3. Execute the phase handler that matches the issue's `req:*` label.",
|
|
@@ -9532,7 +10136,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9532
10136
|
" ```",
|
|
9533
10137
|
"",
|
|
9534
10138
|
"7. **Create downstream issues based on findings:**",
|
|
9535
|
-
" - If any new gaps were identified \u2192 create `req:draft` issue",
|
|
10139
|
+
" - If any new gaps were identified \u2192 create `req:draft-trace` issue",
|
|
9536
10140
|
" (blocked on this issue via `Depends on: #N`).",
|
|
9537
10141
|
" - If **no gaps** were found \u2192 stop (no further phases needed). Comment",
|
|
9538
10142
|
" on the issue noting that no gaps were identified, and proceed directly",
|
|
@@ -9543,12 +10147,54 @@ var requirementsAnalystSubAgent = {
|
|
|
9543
10147
|
"",
|
|
9544
10148
|
"---",
|
|
9545
10149
|
"",
|
|
9546
|
-
"## Phase 2: Draft (`req:draft`)",
|
|
10150
|
+
"## Phase 2: Draft & Trace (`req:draft-trace`)",
|
|
9547
10151
|
"",
|
|
9548
|
-
"**Goal:** Expand each identified gap into a requirement proposal
|
|
9549
|
-
"
|
|
10152
|
+
"**Goal:** Expand each identified gap into a requirement proposal, create",
|
|
10153
|
+
"a `req:write` GitHub issue for each proposal so the downstream",
|
|
10154
|
+
"`requirements-writer` bundle picks it up, and backfill source-document",
|
|
10155
|
+
"traceability notes \u2014 all in a single session.",
|
|
9550
10156
|
"",
|
|
9551
|
-
"**Budget:** No web searches. Reading + writing
|
|
10157
|
+
"**Budget:** No web searches. Reading + writing proposals + issue creation",
|
|
10158
|
+
"+ minor traceability edits to source documents.",
|
|
10159
|
+
"",
|
|
10160
|
+
"Draft and Trace were previously separate phases. They were collapsed",
|
|
10161
|
+
"because the proposals file written by Draft was only ever consumed by",
|
|
10162
|
+
"Trace \u2014 no human review, no async work, no CI validation sat between",
|
|
10163
|
+
"them. See ADR-009 for the decision record.",
|
|
10164
|
+
"",
|
|
10165
|
+
"### `req:write` issue schema",
|
|
10166
|
+
"",
|
|
10167
|
+
"The `req:write` issues this phase creates are picked up by the",
|
|
10168
|
+
"downstream `requirements-writer` agent, which parses a strict",
|
|
10169
|
+
"schema on intake. The authoritative schema is defined in the",
|
|
10170
|
+
"`requirements-writer` sub-agent prompt under **The `req:write`",
|
|
10171
|
+
"Issue Schema** \u2014 every `req:write` issue this phase opens must",
|
|
10172
|
+
"conform. The same schema is embedded in the",
|
|
10173
|
+
"`requirements-reviewer` follow-up generator so the three",
|
|
10174
|
+
"producers never drift apart.",
|
|
10175
|
+
"",
|
|
10176
|
+
...REQ_WRITE_ISSUE_SCHEMA_SECTION,
|
|
10177
|
+
"",
|
|
10178
|
+
"**Deriving the three required fields from the proposal.** For",
|
|
10179
|
+
"every `req:write` issue this phase opens, the three fields come",
|
|
10180
|
+
"directly from the proposal entry written earlier in the same",
|
|
10181
|
+
"session:",
|
|
10182
|
+
"",
|
|
10183
|
+
"- **Category** \u2014 the proposal's `**Category:**` line.",
|
|
10184
|
+
"- **Tier** \u2014 the proposal's `**Tier:**` line.",
|
|
10185
|
+
"- **Output Path** \u2014",
|
|
10186
|
+
" `<REQUIREMENTS_ROOT>/<category-dir>/<PREFIX>-<NNN>-<slug>.md`,",
|
|
10187
|
+
" using the sequence number determined in the proposal step below.",
|
|
10188
|
+
"",
|
|
10189
|
+
"**Validation step \u2014 required before opening the issue.** Before",
|
|
10190
|
+
"calling `gh issue create`, verify all three required fields are",
|
|
10191
|
+
"populated and internally consistent (Category matches title",
|
|
10192
|
+
"prefix, Tier matches `tier:*` label, Output Path filename starts",
|
|
10193
|
+
"with the Category prefix). If any field cannot be derived, open",
|
|
10194
|
+
"the issue with `status:needs-attention` (not `status:ready`) and",
|
|
10195
|
+
"include a `Missing: <field> \u2014 <one-line reason>` line so a human",
|
|
10196
|
+
"triaging the issue only has to supply the remaining value(s)",
|
|
10197
|
+
"before flipping the label to `status:ready`.",
|
|
9552
10198
|
"",
|
|
9553
10199
|
"### Steps",
|
|
9554
10200
|
"",
|
|
@@ -9599,61 +10245,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9599
10245
|
" directory under `<REQUIREMENTS_ROOT>/<category>/` to find the next",
|
|
9600
10246
|
" available `NNN` for each proposed requirement.",
|
|
9601
10247
|
"",
|
|
9602
|
-
"5. **Create
|
|
9603
|
-
"",
|
|
9604
|
-
"6. **Commit and push.**",
|
|
9605
|
-
"",
|
|
9606
|
-
"---",
|
|
9607
|
-
"",
|
|
9608
|
-
"## Phase 3: Trace (`req:trace`)",
|
|
9609
|
-
"",
|
|
9610
|
-
"**Goal:** Create GitHub issues for each proposed requirement and update",
|
|
9611
|
-
"source documents with traceability notes indicating that requirement issues",
|
|
9612
|
-
"were created.",
|
|
9613
|
-
"",
|
|
9614
|
-
"**Budget:** No web searches. Issue creation + minor edits to source",
|
|
9615
|
-
"documents.",
|
|
9616
|
-
"",
|
|
9617
|
-
"### `req:write` issue schema",
|
|
9618
|
-
"",
|
|
9619
|
-
"The `req:write` issues this phase creates are picked up by the",
|
|
9620
|
-
"downstream `requirements-writer` agent, which parses a strict",
|
|
9621
|
-
"schema on intake. The authoritative schema is defined in the",
|
|
9622
|
-
"`requirements-writer` sub-agent prompt under **The `req:write`",
|
|
9623
|
-
"Issue Schema** \u2014 every `req:write` issue this phase opens must",
|
|
9624
|
-
"conform. The same schema is embedded in the",
|
|
9625
|
-
"`requirements-reviewer` follow-up generator so the three",
|
|
9626
|
-
"producers never drift apart.",
|
|
9627
|
-
"",
|
|
9628
|
-
...REQ_WRITE_ISSUE_SCHEMA_SECTION,
|
|
9629
|
-
"",
|
|
9630
|
-
"**Deriving the three required fields from the proposal.** For",
|
|
9631
|
-
"every `req:write` issue this phase opens, the three fields come",
|
|
9632
|
-
"directly from the Phase 2 proposal entry:",
|
|
9633
|
-
"",
|
|
9634
|
-
"- **Category** \u2014 the proposal's `**Category:**` line.",
|
|
9635
|
-
"- **Tier** \u2014 the proposal's `**Tier:**` line (added in Phase 2).",
|
|
9636
|
-
" If the proposal omitted the Tier line (older proposals may),",
|
|
9637
|
-
" route the issue through `Missing:` rather than guessing.",
|
|
9638
|
-
"- **Output Path** \u2014",
|
|
9639
|
-
" `<REQUIREMENTS_ROOT>/<category-dir>/<PREFIX>-<NNN>-<slug>.md`,",
|
|
9640
|
-
" using the sequence number determined in Phase 2 step 4.",
|
|
9641
|
-
"",
|
|
9642
|
-
"**Validation step \u2014 required before opening the issue.** Before",
|
|
9643
|
-
"calling `gh issue create`, verify all three required fields are",
|
|
9644
|
-
"populated and internally consistent (Category matches title",
|
|
9645
|
-
"prefix, Tier matches `tier:*` label, Output Path filename starts",
|
|
9646
|
-
"with the Category prefix). If any field cannot be derived, open",
|
|
9647
|
-
"the issue with `status:needs-attention` (not `status:ready`) and",
|
|
9648
|
-
"include a `Missing: <field> \u2014 <one-line reason>` line so a human",
|
|
9649
|
-
"triaging the issue only has to supply the remaining value(s)",
|
|
9650
|
-
"before flipping the label to `status:ready`.",
|
|
9651
|
-
"",
|
|
9652
|
-
"### Steps",
|
|
9653
|
-
"",
|
|
9654
|
-
"1. **Read the proposals** from Phase 2.",
|
|
9655
|
-
"",
|
|
9656
|
-
"2. **Create requirement issues.** For each proposal:",
|
|
10248
|
+
"5. **Create requirement issues.** For each proposal:",
|
|
9657
10249
|
"",
|
|
9658
10250
|
" All `type:requirement` issues default to `priority:medium` (override",
|
|
9659
10251
|
" only if the proposal's priority was explicitly High or Low). Each",
|
|
@@ -9698,7 +10290,7 @@ var requirementsAnalystSubAgent = {
|
|
|
9698
10290
|
" whichever of the three fields **could** be derived so a human",
|
|
9699
10291
|
" triaging the issue has the minimum possible cleanup.",
|
|
9700
10292
|
"",
|
|
9701
|
-
"
|
|
10293
|
+
"6. **Update source documents.** In each BCM model doc or competitive",
|
|
9702
10294
|
" analysis that was scanned, add a note in the project-relevance /",
|
|
9703
10295
|
" strategic-implications section (whichever heading the source doc uses)",
|
|
9704
10296
|
" indicating that a requirement issue was created:",
|
|
@@ -9708,10 +10300,10 @@ var requirementsAnalystSubAgent = {
|
|
|
9708
10300
|
" (issue #<N>)",
|
|
9709
10301
|
" ```",
|
|
9710
10302
|
"",
|
|
9711
|
-
"
|
|
10303
|
+
"7. **Comment on the scan issue** with a summary of all issues created and",
|
|
9712
10304
|
" all docs updated.",
|
|
9713
10305
|
"",
|
|
9714
|
-
"
|
|
10306
|
+
"8. **Commit and push.**",
|
|
9715
10307
|
"",
|
|
9716
10308
|
"---",
|
|
9717
10309
|
"",
|
|
@@ -9789,39 +10381,41 @@ var scanRequirementsSkill = {
|
|
|
9789
10381
|
"1. Create a `req:scan` issue with `type:requirement`, `priority:medium`,",
|
|
9790
10382
|
" and `status:ready`. Body must list the files to read and the scan scope.",
|
|
9791
10383
|
"2. Execute Phase 1 (Scan) of the requirements-analyst agent.",
|
|
9792
|
-
"3. If gaps are found, a `req:draft` issue is created automatically.",
|
|
10384
|
+
"3. If gaps are found, a `req:draft-trace` issue is created automatically.",
|
|
9793
10385
|
"",
|
|
9794
10386
|
"## Output",
|
|
9795
10387
|
"",
|
|
9796
10388
|
"- A `req-scan-<scope>-<YYYY-MM-DD>.md` file under the project's research",
|
|
9797
10389
|
" requirements directory.",
|
|
9798
|
-
"- A `req:draft` issue if any gaps were identified."
|
|
10390
|
+
"- A `req:draft-trace` issue if any gaps were identified."
|
|
9799
10391
|
].join("\n")
|
|
9800
10392
|
};
|
|
9801
10393
|
var requirementsAnalystBundle = {
|
|
9802
10394
|
name: "requirements-analyst",
|
|
9803
|
-
description: "Requirements gap-discovery agent bundle for BCM-driven projects.
|
|
10395
|
+
description: "Requirements gap-discovery agent bundle for BCM-driven projects. 2-phase pipeline (scan, draft-trace) with req:* phase labels.",
|
|
9804
10396
|
appliesWhen: () => true,
|
|
9805
10397
|
rules: [
|
|
9806
10398
|
{
|
|
9807
10399
|
name: "requirements-analyst-workflow",
|
|
9808
|
-
description: "Describes the
|
|
10400
|
+
description: "Describes the 2-phase requirements gap-discovery pipeline, the req:* label taxonomy, and the boundary with the downstream requirements-writer agent.",
|
|
9809
10401
|
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
9810
10402
|
content: [
|
|
9811
10403
|
"# Requirements Analyst Workflow",
|
|
9812
10404
|
"",
|
|
9813
10405
|
"Use `/scan-requirements <scope>` to kick off a requirements gap",
|
|
9814
|
-
"discovery cycle. The pipeline runs in
|
|
9815
|
-
"each tracked by its own GitHub issue labeled
|
|
9816
|
-
"or `req:trace`. All issues carry
|
|
9817
|
-
"",
|
|
9818
|
-
"
|
|
9819
|
-
"
|
|
9820
|
-
"
|
|
10406
|
+
"discovery cycle. The pipeline runs in 2 phases \u2014 scan and",
|
|
10407
|
+
"draft-trace \u2014 each tracked by its own GitHub issue labeled",
|
|
10408
|
+
"`req:scan` or `req:draft-trace`. All issues carry",
|
|
10409
|
+
"`type:requirement`.",
|
|
10410
|
+
"",
|
|
10411
|
+
"The requirements-analyst *discovers gaps, drafts proposals, and",
|
|
10412
|
+
"opens `req:write` issues for the downstream writer*; it does",
|
|
10413
|
+
"**not** write final requirement documents. Writing is the job of",
|
|
10414
|
+
"the downstream `requirements-writer` agent (a separate bundle).",
|
|
9821
10415
|
"Keep that boundary clean: proposals land under the research",
|
|
9822
10416
|
"requirements directory, not under the authoritative requirements",
|
|
9823
|
-
"tree. The trace phase tags new issues with `req:write` so
|
|
9824
|
-
"writer bundle picks them up automatically.",
|
|
10417
|
+
"tree. The draft-trace phase tags new issues with `req:write` so",
|
|
10418
|
+
"the writer bundle picks them up automatically.",
|
|
9825
10419
|
"",
|
|
9826
10420
|
"See the `requirements-analyst` agent definition for full workflow",
|
|
9827
10421
|
"details and phase-by-phase instructions."
|
|
@@ -9846,14 +10440,9 @@ var requirementsAnalystBundle = {
|
|
|
9846
10440
|
description: "Phase 1: scan source docs for requirement gaps and deduplicate"
|
|
9847
10441
|
},
|
|
9848
10442
|
{
|
|
9849
|
-
name: "req:draft",
|
|
10443
|
+
name: "req:draft-trace",
|
|
9850
10444
|
color: "BFDADC",
|
|
9851
|
-
description: "Phase 2: draft
|
|
9852
|
-
},
|
|
9853
|
-
{
|
|
9854
|
-
name: "req:trace",
|
|
9855
|
-
color: "D4C5F9",
|
|
9856
|
-
description: "Phase 3: create requirement issues and backfill traceability on source docs"
|
|
10445
|
+
description: "Phase 2: draft proposals, create req:write issues, and backfill source-doc traceability"
|
|
9857
10446
|
}
|
|
9858
10447
|
]
|
|
9859
10448
|
};
|
|
@@ -11737,8 +12326,8 @@ var requirementsWriterSubAgent = {
|
|
|
11737
12326
|
"This agent produces **requirement documents only** \u2014 capability",
|
|
11738
12327
|
"models are written by the `bcm-writer` agent and requirement-gap",
|
|
11739
12328
|
"discovery is the responsibility of the `requirements-analyst` agent.",
|
|
11740
|
-
"Keep this boundary clean: never open `req:scan`,
|
|
11741
|
-
"`bcm:*` issues from this pipeline.",
|
|
12329
|
+
"Keep this boundary clean: never open `req:scan`,",
|
|
12330
|
+
"`req:draft-trace`, or `bcm:*` issues from this pipeline.",
|
|
11742
12331
|
"",
|
|
11743
12332
|
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
11744
12333
|
"`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
|
|
@@ -12272,7 +12861,7 @@ var requirementsWriterSubAgent = {
|
|
|
12272
12861
|
"specialized upstream/downstream agents.",
|
|
12273
12862
|
"",
|
|
12274
12863
|
"**Do NOT create:**",
|
|
12275
|
-
"- `req:scan
|
|
12864
|
+
"- `req:scan` or `req:draft-trace` issues \u2014 those belong to",
|
|
12276
12865
|
" the `requirements-analyst` bundle",
|
|
12277
12866
|
"- `bcm:*` issues \u2014 those belong to the `bcm-writer` bundle",
|
|
12278
12867
|
"- `people:*`, `company:*`, `software:*`, `research:*`, or",
|
|
@@ -12320,8 +12909,8 @@ var requirementsWriterSubAgent = {
|
|
|
12320
12909
|
" exists as a file but is missing from its category index is",
|
|
12321
12910
|
" invisible to anyone browsing the documentation tree.",
|
|
12322
12911
|
"- **Write requirements, not capability models or gap reports.**",
|
|
12323
|
-
" Never open `req:scan`, `req:draft
|
|
12324
|
-
"
|
|
12912
|
+
" Never open `req:scan`, `req:draft-trace`, or `bcm:*` issues from",
|
|
12913
|
+
" this pipeline."
|
|
12325
12914
|
].join("\n")
|
|
12326
12915
|
};
|
|
12327
12916
|
var writeRequirementSkill = {
|
|
@@ -12416,8 +13005,8 @@ var requirementsWriterBundle = {
|
|
|
12416
13005
|
"The pipeline produces **requirement documents only** \u2014 capability",
|
|
12417
13006
|
"models are written by the `bcm-writer` agent and gap discovery is",
|
|
12418
13007
|
"the responsibility of the `requirements-analyst` agent. The",
|
|
12419
|
-
"writer never opens `req:scan`, `req:draft
|
|
12420
|
-
"
|
|
13008
|
+
"writer never opens `req:scan`, `req:draft-trace`, or `bcm:*`",
|
|
13009
|
+
"issues.",
|
|
12421
13010
|
"",
|
|
12422
13011
|
"Documents follow the 11-category taxonomy (BR, FR, NFR, TR, ADR,",
|
|
12423
13012
|
"SEC, DR, INT, OPS, UX, MT) and the four-tier classification",
|
|
@@ -12523,8 +13112,8 @@ var requirementsReviewerSubAgent = {
|
|
|
12523
13112
|
"`requirements-writer` bundle (requirement docs) and `bcm-writer`",
|
|
12524
13113
|
"bundle (capability models). Gap discovery belongs to the",
|
|
12525
13114
|
"`requirements-analyst` bundle. Keep this boundary clean: never open",
|
|
12526
|
-
"`req:scan`, `req:draft
|
|
12527
|
-
"
|
|
13115
|
+
"`req:scan`, `req:draft-trace`, `req:review`, or `bcm:*` issues",
|
|
13116
|
+
"from this pipeline. The only follow-ups you open are the",
|
|
12528
13117
|
"`req:write` issues documented below.",
|
|
12529
13118
|
"",
|
|
12530
13119
|
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
@@ -12737,8 +13326,8 @@ var requirementsReviewerSubAgent = {
|
|
|
12737
13326
|
"doc and must be rewritten or removed). Route follow-up issues to",
|
|
12738
13327
|
"`req:write` so the `requirements-writer` \u2014 the only agent scoped",
|
|
12739
13328
|
"to edit under `<REQUIREMENTS_ROOT>` \u2014 picks them up. Do **not**",
|
|
12740
|
-
"route Check 4 findings to `req:trace`; the analyst bundle
|
|
12741
|
-
"not edit requirement documents and the issue would sit",
|
|
13329
|
+
"route Check 4 findings to `req:draft-trace`; the analyst bundle",
|
|
13330
|
+
"does not edit requirement documents and the issue would sit",
|
|
12742
13331
|
"unresolved. See the Follow-Up Issues section below for the full",
|
|
12743
13332
|
"Check 3 vs. Check 4 routing split.",
|
|
12744
13333
|
"",
|
|
@@ -13157,11 +13746,12 @@ var requirementsReviewerSubAgent = {
|
|
|
13157
13746
|
" docs, competitive-analysis notes, product-roadmap entries,",
|
|
13158
13747
|
" meeting extracts \u2014 that should link forward to an existing",
|
|
13159
13748
|
" requirement (Check 3: orphaned requirements whose fix lives",
|
|
13160
|
-
" in the source tree, not the requirement doc) \u2192 `req:trace`",
|
|
13749
|
+
" in the source tree, not the requirement doc) \u2192 `req:draft-trace`",
|
|
13161
13750
|
" (the `requirements-analyst` agent picks it up to backfill",
|
|
13162
|
-
" source-doc traceability
|
|
13163
|
-
" cross-references here \u2014 the
|
|
13164
|
-
" `<REQUIREMENTS_ROOT>` and the
|
|
13751
|
+
" source-doc traceability inside its combined draft-trace phase).",
|
|
13752
|
+
" **Do not** route Check 4 broken cross-references here \u2014 the",
|
|
13753
|
+
" analyst bundle never writes to `<REQUIREMENTS_ROOT>` and the",
|
|
13754
|
+
" issue would sit unresolved.",
|
|
13165
13755
|
" - A new requirement is needed (e.g., a `Proposed` ADR is missing",
|
|
13166
13756
|
" for a deferred technology choice) \u2192 `req:scan` (the analyst",
|
|
13167
13757
|
" runs a scoped scan to confirm the gap, then drafts the new",
|
|
@@ -13175,7 +13765,7 @@ var requirementsReviewerSubAgent = {
|
|
|
13175
13765
|
"",
|
|
13176
13766
|
"**Check 12 exception \u2014 stale `Proposed` ADR/TR triage.** Check 12",
|
|
13177
13767
|
"findings are the one case where follow-up flows through a new",
|
|
13178
|
-
"`req:review` issue rather than `req:write` / `req:trace` /",
|
|
13768
|
+
"`req:review` issue rather than `req:write` / `req:draft-trace` /",
|
|
13179
13769
|
"`req:scan`. The finding is a decision a human must make, not an",
|
|
13180
13770
|
"edit to a requirement document, so:",
|
|
13181
13771
|
"",
|
|
@@ -13615,8 +14205,9 @@ var reviewRequirementsSkill = {
|
|
|
13615
14205
|
"- One verification script under `<REVIEW_REPORTS_ROOT>` (only",
|
|
13616
14206
|
" for audits >10 documents)",
|
|
13617
14207
|
"- Follow-up GitHub issues for every Critical and Warning finding,",
|
|
13618
|
-
" carrying the appropriate phase label (`req:write`,
|
|
13619
|
-
" or `req:scan`) for the downstream agent that
|
|
14208
|
+
" carrying the appropriate phase label (`req:write`,",
|
|
14209
|
+
" `req:draft-trace`, or `req:scan`) for the downstream agent that",
|
|
14210
|
+
" should act",
|
|
13620
14211
|
"- An aggregated `req:review` follow-up issue labeled",
|
|
13621
14212
|
" `status:needs-attention` when Check 12 surfaces stale `Proposed`",
|
|
13622
14213
|
" ADR/TR documents (one issue per review, not one per document);",
|
|
@@ -13771,9 +14362,9 @@ var requirementsReviewerBundle = {
|
|
|
13771
14362
|
"The review phase produces **review reports and follow-up issues",
|
|
13772
14363
|
"only** \u2014 it never edits requirement documents, capability",
|
|
13773
14364
|
"models, or research notes. It files follow-up issues with the",
|
|
13774
|
-
"appropriate phase label (`req:write`, `req:trace`,
|
|
13775
|
-
"or \u2014 only for Check 12 stale-decision triage \u2014
|
|
13776
|
-
"for the downstream agent or human to pick up.",
|
|
14365
|
+
"appropriate phase label (`req:write`, `req:draft-trace`,",
|
|
14366
|
+
"`req:scan`, or \u2014 only for Check 12 stale-decision triage \u2014",
|
|
14367
|
+
"`req:review`) for the downstream agent or human to pick up.",
|
|
13777
14368
|
"",
|
|
13778
14369
|
"For audits covering more than 10 documents, the reviewer writes",
|
|
13779
14370
|
"a read-only Python verification script alongside the report and",
|
|
@@ -13816,9 +14407,9 @@ var requirementsReviewerBundle = {
|
|
|
13816
14407
|
"Authoring remains the responsibility of the `requirements-writer`",
|
|
13817
14408
|
"(requirement docs) and `bcm-writer` (capability models) bundles.",
|
|
13818
14409
|
"Gap discovery is the responsibility of the `requirements-analyst`",
|
|
13819
|
-
"bundle. The reviewer never opens `req:scan`, `req:draft`,",
|
|
13820
|
-
"`req:
|
|
13821
|
-
"
|
|
14410
|
+
"bundle. The reviewer never opens `req:scan`, `req:draft-trace`,",
|
|
14411
|
+
"`req:review`, or `bcm:*` issues \u2014 only `req:write` follow-ups",
|
|
14412
|
+
"from either phase.",
|
|
13822
14413
|
"",
|
|
13823
14414
|
"**Soft dependency on the `requirements-writer` bundle.** The",
|
|
13824
14415
|
"reviewer reads category templates from",
|
|
@@ -16490,6 +17081,7 @@ var BUILT_IN_BUNDLES = [
|
|
|
16490
17081
|
githubWorkflowBundle,
|
|
16491
17082
|
slackBundle,
|
|
16492
17083
|
meetingAnalysisBundle,
|
|
17084
|
+
agendaBundle,
|
|
16493
17085
|
orchestratorBundle,
|
|
16494
17086
|
prReviewBundle,
|
|
16495
17087
|
requirementsAnalystBundle,
|
|
@@ -20285,6 +20877,7 @@ export {
|
|
|
20285
20877
|
addApproveMergeUpgradeWorkflow,
|
|
20286
20878
|
addBuildCompleteJob,
|
|
20287
20879
|
addSyncLabelsWorkflow,
|
|
20880
|
+
agendaBundle,
|
|
20288
20881
|
awsCdkBundle,
|
|
20289
20882
|
baseBundle,
|
|
20290
20883
|
bcmWriterBundle,
|